--- a/services/sync/tests/unit/test_clients_engine.js
+++ b/services/sync/tests/unit/test_clients_engine.js
@@ -26,20 +26,20 @@ function check_record_version(user, id)
rec.collection = "clients";
rec.ciphertext = payload.ciphertext;
rec.hmac = payload.hmac;
rec.IV = payload.IV;
let cleartext = rec.decrypt(Service.collectionKeys.keyForCollection("clients"));
_("Payload is " + JSON.stringify(cleartext));
- do_check_eq(Services.appinfo.version, cleartext.version);
- do_check_eq(2, cleartext.protocols.length);
- do_check_eq("1.1", cleartext.protocols[0]);
- do_check_eq("1.5", cleartext.protocols[1]);
+ equal(Services.appinfo.version, cleartext.version);
+ equal(2, cleartext.protocols.length);
+ equal("1.1", cleartext.protocols[0]);
+ equal("1.5", cleartext.protocols[1]);
}
add_test(function test_bad_hmac() {
_("Ensure that Clients engine deletes corrupt records.");
let contents = {
meta: {global: {engines: {clients: {version: engine.version,
syncID: engine.syncID}}}},
clients: {},
@@ -59,62 +59,62 @@ add_test(function test_bad_hmac() {
let server = serverForUsers({"foo": "password"}, contents, callback);
let user = server.user("foo");
function check_clients_count(expectedCount) {
let stack = Components.stack.caller;
let coll = user.collection("clients");
// Treat a non-existent collection as empty.
- do_check_eq(expectedCount, coll ? coll.count() : 0, stack);
+ equal(expectedCount, coll ? coll.count() : 0, stack);
}
function check_client_deleted(id) {
let coll = user.collection("clients");
let wbo = coll.wbo(id);
return !wbo || !wbo.payload;
}
function uploadNewKeys() {
generateNewKeys(Service.collectionKeys);
let serverKeys = Service.collectionKeys.asWBO("crypto", "keys");
serverKeys.encrypt(Service.identity.syncKeyBundle);
- do_check_true(serverKeys.upload(Service.resource(Service.cryptoKeysURL)).success);
+ ok(serverKeys.upload(Service.resource(Service.cryptoKeysURL)).success);
}
try {
ensureLegacyIdentityManager();
let passphrase = "abcdeabcdeabcdeabcdeabcdea";
Service.serverURL = server.baseURI;
Service.login("foo", "ilovejane", passphrase);
generateNewKeys(Service.collectionKeys);
_("First sync, client record is uploaded");
- do_check_eq(engine.lastRecordUpload, 0);
+ equal(engine.lastRecordUpload, 0);
check_clients_count(0);
engine._sync();
check_clients_count(1);
- do_check_true(engine.lastRecordUpload > 0);
+ ok(engine.lastRecordUpload > 0);
// Our uploaded record has a version.
check_record_version(user, engine.localID);
// Initial setup can wipe the server, so clean up.
deletedCollections = [];
deletedItems = [];
_("Change our keys and our client ID, reupload keys.");
let oldLocalID = engine.localID; // Preserve to test for deletion!
engine.localID = Utils.makeGUID();
engine.resetClient();
generateNewKeys(Service.collectionKeys);
let serverKeys = Service.collectionKeys.asWBO("crypto", "keys");
serverKeys.encrypt(Service.identity.syncKeyBundle);
- do_check_true(serverKeys.upload(Service.resource(Service.cryptoKeysURL)).success);
+ ok(serverKeys.upload(Service.resource(Service.cryptoKeysURL)).success);
_("Sync.");
engine._sync();
_("Old record " + oldLocalID + " was deleted, new one uploaded.");
check_clients_count(1);
check_client_deleted(oldLocalID);
@@ -125,18 +125,18 @@ add_test(function test_bad_hmac() {
engine.resetClient();
generateNewKeys(Service.collectionKeys);
deletedCollections = [];
deletedItems = [];
check_clients_count(1);
engine._sync();
_("Old record was not deleted, new one uploaded.");
- do_check_eq(deletedCollections.length, 0);
- do_check_eq(deletedItems.length, 0);
+ equal(deletedCollections.length, 0);
+ equal(deletedItems.length, 0);
check_clients_count(2);
_("Now try the scenario where our keys are wrong *and* there's a bad record.");
// Clean up and start fresh.
user.collection("clients")._wbos = {};
Service.lastHMACEvent = 0;
engine.localID = Utils.makeGUID();
engine.resetClient();
@@ -157,41 +157,41 @@ add_test(function test_bad_hmac() {
// as the object on the server. We'll download the new keys and also delete
// the bad client record.
oldLocalID = engine.localID; // Preserve to test for deletion!
engine.localID = Utils.makeGUID();
engine.resetClient();
generateNewKeys(Service.collectionKeys);
let oldKey = Service.collectionKeys.keyForCollection();
- do_check_eq(deletedCollections.length, 0);
- do_check_eq(deletedItems.length, 0);
+ equal(deletedCollections.length, 0);
+ equal(deletedItems.length, 0);
engine._sync();
- do_check_eq(deletedItems.length, 1);
+ equal(deletedItems.length, 1);
check_client_deleted(oldLocalID);
check_clients_count(1);
let newKey = Service.collectionKeys.keyForCollection();
- do_check_false(oldKey.equals(newKey));
+ ok(!oldKey.equals(newKey));
} finally {
Svc.Prefs.resetBranch("");
Service.recordManager.clearCache();
server.stop(run_next_test);
}
});
add_test(function test_properties() {
_("Test lastRecordUpload property");
try {
- do_check_eq(Svc.Prefs.get("clients.lastRecordUpload"), undefined);
- do_check_eq(engine.lastRecordUpload, 0);
+ equal(Svc.Prefs.get("clients.lastRecordUpload"), undefined);
+ equal(engine.lastRecordUpload, 0);
let now = Date.now();
engine.lastRecordUpload = now / 1000;
- do_check_eq(engine.lastRecordUpload, Math.floor(now / 1000));
+ equal(engine.lastRecordUpload, Math.floor(now / 1000));
} finally {
Svc.Prefs.resetBranch("");
run_next_test();
}
});
add_test(function test_full_sync() {
_("Ensure that Clients engine fetches all records for each sync.");
@@ -283,40 +283,40 @@ add_test(function test_sync() {
function clientWBO() {
return user.collection("clients").wbo(engine.localID);
}
try {
_("First sync. Client record is uploaded.");
- do_check_eq(clientWBO(), undefined);
- do_check_eq(engine.lastRecordUpload, 0);
+ equal(clientWBO(), undefined);
+ equal(engine.lastRecordUpload, 0);
engine._sync();
- do_check_true(!!clientWBO().payload);
- do_check_true(engine.lastRecordUpload > 0);
+ ok(!!clientWBO().payload);
+ ok(engine.lastRecordUpload > 0);
_("Let's time travel more than a week back, new record should've been uploaded.");
engine.lastRecordUpload -= MORE_THAN_CLIENTS_TTL_REFRESH;
let lastweek = engine.lastRecordUpload;
clientWBO().payload = undefined;
engine._sync();
- do_check_true(!!clientWBO().payload);
- do_check_true(engine.lastRecordUpload > lastweek);
+ ok(!!clientWBO().payload);
+ ok(engine.lastRecordUpload > lastweek);
_("Remove client record.");
engine.removeClientData();
- do_check_eq(clientWBO().payload, undefined);
+ equal(clientWBO().payload, undefined);
_("Time travel one day back, no record uploaded.");
engine.lastRecordUpload -= LESS_THAN_CLIENTS_TTL_REFRESH;
let yesterday = engine.lastRecordUpload;
engine._sync();
- do_check_eq(clientWBO().payload, undefined);
- do_check_eq(engine.lastRecordUpload, yesterday);
+ equal(clientWBO().payload, undefined);
+ equal(engine.lastRecordUpload, yesterday);
} finally {
Svc.Prefs.resetBranch("");
Service.recordManager.clearCache();
server.stop(run_next_test);
}
});
@@ -331,26 +331,26 @@ add_test(function test_client_name_chang
Svc.Obs.notify("weave:engine:start-tracking");
_("initial name: " + initialName);
// Tracker already has data, so clear it.
tracker.clearChangedIDs();
let initialScore = tracker.score;
- do_check_eq(Object.keys(tracker.changedIDs).length, 0);
+ equal(Object.keys(tracker.changedIDs).length, 0);
Svc.Prefs.set("client.name", "new name");
_("new name: " + engine.localName);
- do_check_neq(initialName, engine.localName);
- do_check_eq(Object.keys(tracker.changedIDs).length, 1);
- do_check_true(engine.localID in tracker.changedIDs);
- do_check_true(tracker.score > initialScore);
- do_check_true(tracker.score >= SCORE_INCREMENT_XLARGE);
+ notEqual(initialName, engine.localName);
+ equal(Object.keys(tracker.changedIDs).length, 1);
+ ok(engine.localID in tracker.changedIDs);
+ ok(tracker.score > initialScore);
+ ok(tracker.score >= SCORE_INCREMENT_XLARGE);
Svc.Obs.notify("weave:engine:stop-tracking");
run_next_test();
});
add_test(function test_send_command() {
_("Verifies _sendCommandToClient puts commands in the outbound queue.");
@@ -364,25 +364,25 @@ add_test(function test_send_command() {
let remoteRecord = store.createRecord(remoteId, "clients");
let action = "testCommand";
let args = ["foo", "bar"];
engine._sendCommandToClient(action, args, remoteId);
let newRecord = store._remoteClients[remoteId];
- do_check_neq(newRecord, undefined);
- do_check_eq(newRecord.commands.length, 1);
+ notEqual(newRecord, undefined);
+ equal(newRecord.commands.length, 1);
let command = newRecord.commands[0];
- do_check_eq(command.command, action);
- do_check_eq(command.args.length, 2);
- do_check_eq(command.args, args);
+ equal(command.command, action);
+ equal(command.args.length, 2);
+ equal(command.args, args);
- do_check_neq(tracker.changedIDs[remoteId], undefined);
+ notEqual(tracker.changedIDs[remoteId], undefined);
run_next_test();
});
add_test(function test_command_validation() {
_("Verifies that command validation works properly.");
let store = engine._store;
@@ -406,34 +406,34 @@ add_test(function test_command_validatio
let rec = new ClientsRec("clients", remoteId);
store.create(rec);
store.createRecord(remoteId, "clients");
engine.sendCommand(action, args, remoteId);
let newRecord = store._remoteClients[remoteId];
- do_check_neq(newRecord, undefined);
+ notEqual(newRecord, undefined);
if (expectedResult) {
_("Ensuring command is sent: " + action);
- do_check_eq(newRecord.commands.length, 1);
+ equal(newRecord.commands.length, 1);
let command = newRecord.commands[0];
- do_check_eq(command.command, action);
- do_check_eq(command.args, args);
+ equal(command.command, action);
+ equal(command.args, args);
- do_check_neq(engine._tracker, undefined);
- do_check_neq(engine._tracker.changedIDs[remoteId], undefined);
+ notEqual(engine._tracker, undefined);
+ notEqual(engine._tracker.changedIDs[remoteId], undefined);
} else {
_("Ensuring command is scrubbed: " + action);
- do_check_eq(newRecord.commands, undefined);
+ equal(newRecord.commands, undefined);
if (store._tracker) {
- do_check_eq(engine._tracker[remoteId], undefined);
+ equal(engine._tracker[remoteId], undefined);
}
}
}
run_next_test();
});
add_test(function test_command_duplication() {
@@ -447,46 +447,46 @@ add_test(function test_command_duplicati
let action = "resetAll";
let args = [];
engine.sendCommand(action, args, remoteId);
engine.sendCommand(action, args, remoteId);
let newRecord = store._remoteClients[remoteId];
- do_check_eq(newRecord.commands.length, 1);
+ equal(newRecord.commands.length, 1);
_("Check variant args length");
newRecord.commands = [];
action = "resetEngine";
engine.sendCommand(action, [{ x: "foo" }], remoteId);
engine.sendCommand(action, [{ x: "bar" }], remoteId);
_("Make sure we spot a real dupe argument.");
engine.sendCommand(action, [{ x: "bar" }], remoteId);
- do_check_eq(newRecord.commands.length, 2);
+ equal(newRecord.commands.length, 2);
run_next_test();
});
add_test(function test_command_invalid_client() {
_("Ensures invalid client IDs are caught");
let id = Utils.makeGUID();
let error;
try {
engine.sendCommand("wipeAll", [], id);
} catch (ex) {
error = ex;
}
- do_check_eq(error.message.indexOf("Unknown remote client ID: "), 0);
+ equal(error.message.indexOf("Unknown remote client ID: "), 0);
run_next_test();
});
add_test(function test_process_incoming_commands() {
_("Ensures local commands are executed");
engine.localCommands = [{ command: "logout", args: [] }];
@@ -501,17 +501,17 @@ add_test(function test_process_incoming_
engine._resetClient();
run_next_test();
};
Svc.Obs.add(ev, handler);
// logout command causes processIncomingCommands to return explicit false.
- do_check_false(engine.processIncomingCommands());
+ ok(!engine.processIncomingCommands());
});
add_test(function test_filter_duplicate_names() {
_("Ensure that we exclude clients with identical names that haven't synced in a week.");
let now = Date.now() / 1000;
let contents = {
meta: {global: {engines: {clients: {version: engine.version,
@@ -698,41 +698,41 @@ add_test(function test_command_sync() {
}), Date.now() / 1000));
try {
_("Syncing.");
engine._sync();
_("Checking remote record was downloaded.");
let clientRecord = engine._store._remoteClients[remoteId];
- do_check_neq(clientRecord, undefined);
- do_check_eq(clientRecord.commands.length, 0);
+ notEqual(clientRecord, undefined);
+ equal(clientRecord.commands.length, 0);
_("Send a command to the remote client.");
engine.sendCommand("wipeAll", []);
- do_check_eq(clientRecord.commands.length, 1);
+ equal(clientRecord.commands.length, 1);
engine._sync();
_("Checking record was uploaded.");
- do_check_neq(clientWBO(engine.localID).payload, undefined);
- do_check_true(engine.lastRecordUpload > 0);
+ notEqual(clientWBO(engine.localID).payload, undefined);
+ ok(engine.lastRecordUpload > 0);
- do_check_neq(clientWBO(remoteId).payload, undefined);
+ notEqual(clientWBO(remoteId).payload, undefined);
Svc.Prefs.set("client.GUID", remoteId);
engine._resetClient();
- do_check_eq(engine.localID, remoteId);
+ equal(engine.localID, remoteId);
_("Performing sync on resetted client.");
engine._sync();
- do_check_neq(engine.localCommands, undefined);
- do_check_eq(engine.localCommands.length, 1);
+ notEqual(engine.localCommands, undefined);
+ equal(engine.localCommands.length, 1);
let command = engine.localCommands[0];
- do_check_eq(command.command, "wipeAll");
- do_check_eq(command.args.length, 0);
+ equal(command.command, "wipeAll");
+ equal(command.args.length, 0);
} finally {
Svc.Prefs.resetBranch("");
Service.recordManager.clearCache();
try {
let collection = server.getCollection("foo", "clients");
collection.remove(remoteId);
@@ -758,40 +758,40 @@ add_test(function test_send_uri_to_clien
let initialScore = tracker.score;
let uri = "http://www.mozilla.org/";
let title = "Title of the Page";
engine.sendURIToClientForDisplay(uri, remoteId, title);
let newRecord = store._remoteClients[remoteId];
- do_check_neq(newRecord, undefined);
- do_check_eq(newRecord.commands.length, 1);
+ notEqual(newRecord, undefined);
+ equal(newRecord.commands.length, 1);
let command = newRecord.commands[0];
- do_check_eq(command.command, "displayURI");
- do_check_eq(command.args.length, 3);
- do_check_eq(command.args[0], uri);
- do_check_eq(command.args[1], engine.localID);
- do_check_eq(command.args[2], title);
+ equal(command.command, "displayURI");
+ equal(command.args.length, 3);
+ equal(command.args[0], uri);
+ equal(command.args[1], engine.localID);
+ equal(command.args[2], title);
- do_check_true(tracker.score > initialScore);
- do_check_true(tracker.score - initialScore >= SCORE_INCREMENT_XLARGE);
+ ok(tracker.score > initialScore);
+ ok(tracker.score - initialScore >= SCORE_INCREMENT_XLARGE);
_("Ensure unknown client IDs result in exception.");
let unknownId = Utils.makeGUID();
let error;
try {
engine.sendURIToClientForDisplay(uri, unknownId);
} catch (ex) {
error = ex;
}
- do_check_eq(error.message.indexOf("Unknown remote client ID: "), 0);
+ equal(error.message.indexOf("Unknown remote client ID: "), 0);
Svc.Prefs.resetBranch("");
Service.recordManager.clearCache();
engine._resetClient();
run_next_test();
});
@@ -814,52 +814,52 @@ add_test(function test_receive_display_u
// Received 'displayURI' command should result in the topic defined below
// being called.
let ev = "weave:engine:clients:display-uris";
let handler = function(subject, data) {
Svc.Obs.remove(ev, handler);
- do_check_eq(subject[0].uri, uri);
- do_check_eq(subject[0].clientId, remoteId);
- do_check_eq(subject[0].title, title);
- do_check_eq(data, null);
+ equal(subject[0].uri, uri);
+ equal(subject[0].clientId, remoteId);
+ equal(subject[0].title, title);
+ equal(data, null);
run_next_test();
};
Svc.Obs.add(ev, handler);
- do_check_true(engine.processIncomingCommands());
+ ok(engine.processIncomingCommands());
Svc.Prefs.resetBranch("");
Service.recordManager.clearCache();
engine._resetClient();
});
add_test(function test_optional_client_fields() {
_("Ensure that we produce records with the fields added in Bug 1097222.");
const SUPPORTED_PROTOCOL_VERSIONS = ["1.1", "1.5"];
let local = engine._store.createRecord(engine.localID, "clients");
- do_check_eq(local.name, engine.localName);
- do_check_eq(local.type, engine.localType);
- do_check_eq(local.version, Services.appinfo.version);
- do_check_array_eq(local.protocols, SUPPORTED_PROTOCOL_VERSIONS);
+ equal(local.name, engine.localName);
+ equal(local.type, engine.localType);
+ equal(local.version, Services.appinfo.version);
+ deepEqual(local.protocols, SUPPORTED_PROTOCOL_VERSIONS);
// Optional fields.
// Make sure they're what they ought to be...
- do_check_eq(local.os, Services.appinfo.OS);
- do_check_eq(local.appPackage, Services.appinfo.ID);
+ equal(local.os, Services.appinfo.OS);
+ equal(local.appPackage, Services.appinfo.ID);
// ... and also that they're non-empty.
- do_check_true(!!local.os);
- do_check_true(!!local.appPackage);
- do_check_true(!!local.application);
+ ok(!!local.os);
+ ok(!!local.appPackage);
+ ok(!!local.application);
// We don't currently populate device or formfactor.
// See Bug 1100722, Bug 1100723.
engine._resetClient();
run_next_test();
});
@@ -1065,13 +1065,85 @@ add_test(function test_send_uri_ack() {
try {
server.deleteCollections("foo");
} finally {
server.stop(run_next_test);
}
}
});
+add_test(function test_command_sync() {
+ _("Notify other clients when writing their record.");
+
+ engine._store.wipe();
+ generateNewKeys(Service.collectionKeys);
+
+ let contents = {
+ meta: {global: {engines: {clients: {version: engine.version,
+ syncID: engine.syncID}}}},
+ clients: {},
+ crypto: {}
+ };
+ let server = serverForUsers({"foo": "password"}, contents);
+ new SyncTestingInfrastructure(server.server);
+
+ let user = server.user("foo");
+ let collection = server.getCollection("foo", "clients");
+ let remoteId = Utils.makeGUID();
+ let remoteId2 = Utils.makeGUID();
+
+ function clientWBO(id) {
+ return user.collection("clients").wbo(id);
+ }
+
+ _("Create remote client record 1");
+ server.insertWBO("foo", "clients", new ServerWBO(remoteId, encryptPayload({
+ id: remoteId,
+ name: "Remote client",
+ type: "desktop",
+ commands: [],
+ version: "48",
+ protocols: ["1.5"]
+ }), Date.now() / 1000));
+
+ _("Create remote client record 2");
+ server.insertWBO("foo", "clients", new ServerWBO(remoteId2, encryptPayload({
+ id: remoteId2,
+ name: "Remote client 2",
+ type: "mobile",
+ commands: [],
+ version: "48",
+ protocols: ["1.5"]
+ }), Date.now() / 1000));
+
+ try {
+ equal(collection.count(), 2, "2 remote records written");
+ engine._sync();
+ equal(collection.count(), 3, "3 remote records written (+1 for the synced local record)");
+
+ let notifiedIds;
+ engine.sendCommand("wipeAll", []);
+ engine._tracker.addChangedID(engine.localID);
+ engine.getClientFxaDeviceId = (id) => "fxa-" + id;
+ engine._notifyCollectionChanged = (ids) => (notifiedIds = ids);
+ _("Syncing.");
+ engine._sync();
+ deepEqual(notifiedIds, ["fxa-fake-guid-00","fxa-fake-guid-01"]);
+ ok(!notifiedIds.includes(engine.getClientFxaDeviceId(engine.localID)),
+ "We never notify the local device");
+
+ } finally {
+ Svc.Prefs.resetBranch("");
+ Service.recordManager.clearCache();
+
+ try {
+ server.deleteCollections("foo");
+ } finally {
+ server.stop(run_next_test);
+ }
+ }
+});
+
function run_test() {
initTestLogging("Trace");
Log.repository.getLogger("Sync.Engine.Clients").level = Log.Level.Trace;
run_next_test();
}