3856de32fc | ||
---|---|---|
.. | ||
compose-spec | ||
helpers | ||
impl | ||
src | ||
.gitignore | ||
Makefile | ||
README.md | ||
dockerBuildWrapper.sh | ||
package-lock.json | ||
package.json | ||
renderResults.ts | ||
testplans.ts | ||
tsconfig.json | ||
versions.ts |
README.md
Interoperability test
This tests that different libp2p implementations can communicate with each other on each of their supported capabilities.
Each version of libp2p is defined in versions.ts
. There the version defines
its capabilities along with the id of its container image.
This repo and tests adhere to these constraints:
- Be reproducible for a given commit.
- Caching is an optimization. Things should be fine without it.
- If we have a cache hit, be fast.
Test spec
The implementation is run in a container and is passed parameters via environment variables. The current parameters are:
Name | Description | Is Optional |
---|---|---|
transport | The transport to use | no |
muxer | The muxer to use | no, except when transport is one of quic, quic-v1, webtransport |
security | The security channel to use | no, except when transport is one of quic, quic-v1, webtransport |
is_dialer | Should you dial or listen | no |
ip | IP address to bind the listener to | yes, default to "0.0.0.0" |
redis_addr | A different address to connect to redis (default redis:6379) | yes, default to the redis host on port 6379 |
test_timeout_seconds | Control the timeout of test. | yes, default to 180 seconds. |
The test should do two different things depending on if it's the dialer or listener.
Dialer
The dialer should emit all diagnostic logs to stderr
. Only the final JSON
string result should be emitted to stdout
.
- Connect to the Redis instance.
- Create a libp2p node as defined by the environment variables.
- Get the listener's address via Redis'
BLPOP
using thelistenerAddr
key. - Record the current instant as
handshakeStartInstant
. - Connect to the listener.
- Ping the listener, and record the round trip duration as
pingRTT
- Record the duration since
handshakeStartInstant
. This ishandshakePlusOneRTT
. - Print to
stdout
the JSON formatted string:{"handshakePlusOneRTTMillis": handshakePlusOneRTT, "pingRTTMilllis": pingRTT}
. Durations should be printed in milliseconds as a float. - Exit with a code zero.
On error, the dialer should return a non-zero exit code.
Listener
The listener should emit all diagnostic logs to stderr
.
- Connect to the Redis instance.
- Create a libp2p node as defined by the environment variables.
- Publish the listener's address via Redis'
RPUSH
using thelistenerAddr
key. - Sleep for the duration of
test_timeout_seconds
. The test runner will kill this process when the dialer finishes. - If the timeout is hit, exit with a non-zero error code.
On error, the listener should return a non-zero exit code.
Caching
The caching strategy is opinionated in an attempt to make things simpler and faster. Here's how it works:
- We cache the result of image.json in each implementation folder.
- The cache key is derived from the hashes of the files in the implementation folder.
- When loading from cache, if we have a cache hit, we load the image into
docker and create the image.json file. We then call
make -o image.json
to allow the implementation to build any extra things from cache (e.g. JS-libp2p builds browser images from the same base as node). If we have a cache miss, we simply callmake
and build from scratch. - When we push the cache we use the cache-key along with the docker platform (arm64 vs x86_64).