Welcome to mirror list, hosted at ThFree Co, Russian Federation.

actioncable_connection_monitor_spec.js « frontend « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c68eb53acdea2d52e93f83381c18d61a1d2918f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import ConnectionMonitor from '~/actioncable_connection_monitor';

describe('ConnectionMonitor', () => {
  let monitor;

  beforeEach(() => {
    monitor = new ConnectionMonitor({});
  });

  describe('#getPollInterval', () => {
    beforeEach(() => {
      Math.originalRandom = Math.random;
    });
    afterEach(() => {
      Math.random = Math.originalRandom;
    });

    const { staleThreshold, reconnectionBackoffRate } = ConnectionMonitor;
    const backoffFactor = 1 + reconnectionBackoffRate;
    const ms = 1000;

    it('uses exponential backoff', () => {
      Math.random = () => 0;

      monitor.reconnectAttempts = 0;
      expect(monitor.getPollInterval()).toEqual(staleThreshold * ms);

      monitor.reconnectAttempts = 1;
      expect(monitor.getPollInterval()).toEqual(staleThreshold * backoffFactor * ms);

      monitor.reconnectAttempts = 2;
      expect(monitor.getPollInterval()).toEqual(
        staleThreshold * backoffFactor * backoffFactor * ms,
      );
    });

    it('caps exponential backoff after some number of reconnection attempts', () => {
      Math.random = () => 0;
      monitor.reconnectAttempts = 42;
      const cappedPollInterval = monitor.getPollInterval();

      monitor.reconnectAttempts = 9001;
      expect(monitor.getPollInterval()).toEqual(cappedPollInterval);
    });

    it('uses 100% jitter when 0 reconnection attempts', () => {
      Math.random = () => 0;
      expect(monitor.getPollInterval()).toEqual(staleThreshold * ms);

      Math.random = () => 0.5;
      expect(monitor.getPollInterval()).toEqual(staleThreshold * 1.5 * ms);
    });

    it('uses reconnectionBackoffRate for jitter when >0 reconnection attempts', () => {
      monitor.reconnectAttempts = 1;

      Math.random = () => 0.25;
      expect(monitor.getPollInterval()).toEqual(
        staleThreshold * backoffFactor * (1 + reconnectionBackoffRate * 0.25) * ms,
      );

      Math.random = () => 0.5;
      expect(monitor.getPollInterval()).toEqual(
        staleThreshold * backoffFactor * (1 + reconnectionBackoffRate * 0.5) * ms,
      );
    });

    it('applies jitter after capped exponential backoff', () => {
      monitor.reconnectAttempts = 9001;

      Math.random = () => 0;
      const withoutJitter = monitor.getPollInterval();
      Math.random = () => 0.5;
      const withJitter = monitor.getPollInterval();

      expect(withJitter).toBeGreaterThan(withoutJitter);
    });
  });
});