tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_register_rollback.js (2920B)


      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 = "b2546987-4f63-49b1-99f7-739cd3c40e44";
      7 const channelID = "35a820f7-d7dd-43b3-af21-d65352212ae3";
      8 
      9 function run_test() {
     10  do_get_profile();
     11  setPrefs({
     12    userAgentID,
     13    requestTimeout: 1000,
     14    retryBaseInterval: 150,
     15  });
     16  run_next_test();
     17 }
     18 
     19 add_task(async function test_register_rollback() {
     20  let db = PushServiceWebSocket.newPushDB();
     21  registerCleanupFunction(() => {
     22    return db.drop().then(_ => db.close());
     23  });
     24 
     25  let handshakes = 0;
     26  let registers = 0;
     27  let unregisterDone;
     28  let unregisterPromise = new Promise(resolve => (unregisterDone = resolve));
     29  PushServiceWebSocket._generateID = () => channelID;
     30  PushService.init({
     31    serverURI: "wss://push.example.org/",
     32    db: makeStub(db, {
     33      put() {
     34        return Promise.reject("universe has imploded");
     35      },
     36    }),
     37    makeWebSocket(uri) {
     38      return new MockWebSocket(uri, {
     39        onHello(request) {
     40          handshakes++;
     41          if (registers > 0) {
     42            equal(request.uaid, userAgentID, "Handshake: wrong device ID");
     43          } else {
     44            ok(
     45              !request.uaid,
     46              "Should not send UAID in handshake without local subscriptions"
     47            );
     48          }
     49          this.serverSendMsg(
     50            JSON.stringify({
     51              messageType: "hello",
     52              status: 200,
     53              uaid: userAgentID,
     54            })
     55          );
     56        },
     57        onRegister(request) {
     58          equal(request.channelID, channelID, "Register: wrong channel ID");
     59          registers++;
     60          this.serverSendMsg(
     61            JSON.stringify({
     62              messageType: "register",
     63              status: 200,
     64              uaid: userAgentID,
     65              channelID,
     66              pushEndpoint: "https://example.com/update/rollback",
     67            })
     68          );
     69        },
     70        onUnregister(request) {
     71          equal(request.channelID, channelID, "Unregister: wrong channel ID");
     72          equal(request.code, 200, "Expected manual unregister reason");
     73          this.serverSendMsg(
     74            JSON.stringify({
     75              messageType: "unregister",
     76              status: 200,
     77              channelID,
     78            })
     79          );
     80          unregisterDone();
     81        },
     82      });
     83    },
     84  });
     85 
     86  // Should return a rejected promise if storage fails.
     87  await Assert.rejects(
     88    PushService.register({
     89      scope: "https://example.com/storage-error",
     90      originAttributes: ChromeUtils.originAttributesToSuffix({
     91        inIsolatedMozBrowser: false,
     92      }),
     93    }),
     94    /universe has imploded/,
     95    "Expected error for unregister database failure"
     96  );
     97 
     98  // Should send an out-of-band unregister request.
     99  await unregisterPromise;
    100  equal(handshakes, 1, "Wrong handshake count");
    101  equal(registers, 1, "Wrong register count");
    102 });