Ivan FB 070c86c0eb
fix(tests): add relay-only peer nwaku so mesh forms before tests publish
Tests built on `runNodes` (Store, Filter single-node, etc.) start a single
nwaku container and a js-waku LightNode. LightNodes never join the
gossipsub mesh, so the nwaku ends up with zero mesh peers on the test
topic. After nwaku PR #3669 (Jan 2026) the REST endpoint
`POST /relay/v1/auto/messages` now returns HTTP 400 with
`NoPeersToPublish` instead of silently succeeding in that state, which
causes `ServiceNode.sendMessage()` to return `false` and fails every
test that seeds the store via REST publish. That broke ~50/56 of the
failing assertions in the nwaku `js-waku-node` CI job and the job has
been red on every master run since.

Fix the test harness rather than reverting the (correct) nwaku change:

- `runNodes` now starts a second relay-only `ServiceNode` chained to the
  primary via `--staticnode`, subscribed to the same shards/topics. Once
  the gossipsub mesh GRAFTs, REST publishes on the primary have a real
  mesh peer and succeed.
- The peer's lifecycle is bound to the primary through a new private
  `companion` field + `setCompanion()` getter; existing `tearDownNodes`
  calls keep working unchanged.
- Add `ServiceNode.waitForMeshPeers(pubsubTopics, {timeoutMs})` polling
  `/admin/v1/peers/mesh`, called before `runNodes` returns so the first
  publish doesn't race the heartbeat.

Doesn't touch `ServiceNodesFleet` (already multi-node); doesn't address
the Filter Multiple-Service-Nodes duplication or Peer Exchange compliance
timeouts surfaced in the same run — those are separate bugs.
2026-05-21 16:35:54 +02:00
..
2025-04-18 20:44:22 +02:00
2022-12-02 15:54:30 +11:00

Description

This package contains tests for the js-waku library.

Pre-requisites

Some of the tests from this package require a running nwaku node. These nodes are setup to be run in a docker container. Therefore, you need to have docker installed on your machine to run the tests.

Running interop tests

  • The tests by default run against an nwaku node with the image name specified in nwaku.ts and packages/tests/package.json. The tests can be run against a different image by setting the environment variable WAKUNODE_IMAGE to the desired image.

  • Whatever WAKUNODE_IMAGE is set to, the tests will run against that image. If the image is not available locally, the tests will pull the image from the docker hub. You can run the tests by running the following command:

    WAKUNODE_IMAGE=explicit-image-name npm run test:node
    

    Or against the default docker image by running:

    npm run test:node
    
  • You can also run the tests against a local nwaku by setting the environment variable WAKUNODE_IMAGE to the name of the image. The tests will then run against the local image.

    • For example, to run the tests against a local checkout of nwaku, build the image first manually. You can build the image by running the following command:

      docker build path-to-dockerfile -t image-name
      

      Then, you can run the tests by running the following command:

      WAKUNODE_IMAGE=image-name npm run test:node
      
  • Locally, tests are executed serially, allowing the use of .only for focused testing. If you wish to run all tests locally and expedite the process, you can enable parallel execution in the Mocha configuration.

  • Logs from nwaku nodes can be found in packages/tests/logs folder from latest execution.

Running tests in the CI

  • Tests are being run on standard Ubuntu GitHub Actions instances.
  • To speed up execution, we run tests in parallel. After numerous attempts, we determined that using 6 threads strikes the best balance between execution speed and test reliability. Using more than this doesn't significantly decrease execution time and might even slow it down.
  • To address occasional test flakiness, primarily due to Docker containers starting and stopping for each test and the concurrent execution of tests, we utilize the Mocha retry mechanism.