|
1 | 1 | // Flags: --expose-gc |
2 | 2 | 'use strict'; |
3 | 3 |
|
4 | | -constcommon=require('../common'); |
| 4 | +require('../common'); |
5 | 5 | const{ aborted }=require('util'); |
6 | | -constassert=require('assert'); |
| 6 | +const{ |
| 7 | + match, |
| 8 | + rejects, |
| 9 | + strictEqual, |
| 10 | +}=require('assert'); |
7 | 11 | const{ getEventListeners }=require('events'); |
8 | | -const{spawn}=require('child_process'); |
| 12 | +const{inspect}=require('util'); |
9 | 13 |
|
10 | | -{ |
11 | | -// Test aborted works when provided a resource |
| 14 | +const{ |
| 15 | + test, |
| 16 | +}=require('node:test'); |
| 17 | + |
| 18 | +test('Aborted works when provided a resource',async()=>{ |
12 | 19 | constac=newAbortController(); |
13 | | -aborted(ac.signal,{}).then(common.mustCall()); |
| 20 | +constpromise=aborted(ac.signal,{}); |
14 | 21 | ac.abort(); |
15 | | -assert.strictEqual(ac.signal.aborted,true); |
16 | | -assert.strictEqual(getEventListeners(ac.signal,'abort').length,0); |
17 | | -} |
| 22 | +awaitpromise; |
| 23 | +strictEqual(ac.signal.aborted,true); |
| 24 | +strictEqual(getEventListeners(ac.signal,'abort').length,0); |
| 25 | +}); |
18 | 26 |
|
19 | | -{ |
| 27 | +test('Aborted with gc cleanup',async()=>{ |
20 | 28 | // Test aborted with gc cleanup |
21 | 29 | constac=newAbortController(); |
22 | | -aborted(ac.signal,{}).then(common.mustNotCall()); |
| 30 | + |
| 31 | +constabortedPromise=aborted(ac.signal,{}); |
| 32 | +const{ promise, resolve }=Promise.withResolvers(); |
| 33 | + |
23 | 34 | setImmediate(()=>{ |
24 | 35 | global.gc(); |
25 | 36 | ac.abort(); |
26 | | -assert.strictEqual(ac.signal.aborted,true); |
27 | | -assert.strictEqual(getEventListeners(ac.signal,'abort').length,0); |
| 37 | +strictEqual(ac.signal.aborted,true); |
| 38 | +strictEqual(getEventListeners(ac.signal,'abort').length,0); |
| 39 | +resolve(); |
28 | 40 | }); |
29 | | -} |
30 | 41 |
|
31 | | -{ |
32 | | -// Fails with error if not provided abort signal |
33 | | -Promise.all([{},null,undefined,Symbol(),[],1,0,1n,true,false,'a',()=>{}].map((sig)=> |
34 | | -assert.rejects(aborted(sig,{}),{ |
| 42 | +awaitpromise; |
| 43 | + |
| 44 | +// Ensure that the promise is still pending |
| 45 | +match(inspect(abortedPromise),/<pending>/); |
| 46 | +}); |
| 47 | + |
| 48 | +test('Fails with error if not provided AbortSignal',async()=>{ |
| 49 | +awaitPromise.all([{},null,undefined,Symbol(),[],1,0,1n,true,false,'a',()=>{}].map((sig)=> |
| 50 | +rejects(aborted(sig,{}),{ |
35 | 51 | code: 'ERR_INVALID_ARG_TYPE', |
36 | 52 | }) |
37 | | -)).then(common.mustCall()); |
38 | | -} |
| 53 | +)); |
| 54 | +}); |
39 | 55 |
|
40 | | -{ |
| 56 | +test('Fails if not provided a resource',async()=>{ |
41 | 57 | // Fails if not provided a resource |
42 | 58 | constac=newAbortController(); |
43 | | -Promise.all([null,undefined,0,1,0n,1n,Symbol(),'','a'].map((resource)=> |
44 | | -assert.rejects(aborted(ac.signal,resource),{ |
| 59 | +awaitPromise.all([null,undefined,0,1,0n,1n,Symbol(),'','a'].map((resource)=> |
| 60 | +rejects(aborted(ac.signal,resource),{ |
45 | 61 | code: 'ERR_INVALID_ARG_TYPE', |
46 | 62 | }) |
47 | | -)).then(common.mustCall()); |
| 63 | +)); |
| 64 | +}); |
| 65 | + |
| 66 | +// To allow this case to be more flexibly tested on runtimes that do not have |
| 67 | +// child_process.spawn, we lazily require it and skip the test if it is not |
| 68 | +// present. |
| 69 | + |
| 70 | +letspawn; |
| 71 | +functionlazySpawn(){ |
| 72 | +if(spawn===undefined){ |
| 73 | +try{ |
| 74 | +spawn=require('child_process').spawn; |
| 75 | +}catch{ |
| 76 | +// Ignore if spawn does not exist. |
| 77 | +} |
| 78 | +} |
| 79 | +returnspawn; |
48 | 80 | } |
49 | 81 |
|
50 | | -{ |
| 82 | +test('Does not hang forever',{skip: !lazySpawn()},async()=>{ |
| 83 | +const{ promise, resolve }=Promise.withResolvers(); |
51 | 84 | constchildProcess=spawn(process.execPath,['--input-type=module']); |
52 | | -childProcess.on('exit',common.mustCall((code)=>{ |
53 | | -assert.strictEqual(code,13); |
54 | | -})); |
| 85 | +childProcess.on('exit',(code)=>{ |
| 86 | +strictEqual(code,13); |
| 87 | +resolve(); |
| 88 | +}); |
55 | 89 | childProcess.stdin.end(` |
56 | 90 | import { aborted } from 'node:util'; |
57 | 91 | await aborted(new AbortController().signal, {}); |
58 | 92 | `); |
59 | | -} |
| 93 | +awaitpromise; |
| 94 | +}); |
0 commit comments