forked from mirrors/gecko-dev
		
	# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D35951 --HG-- extra : source : 62f3501af4bc1c0bd1ee1977a28aee04706a6663
		
			
				
	
	
		
			152 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
	
		
			4.3 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 = "1ca1cf66-eeb4-4df7-87c1-d5c92906ab90";
 | 
						|
 | 
						|
function run_test() {
 | 
						|
  do_get_profile();
 | 
						|
  setPrefs({
 | 
						|
    userAgentID,
 | 
						|
  });
 | 
						|
  run_next_test();
 | 
						|
}
 | 
						|
 | 
						|
add_task(async function test_notification_incomplete() {
 | 
						|
  let db = PushServiceWebSocket.newPushDB();
 | 
						|
  registerCleanupFunction(() => {
 | 
						|
    return db.drop().then(_ => db.close());
 | 
						|
  });
 | 
						|
  let records = [
 | 
						|
    {
 | 
						|
      channelID: "123",
 | 
						|
      pushEndpoint: "https://example.org/update/1",
 | 
						|
      scope: "https://example.com/page/1",
 | 
						|
      version: 1,
 | 
						|
      originAttributes: "",
 | 
						|
      quota: Infinity,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      channelID: "3ad1ed95-d37a-4d88-950f-22cbe2e240d7",
 | 
						|
      pushEndpoint: "https://example.org/update/2",
 | 
						|
      scope: "https://example.com/page/2",
 | 
						|
      version: 1,
 | 
						|
      originAttributes: "",
 | 
						|
      quota: Infinity,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      channelID: "d239498b-1c85-4486-b99b-205866e82d1f",
 | 
						|
      pushEndpoint: "https://example.org/update/3",
 | 
						|
      scope: "https://example.com/page/3",
 | 
						|
      version: 3,
 | 
						|
      originAttributes: "",
 | 
						|
      quota: Infinity,
 | 
						|
    },
 | 
						|
    {
 | 
						|
      channelID: "a50de97d-b496-43ce-8b53-05522feb78db",
 | 
						|
      pushEndpoint: "https://example.org/update/4",
 | 
						|
      scope: "https://example.com/page/4",
 | 
						|
      version: 10,
 | 
						|
      originAttributes: "",
 | 
						|
      quota: Infinity,
 | 
						|
    },
 | 
						|
  ];
 | 
						|
  for (let record of records) {
 | 
						|
    await db.put(record);
 | 
						|
  }
 | 
						|
 | 
						|
  function observeMessage(subject, topic, data) {
 | 
						|
    ok(false, "Should not deliver malformed updates");
 | 
						|
  }
 | 
						|
  registerCleanupFunction(() =>
 | 
						|
    Services.obs.removeObserver(observeMessage, PushServiceComponent.pushTopic)
 | 
						|
  );
 | 
						|
  Services.obs.addObserver(observeMessage, PushServiceComponent.pushTopic);
 | 
						|
 | 
						|
  let notificationDone;
 | 
						|
  let notificationPromise = new Promise(
 | 
						|
    resolve => (notificationDone = after(2, resolve))
 | 
						|
  );
 | 
						|
  let prevHandler = PushServiceWebSocket._handleNotificationReply;
 | 
						|
  PushServiceWebSocket._handleNotificationReply = function _handleNotificationReply() {
 | 
						|
    notificationDone();
 | 
						|
    return prevHandler.apply(this, arguments);
 | 
						|
  };
 | 
						|
  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,
 | 
						|
            })
 | 
						|
          );
 | 
						|
          this.serverSendMsg(
 | 
						|
            JSON.stringify({
 | 
						|
              // Missing "updates" field; should ignore message.
 | 
						|
              messageType: "notification",
 | 
						|
            })
 | 
						|
          );
 | 
						|
          this.serverSendMsg(
 | 
						|
            JSON.stringify({
 | 
						|
              messageType: "notification",
 | 
						|
              updates: [
 | 
						|
                {
 | 
						|
                  // Wrong channel ID field type.
 | 
						|
                  channelID: 123,
 | 
						|
                  version: 3,
 | 
						|
                },
 | 
						|
                {
 | 
						|
                  // Missing version field.
 | 
						|
                  channelID: "3ad1ed95-d37a-4d88-950f-22cbe2e240d7",
 | 
						|
                },
 | 
						|
                {
 | 
						|
                  // Wrong version field type.
 | 
						|
                  channelID: "d239498b-1c85-4486-b99b-205866e82d1f",
 | 
						|
                  version: true,
 | 
						|
                },
 | 
						|
                {
 | 
						|
                  // Negative versions should be ignored.
 | 
						|
                  channelID: "a50de97d-b496-43ce-8b53-05522feb78db",
 | 
						|
                  version: -5,
 | 
						|
                },
 | 
						|
              ],
 | 
						|
            })
 | 
						|
          );
 | 
						|
        },
 | 
						|
        onACK() {
 | 
						|
          ok(false, "Should not acknowledge malformed updates");
 | 
						|
        },
 | 
						|
      });
 | 
						|
    },
 | 
						|
  });
 | 
						|
 | 
						|
  await notificationPromise;
 | 
						|
 | 
						|
  let storeRecords = await db.getAllKeyIDs();
 | 
						|
  storeRecords.sort(({ pushEndpoint: a }, { pushEndpoint: b }) =>
 | 
						|
    compareAscending(a, b)
 | 
						|
  );
 | 
						|
  recordsAreEqual(records, storeRecords);
 | 
						|
});
 | 
						|
 | 
						|
function recordIsEqual(a, b) {
 | 
						|
  strictEqual(a.channelID, b.channelID, "Wrong channel ID in record");
 | 
						|
  strictEqual(a.pushEndpoint, b.pushEndpoint, "Wrong push endpoint in record");
 | 
						|
  strictEqual(a.scope, b.scope, "Wrong scope in record");
 | 
						|
  strictEqual(a.version, b.version, "Wrong version in record");
 | 
						|
}
 | 
						|
 | 
						|
function recordsAreEqual(a, b) {
 | 
						|
  equal(a.length, b.length, "Mismatched record count");
 | 
						|
  for (let i = 0; i < a.length; i++) {
 | 
						|
    recordIsEqual(a[i], b[i]);
 | 
						|
  }
 | 
						|
}
 |