|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +require('../common'); |
| 4 | + |
| 5 | +constTIMEOUT=50; |
| 6 | + |
| 7 | +constassert=require('assert'); |
| 8 | +const{ performance }=require('perf_hooks'); |
| 9 | +const{ Worker, parentPort }=require('worker_threads'); |
| 10 | + |
| 11 | +const{ nodeTiming, eventLoopUtilization }=performance; |
| 12 | +constelu=eventLoopUtilization(); |
| 13 | + |
| 14 | +// Take into account whether this test was started as a Worker. |
| 15 | +if(nodeTiming.loopStart===-1){ |
| 16 | +assert.strictEqual(nodeTiming.idleTime,0); |
| 17 | +assert.deepStrictEqual(elu,{idle: 0,active: 0,utilization: 0}); |
| 18 | +assert.deepStrictEqual(eventLoopUtilization(elu), |
| 19 | +{idle: 0,active: 0,utilization: 0}); |
| 20 | +assert.deepStrictEqual(eventLoopUtilization(elu,eventLoopUtilization()), |
| 21 | +{idle: 0,active: 0,utilization: 0}); |
| 22 | +} |
| 23 | + |
| 24 | +// Place in setTimeout() to make sure there is some idle time, but not going to |
| 25 | +// assert this since it could make the test flaky. |
| 26 | +setTimeout(()=>{ |
| 27 | +constt=Date.now(); |
| 28 | +constelu1=eventLoopUtilization(); |
| 29 | + |
| 30 | +while(Date.now()-t<50){} |
| 31 | + |
| 32 | +constelu2=eventLoopUtilization(); |
| 33 | +constelu3=eventLoopUtilization(elu1); |
| 34 | +constelu4=eventLoopUtilization(elu2,elu1); |
| 35 | + |
| 36 | +assert.strictEqual(elu3.idle,0); |
| 37 | +assert.strictEqual(elu4.idle,0); |
| 38 | +assert.strictEqual(elu3.utilization,1); |
| 39 | +assert.strictEqual(elu4.utilization,1); |
| 40 | +assert.strictEqual(elu2.active-elu1.active,elu4.active); |
| 41 | +assert.ok(elu2.active>elu3.active); |
| 42 | +assert.ok(elu2.active>elu4.active); |
| 43 | +assert.ok(elu3.active>elu4.active); |
| 44 | + |
| 45 | +setTimeout(runIdleTimeTest,TIMEOUT); |
| 46 | +},5); |
| 47 | + |
| 48 | +functionrunIdleTimeTest(){ |
| 49 | +constidleTime=nodeTiming.idleTime; |
| 50 | +constelu1=eventLoopUtilization(); |
| 51 | +constsum=elu1.idle+elu1.active; |
| 52 | + |
| 53 | +assert.ok(sum>=elu1.idle&&sum>=elu1.active, |
| 54 | +`idle: ${elu1.idle} active: ${elu1.active} sum: ${sum}`); |
| 55 | +assert.strictEqual(elu1.idle,idleTime); |
| 56 | +assert.strictEqual(elu1.utilization,elu1.active/sum); |
| 57 | + |
| 58 | +setTimeout(runCalcTest,TIMEOUT,elu1); |
| 59 | +} |
| 60 | + |
| 61 | +functionrunCalcTest(elu1){ |
| 62 | +constnow=performance.now(); |
| 63 | +constelu2=eventLoopUtilization(); |
| 64 | +constelu3=eventLoopUtilization(elu2,elu1); |
| 65 | +constactive_delta=elu2.active-elu1.active; |
| 66 | +constidle_delta=elu2.idle-elu1.idle; |
| 67 | + |
| 68 | +assert.ok(elu2.idle>=0); |
| 69 | +assert.ok(elu2.active>=0); |
| 70 | +assert.ok(elu3.idle>=0); |
| 71 | +assert.ok(elu3.active>=0); |
| 72 | +assert.ok(elu2.idle+elu2.active>elu1.idle+elu2.active); |
| 73 | +assert.ok(elu2.idle+elu2.active>=now-nodeTiming.loopStart); |
| 74 | +assert.strictEqual(elu3.active,elu2.active-elu1.active); |
| 75 | +assert.strictEqual(elu3.idle,elu2.idle-elu1.idle); |
| 76 | +assert.strictEqual(elu3.utilization, |
| 77 | +active_delta/(idle_delta+active_delta)); |
| 78 | + |
| 79 | +setImmediate(runWorkerTest); |
| 80 | +} |
| 81 | + |
| 82 | +functionrunWorkerTest(){ |
| 83 | +// Use argv to detect whether we're running as a Worker called by this test |
| 84 | +// vs. this test also being called as a Worker. |
| 85 | +if(process.argv[2]==='iamalive'){ |
| 86 | +parentPort.postMessage(JSON.stringify(eventLoopUtilization())); |
| 87 | +return; |
| 88 | +} |
| 89 | + |
| 90 | +constelu1=eventLoopUtilization(); |
| 91 | +constworker=newWorker(__filename,{argv: ['iamalive']}); |
| 92 | + |
| 93 | +worker.on('message',(msg)=>{ |
| 94 | +constelu2=eventLoopUtilization(elu1); |
| 95 | +constdata=JSON.parse(msg); |
| 96 | + |
| 97 | +assert.ok(elu2.active+elu2.idle>data.active+data.idle); |
| 98 | +}); |
| 99 | +} |
0 commit comments