Skip to content

Commit

Permalink
test(autosharding): Functional Tests (#2318)
Browse files Browse the repository at this point in the history
* Implement autosharding tests.
  • Loading branch information
AlejandroCabeza authored Jan 4, 2024
1 parent b0c7805 commit 3bbe234
Show file tree
Hide file tree
Showing 4 changed files with 182 additions and 146 deletions.
28 changes: 28 additions & 0 deletions tests/testlib/tables.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import
std/[
tables,
sequtils,
options
]

import
../../../waku/waku_core/topics,
../testlib/wakucore





proc `==`*(table: Table[pubsub_topic.NsPubsubTopic, seq[NsContentTopic]], other: array[0..0, (string, seq[string])]): bool =
let otherTyped = other.map(
proc(item: (string, seq[string])): (NsPubsubTopic, seq[NsContentTopic]) =
let
(pubsubTopic, contentTopics) = item
nsPubsubTopic = NsPubsubTopic.parse(pubsubTopic).value()
nsContentTopics = contentTopics.map(
proc(contentTopic: string): NsContentTopic = NsContentTopic.parse(contentTopic).value()
)
return (nsPubsubTopic, nsContentTopics)
)

table == otherTyped.toTable()
145 changes: 0 additions & 145 deletions tests/waku_core/test_sharding.nim

This file was deleted.

153 changes: 153 additions & 0 deletions tests/waku_core/topics/test_sharding.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
import
std/[
options,
tables
],
testutils/unittests


import
../../../../waku/waku_core/topics,
../../testlib/[
wakucore,
tables,
testutils
]


suite "Autosharding":
const
pubsubTopic04 = "/waku/2/rs/0/4"
pubsubTopic13 = "/waku/2/rs/1/3"
contentTopicShort = "/toychat/2/huilong/proto"
contentTopicFull = "/0/toychat/2/huilong/proto"
contentTopicInvalid = "/1/toychat/2/huilong/proto"


suite "getGenZeroShard":
test "Generate Gen0 Shard":
# Given two valid topics
let
nsContentTopic1 = NsContentTopic.parse(contentTopicShort).value()
nsContentTopic2 = NsContentTopic.parse(contentTopicFull).value()

# When we generate a gen0 shard from them
let
nsPubsubTopic1 = getGenZeroShard(nsContentTopic1, GenerationZeroShardsCount)
nsPubsubTopic2 = getGenZeroShard(nsContentTopic2, GenerationZeroShardsCount)

# Then the generated shards are valid
check:
nsPubsubTopic1 == NsPubsubTopic.staticSharding(ClusterId, 3)
nsPubsubTopic2 == NsPubsubTopic.staticSharding(ClusterId, 3)

suite "getShard from NsContentTopic":
test "Generate Gen0 Shard with topic.generation==none":
# When we get a shard from a topic without generation
let nsPubsubTopic = getShard(contentTopicShort)

# Then the generated shard is valid
check:
nsPubsubTopic.value() == NsPubsubTopic.staticSharding(ClusterId, 3)

test "Generate Gen0 Shard with topic.generation==0":
# When we get a shard from a gen0 topic
let nsPubsubTopic = getShard(contentTopicFull)

# Then the generated shard is valid
check:
nsPubsubTopic.value() == NsPubsubTopic.staticSharding(ClusterId, 3)

test "Generate Gen0 Shard with topic.generation==other":
# When we get a shard from ain invalid content topic
let nsPubsubTopic = getShard(contentTopicInvalid)

# Then the generated shard is valid
check:
nsPubsubTopic.error() == "Generation > 0 are not supported yet"

suite "getShard from ContentTopic":
test "Generate Gen0 Shard with topic.generation==none":
# When we get a shard from it
let nsPubsubTopic = getShard(contentTopicShort)

# Then the generated shard is valid
check:
nsPubsubTopic.value() == NsPubsubTopic.staticSharding(ClusterId, 3)

test "Generate Gen0 Shard with topic.generation==0":
# When we get a shard from it
let nsPubsubTopic = getShard(contentTopicFull)

# Then the generated shard is valid
check:
nsPubsubTopic.value() == NsPubsubTopic.staticSharding(ClusterId, 3)

test "Generate Gen0 Shard with topic.generation==other":
# When we get a shard from it
let nsPubsubTopic = getShard(contentTopicInvalid)

# Then the generated shard is valid
check:
nsPubsubTopic.error() == "Generation > 0 are not supported yet"

test "Generate Gen0 Shard invalid topic":
# When we get a shard from it
let nsPubsubTopic = getShard("invalid")

# Then the generated shard is valid
check:
nsPubsubTopic.error() == "invalid format: topic must start with slash"

suite "parseSharding":
test "contentTopics is ContentTopic":
# When calling with contentTopic as string
let topicMap = parseSharding(some(pubsubTopic04), contentTopicShort)

# Then the topicMap is valid
check:
topicMap.value() == {pubsubTopic04: @[contentTopicShort]}

test "contentTopics is seq[ContentTopic]":
# When calling with contentTopic as string seq
let topicMap = parseSharding(some(pubsubTopic04), @[contentTopicShort, "/0/foo/1/bar/proto"])

# Then the topicMap is valid
check:
topicMap.value() == {pubsubTopic04: @[contentTopicShort, "/0/foo/1/bar/proto"]}

test "pubsubTopic is none":
# When calling with pubsubTopic as none
let topicMap = parseSharding(PubsubTopic.none(), contentTopicShort)

# Then the topicMap is valid
check:
topicMap.value() == {pubsubTopic13: @[contentTopicShort]}

test "content parse error":
# When calling with pubsubTopic as none with invalid content
let topicMap = parseSharding(PubsubTopic.none(), "invalid")

# Then the topicMap is valid
check:
topicMap.error() == "Cannot parse content topic: invalid format: topic must start with slash"

test "pubsubTopic parse error":
# When calling with pubsubTopic as none with invalid content
let topicMap = parseSharding(some("invalid"), contentTopicShort)

# Then the topicMap is valid
check:
topicMap.error() == "Cannot parse pubsub topic: invalid format: must start with /waku/2"

test "pubsubTopic getShard error":
# When calling with pubsubTopic as none with invalid content
let topicMap = parseSharding(PubsubTopic.none(), contentTopicInvalid)

# Then the topicMap is valid
check:
topicMap.error() == "Cannot autoshard content topic: Generation > 0 are not supported yet"

xtest "catchable error on add to topicMap":
# TODO: Trigger a CatchableError or mock
discard
2 changes: 1 addition & 1 deletion waku/waku_core/topics/sharding.nim
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ proc parseSharding*(pubsubTopic: Option[PubsubTopic], contentTopics: ContentTopi
if shardsRes.isErr():
return err("Cannot autoshard content topic: " & $shardsRes.error)
else: shardsRes.get()

if not topicMap.hasKey(pubsub):
topicMap[pubsub] = @[]

Expand Down

0 comments on commit 3bbe234

Please sign in to comment.