@@ -80,3 +80,75 @@ fs.promises.open(file, 'r').then((handle) => {
8080 assert . strictEqual ( output , input ) ;
8181 } ) ) ;
8282} ) . then ( common . mustCall ( ) ) ;
83+
84+ // AbortSignal option test
85+ fs . promises . open ( file , 'r' ) . then ( ( handle ) => {
86+ const controller = new AbortController ( ) ;
87+ const { signal } = controller ;
88+ const stream = handle . createReadStream ( { signal } ) ;
89+
90+ stream . on ( 'data' , common . mustNotCall ( ) ) ;
91+ stream . on ( 'end' , common . mustNotCall ( ) ) ;
92+
93+ stream . on ( 'error' , common . mustCall ( ( err ) => {
94+ assert . strictEqual ( err . name , 'AbortError' ) ;
95+ } ) ) ;
96+
97+ stream . on ( 'close' , common . mustCall ( ( ) => {
98+ handle . close ( ) ;
99+ } ) ) ;
100+
101+ controller . abort ( ) ;
102+ } ) . then ( common . mustCall ( ) ) ;
103+
104+ // Already-aborted signal test
105+ fs . promises . open ( file , 'r' ) . then ( ( handle ) => {
106+ const signal = AbortSignal . abort ( ) ;
107+ const stream = handle . createReadStream ( { signal } ) ;
108+
109+ stream . on ( 'data' , common . mustNotCall ( ) ) ;
110+ stream . on ( 'end' , common . mustNotCall ( ) ) ;
111+
112+ stream . on ( 'error' , common . mustCall ( ( err ) => {
113+ assert . strictEqual ( err . name , 'AbortError' ) ;
114+ } ) ) ;
115+
116+ stream . on ( 'close' , common . mustCall ( ( ) => {
117+ handle . close ( ) ;
118+ } ) ) ;
119+ } ) . then ( common . mustCall ( ) ) ;
120+
121+ // Invalid signal type test
122+ fs . promises . open ( file , 'r' ) . then ( ( handle ) => {
123+ for ( const signal of [ 1 , { } , [ ] , '' , null , NaN , 1n , ( ) => { } , Symbol ( ) , false , true ] ) {
124+ assert . throws ( ( ) => {
125+ handle . createReadStream ( { signal } ) ;
126+ } , {
127+ code : 'ERR_INVALID_ARG_TYPE' ,
128+ name : 'TypeError' ,
129+ } ) ;
130+ }
131+ return handle . close ( ) ;
132+ } ) . then ( common . mustCall ( ) ) ;
133+
134+ // Custom abort reason test
135+ fs . promises . open ( file , 'r' ) . then ( ( handle ) => {
136+ const controller = new AbortController ( ) ;
137+ const { signal } = controller ;
138+ const reason = new Error ( 'some silly abort reason' ) ;
139+ const stream = handle . createReadStream ( { signal } ) ;
140+
141+ stream . on ( 'data' , common . mustNotCall ( ) ) ;
142+ stream . on ( 'end' , common . mustNotCall ( ) ) ;
143+
144+ stream . on ( 'error' , common . mustCall ( ( err ) => {
145+ assert . strictEqual ( err . name , 'AbortError' ) ;
146+ assert . strictEqual ( err . cause , reason ) ;
147+ } ) ) ;
148+
149+ stream . on ( 'close' , common . mustCall ( ( ) => {
150+ handle . close ( ) ;
151+ } ) ) ;
152+
153+ controller . abort ( reason ) ;
154+ } ) . then ( common . mustCall ( ) ) ;
0 commit comments