• Lars Gierth's avatar
    Add conformance testing · e791f319
    Lars Gierth authored
    This patch adds a go-multiaddr CLI to aid in testing this
    implementation of multiaddr. It takes a multiaddr in string or
    packed form as input, and prints detailed information about the
    multiaddr. This tool can be useful beyond testing, of course.
    
    Another addition is a Makefile target for running the new
    multiaddr conformance test suite. This test suite lives at
    https://github.com/multiformats/multiaddr and is fetched to be
    run against our new go-multiaddr CLI. This target is to be run in CI
    
    Neither the test suite nor the CLI are complete yet.
    
    Currently the output looks like this:
    
    ```
    > go run ./multiaddr /ip4/192.0.2.42/tcp/443 | jq .
    {
      "string": "/ip4/192.0.2.42/tcp/443",
      "stringSize": "23",
      "packed": "0x04c000022a0601bb",
      "packedSize": "8",
      "components": [
        {
          "string": "/ip4/192.0.2.42",
          "stringSize": "15",
          "packed": "0x04c000022a",
          "packedSize": "5",
          "value": "192.0.2.42",
          "rawValue": "0xc000022a",
          "valueSize": "4",
          "protocol": "ip4",
          "codec": "4",
          "uvarint": "0x04",
          "lengthPrefix": ""
        },
        {
          "string": "/tcp/443",
          "stringSize": "8",
          "packed": "0x0601bb",
          "packedSize": "3",
          "value": "443",
          "rawValue": "0x01bb",
          "valueSize": "2",
          "protocol": "tcp",
          "codec": "6",
          "uvarint": "0x06",
          "lengthPrefix": ""
        }
      ]
    }
    ```
    
    And the Makefile target:
    
    ```
    > make conformance
    go get -d -v .
    go build -o tmp/multiaddr/test/go-multiaddr ./multiaddr
    cd tmp/multiaddr/test && MULTIADDR_BIN="./go-multiaddr" go test -v
    === RUN   TestGodog
    MULTIADDR_BIN="./go-multiaddr"
    Feature: Multiaddr
    
      Scenario: Banana                              # multiaddr.feature:3
        Given the multiaddr /ip4/192.0.2.42/tcp/443 # main_test.go:81 -> github.com/multiformats/multiaddr/test_test.theMultiaddr
        Then the packed form is 0x04c000022a0601bb  # main_test.go:98 -> github.com/multiformats/multiaddr/test_test.thePackedFormIs
        And the packed size is 8 bytes              # main_test.go:105 -> github.com/multiformats/multiaddr/test_test.thePackedSizeIs
        And the components are:                     # main_test.go:126 -> github.com/multiformats/multiaddr/test_test.theComponentsAre
          | string          | stringSize | packed       | packedSize | value      | valueSize | protocol | codec | uvarint | lengthPrefix | rawValue   |
          | /ip4/192.0.2.42 | 15         | 0x04c000022a | 5          | 192.0.2.42 | 4         | ip4      | 4     | 0x04    |              | 0xc000022a |
          | /tcp/443        | 8          | 0x0601bb     | 3          | 443        | 2         | tcp      | 6     | 0x06    |              | 0x01bb     |
    
      Scenario: Banana #2                               # multiaddr.feature:12
        Given the multiaddr 0x04c000022a0601bb          # main_test.go:81 -> github.com/multiformats/multiaddr/test_test.theMultiaddr
        Then the string form is /ip4/192.0.2.42/tcp/443 # main_test.go:112 -> github.com/multiformats/multiaddr/test_test.theStringFormIs
        And the string size is 23 bytes                 # main_test.go:119 -> github.com/multiformats/multiaddr/test_test.theStringSizeIs
        And the components are:                         # main_test.go:126 -> github.com/multiformats/multiaddr/test_test.theComponentsAre
          | string          | stringSize | packed       | packedSize | value      | valueSize | protocol | codec | uvarint | lengthPrefix | rawValue   |
          | /ip4/192.0.2.42 | 15         | 0x04c000022a | 5          | 192.0.2.42 | 4         | ip4      | 4     | 0x04    |              | 0xc000022a |
          | /tcp/443        | 8          | 0x0601bb     | 3          | 443        | 2         | tcp      | 6     | 0x06    |              | 0x01bb     |
    
    2 scenarios (2 passed)
    8 steps (8 passed)
    3.187755ms
    --- PASS: TestGodog (0.00s)
    PASS
    ok  	github.com/multiformats/multiaddr/test	0.012s
    ```
    e791f319
main.go 2.16 KB