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  }