2023-03-03 10:07:25 +01:00
{. used . }
2024-07-09 13:14:28 +02:00
import std / options , results , testutils / unittests
2024-07-06 03:33:38 +05:30
import waku / waku_core / topics
2023-03-03 10:07:25 +01:00
2023-03-07 11:10:36 +01:00
suite " Waku Message - Content topics namespacing " :
test " Stringify namespaced content topic " :
2023-03-03 10:07:25 +01:00
## Given
2023-03-07 11:10:36 +01:00
var ns = NsContentTopic ( )
2023-08-01 09:05:16 -04:00
ns . generation = none ( int )
2023-03-07 11:10:36 +01:00
ns . application = " toychat "
2023-03-03 10:07:25 +01:00
ns . version = " 2 "
2023-03-07 11:10:36 +01:00
ns . name = " huilong "
2023-03-03 10:07:25 +01:00
ns . encoding = " proto "
## When
let topic = $ ns
## Then
check :
2023-03-07 11:10:36 +01:00
topic = = " /toychat/2/huilong/proto "
2023-03-03 10:07:25 +01:00
2023-03-07 11:10:36 +01:00
test " Parse content topic string - Valid string " :
2023-03-03 10:07:25 +01:00
## Given
2023-03-07 11:10:36 +01:00
let topic = " /toychat/2/huilong/proto "
2023-03-03 10:07:25 +01:00
## When
2023-03-07 11:10:36 +01:00
let nsRes = NsContentTopic . parse ( topic )
2023-03-03 10:07:25 +01:00
## Then
2023-08-01 09:05:16 -04:00
assert nsRes . isOk ( ) , $ nsRes . error
2023-03-03 10:07:25 +01:00
let ns = nsRes . get ( )
check :
2023-08-01 09:05:16 -04:00
ns . generation = = none ( int )
ns . application = = " toychat "
ns . version = = " 2 "
ns . name = = " huilong "
ns . encoding = = " proto "
test " Parse content topic string - Valid string with sharding " :
## Given
2023-08-17 08:11:18 -04:00
let topic = " /0/toychat/2/huilong/proto "
2023-08-01 09:05:16 -04:00
## When
let nsRes = NsContentTopic . parse ( topic )
## Then
assert nsRes . isOk ( ) , $ nsRes . error
let ns = nsRes . get ( )
check :
ns . generation = = some ( 0 )
2023-03-07 11:10:36 +01:00
ns . application = = " toychat "
2023-03-03 10:07:25 +01:00
ns . version = = " 2 "
2023-03-07 11:10:36 +01:00
ns . name = = " huilong "
2023-03-03 10:07:25 +01:00
ns . encoding = = " proto "
2023-03-07 11:10:36 +01:00
test " Parse content topic string - Invalid string: missing leading slash " :
2023-03-03 10:07:25 +01:00
## Given
2023-03-07 11:10:36 +01:00
let topic = " toychat/2/huilong/proto "
2023-03-03 10:07:25 +01:00
## When
2023-03-07 11:10:36 +01:00
let ns = NsContentTopic . parse ( topic )
2023-03-03 10:07:25 +01:00
## Then
2023-08-01 09:05:16 -04:00
assert ns . isErr ( ) , $ ns . get ( )
2023-03-03 10:07:25 +01:00
let err = ns . tryError ( )
check :
2023-03-07 11:10:36 +01:00
err . kind = = ParsingErrorKind . InvalidFormat
2024-06-20 18:38:55 +05:30
err . cause = = " content-topic ' " & topic & " ' must start with slash "
2023-03-03 10:07:25 +01:00
2023-03-07 11:10:36 +01:00
test " Parse content topic string - Invalid string: not namespaced " :
2023-03-03 10:07:25 +01:00
## Given
let topic = " /this-is-not-namespaced "
## When
2023-03-07 11:10:36 +01:00
let ns = NsContentTopic . parse ( topic )
2023-03-03 10:07:25 +01:00
## Then
2023-08-01 09:05:16 -04:00
assert ns . isErr ( ) , $ ns . get ( )
2023-03-03 10:07:25 +01:00
let err = ns . tryError ( )
check :
2023-03-07 11:10:36 +01:00
err . kind = = ParsingErrorKind . InvalidFormat
2024-03-16 00:08:47 +01:00
err . cause = =
" Invalid content topic structure. Expected either /<application>/<version>/<topic-name>/<encoding> or /<gen>/<application>/<version>/<topic-name>/<encoding> "
2023-03-03 10:07:25 +01:00
2023-03-07 11:10:36 +01:00
test " Parse content topic string - Invalid string: missing encoding part " :
2023-03-03 10:07:25 +01:00
## Given
2023-03-07 11:10:36 +01:00
let topic = " /toychat/2/huilong "
2023-03-03 10:07:25 +01:00
## When
2023-03-07 11:10:36 +01:00
let ns = NsContentTopic . parse ( topic )
2023-03-03 10:07:25 +01:00
## Then
2023-08-01 09:05:16 -04:00
assert ns . isErr ( ) , $ ns . get ( )
2023-03-03 10:07:25 +01:00
let err = ns . tryError ( )
check :
2023-03-07 11:10:36 +01:00
err . kind = = ParsingErrorKind . InvalidFormat
2024-03-16 00:08:47 +01:00
err . cause = =
" Invalid content topic structure. Expected either /<application>/<version>/<topic-name>/<encoding> or /<gen>/<application>/<version>/<topic-name>/<encoding> "
2023-03-03 10:07:25 +01:00
2023-08-01 09:05:16 -04:00
test " Parse content topic string - Invalid string: wrong extra parts " :
2023-03-03 10:07:25 +01:00
## Given
2023-03-07 11:10:36 +01:00
let topic = " /toychat/2/huilong/proto/33 "
2023-03-03 10:07:25 +01:00
## When
2023-03-07 11:10:36 +01:00
let ns = NsContentTopic . parse ( topic )
2023-03-03 10:07:25 +01:00
## Then
2023-08-01 09:05:16 -04:00
assert ns . isErr ( ) , $ ns . get ( )
2023-03-03 10:07:25 +01:00
let err = ns . tryError ( )
check :
2023-03-07 11:10:36 +01:00
err . kind = = ParsingErrorKind . InvalidFormat
2023-08-17 08:11:18 -04:00
err . cause = = " generation should be a numeric value "
2023-03-03 10:07:25 +01:00
2023-08-01 09:05:16 -04:00
test " Parse content topic string - Invalid string: non numeric generation " :
## Given
2023-08-17 08:11:18 -04:00
let topic = " /first/toychat/2/huilong/proto "
2023-08-01 09:05:16 -04:00
## When
let ns = NsContentTopic . parse ( topic )
## Then
assert ns . isErr ( ) , $ ns . get ( )
let err = ns . tryError ( )
check :
err . kind = = ParsingErrorKind . InvalidFormat
err . cause = = " generation should be a numeric value "
2023-03-07 11:10:36 +01:00
suite " Waku Message - Pub-sub topics namespacing " :
test " Stringify static sharding pub-sub topic " :
## Given
2024-09-10 15:07:12 -06:00
var shard = RelayShard ( clusterId : 0 , shardId : 2 )
2023-03-07 11:10:36 +01:00
## When
2024-08-19 11:29:35 +02:00
let topic = $ shard
2023-03-07 11:10:36 +01:00
## Then
check :
topic = = " /waku/2/rs/0/2 "
2024-07-09 18:36:12 +03:00
test " Parse invalid pub-sub topic string " :
2023-03-07 11:10:36 +01:00
## Given
let topic = " /waku/2/waku-dev "
## When
2024-08-19 11:29:35 +02:00
let shardRes = RelayShard . parse ( topic )
2023-03-07 11:10:36 +01:00
## Then
2024-08-19 11:29:35 +02:00
check shardRes . isErr ( )
let err = shardRes . tryError ( )
2023-03-07 11:10:36 +01:00
check :
2024-07-09 18:36:12 +03:00
err . kind = = ParsingErrorKind . InvalidFormat
2023-03-07 11:10:36 +01:00
test " Parse static sharding pub-sub topic string - Valid string " :
## Given
let topic = " /waku/2/rs/16/42 "
## When
2024-08-19 11:29:35 +02:00
let shardRes = RelayShard . parse ( topic )
2023-03-07 11:10:36 +01:00
## Then
2024-08-19 11:29:35 +02:00
check shardRes . isOk ( )
2023-03-07 11:10:36 +01:00
2024-08-19 11:29:35 +02:00
let shard = shardRes . get ( )
2023-03-07 11:10:36 +01:00
check :
2024-08-19 11:29:35 +02:00
shard . clusterId = = 16
shard . shardId = = 42
2023-03-07 11:10:36 +01:00
test " Parse pub-sub topic string - Invalid string: invalid protocol version " :
## Given
let topic = " /waku/1/rs/16/42 "
## When
2024-08-19 11:29:35 +02:00
let shard = RelayShard . parse ( topic )
2023-03-07 11:10:36 +01:00
## Then
2024-08-19 11:29:35 +02:00
check shard . isErr ( )
let err = shard . tryError ( )
2023-03-07 11:10:36 +01:00
check :
err . kind = = ParsingErrorKind . InvalidFormat
2023-10-05 08:37:05 -04:00
test " Parse static sharding pub-sub topic string - Invalid string: empty cluster id value " :
2023-03-07 11:10:36 +01:00
## Given
let topic = " /waku/2/rs//02 "
## When
2024-08-19 11:29:35 +02:00
let shard = RelayShard . parse ( topic )
2023-03-07 11:10:36 +01:00
## Then
2024-08-19 11:29:35 +02:00
check shard . isErr ( )
let err = shard . tryError ( )
2023-03-07 11:10:36 +01:00
check :
err . kind = = ParsingErrorKind . MissingPart
2023-10-05 08:37:05 -04:00
err . part = = " cluster_id "
2023-03-07 11:10:36 +01:00
2023-10-05 08:37:05 -04:00
test " Parse static sharding pub-sub topic string - Invalid string: cluster id value " :
2023-03-07 11:10:36 +01:00
## Given
let topic = " /waku/2/rs/xx/77 "
## When
2024-08-19 11:29:35 +02:00
let shard = RelayShard . parse ( topic )
2023-03-07 11:10:36 +01:00
## Then
2024-08-19 11:29:35 +02:00
check shard . isErr ( )
let err = shard . tryError ( )
2023-03-07 11:10:36 +01:00
check :
err . kind = = ParsingErrorKind . InvalidFormat