Skip to content

Commit ad19781

Browse files
author
Lorenzo Delgado
committed
feat(archive): add waku archive implementation
1 parent 59c18ab commit ad19781

25 files changed

+3890
-9
lines changed

tests/all_tests_v2.nim

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,31 @@
11
import
2-
# Waku common tests
2+
# Waku common test suite
33
./v2/test_envvar_serialization,
44
./v2/test_confutils_envvar,
55
./v2/test_sqlite_migrations
66

77
import
8-
# Waku v2 tests
9-
./v2/test_wakunode,
10-
./v2/test_wakunode_relay,
11-
# Waku Store
8+
# Waku archive test suite
9+
./v2/waku_archive/test_driver_queue_index,
10+
./v2/waku_archive/test_driver_queue_pagination,
11+
./v2/waku_archive/test_driver_queue,
12+
./v2/waku_archive/test_driver_sqlite_query,
13+
./v2/waku_archive/test_driver_sqlite,
14+
./v2/waku_archive/test_retention_policy,
15+
./v2/waku_archive/test_waku_archive,
16+
17+
# TODO: Remove with the implementation
1218
./v2/test_message_store_queue_index,
1319
./v2/test_message_store_queue_pagination,
1420
./v2/test_message_store_queue,
1521
./v2/test_message_store_sqlite_query,
16-
./v2/test_message_store_sqlite,
22+
./v2/test_message_store_sqlite
23+
24+
import
25+
# Waku v2 tests
26+
./v2/test_wakunode,
27+
./v2/test_wakunode_relay,
28+
# Waku Store
1729
./v2/test_waku_store_rpc_codec,
1830
./v2/test_waku_store,
1931
./v2/test_waku_store_client,
@@ -53,7 +65,7 @@ import
5365
./v2/test_utils_keyfile
5466

5567
when defined(rln):
56-
import
68+
import
5769
./v2/test_waku_rln_relay,
5870
./v2/test_wakunode_rln_relay
5971
when defined(onchain_rln):

tests/v2/test_sqlite_migrations.nim

+27-2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,38 @@ import
55
stew/results,
66
testutils/unittests
77
import
8+
../../waku/common/sqlite/database,
89
../../waku/common/sqlite/migrations {.all.}
910

11+
12+
proc newTestDatabase(): SqliteDatabase =
13+
SqliteDatabase.new(":memory:").tryGet()
14+
1015
template sourceDir: string = currentSourcePath.rsplit(DirSep, 1)[0]
1116

1217

1318
suite "SQLite - migrations":
1419

20+
test "set and get user version":
21+
## Given
22+
let database = newTestDatabase()
23+
24+
## When
25+
let setRes = database.setUserVersion(5)
26+
let getRes = database.getUserVersion()
27+
28+
## Then
29+
check:
30+
setRes.isOk()
31+
getRes.isOk()
32+
33+
let version = getRes.tryGet()
34+
check:
35+
version == 5
36+
37+
## Cleanup
38+
database.close()
39+
1540
test "filter and order migration script file paths":
1641
## Given
1742
let paths = @[
@@ -64,7 +89,7 @@ suite "SQLite - migrations":
6489

6590
## When
6691
let statements = script.breakIntoStatements()
67-
92+
6893
## Then
6994
check:
7095
statements == @[statement1, statement2]
@@ -91,5 +116,5 @@ suite "SQLite - migrations":
91116
let statements = script.breakIntoStatements()
92117

93118
## Then
94-
check:
119+
check:
95120
statements == @[statement1, statement2]
+186
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
{.used.}
2+
3+
import
4+
std/options,
5+
stew/results,
6+
testutils/unittests
7+
import
8+
../../../waku/v2/protocol/waku_archive,
9+
../../../waku/v2/protocol/waku_archive/driver/queue_driver/queue_driver {.all.},
10+
../../../waku/v2/protocol/waku_archive/driver/queue_driver/index,
11+
../../../waku/v2/protocol/waku_message,
12+
../../../waku/v2/utils/time
13+
14+
15+
# Helper functions
16+
17+
proc genIndexedWakuMessage(i: int8): IndexedWakuMessage =
18+
## Use i to generate an IndexedWakuMessage
19+
var data {.noinit.}: array[32, byte]
20+
for x in data.mitems: x = i.byte
21+
22+
let
23+
message = WakuMessage(payload: @[byte i], timestamp: Timestamp(i))
24+
cursor = Index(
25+
receiverTime: Timestamp(i),
26+
senderTime: Timestamp(i),
27+
digest: MessageDigest(data: data),
28+
pubsubTopic: "test-pubsub-topic"
29+
)
30+
31+
IndexedWakuMessage(msg: message, index: cursor)
32+
33+
proc getPrepopulatedTestQueue(unsortedSet: auto, capacity: int): QueueDriver =
34+
let driver = QueueDriver.new(capacity)
35+
36+
for i in unsortedSet:
37+
let message = genIndexedWakuMessage(i.int8)
38+
discard driver.add(message)
39+
40+
driver
41+
42+
43+
procSuite "Sorted driver queue":
44+
45+
test "queue capacity - add a message over the limit":
46+
## Given
47+
let capacity = 5
48+
let driver = QueueDriver.new(capacity)
49+
50+
## When
51+
# Fill up the queue
52+
for i in 1..capacity:
53+
let message = genIndexedWakuMessage(i.int8)
54+
require(driver.add(message).isOk())
55+
56+
# Add one more. Capacity should not be exceeded
57+
let message = genIndexedWakuMessage(capacity.int8 + 1)
58+
require(driver.add(message).isOk())
59+
60+
## Then
61+
check:
62+
driver.len == capacity
63+
64+
test "queue capacity - add message older than oldest in the queue":
65+
## Given
66+
let capacity = 5
67+
let driver = QueueDriver.new(capacity)
68+
69+
## When
70+
# Fill up the queue
71+
for i in 1..capacity:
72+
let message = genIndexedWakuMessage(i.int8)
73+
require(driver.add(message).isOk())
74+
75+
# Attempt to add message with older value than oldest in queue should fail
76+
let
77+
oldestTimestamp = driver.first().get().index.senderTime
78+
message = genIndexedWakuMessage(oldestTimestamp.int8 - 1)
79+
addRes = driver.add(message)
80+
81+
## Then
82+
check:
83+
addRes.isErr()
84+
addRes.error() == "too_old"
85+
86+
check:
87+
driver.len == capacity
88+
89+
test "queue sort-on-insert":
90+
## Given
91+
let
92+
capacity = 5
93+
unsortedSet = [5,1,3,2,4]
94+
let driver = getPrepopulatedTestQueue(unsortedSet, capacity)
95+
96+
# Walk forward through the set and verify ascending order
97+
var prevSmaller = genIndexedWakuMessage(min(unsortedSet).int8 - 1).index
98+
for i in driver.fwdIterator:
99+
let (index, _) = i
100+
check cmp(index, prevSmaller) > 0
101+
prevSmaller = index
102+
103+
# Walk backward through the set and verify descending order
104+
var prevLarger = genIndexedWakuMessage(max(unsortedSet).int8 + 1).index
105+
for i in driver.bwdIterator:
106+
let (index, _) = i
107+
check cmp(index, prevLarger) < 0
108+
prevLarger = index
109+
110+
test "access first item from queue":
111+
## Given
112+
let
113+
capacity = 5
114+
unsortedSet = [5,1,3,2,4]
115+
let driver = getPrepopulatedTestQueue(unsortedSet, capacity)
116+
117+
## When
118+
let firstRes = driver.first()
119+
120+
## Then
121+
check:
122+
firstRes.isOk()
123+
124+
let first = firstRes.tryGet()
125+
check:
126+
first.msg.timestamp == Timestamp(1)
127+
128+
test "get first item from empty queue should fail":
129+
## Given
130+
let capacity = 5
131+
let driver = QueueDriver.new(capacity)
132+
133+
## When
134+
let firstRes = driver.first()
135+
136+
## Then
137+
check:
138+
firstRes.isErr()
139+
firstRes.error() == "Not found"
140+
141+
test "access last item from queue":
142+
## Given
143+
let
144+
capacity = 5
145+
unsortedSet = [5,1,3,2,4]
146+
let driver = getPrepopulatedTestQueue(unsortedSet, capacity)
147+
148+
## When
149+
let lastRes = driver.last()
150+
151+
## Then
152+
check:
153+
lastRes.isOk()
154+
155+
let last = lastRes.tryGet()
156+
check:
157+
last.msg.timestamp == Timestamp(5)
158+
159+
test "get last item from empty queue should fail":
160+
## Given
161+
let capacity = 5
162+
let driver = QueueDriver.new(capacity)
163+
164+
## When
165+
let lastRes = driver.last()
166+
167+
## Then
168+
check:
169+
lastRes.isErr()
170+
lastRes.error() == "Not found"
171+
172+
test "verify if queue contains an index":
173+
## Given
174+
let
175+
capacity = 5
176+
unsortedSet = [5,1,3,2,4]
177+
let driver = getPrepopulatedTestQueue(unsortedSet, capacity)
178+
179+
let
180+
existingIndex = genIndexedWakuMessage(4).index
181+
nonExistingIndex = genIndexedWakuMessage(99).index
182+
183+
## Then
184+
check:
185+
driver.contains(existingIndex) == true
186+
driver.contains(nonExistingIndex) == false

0 commit comments

Comments
 (0)