summaryrefslogtreecommitdiffstats
path: root/dom/push/test/xpcshell/test_unregister_invalid_json.js
blob: fa709c8eaecdf0b71158e0f30c5f31d2f6991d9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const userAgentID = "7f0af1bb-7e1f-4fb8-8e4a-e8de434abde3";

function run_test() {
  do_get_profile();
  setPrefs({
    userAgentID,
    requestTimeout: 150,
    retryBaseInterval: 150,
  });
  run_next_test();
}

add_task(async function test_unregister_invalid_json() {
  let db = PushServiceWebSocket.newPushDB();
  registerCleanupFunction(() => {
    return db.drop().then(_ => db.close());
  });
  let records = [
    {
      channelID: "87902e90-c57e-4d18-8354-013f4a556559",
      pushEndpoint: "https://example.org/update/1",
      scope: "https://example.edu/page/1",
      originAttributes: "",
      version: 1,
      quota: Infinity,
    },
    {
      channelID: "057caa8f-9b99-47ff-891c-adad18ce603e",
      pushEndpoint: "https://example.com/update/2",
      scope: "https://example.net/page/1",
      originAttributes: "",
      version: 1,
      quota: Infinity,
    },
  ];
  for (let record of records) {
    await db.put(record);
  }

  let unregisterDone;
  let unregisterPromise = new Promise(
    resolve => (unregisterDone = after(2, resolve))
  );
  PushService.init({
    serverURI: "wss://push.example.org/",
    db,
    makeWebSocket(uri) {
      return new MockWebSocket(uri, {
        onHello(request) {
          this.serverSendMsg(
            JSON.stringify({
              messageType: "hello",
              status: 200,
              uaid: userAgentID,
              use_webpush: true,
            })
          );
        },
        onUnregister(request) {
          this.serverSendMsg(");alert(1);(");
          unregisterDone();
        },
      });
    },
  });

  await Assert.rejects(
    PushService.unregister({
      scope: "https://example.edu/page/1",
      originAttributes: "",
    }),
    /Request timed out/,
    "Expected error for first invalid JSON response"
  );

  let record = await db.getByKeyID("87902e90-c57e-4d18-8354-013f4a556559");
  ok(!record, "Failed to delete unregistered record");

  await Assert.rejects(
    PushService.unregister({
      scope: "https://example.net/page/1",
      originAttributes: ChromeUtils.originAttributesToSuffix({
        inIsolatedMozBrowser: false,
      }),
    }),
    /Request timed out/,
    "Expected error for second invalid JSON response"
  );

  record = await db.getByKeyID("057caa8f-9b99-47ff-891c-adad18ce603e");
  ok(
    !record,
    "Failed to delete unregistered record after receiving invalid JSON"
  );

  await unregisterPromise;
});