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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/actioncable_connection_monitor_spec.js')
-rw-r--r--spec/frontend/actioncable_connection_monitor_spec.js79
1 files changed, 79 insertions, 0 deletions
diff --git a/spec/frontend/actioncable_connection_monitor_spec.js b/spec/frontend/actioncable_connection_monitor_spec.js
new file mode 100644
index 00000000000..c68eb53acde
--- /dev/null
+++ b/spec/frontend/actioncable_connection_monitor_spec.js
@@ -0,0 +1,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);
+ });
+ });
+});