summaryrefslogtreecommitdiffstats
path: root/services/sync/tests/unit/test_tab_store.js
diff options
context:
space:
mode:
Diffstat (limited to 'services/sync/tests/unit/test_tab_store.js')
-rw-r--r--services/sync/tests/unit/test_tab_store.js177
1 files changed, 177 insertions, 0 deletions
diff --git a/services/sync/tests/unit/test_tab_store.js b/services/sync/tests/unit/test_tab_store.js
new file mode 100644
index 0000000000..34227eee07
--- /dev/null
+++ b/services/sync/tests/unit/test_tab_store.js
@@ -0,0 +1,177 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const { TabEngine, TabSetRecord } = ChromeUtils.import(
+ "resource://services-sync/engines/tabs.js"
+);
+const { Service } = ChromeUtils.import("resource://services-sync/service.js");
+
+async function getMockStore() {
+ let engine = new TabEngine(Service);
+ await engine.initialize();
+ let store = engine._store;
+ store.getTabState = mockGetTabState;
+ store.shouldSkipWindow = mockShouldSkipWindow;
+ return store;
+}
+
+add_task(async function test_create() {
+ let engine = new TabEngine(Service);
+ await engine.initialize();
+ let store = engine._store;
+
+ _("Create a first record");
+ let rec = {
+ id: "id1",
+ clientName: "clientName1",
+ cleartext: { foo: "bar" },
+ modified: 1000,
+ };
+ await store.applyIncoming(rec);
+ deepEqual(store._remoteClients.id1, { lastModified: 1000, foo: "bar" });
+
+ _("Create a second record");
+ rec = {
+ id: "id2",
+ clientName: "clientName2",
+ cleartext: { foo2: "bar2" },
+ modified: 2000,
+ };
+ await store.applyIncoming(rec);
+ deepEqual(store._remoteClients.id2, { lastModified: 2000, foo2: "bar2" });
+
+ _("Create a third record");
+ rec = {
+ id: "id3",
+ clientName: "clientName3",
+ cleartext: { foo3: "bar3" },
+ modified: 3000,
+ };
+ await store.applyIncoming(rec);
+ deepEqual(store._remoteClients.id3, { lastModified: 3000, foo3: "bar3" });
+});
+
+add_task(async function test_getAllTabs() {
+ let store = await getMockStore();
+ let tabs;
+
+ let threeUrls = ["http://foo.com", "http://fuubar.com", "http://barbar.com"];
+
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://bar.com",
+ 1,
+ 1,
+ () => 2,
+ () => threeUrls
+ );
+
+ _("Get all tabs.");
+ tabs = await store.getAllTabs();
+ _("Tabs: " + JSON.stringify(tabs));
+ equal(tabs.length, 1);
+ equal(tabs[0].title, "title");
+ equal(tabs[0].urlHistory.length, 2);
+ equal(tabs[0].urlHistory[0], "http://foo.com");
+ equal(tabs[0].urlHistory[1], "http://bar.com");
+ equal(tabs[0].icon, "");
+ equal(tabs[0].lastUsed, 1);
+
+ _("Get all tabs, and check that filtering works.");
+ let twoUrls = ["about:foo", "http://fuubar.com"];
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://foo.com",
+ 1,
+ 1,
+ () => 2,
+ () => twoUrls
+ );
+ tabs = await store.getAllTabs(true);
+ _("Filtered: " + JSON.stringify(tabs));
+ equal(tabs.length, 0);
+
+ _("Get all tabs, and check that the entries safety limit works.");
+ let allURLs = [];
+ for (let i = 0; i < 50; i++) {
+ allURLs.push("http://foo" + i + ".bar");
+ }
+ allURLs.splice(35, 0, "about:foo", "about:bar", "about:foobar");
+
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://bar.com",
+ 1,
+ 1,
+ () => 45,
+ () => allURLs
+ );
+ tabs = await store.getAllTabs(url => url.startsWith("about"));
+
+ _("Sliced: " + JSON.stringify(tabs));
+ equal(tabs.length, 1);
+ equal(tabs[0].urlHistory.length, 5);
+ equal(tabs[0].urlHistory[0], "http://foo40.bar");
+ equal(tabs[0].urlHistory[4], "http://foo36.bar");
+});
+
+add_task(async function test_createRecord() {
+ let store = await getMockStore();
+ let record;
+
+ store.getTabState = mockGetTabState;
+ store.shouldSkipWindow = mockShouldSkipWindow;
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://foo.com",
+ 1,
+ 1
+ );
+ // This number is sensitive to our hard-coded default max record payload size
+ // in service.js (256 * 1024).
+ // It should be larger than how many records we can fit in a single payload.
+ let numtabs = 2700;
+
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://foo.com",
+ 1,
+ 1
+ );
+ record = await store.createRecord("fake-guid");
+ ok(record instanceof TabSetRecord);
+ equal(record.tabs.length, 1);
+
+ _("create a big record");
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://foo.com",
+ 1,
+ numtabs
+ );
+ record = await store.createRecord("fake-guid");
+ ok(record instanceof TabSetRecord);
+ // This number is sensitive to our hard-coded default max record payload size
+ // in service.js (256 * 1024). Given our mock session-store etc, it is the
+ // actual max we can fit.
+ equal(record.tabs.length, 2672);
+
+ let maxSizeStub = sinon
+ .stub(Service, "getMemcacheMaxRecordPayloadSize")
+ .callsFake(() => 512 * 1024);
+ try {
+ numtabs = 5400;
+ _("Modify the max record payload size and create a big record");
+ store.getWindowEnumerator = mockGetWindowEnumerator.bind(
+ this,
+ "http://foo.com",
+ 1,
+ numtabs
+ );
+ record = await store.createRecord("fake-guid");
+ ok(record instanceof TabSetRecord);
+ equal(record.tabs.length, 5365);
+ } finally {
+ maxSizeStub.restore();
+ }
+});