Skip to content

Commit 3e66dd6

Browse files
committed
[ws] Isolation tests
1 parent 0886eff commit 3e66dd6

2 files changed

Lines changed: 142 additions & 17 deletions

File tree

test/unit/common.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1281,11 +1281,13 @@ export const describeSchemaTests = <DB, Depth extends number>(
12811281
export const createClients = async (
12821282
number: number,
12831283
connect: (path: string) => Promise<{status: number; webSocket: any}>,
1284+
getPath?: (index: number) => string,
12841285
) => {
12851286
const webSockets: any[] = [];
12861287
const received: [string, string][][] = Array.from({length: number}, () => []);
12871288
for (let i = 0; i < number; i++) {
1288-
const {webSocket} = await connect('');
1289+
const path = getPath ? getPath(i) : '';
1290+
const {webSocket} = await connect(path);
12891291
if (!webSocket) {
12901292
throw new Error('failed to obtain WebSocket');
12911293
}

test/unit/ws/broker-basics.test.ts

Lines changed: 139 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
pause,
1111
} from '../common.ts';
1212

13-
let serverSynclet: Synclet<1>;
13+
let synclet: Synclet<1>;
1414

1515
const connect = async (
1616
port: number,
@@ -30,31 +30,30 @@ const connect = async (
3030

3131
describeCommonBrokerTests(
3232
async () => {
33-
serverSynclet = await createSynclet({
33+
synclet = await createSynclet({
3434
transport: createWsBrokerTransport({
3535
webSocketServer: new WebSocketServer({
3636
port: allocatePort(),
3737
}).setMaxListeners(0),
3838
}),
3939
});
40-
await serverSynclet.start();
40+
await synclet.start();
4141

4242
return [
4343
(path: string) =>
4444
connect(
45-
(
46-
serverSynclet.getTransport()[0] as WsBrokerTransport
47-
).getWebSocketServer().options.port!,
45+
(synclet.getTransport()[0] as WsBrokerTransport).getWebSocketServer()
46+
.options.port!,
4847
path,
4948
),
5049
async () =>
51-
(serverSynclet.getTransport()[0] as WsBrokerTransport).getClientIds(),
50+
(synclet.getTransport()[0] as WsBrokerTransport).getClientIds(),
5251
] as const;
5352
},
5453

5554
async () => {
56-
serverSynclet.destroy();
57-
(serverSynclet.getTransport()[0] as WsBrokerTransport)
55+
synclet.destroy();
56+
(synclet.getTransport()[0] as WsBrokerTransport)
5857
.getWebSocketServer()
5958
.close();
6059
},
@@ -79,24 +78,23 @@ describe('external httpServer', () => {
7978
});
8079
});
8180

82-
test('single webSocketServer serving both paths', async () => {
83-
serverSynclet = await createSynclet({
81+
test('single webSocketServer, two paths', async () => {
82+
const synclet = await createSynclet({
8483
transport: createWsBrokerTransport({
8584
webSocketServer: new WebSocketServer({
8685
server: httpServer,
8786
}).setMaxListeners(0),
8887
}),
8988
});
90-
await serverSynclet.start();
89+
await synclet.start();
9190

9291
const [[ws1, ws2], [received1, received2]] = await createClients(
9392
2,
9493
(path: string) => connect(port, path),
9594
);
9695

9796
expect(
98-
(serverSynclet.getTransport()[0] as WsBrokerTransport).getClientIds()
99-
.length,
97+
(synclet.getTransport()[0] as WsBrokerTransport).getClientIds().length,
10098
).toEqual(2);
10199

102100
ws1.send('* from1To*');
@@ -112,9 +110,134 @@ describe('external httpServer', () => {
112110

113111
ws1.close();
114112
ws2.close();
115-
await serverSynclet.destroy();
116-
(serverSynclet.getTransport()[0] as WsBrokerTransport)
113+
await synclet.destroy();
114+
(synclet.getTransport()[0] as WsBrokerTransport)
117115
.getWebSocketServer()
118116
.close();
119117
});
118+
119+
test('single webSocketServer, manual upgrade, two paths', async () => {
120+
const wss = new WebSocketServer({noServer: true}).setMaxListeners(0);
121+
const synclet = await createSynclet({
122+
transport: createWsBrokerTransport({
123+
webSocketServer: wss,
124+
}),
125+
});
126+
await synclet.start();
127+
128+
httpServer.on('upgrade', (request, socket, head) =>
129+
wss.handleUpgrade(request, socket, head, (ws) =>
130+
wss.emit('connection', ws, request),
131+
),
132+
);
133+
134+
const [[ws1, ws2], [received1, received2]] = await createClients(
135+
2,
136+
(path: string) => connect(port, path),
137+
);
138+
139+
expect(
140+
(synclet.getTransport()[0] as WsBrokerTransport).getClientIds().length,
141+
).toEqual(2);
142+
143+
ws1.send('* from1To*');
144+
await pause(transportPause);
145+
146+
ws2.send('* from2To*');
147+
await pause(transportPause);
148+
149+
expect(received1.length).toEqual(1);
150+
expect(received1[0][1]).toEqual('from2To*');
151+
expect(received2.length).toEqual(1);
152+
expect(received2[0][1]).toEqual('from1To*');
153+
154+
ws1.close();
155+
ws2.close();
156+
await synclet.destroy();
157+
wss.close();
158+
});
159+
160+
test('two webSocketServers, manual upgrade, two paths', async () => {
161+
const wss1 = new WebSocketServer({noServer: true}).setMaxListeners(0);
162+
const synclet1 = await createSynclet({
163+
transport: createWsBrokerTransport({
164+
webSocketServer: wss1,
165+
}),
166+
});
167+
await synclet1.start();
168+
169+
const wss2 = new WebSocketServer({noServer: true}).setMaxListeners(0);
170+
const synclet2 = await createSynclet({
171+
transport: createWsBrokerTransport({
172+
webSocketServer: wss2,
173+
}),
174+
});
175+
await synclet2.start();
176+
177+
httpServer.on('upgrade', (request, socket, head) => {
178+
const pathname = new URL(request.url!, 'ws://localhost').pathname;
179+
if (pathname === '/p1') {
180+
wss1.handleUpgrade(request, socket, head, (ws) =>
181+
wss1.emit('connection', ws, request),
182+
);
183+
} else if (pathname === '/p2') {
184+
wss2.handleUpgrade(request, socket, head, (ws) =>
185+
wss2.emit('connection', ws, request),
186+
);
187+
}
188+
});
189+
190+
const [[ws1p1, ws2p1], [received1p1, received2p1]] = await createClients(
191+
2,
192+
(path: string) => connect(port, path),
193+
() => 'p1',
194+
);
195+
196+
const [[ws1p2, ws2p2], [received1p2, received2p2]] = await createClients(
197+
2,
198+
(path: string) => connect(port, path),
199+
() => 'p2',
200+
);
201+
202+
expect(
203+
(synclet1.getTransport()[0] as WsBrokerTransport).getClientIds().length,
204+
).toEqual(2);
205+
expect(
206+
(synclet2.getTransport()[0] as WsBrokerTransport).getClientIds().length,
207+
).toEqual(2);
208+
209+
ws1p1.send('* from1p1To*');
210+
await pause(transportPause);
211+
ws2p1.send('* from2p1To*');
212+
await pause(transportPause);
213+
214+
expect(received1p1.length).toEqual(1);
215+
expect(received1p1[0][1]).toEqual('from2p1To*');
216+
expect(received2p1.length).toEqual(1);
217+
expect(received2p1[0][1]).toEqual('from1p1To*');
218+
expect(received1p2.length).toEqual(0);
219+
expect(received1p2.length).toEqual(0);
220+
221+
ws1p2.send('* from1p2To*');
222+
await pause(transportPause);
223+
ws2p2.send('* from2p2To*');
224+
await pause(transportPause);
225+
226+
expect(received1p1.length).toEqual(1);
227+
expect(received1p1.length).toEqual(1);
228+
expect(received1p2.length).toEqual(1);
229+
expect(received1p2[0][1]).toEqual('from2p2To*');
230+
expect(received2p2.length).toEqual(1);
231+
expect(received2p2[0][1]).toEqual('from1p2To*');
232+
233+
ws1p1.close();
234+
ws2p1.close();
235+
ws1p2.close();
236+
ws2p2.close();
237+
238+
await synclet1.destroy();
239+
await synclet2.destroy();
240+
wss1.close();
241+
wss2.close();
242+
});
120243
});

0 commit comments

Comments
 (0)