Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(autosharding): Functional Tests #2318

Merged
merged 3 commits into from
Jan 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
SionoiS marked this conversation as resolved.
Show resolved Hide resolved
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
Loading