test_retry_ws.js (1762B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const userAgentID = "05f7b940-51b6-4b6f-8032-b83ebb577ded"; 7 8 function run_test() { 9 do_get_profile(); 10 setPrefs({ 11 userAgentID, 12 pingInterval: 2000, 13 retryBaseInterval: 25, 14 }); 15 run_next_test(); 16 } 17 18 add_task(async function test_ws_retry() { 19 let db = PushServiceWebSocket.newPushDB(); 20 registerCleanupFunction(() => { 21 return db.drop().then(_ => db.close()); 22 }); 23 24 await db.put({ 25 channelID: "61770ba9-2d57-4134-b949-d40404630d5b", 26 pushEndpoint: "https://example.org/push/1", 27 scope: "https://example.net/push/1", 28 version: 1, 29 originAttributes: "", 30 quota: Infinity, 31 }); 32 33 // Use a mock timer to avoid waiting for the backoff interval. 34 let reconnects = 0; 35 PushServiceWebSocket._backoffTimer = { 36 init(observer, delay) { 37 reconnects++; 38 ok( 39 delay >= 5 && delay <= 2000, 40 `Backoff delay ${delay} out of range for attempt ${reconnects}` 41 ); 42 observer.observe(this, "timer-callback", null); 43 }, 44 45 cancel() {}, 46 }; 47 48 let handshakeDone; 49 let handshakePromise = new Promise(resolve => (handshakeDone = resolve)); 50 PushService.init({ 51 serverURI: "wss://push.example.org/", 52 makeWebSocket(uri) { 53 return new MockWebSocket(uri, { 54 onHello() { 55 if (reconnects == 10) { 56 this.serverSendMsg( 57 JSON.stringify({ 58 messageType: "hello", 59 status: 200, 60 uaid: userAgentID, 61 }) 62 ); 63 handshakeDone(); 64 return; 65 } 66 this.serverInterrupt(); 67 }, 68 }); 69 }, 70 }); 71 72 await handshakePromise; 73 });