2023-03-03 10:07:25 +01:00
{. used . }
import
2023-08-01 09:05:16 -04:00
std / options ,
2023-03-03 10:07:25 +01:00
stew / results ,
testutils / unittests
import
2023-08-09 18:11:50 +01:00
.. / .. / .. / 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 " :
2023-03-03 10:07:25 +01:00
2023-03-07 11:10:36 +01:00
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
2023-03-03 10:07:25 +01:00
err . cause = = " topic must start with slash "
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
2023-11-30 11:11:33 +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
2023-11-30 11:11:33 +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 named sharding pub-sub topic " :
## Given
var ns = NsPubsubTopic . named ( " waku-dev " )
## When
let topic = $ ns
## Then
check :
topic = = " /waku/2/waku-dev "
test " Stringify static sharding pub-sub topic " :
## Given
2023-10-05 08:37:05 -04:00
var ns = NsPubsubTopic . staticSharding ( clusterId = 0 , shardId = 2 )
2023-03-07 11:10:36 +01:00
## When
let topic = $ ns
## Then
check :
topic = = " /waku/2/rs/0/2 "
test " Parse named pub-sub topic string - Valid string " :
## Given
let topic = " /waku/2/waku-dev "
## When
let nsRes = NsPubsubTopic . parse ( topic )
## Then
check nsRes . isOk ( )
let ns = nsRes . get ( )
check :
ns . name = = " waku-dev "
test " Parse static sharding pub-sub topic string - Valid string " :
## Given
let topic = " /waku/2/rs/16/42 "
## When
let nsRes = NsPubsubTopic . parse ( topic )
## Then
check nsRes . isOk ( )
let ns = nsRes . get ( )
check :
2023-10-05 08:37:05 -04:00
ns . clusterId = = 16
ns . 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
let ns = NsPubsubTopic . parse ( topic )
## Then
check ns . isErr ( )
let err = ns . tryError ( )
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
let ns = NsPubsubTopic . parse ( topic )
## Then
check ns . isErr ( )
let err = ns . tryError ( )
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
let ns = NsPubsubTopic . parse ( topic )
## Then
check ns . isErr ( )
let err = ns . tryError ( )
check :
err . kind = = ParsingErrorKind . InvalidFormat