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