summaryrefslogtreecommitdiffstats
path: root/services/sync/modules-testing/rotaryengine.js
diff options
context:
space:
mode:
Diffstat (limited to 'services/sync/modules-testing/rotaryengine.js')
-rw-r--r--services/sync/modules-testing/rotaryengine.js126
1 files changed, 126 insertions, 0 deletions
diff --git a/services/sync/modules-testing/rotaryengine.js b/services/sync/modules-testing/rotaryengine.js
new file mode 100644
index 0000000000..e8d4293c5a
--- /dev/null
+++ b/services/sync/modules-testing/rotaryengine.js
@@ -0,0 +1,126 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+var EXPORTED_SYMBOLS = [
+ "RotaryEngine",
+ "RotaryRecord",
+ "RotaryStore",
+ "RotaryTracker",
+];
+
+const { Store, SyncEngine, LegacyTracker } = ChromeUtils.import(
+ "resource://services-sync/engines.js"
+);
+const { CryptoWrapper } = ChromeUtils.import(
+ "resource://services-sync/record.js"
+);
+const { SerializableSet, Utils } = ChromeUtils.import(
+ "resource://services-sync/util.js"
+);
+
+/*
+ * A fake engine implementation.
+ * This is used all over the place.
+ *
+ * Complete with record, store, and tracker implementations.
+ */
+
+function RotaryRecord(collection, id) {
+ CryptoWrapper.call(this, collection, id);
+}
+RotaryRecord.prototype = {};
+Object.setPrototypeOf(RotaryRecord.prototype, CryptoWrapper.prototype);
+Utils.deferGetSet(RotaryRecord, "cleartext", ["denomination"]);
+
+function RotaryStore(name, engine) {
+ Store.call(this, name, engine);
+ this.items = {};
+}
+RotaryStore.prototype = {
+ async create(record) {
+ this.items[record.id] = record.denomination;
+ },
+
+ async remove(record) {
+ delete this.items[record.id];
+ },
+
+ async update(record) {
+ this.items[record.id] = record.denomination;
+ },
+
+ async itemExists(id) {
+ return id in this.items;
+ },
+
+ async createRecord(id, collection) {
+ let record = new RotaryRecord(collection, id);
+
+ if (!(id in this.items)) {
+ record.deleted = true;
+ return record;
+ }
+
+ record.denomination = this.items[id] || "Data for new record: " + id;
+ return record;
+ },
+
+ async changeItemID(oldID, newID) {
+ if (oldID in this.items) {
+ this.items[newID] = this.items[oldID];
+ }
+
+ delete this.items[oldID];
+ },
+
+ async getAllIDs() {
+ let ids = {};
+ for (let id in this.items) {
+ ids[id] = true;
+ }
+ return ids;
+ },
+
+ async wipe() {
+ this.items = {};
+ },
+};
+
+Object.setPrototypeOf(RotaryStore.prototype, Store.prototype);
+
+function RotaryTracker(name, engine) {
+ LegacyTracker.call(this, name, engine);
+}
+RotaryTracker.prototype = {};
+Object.setPrototypeOf(RotaryTracker.prototype, LegacyTracker.prototype);
+
+function RotaryEngine(service) {
+ SyncEngine.call(this, "Rotary", service);
+ // Ensure that the engine starts with a clean slate.
+ this.toFetch = new SerializableSet();
+ this.previousFailed = new SerializableSet();
+}
+RotaryEngine.prototype = {
+ _storeObj: RotaryStore,
+ _trackerObj: RotaryTracker,
+ _recordObj: RotaryRecord,
+
+ async _findDupe(item) {
+ // This is a Special Value® used for testing proper reconciling on dupe
+ // detection.
+ if (item.id == "DUPE_INCOMING") {
+ return "DUPE_LOCAL";
+ }
+
+ for (let [id, value] of Object.entries(this._store.items)) {
+ if (item.denomination == value) {
+ return id;
+ }
+ }
+ return null;
+ },
+};
+Object.setPrototypeOf(RotaryEngine.prototype, SyncEngine.prototype);