80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
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);
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |