logos-messaging-nim/tests/api/test_node_conf.nim
fryorcraken bc8acf7611
feat: Waku API create node (#3580)
* introduce createNode

# Conflicts:
#	apps/wakunode2/cli_args.nim

* remove confutils dependency on the library

* test: remove websocket in default test config

* update to latest specs

* test: cli_args

* align to spec changes (sovereign, message conf, entrypoints

* accept enr, entree and multiaddr as entry points

* post rebase

* format

* change from "sovereign" to "core"

* add example

* get example to continue running

* nitpicks

* idiomatic constructors

* fix enum naming

* replace procs with consts

* remove messageConfirmation

* use pure enum

* rename example file
2025-10-01 16:31:34 +10:00

278 lines
8.1 KiB
Nim

{.used.}
import std/options, results, stint, testutils/unittests
import waku/api/api_conf, waku/factory/waku_conf, waku/factory/networks_config
suite "LibWaku Conf - toWakuConf":
test "Minimal configuration":
## Given
let nodeConfig = NodeConfig.init(ethRpcEndpoints = @["http://someaddress"])
## When
let wakuConfRes = toWakuConf(nodeConfig)
## Then
let wakuConf = wakuConfRes.valueOr:
raiseAssert error
wakuConf.validate().isOkOr:
raiseAssert error
check:
wakuConf.clusterId == 1
wakuConf.shardingConf.numShardsInCluster == 8
wakuConf.staticNodes.len == 0
test "Core mode configuration":
## Given
let wakuConfig = WakuConfig.init(entryNodes = @[], clusterId = 1)
let nodeConfig = NodeConfig.init(mode = Core, wakuConfig = wakuConfig)
## When
let wakuConfRes = toWakuConf(nodeConfig)
## Then
require wakuConfRes.isOk()
let wakuConf = wakuConfRes.get()
require wakuConf.validate().isOk()
check:
wakuConf.relay == true
wakuConf.lightPush == true
wakuConf.peerExchangeService == true
wakuConf.clusterId == 1
test "Auto-sharding configuration":
## Given
let nodeConfig = NodeConfig.init(
mode = Core,
wakuConfig = WakuConfig.init(
entryNodes = @[],
staticStoreNodes = @[],
clusterId = 42,
autoShardingConfig = AutoShardingConfig(numShardsInCluster: 16),
),
)
## When
let wakuConfRes = toWakuConf(nodeConfig)
## Then
require wakuConfRes.isOk()
let wakuConf = wakuConfRes.get()
require wakuConf.validate().isOk()
check:
wakuConf.clusterId == 42
wakuConf.shardingConf.numShardsInCluster == 16
test "Bootstrap nodes configuration":
## Given
let entryNodes =
@[
"enr:-QESuEC1p_s3xJzAC_XlOuuNrhVUETmfhbm1wxRGis0f7DlqGSw2FM-p2Vn7gmfkTTnAe8Ys2cgGBN8ufJnvzKQFZqFMBgmlkgnY0iXNlY3AyNTZrMaEDS8-D878DrdbNwcuY-3p1qdDp5MOoCurhdsNPJTXZ3c5g3RjcIJ2X4N1ZHCCd2g",
"enr:-QEkuECnZ3IbVAgkOzv-QLnKC4dRKAPRY80m1-R7G8jZ7yfT3ipEfBrhKN7ARcQgQ-vg-h40AQzyvAkPYlHPaFKk6u9MBgmlkgnY0iXNlY3AyNTZrMaEDk49D8JjMSns4p1XVNBvJquOUzT4PENSJknkROspfAFGg3RjcIJ2X4N1ZHCCd2g",
]
let libConf = NodeConfig.init(
mode = Core,
wakuConfig =
WakuConfig.init(entryNodes = entryNodes, staticStoreNodes = @[], clusterId = 1),
)
## When
let wakuConfRes = toWakuConf(libConf)
## Then
require wakuConfRes.isOk()
let wakuConf = wakuConfRes.get()
require wakuConf.validate().isOk()
require wakuConf.discv5Conf.isSome()
check:
wakuConf.discv5Conf.get().bootstrapNodes == entryNodes
test "Static store nodes configuration":
## Given
let staticStoreNodes =
@[
"/ip4/127.0.0.1/tcp/60000/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc",
"/ip4/192.168.1.1/tcp/60001/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYd",
]
let nodeConf = NodeConfig.init(
wakuConfig = WakuConfig.init(
entryNodes = @[], staticStoreNodes = staticStoreNodes, clusterId = 1
)
)
## When
let wakuConfRes = toWakuConf(nodeConf)
## Then
require wakuConfRes.isOk()
let wakuConf = wakuConfRes.get()
require wakuConf.validate().isOk()
check:
wakuConf.staticNodes == staticStoreNodes
test "Message validation with max message size":
## Given
let nodeConfig = NodeConfig.init(
wakuConfig = WakuConfig.init(
entryNodes = @[],
staticStoreNodes = @[],
clusterId = 1,
messageValidation =
MessageValidation(maxMessageSize: "100KiB", rlnConfig: none(RlnConfig)),
)
)
## When
let wakuConfRes = toWakuConf(nodeConfig)
## Then
require wakuConfRes.isOk()
let wakuConf = wakuConfRes.get()
require wakuConf.validate().isOk()
check:
wakuConf.maxMessageSizeBytes == 100'u64 * 1024'u64
test "Message validation with RLN config":
## Given
let nodeConfig = NodeConfig.init(
wakuConfig = WakuConfig.init(
entryNodes = @[],
clusterId = 1,
messageValidation = MessageValidation(
maxMessageSize: "150 KiB",
rlnConfig: some(
RlnConfig(
contractAddress: "0x1234567890123456789012345678901234567890",
chainId: 1'u,
epochSizeSec: 600'u64,
)
),
),
),
ethRpcEndpoints = @["http://127.0.0.1:1111"],
)
## When
let wakuConf = toWakuConf(nodeConfig).valueOr:
raiseAssert error
wakuConf.validate().isOkOr:
raiseAssert error
check:
wakuConf.maxMessageSizeBytes == 150'u64 * 1024'u64
require wakuConf.rlnRelayConf.isSome()
let rlnConf = wakuConf.rlnRelayConf.get()
check:
rlnConf.dynamic == true
rlnConf.ethContractAddress == "0x1234567890123456789012345678901234567890"
rlnConf.chainId == 1'u256
rlnConf.epochSizeSec == 600'u64
test "Full Core mode configuration with all fields":
## Given
let nodeConfig = NodeConfig.init(
mode = Core,
wakuConfig = WakuConfig.init(
entryNodes =
@[
"enr:-QESuEC1p_s3xJzAC_XlOuuNrhVUETmfhbm1wxRGis0f7DlqGSw2FM-p2Vn7gmfkTTnAe8Ys2cgGBN8ufJnvzKQFZqFMBgmlkgnY0iXNlY3AyNTZrMaEDS8-D878DrdbNwcuY-3p1qdDp5MOoCurhdsNPJTXZ3c5g3RjcIJ2X4N1ZHCCd2g"
],
staticStoreNodes =
@[
"/ip4/127.0.0.1/tcp/60000/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc"
],
clusterId = 99,
autoShardingConfig = AutoShardingConfig(numShardsInCluster: 12),
messageValidation = MessageValidation(
maxMessageSize: "512KiB",
rlnConfig: some(
RlnConfig(
contractAddress: "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
chainId: 5'u, # Goerli
epochSizeSec: 300'u64,
)
),
),
),
ethRpcEndpoints = @["https://127.0.0.1:8333"],
)
## When
let wakuConfRes = toWakuConf(nodeConfig)
## Then
let wakuConf = wakuConfRes.valueOr:
raiseAssert error
wakuConf.validate().isOkOr:
raiseAssert error
# Check basic settings
check:
wakuConf.relay == true
wakuConf.lightPush == true
wakuConf.peerExchangeService == true
wakuConf.rendezvous == true
wakuConf.clusterId == 99
# Check sharding
check:
wakuConf.shardingConf.numShardsInCluster == 12
# Check bootstrap nodes
require wakuConf.discv5Conf.isSome()
check:
wakuConf.discv5Conf.get().bootstrapNodes.len == 1
# Check static nodes
check:
wakuConf.staticNodes.len == 1
wakuConf.staticNodes[0] ==
"/ip4/127.0.0.1/tcp/60000/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc"
# Check message validation
check:
wakuConf.maxMessageSizeBytes == 512'u64 * 1024'u64
# Check RLN config
require wakuConf.rlnRelayConf.isSome()
let rlnConf = wakuConf.rlnRelayConf.get()
check:
rlnConf.dynamic == true
rlnConf.ethContractAddress == "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
rlnConf.chainId == 5'u256
rlnConf.epochSizeSec == 300'u64
test "NodeConfig with mixed entry nodes (integration test)":
## Given
let entryNodes =
@[
"enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im",
"/ip4/127.0.0.1/tcp/60000/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc",
]
let nodeConfig = NodeConfig.init(
mode = Core,
wakuConfig =
WakuConfig.init(entryNodes = entryNodes, staticStoreNodes = @[], clusterId = 1),
)
## When
let wakuConfRes = toWakuConf(nodeConfig)
## Then
require wakuConfRes.isOk()
let wakuConf = wakuConfRes.get()
require wakuConf.validate().isOk()
# Check that ENRTree went to DNS discovery
require wakuConf.dnsDiscoveryConf.isSome()
check:
wakuConf.dnsDiscoveryConf.get().enrTreeUrl == entryNodes[0]
# Check that multiaddr went to static nodes
check:
wakuConf.staticNodes.len == 1
wakuConf.staticNodes[0] == entryNodes[1]