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);
 | |
|     });
 | |
|   });
 | |
| });
 |