зеркало из https://github.com/mozilla/gecko-dev.git
154 строки
3.8 KiB
JavaScript
154 строки
3.8 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const { PushDB, PushService, PushServiceWebSocket } = serviceExports;
|
|
|
|
const userAgentID = "3c7462fc-270f-45be-a459-b9d631b0d093";
|
|
|
|
function run_test() {
|
|
do_get_profile();
|
|
setPrefs({
|
|
userAgentID,
|
|
});
|
|
run_next_test();
|
|
}
|
|
|
|
add_task(async function test_notification_error() {
|
|
let db = PushServiceWebSocket.newPushDB();
|
|
registerCleanupFunction(() => {
|
|
return db.drop().then(_ => db.close());
|
|
});
|
|
|
|
let originAttributes = "";
|
|
let records = [
|
|
{
|
|
channelID: "f04f1e46-9139-4826-b2d1-9411b0821283",
|
|
pushEndpoint: "https://example.org/update/success-1",
|
|
scope: "https://example.com/a",
|
|
originAttributes,
|
|
version: 1,
|
|
quota: Infinity,
|
|
systemRecord: true,
|
|
},
|
|
{
|
|
channelID: "3c3930ba-44de-40dc-a7ca-8a133ec1a866",
|
|
pushEndpoint: "https://example.org/update/error",
|
|
scope: "https://example.com/b",
|
|
originAttributes,
|
|
version: 2,
|
|
quota: Infinity,
|
|
systemRecord: true,
|
|
},
|
|
{
|
|
channelID: "b63f7bef-0a0d-4236-b41e-086a69dfd316",
|
|
pushEndpoint: "https://example.org/update/success-2",
|
|
scope: "https://example.com/c",
|
|
originAttributes,
|
|
version: 3,
|
|
quota: Infinity,
|
|
systemRecord: true,
|
|
},
|
|
];
|
|
for (let record of records) {
|
|
await db.put(record);
|
|
}
|
|
|
|
let scopes = [];
|
|
let notifyPromise = promiseObserverNotification(
|
|
PushServiceComponent.pushTopic,
|
|
(subject, data) => scopes.push(data) == 2
|
|
);
|
|
|
|
let ackDone;
|
|
let ackPromise = new Promise(
|
|
resolve => (ackDone = after(records.length, resolve))
|
|
);
|
|
PushService.init({
|
|
serverURI: "wss://push.example.org/",
|
|
db: makeStub(db, {
|
|
getByKeyID(prev, channelID) {
|
|
if (channelID == "3c3930ba-44de-40dc-a7ca-8a133ec1a866") {
|
|
return Promise.reject("splines not reticulated");
|
|
}
|
|
return prev.call(this, channelID);
|
|
},
|
|
}),
|
|
makeWebSocket(uri) {
|
|
return new MockWebSocket(uri, {
|
|
onHello(request) {
|
|
this.serverSendMsg(
|
|
JSON.stringify({
|
|
messageType: "hello",
|
|
status: 200,
|
|
uaid: userAgentID,
|
|
})
|
|
);
|
|
this.serverSendMsg(
|
|
JSON.stringify({
|
|
messageType: "notification",
|
|
updates: records.map(({ channelID, version }) => ({
|
|
channelID,
|
|
version: ++version,
|
|
})),
|
|
})
|
|
);
|
|
},
|
|
// Should acknowledge all received updates, even if updating
|
|
// IndexedDB fails.
|
|
onACK: ackDone,
|
|
});
|
|
},
|
|
});
|
|
|
|
await notifyPromise;
|
|
ok(
|
|
scopes.includes("https://example.com/a"),
|
|
"Missing scope for notification A"
|
|
);
|
|
ok(
|
|
scopes.includes("https://example.com/c"),
|
|
"Missing scope for notification C"
|
|
);
|
|
|
|
await ackPromise;
|
|
|
|
let aRecord = await db.getByIdentifiers({
|
|
scope: "https://example.com/a",
|
|
originAttributes,
|
|
});
|
|
equal(
|
|
aRecord.channelID,
|
|
"f04f1e46-9139-4826-b2d1-9411b0821283",
|
|
"Wrong channel ID for record A"
|
|
);
|
|
strictEqual(aRecord.version, 2, "Should return the new version for record A");
|
|
|
|
let bRecord = await db.getByIdentifiers({
|
|
scope: "https://example.com/b",
|
|
originAttributes,
|
|
});
|
|
equal(
|
|
bRecord.channelID,
|
|
"3c3930ba-44de-40dc-a7ca-8a133ec1a866",
|
|
"Wrong channel ID for record B"
|
|
);
|
|
strictEqual(
|
|
bRecord.version,
|
|
2,
|
|
"Should return the previous version for record B"
|
|
);
|
|
|
|
let cRecord = await db.getByIdentifiers({
|
|
scope: "https://example.com/c",
|
|
originAttributes,
|
|
});
|
|
equal(
|
|
cRecord.channelID,
|
|
"b63f7bef-0a0d-4236-b41e-086a69dfd316",
|
|
"Wrong channel ID for record C"
|
|
);
|
|
strictEqual(cRecord.version, 4, "Should return the new version for record C");
|
|
});
|