logos-delivery/tests/wakunode_rest/test_rest_health.nim
Fabiana Cecin 6837ae0c1f
feat: bump nim-libp2p to v2.0.0 (#3929)
* bump nim-libp2p pin to v2.0.0 tag
* bump json_rpc to v0.6.1, lsquic to v0.5.1, boringssl to v0.0.8 (latest tags)
* add libp2p_mix dep; repoint libp2p/protocols/mix -> libp2p_mix
* pin nimble.lock: websock / protobuf_serialization / npeg / jwt
* Makefile: add -d:libp2p_quic_support
* regenerate nix/deps.nix (adds libp2p_mix, refreshes pins)
* migrate rng ref HmacDrbgContext -> libp2p Rng across prod/channels/tests (interface-only; same DRBG)
* waku_switch: TransportConfig factory; unified 2.0.0 connection limits (withMaxInOut, withMaxConnections); local MaxConnections
* waku_relay/rendezvous/discv5/kademlia: v2.0.0 API (rng, config, ServiceDiscovery rename)
* call Service.setup() on post-build switch services (2.0.0 split setup/start)
* drop libp2p/utils/semaphore -> chronos AsyncSemaphore
* add logos_delivery/waku/compat/option_valueor shim (Option[T] valueOr/withValue, dropped upstream)
* add std/options where a transitive re-export was removed
* add newStandardSwitch shim (libp2p removed it in 2.0.0); mounts yamux+mplex to match prod muxer
* PeerId.random(rng); common.rng()/crypto.newRng(); hoist shared rng (instantiation cleanup)
* update expectations for 2.0.0 defaults: DEFAULT_PROTOCOLS += /ipfs/id/push/1.0.0; agent "nim-libp2p"
* drop relay reboot/reconnect test (asserted a Switch restart capability that is simply not supported)
* fix up a few tests that were flaking on MacOS (libp2p upgrade may have exposed these)
2026-06-15 09:56:15 -03:00

118 lines
4.0 KiB
Nim

{.used.}
import
std/[tempfiles, osproc, options],
testutils/unittests,
presto,
presto/client as presto_client,
libp2p/peerinfo,
libp2p/multiaddress,
libp2p/crypto/crypto
import
logos_delivery/waku/[
common/waku_protocol,
waku_node,
node/waku_node as waku_node2,
# TODO: Remove after moving `git_version` to the app code.
rest_api/endpoint/server,
rest_api/endpoint/client,
rest_api/endpoint/responses,
rest_api/endpoint/health/handlers as health_rest_interface,
rest_api/endpoint/health/client as health_rest_client,
waku_rln_relay,
node/health_monitor,
],
../testlib/common,
../testlib/wakucore,
../testlib/wakunode,
../waku_rln_relay/[rln/waku_rln_relay_utils, utils_onchain]
proc testWakuNode(): WakuNode =
let
privkey = crypto.PrivateKey.random(Secp256k1, rng).tryGet()
bindIp = parseIpAddress("0.0.0.0")
extIp = parseIpAddress("127.0.0.1")
port = Port(0)
newTestWakuNode(privkey, bindIp, port, some(extIp), some(port))
suite "Waku v2 REST API - health":
# TODO: better test for health
var anvilProc {.threadVar.}: Process
var manager {.threadVar.}: OnchainGroupManager
setup:
anvilProc = runAnvil(stateFile = some(DEFAULT_ANVIL_STATE_PATH))
manager = waitFor setupOnchainGroupManager(deployContracts = false)
teardown:
stopAnvil(anvilProc)
asyncTest "Get node health info - GET /health":
# Given
let node = testWakuNode()
await node.start()
(await node.mountRelay()).isOkOr:
assert false, "Failed to mount relay"
var restPort = Port(0)
let restAddress = parseIpAddress("0.0.0.0")
let restServer = WakuRestServerRef.init(restAddress, restPort).tryGet()
restPort = restServer.httpServer.address.port # update with bound port for client use
let healthMonitor = NodeHealthMonitor.new(node)
installHealthApiHandler(restServer.router, healthMonitor)
restServer.start()
let client = newRestHttpClient(initTAddress(restAddress, restPort))
# kick in rln (currently the only check for health)
await node.mountRlnRelay(
getWakuRlnConfig(manager = manager, index = MembershipIndex(1))
)
node.mountLightPushClient()
await node.mountFilterClient()
# We don't have a Waku, so we need to set the overall health to READY here in its behalf
healthMonitor.setOverallHealth(HealthStatus.READY)
# When
var response = await client.healthCheck()
let report = response.data
# Then
check:
response.status == 200
$response.contentType == $MIMETYPE_JSON
report.nodeHealth == HealthStatus.READY
report.protocolsHealth.len() == 13
report.getHealth(RelayProtocol).health == HealthStatus.NOT_READY
report.getHealth(RelayProtocol).desc == some("No connected peers")
report.getHealth(RlnRelayProtocol).health == HealthStatus.READY
report.getHealth(LightpushProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(LegacyLightpushProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(FilterProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(StoreProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(PeerExchangeProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(RendezvousProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(MixProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(LightpushClientProtocol).health == HealthStatus.NOT_READY
report.getHealth(LightpushClientProtocol).desc ==
some("No Lightpush service peer available yet")
report.getHealth(LegacyLightpushClientProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(StoreClientProtocol).health == HealthStatus.NOT_MOUNTED
report.getHealth(FilterClientProtocol).health == HealthStatus.NOT_READY
report.getHealth(FilterClientProtocol).desc ==
some("No Filter service peer available yet")
await restServer.stop()
await restServer.closeWait()
await node.stop()