github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js (about) 1 import { resolve } from 'rsvp'; 2 import { test } from 'qunit'; 3 import sinon from 'sinon'; 4 import { settled } from '@ember/test-helpers'; 5 6 const MockResponse = json => ({ 7 ok: true, 8 json() { 9 return resolve(json); 10 }, 11 }); 12 13 export default function statsTrackerFrameMissing({ 14 resourceName, 15 TrackerConstructor, 16 ResourceConstructor, 17 mockFrame, 18 compileResources, 19 }) { 20 test('a bad response from a fetch request is handled gracefully', async function(assert) { 21 const frame = mockFrame(1); 22 const [compiledCPU, compiledMemory] = compileResources(frame); 23 24 let shouldFail = false; 25 const fetch = () => { 26 return resolve(shouldFail ? { ok: false } : MockResponse(frame)); 27 }; 28 29 const resource = ResourceConstructor(); 30 const tracker = TrackerConstructor.create({ fetch, [resourceName]: resource }); 31 32 tracker.get('poll').perform(); 33 await settled(); 34 35 assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'One frame of cpu'); 36 assert.deepEqual(tracker.get('memory'), [compiledMemory], 'One frame of memory'); 37 38 shouldFail = true; 39 tracker.get('poll').perform(); 40 await settled(); 41 42 assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'Still one frame of cpu'); 43 assert.deepEqual(tracker.get('memory'), [compiledMemory], 'Still one frame of memory'); 44 assert.equal(tracker.get('frameMisses'), 1, 'Frame miss is tracked'); 45 46 shouldFail = false; 47 tracker.get('poll').perform(); 48 await settled(); 49 50 assert.deepEqual(tracker.get('cpu'), [compiledCPU, compiledCPU], 'Still one frame of cpu'); 51 assert.deepEqual( 52 tracker.get('memory'), 53 [compiledMemory, compiledMemory], 54 'Still one frame of memory' 55 ); 56 assert.equal(tracker.get('frameMisses'), 0, 'Frame misses is reset'); 57 }); 58 59 test('enough bad responses from fetch consecutively (as set by maxFrameMisses) results in a pause', async function(assert) { 60 const fetch = () => { 61 return resolve({ ok: false }); 62 }; 63 64 const resource = ResourceConstructor(); 65 const tracker = TrackerConstructor.create({ 66 fetch, 67 [resourceName]: resource, 68 maxFrameMisses: 3, 69 pause: sinon.spy(), 70 }); 71 72 tracker.get('poll').perform(); 73 await settled(); 74 75 assert.equal(tracker.get('frameMisses'), 1, 'Tick misses'); 76 assert.notOk(tracker.pause.called, 'Pause not called yet'); 77 78 tracker.get('poll').perform(); 79 await settled(); 80 81 assert.equal(tracker.get('frameMisses'), 2, 'Tick misses'); 82 assert.notOk(tracker.pause.called, 'Pause still not called yet'); 83 84 tracker.get('poll').perform(); 85 await settled(); 86 87 assert.equal(tracker.get('frameMisses'), 0, 'Misses reset'); 88 assert.ok(tracker.pause.called, 'Pause called now that frameMisses == maxFrameMisses'); 89 }); 90 }