Skip to content

Commit 52e6a63

Browse files
committed
tests: added corner case test for cancelling a stream before sending data
1 parent f7a89ea commit 52e6a63

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

tests/QUICStream.test.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,78 @@ describe(QUICStream.name, () => {
867867
await client.destroy({ force: true });
868868
await server.stop({ force: true });
869869
});
870+
test('streams can be cancelled with no data sent', async () => {
871+
const cancelReason = Symbol('CancelReason');
872+
const connectionEventProm =
873+
utils.promise<events.QUICServerConnectionEvent>();
874+
const tlsConfig1 = await generateConfig(defaultType);
875+
const tlsConfig2 = await generateConfig(defaultType);
876+
const server = new QUICServer({
877+
crypto: {
878+
key,
879+
ops: serverCrypto,
880+
},
881+
logger: logger.getChild(QUICServer.name),
882+
config: {
883+
key: tlsConfig1.key,
884+
cert: tlsConfig1.cert,
885+
verifyPeer: true,
886+
ca: tlsConfig2.ca,
887+
},
888+
});
889+
testsUtils.extractSocket(server, sockets);
890+
server.addEventListener(
891+
'serverConnection',
892+
(e: events.QUICServerConnectionEvent) => connectionEventProm.resolveP(e),
893+
);
894+
await server.start({
895+
host: localhost,
896+
});
897+
const client = await QUICClient.createQUICClient({
898+
host: localhost,
899+
port: server.port,
900+
localHost: localhost,
901+
crypto: {
902+
ops: clientCrypto,
903+
},
904+
logger: logger.getChild(QUICClient.name),
905+
config: {
906+
verifyPeer: false,
907+
key: tlsConfig2.key,
908+
cert: tlsConfig2.cert,
909+
},
910+
});
911+
testsUtils.extractSocket(client, sockets);
912+
const conn = (await connectionEventProm.p).detail;
913+
// Do the test
914+
const serverStreamProm = utils.promise<QUICStream>();
915+
conn.addEventListener(
916+
'connectionStream',
917+
(event: events.QUICConnectionStreamEvent) => {
918+
serverStreamProm.resolveP(event.detail);
919+
},
920+
);
921+
// Let's make a new streams.
922+
const clientStream = await client.connection.streamNew();
923+
clientStream.cancel(cancelReason);
924+
925+
await expect(clientStream.readable.getReader().read()).rejects.toBe(
926+
cancelReason,
927+
);
928+
await expect(clientStream.writable.getWriter().write()).rejects.toBe(
929+
cancelReason,
930+
);
931+
// Let's check that the server side ended
932+
const serverStream = await serverStreamProm.p;
933+
await expect(
934+
serverStream.readable.pipeTo(serverStream.writable),
935+
).rejects.toThrow('recv 0');
936+
// And client stream should've cleaned up
937+
await testsUtils.sleep(100);
938+
expect(clientStream[destroyed]).toBeTrue();
939+
await client.destroy({ force: true });
940+
await server.stop({ force: true });
941+
});
870942
test('Stream will end when waiting for more data', async () => {
871943
// Needed to check that the pull based reading of data doesn't break when we
872944
// temporarily run out of data to read

0 commit comments

Comments
 (0)