Skip to content

Commit 7508907

Browse files
committed
fix: refactor delays in reliable channel tests
1 parent 1aad668 commit 7508907

File tree

5 files changed

+212
-260
lines changed

5 files changed

+212
-260
lines changed

packages/sdk/src/reliable_channel/reliable_channel.spec.ts

Lines changed: 67 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { expect } from "chai";
2525
import { beforeEach, describe } from "mocha";
2626
import sinon from "sinon";
2727

28+
import { waitForEvent } from "./test_utils.js";
29+
2830
import { ReliableChannel } from "./index.js";
2931

3032
const TEST_CONTENT_TOPIC = "/my-tests/0/topic-name/proto";
@@ -63,18 +65,12 @@ describe("Reliable Channel", () => {
6365

6466
// Setting up message tracking
6567
const messageId = reliableChannel.send(message);
66-
let messageSending = false;
67-
reliableChannel.addEventListener("sending-message", (event) => {
68-
if (event.detail === messageId) {
69-
messageSending = true;
70-
}
71-
});
7268

73-
while (!messageSending) {
74-
await delay(50);
75-
}
76-
77-
expect(messageSending).to.be.true;
69+
await waitForEvent<string>(
70+
reliableChannel,
71+
"sending-message",
72+
(id) => id === messageId
73+
);
7874
});
7975

8076
it("Outgoing message is emitted as sent", async () => {
@@ -90,19 +86,11 @@ describe("Reliable Channel", () => {
9086

9187
const messageId = reliableChannel.send(message);
9288

93-
// Setting up message tracking
94-
let messageSent = false;
95-
reliableChannel.addEventListener("message-sent", (event) => {
96-
if (event.detail === messageId) {
97-
messageSent = true;
98-
}
99-
});
100-
101-
while (!messageSent) {
102-
await delay(50);
103-
}
104-
105-
expect(messageSent).to.be.true;
89+
await waitForEvent<string>(
90+
reliableChannel,
91+
"message-sent",
92+
(id) => id === messageId
93+
);
10694
});
10795

10896
it("Encoder error raises irrecoverable error", async () => {
@@ -130,22 +118,11 @@ describe("Reliable Channel", () => {
130118
encoder.contentTopic = "...";
131119
const messageId = reliableChannel.send(message);
132120

133-
// Setting up message tracking
134-
let irrecoverableError = false;
135-
reliableChannel.addEventListener(
121+
await waitForEvent<{ messageId: string; error: any }>(
122+
reliableChannel,
136123
"sending-message-irrecoverable-error",
137-
(event) => {
138-
if (event.detail.messageId === messageId) {
139-
irrecoverableError = true;
140-
}
141-
}
124+
(detail) => detail.messageId === messageId
142125
);
143-
144-
while (!irrecoverableError) {
145-
await delay(50);
146-
}
147-
148-
expect(irrecoverableError).to.be.true;
149126
});
150127

151128
it("Outgoing message is not emitted as acknowledged from own outgoing messages", async () => {
@@ -205,39 +182,32 @@ describe("Reliable Channel", () => {
205182

206183
// Alice sets up message tracking for first message
207184
const firstMessageId = ReliableChannel.getMessageId(messages[0]);
208-
let firstMessagePossiblyAcknowledged = false;
209-
reliableChannelAlice.addEventListener(
210-
"message-possibly-acknowledged",
211-
(event) => {
212-
if (event.detail.messageId === firstMessageId) {
213-
firstMessagePossiblyAcknowledged = true;
214-
}
215-
}
185+
186+
const bobReceivedThirdPromise = waitForEvent<IDecodedMessage>(
187+
reliableChannelBob,
188+
"message-received",
189+
(msg) => bytesToUtf8(msg.payload) === "third"
216190
);
217191

218-
let messageReceived = false;
219-
reliableChannelBob.addEventListener("message-received", (event) => {
220-
if (bytesToUtf8(event.detail.payload) === "third") {
221-
messageReceived = true;
222-
}
223-
});
192+
const firstMessagePossiblyAckPromise = waitForEvent<{
193+
messageId: string;
194+
possibleAckCount: number;
195+
}>(
196+
reliableChannelAlice,
197+
"message-possibly-acknowledged",
198+
(detail) => detail.messageId === firstMessageId
199+
);
224200

225201
for (const m of messages) {
226202
reliableChannelAlice.send(m);
227203
}
228204

229205
// Wait for Bob to receive last message to ensure it is all included in filter
230-
while (!messageReceived) {
231-
await delay(50);
232-
}
206+
await bobReceivedThirdPromise;
233207

234-
// Bobs sends a message now, it should include first one in bloom filter
208+
// Bob sends a message now, it should include first one in bloom filter
235209
reliableChannelBob.send(utf8ToBytes("message back"));
236-
while (!firstMessagePossiblyAcknowledged) {
237-
await delay(50);
238-
}
239-
240-
expect(firstMessagePossiblyAcknowledged).to.be.true;
210+
await firstMessagePossiblyAckPromise;
241211
});
242212

243213
it("Outgoing message is acknowledged", async () => {
@@ -264,31 +234,23 @@ describe("Reliable Channel", () => {
264234

265235
const messageId = reliableChannelAlice.send(message);
266236

267-
// Alice sets up message tracking
268-
let messageAcknowledged = false;
269-
reliableChannelAlice.addEventListener("message-acknowledged", (event) => {
270-
if (event.detail === messageId) {
271-
messageAcknowledged = true;
272-
}
273-
});
237+
const bobReceivedPromise = waitForEvent<IDecodedMessage>(
238+
reliableChannelBob,
239+
"message-received"
240+
);
274241

275-
let bobReceivedMessage = false;
276-
reliableChannelBob.addEventListener("message-received", () => {
277-
bobReceivedMessage = true;
278-
});
242+
const messageAcknowledgedPromise = waitForEvent<string>(
243+
reliableChannelAlice,
244+
"message-acknowledged",
245+
(id) => id === messageId
246+
);
279247

280248
// Wait for bob to receive the message to ensure it's included in causal history
281-
while (!bobReceivedMessage) {
282-
await delay(50);
283-
}
249+
await bobReceivedPromise;
284250

285-
// Bobs sends a message now, it should include first one in causal history
251+
// Bob sends a message now, it should include first one in causal history
286252
reliableChannelBob.send(utf8ToBytes("second message in channel"));
287-
while (!messageAcknowledged) {
288-
await delay(50);
289-
}
290-
291-
expect(messageAcknowledged).to.be.true;
253+
await messageAcknowledgedPromise;
292254
});
293255

294256
it("Incoming message is emitted as received", async () => {
@@ -300,19 +262,17 @@ describe("Reliable Channel", () => {
300262
decoder
301263
);
302264

303-
let receivedMessage: IDecodedMessage;
304-
reliableChannel.addEventListener("message-received", (event) => {
305-
receivedMessage = event.detail;
306-
});
307-
308265
const message = utf8ToBytes("message in channel");
309266

267+
const receivedPromise = waitForEvent<IDecodedMessage>(
268+
reliableChannel,
269+
"message-received"
270+
);
271+
310272
reliableChannel.send(message);
311-
while (!receivedMessage!) {
312-
await delay(50);
313-
}
273+
const receivedMessage = await receivedPromise;
314274

315-
expect(bytesToUtf8(receivedMessage!.payload)).to.eq(bytesToUtf8(message));
275+
expect(bytesToUtf8(receivedMessage.payload)).to.eq(bytesToUtf8(message));
316276
});
317277

318278
describe("Retries", () => {
@@ -355,20 +315,29 @@ describe("Reliable Channel", () => {
355315
}
356316
});
357317

358-
reliableChannelAlice.send(message);
318+
// Wait for first message
319+
const firstMessagePromise = waitForEvent<IDecodedMessage>(
320+
reliableChannelBob,
321+
"message-received",
322+
(msg) => bytesToUtf8(msg.payload) === msgTxt
323+
);
359324

360-
while (messageCount < 1) {
361-
await delay(10);
362-
}
325+
reliableChannelAlice.send(message);
326+
await firstMessagePromise;
363327
expect(messageCount).to.equal(1, "Bob received Alice's message once");
364328

329+
// Wait for retry - Bob should receive the same message again
330+
const retryMessagePromise = waitForEvent<IDecodedMessage>(
331+
reliableChannelBob,
332+
"message-received",
333+
(msg) => bytesToUtf8(msg.payload) === msgTxt
334+
);
335+
365336
// No response from Bob should trigger a retry from Alice
366-
while (messageCount < 2) {
367-
await delay(10);
368-
}
337+
await retryMessagePromise;
369338
expect(messageCount).to.equal(2, "retried once");
370339

371-
// Bobs sends a message now, it should include first one in causal history
340+
// Bob sends a message now, it should include first one in causal history
372341
reliableChannelBob.send(utf8ToBytes("second message in channel"));
373342

374343
// Wait long enough to confirm no retry is executed

packages/sdk/src/reliable_channel/reliable_channel_acks.spec.ts

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,9 @@ import { bytesToUtf8, utf8ToBytes } from "@waku/utils/bytes";
1111
import { expect } from "chai";
1212
import { beforeEach, describe } from "mocha";
1313

14-
import { ReliableChannel } from "./index.js";
15-
16-
function waitForEvent<T>(
17-
emitter: TypedEventEmitter<any>,
18-
eventName: string,
19-
predicate?: (detail: T) => boolean,
20-
timeoutMs: number = 5000
21-
): Promise<T> {
22-
return new Promise((resolve, reject) => {
23-
const timeout = setTimeout(() => {
24-
emitter.removeEventListener(eventName, handler);
25-
reject(new Error(`Timeout waiting for event: ${eventName}`));
26-
}, timeoutMs);
27-
28-
const handler = (event: CustomEvent<T>): void => {
29-
if (!predicate || predicate(event.detail)) {
30-
clearTimeout(timeout);
31-
emitter.removeEventListener(eventName, handler);
32-
resolve(event.detail);
33-
}
34-
};
14+
import { waitForEvent } from "./test_utils.js";
3515

36-
emitter.addEventListener(eventName, handler);
37-
});
38-
}
16+
import { ReliableChannel } from "./index.js";
3917

4018
const TEST_CONTENT_TOPIC = "/my-tests/0/topic-name/proto";
4119
const TEST_NETWORK_CONFIG: AutoSharding = {

0 commit comments

Comments
 (0)