@@ -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