Index: test/filterStorage.js |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/test/filterStorage.js |
@@ -0,0 +1,303 @@ |
+/* |
+ * This file is part of Adblock Plus <https://adblockplus.org/>, |
+ * Copyright (C) 2006-present eyeo GmbH |
+ * |
+ * Adblock Plus is free software: you can redistribute it and/or modify |
+ * it under the terms of the GNU General Public License version 3 as |
+ * published by the Free Software Foundation. |
+ * |
+ * Adblock Plus is distributed in the hope that it will be useful, |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ * GNU General Public License for more details. |
+ * |
+ * You should have received a copy of the GNU General Public License |
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
+ */ |
+ |
+"use strict"; |
+ |
+const {createSandbox} = require("./_common"); |
+ |
+let Filter = null; |
+let FilterNotifier = null; |
+let FilterStorage = null; |
+let Subscription = null; |
+ |
+exports.setUp = function(callback) |
+{ |
+ let sandboxedRequire = createSandbox(); |
+ |
+ ( |
+ {Filter} = sandboxedRequire("../lib/filterClasses"), |
+ {FilterNotifier} = sandboxedRequire("../lib/filterNotifier"), |
+ {FilterStorage} = sandboxedRequire("../lib/filterStorage"), |
+ {Subscription} = sandboxedRequire("../lib/subscriptionClasses") |
+ ); |
+ |
+ callback(); |
+}; |
+ |
+function compareSubscriptionList(test, testMessage, list) |
+{ |
+ let result = Array.from(FilterStorage.subscriptions, subscription => subscription.url); |
+ let expected = list.map(subscription => subscription.url); |
+ test.deepEqual(result, expected, testMessage); |
+} |
+ |
+function compareFiltersList(test, testMessage, list) |
+{ |
+ let result = Array.from(FilterStorage.subscriptions, subscription => |
+ { |
+ return Array.from(subscription.filters, filter => filter.text); |
+ }); |
+ test.deepEqual(result, list, testMessage); |
+} |
+ |
+exports.testAddingRemovingSubscriptions = function(test) |
+{ |
+ let subscription1 = Subscription.fromURL("http://test1/"); |
+ let subscription2 = Subscription.fromURL("http://test2/"); |
+ test.ok(!subscription1.listed, "First subscription not listed"); |
+ test.ok(!subscription2.listed, "Second subscription not listed"); |
+ |
+ let changes = []; |
+ function listener(action, subscription) |
+ { |
+ if (action.indexOf("subscription.") == 0) |
+ changes.push(action + " " + subscription.url); |
+ } |
+ FilterNotifier.addListener(listener); |
+ |
+ compareSubscriptionList(test, "Initial state", []); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ changes = []; |
+ FilterStorage.addSubscription(subscription1); |
+ compareSubscriptionList(test, "Adding first subscription", [subscription1]); |
+ test.deepEqual(changes, ["subscription.added http://test1/"], "Received changes"); |
+ test.ok(subscription1.listed, "First subscription listed"); |
+ test.ok(!subscription2.listed, "Second subscription not listed"); |
+ |
+ changes = []; |
+ FilterStorage.addSubscription(subscription1); |
+ compareSubscriptionList(test, "Adding already added subscription", [subscription1]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ test.ok(subscription1.listed, "First subscription listed"); |
+ test.ok(!subscription2.listed, "Second subscription not listed"); |
+ |
+ changes = []; |
+ FilterStorage.addSubscription(subscription2); |
+ compareSubscriptionList(test, "Adding second", [subscription1, subscription2]); |
+ test.deepEqual(changes, ["subscription.added http://test2/"], "Received changes"); |
+ test.ok(subscription1.listed, "First subscription listed"); |
+ test.ok(subscription2.listed, "Second subscription listed"); |
+ |
+ changes = []; |
+ FilterStorage.removeSubscription(subscription1); |
+ compareSubscriptionList(test, "Remove", [subscription2]); |
+ test.deepEqual(changes, ["subscription.removed http://test1/"], "Received changes"); |
+ test.ok(!subscription1.listed, "First subscription not listed"); |
+ test.ok(subscription2.listed, "Second subscription listed"); |
+ |
+ changes = []; |
+ FilterStorage.removeSubscription(subscription1); |
+ compareSubscriptionList(test, "Removing already removed subscription", [subscription2]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ test.ok(!subscription1.listed, "First subscription not listed"); |
+ test.ok(subscription2.listed, "Second subscription listed"); |
+ |
+ changes = []; |
+ FilterStorage.removeSubscription(subscription2); |
+ compareSubscriptionList(test, "Removing remaining subscription", []); |
+ test.deepEqual(changes, ["subscription.removed http://test2/"], "Received changes"); |
+ test.ok(!subscription1.listed, "First subscription not listed"); |
+ test.ok(!subscription2.listed, "Second subscription not listed"); |
+ |
+ changes = []; |
+ FilterStorage.addSubscription(subscription2); |
+ compareSubscriptionList(test, "Re-adding previously removed subscription", [subscription2]); |
+ test.deepEqual(changes, ["subscription.added http://test2/"], "Received changes"); |
+ test.ok(!subscription1.listed, "First subscription not listed"); |
+ test.ok(subscription2.listed, "Second subscription listed"); |
+ |
+ changes = []; |
+ FilterStorage.removeSubscription(subscription2); |
+ compareSubscriptionList(test, "Re-removing previously added subscription", []); |
+ test.deepEqual(changes, ["subscription.removed http://test2/"], "Received changes"); |
+ test.ok(!subscription1.listed, "First subscription not listed"); |
+ test.ok(!subscription2.listed, "Second subscription not listed"); |
+ |
+ subscription1.delete(); |
+ subscription2.delete(); |
+ |
+ test.done(); |
+}; |
+ |
+exports.testMovingSubscriptions = function(test) |
+{ |
+ let subscription1 = Subscription.fromURL("http://test1/"); |
+ let subscription2 = Subscription.fromURL("http://test2/"); |
+ let subscription3 = Subscription.fromURL("http://test3/"); |
+ |
+ FilterStorage.addSubscription(subscription1); |
+ FilterStorage.addSubscription(subscription2); |
+ FilterStorage.addSubscription(subscription3); |
+ |
+ let changes = []; |
+ function listener(action, subscription) |
+ { |
+ if (action.indexOf("subscription.") == 0) |
+ changes.push(action + " " + subscription.url); |
+ } |
+ FilterNotifier.addListener(listener); |
+ |
+ compareSubscriptionList(test, "Initial state", [subscription1, subscription2, subscription3]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ changes = []; |
+ test.ok(FilterStorage.moveSubscription(subscription1), "Move without explicit position succeeded"); |
+ compareSubscriptionList(test, "Move without explicit position", [subscription2, subscription3, subscription1]); |
+ test.deepEqual(changes, ["subscription.moved http://test1/"], "Received changes"); |
+ |
+ changes = []; |
+ test.ok(!FilterStorage.moveSubscription(subscription1), "Move without explicit position failed (subscription already last)"); |
+ compareSubscriptionList(test, "Move without explicit position (subscription already last)", [subscription2, subscription3, subscription1]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ changes = []; |
+ test.ok(FilterStorage.moveSubscription(subscription2, subscription1), "Move with explicit position succeeded"); |
+ compareSubscriptionList(test, "Move with explicit position", [subscription3, subscription2, subscription1]); |
+ test.deepEqual(changes, ["subscription.moved http://test2/"], "Received changes"); |
+ |
+ changes = []; |
+ test.ok(!FilterStorage.moveSubscription(subscription3, subscription2), "Move without explicit position failed (subscription already at position)"); |
+ compareSubscriptionList(test, "Move without explicit position (subscription already at position)", [subscription3, subscription2, subscription1]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ FilterStorage.removeSubscription(subscription2); |
+ compareSubscriptionList(test, "Remove", [subscription3, subscription1]); |
+ |
+ changes = []; |
+ test.ok(FilterStorage.moveSubscription(subscription3, subscription2), "Move before removed subscription succeeded"); |
+ compareSubscriptionList(test, "Move before removed subscription", [subscription1, subscription3]); |
+ test.deepEqual(changes, ["subscription.moved http://test3/"], "Received changes"); |
+ |
+ changes = []; |
+ test.ok(!FilterStorage.moveSubscription(subscription2), "Move of removed subscription failed"); |
+ compareSubscriptionList(test, "Move of removed subscription", [subscription1, subscription3]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ subscription1.delete(); |
+ subscription2.delete(); |
+ subscription3.delete(); |
+ |
+ test.done(); |
+}; |
+ |
+exports.testAddingRemovingFilters = function(test) |
+{ |
+ function addFilter(text) |
+ { |
+ let filter = Filter.fromText(text); |
+ FilterStorage.addFilter(filter); |
+ filter.delete(); |
+ } |
+ |
+ function removeFilter(text) |
+ { |
+ let filter = Filter.fromText(text); |
+ FilterStorage.removeFilter(filter); |
+ filter.delete(); |
+ } |
+ |
+ |
+ let changes = []; |
+ function listener(action, filter, subscription, position) |
+ { |
+ if (action.indexOf("filter.") == 0) |
+ { |
+ changes.push([ |
+ action, filter.text, FilterStorage.indexOfSubscription(subscription), |
+ position |
+ ].join(" ")); |
+ } |
+ } |
+ FilterNotifier.addListener(listener); |
+ |
+ compareFiltersList(test, "Initial state", []); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ changes = []; |
+ addFilter("foo"); |
+ compareFiltersList(test, "Adding blocking filter", [["foo"]]); |
+ test.deepEqual(changes, ["filter.added foo 0 0"], "Received changes"); |
+ |
+ changes = []; |
+ addFilter("@@bar"); |
+ compareFiltersList(test, "Adding exception rule", [["foo"], ["@@bar"]]); |
+ test.deepEqual(changes, ["filter.added @@bar 1 0"], "Received changes"); |
+ |
+ { |
+ let subscription = FilterStorage.subscriptionAt(1); |
+ let filter = Filter.fromText("##elemhide"); |
+ subscription.makeDefaultFor(filter); |
+ filter.delete(); |
+ subscription.delete(); |
+ } |
+ |
+ { |
+ let subscription = Subscription.fromURL("~other"); |
+ FilterStorage.addSubscription(subscription); |
+ subscription.delete(); |
+ } |
+ |
+ test.deepEqual(Array.from(FilterStorage.subscriptions, s => s.isGeneric()), |
+ [false, false, true], "SpecialSubscription.isGeneric() result"); |
+ |
+ changes = []; |
+ addFilter("foo##bar"); |
+ compareFiltersList(test, "Adding hiding rule", [["foo"], ["@@bar", "foo##bar"], []]); |
+ test.deepEqual(changes, ["filter.added foo##bar 1 1"], "Received changes"); |
+ |
+ changes = []; |
+ addFilter("foo#@#bar"); |
+ compareFiltersList(test, "Adding hiding exception", [["foo"], ["@@bar", "foo##bar", "foo#@#bar"], []]); |
+ test.deepEqual(changes, ["filter.added foo#@#bar 1 2"], "Received changes"); |
+ |
+ changes = []; |
+ addFilter("!foobar"); |
+ compareFiltersList(test, "Adding comment", [["foo"], ["@@bar", "foo##bar", "foo#@#bar"], ["!foobar"]]); |
+ test.deepEqual(changes, ["filter.added !foobar 2 0"], "Received changes"); |
+ |
+ changes = []; |
+ addFilter("foo"); |
+ compareFiltersList(test, "Adding already added filter", [["foo"], ["@@bar", "foo##bar", "foo#@#bar"], ["!foobar"]]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ { |
+ let subscription = FilterStorage.subscriptionAt(0); |
+ subscription.disabled = true; |
+ subscription.delete(); |
+ } |
+ |
+ changes = []; |
+ addFilter("foo"); |
+ compareFiltersList(test, "Adding filter already in a disabled subscription", [["foo"], ["@@bar", "foo##bar", "foo#@#bar"], ["!foobar", "foo"]]); |
+ test.deepEqual(changes, ["filter.added foo 2 1"], "Received changes"); |
+ |
+ changes = []; |
+ removeFilter("foo"); |
+ compareFiltersList(test, "Removing filter", [[], ["@@bar", "foo##bar", "foo#@#bar"], ["!foobar"]]); |
+ test.deepEqual(changes, [ |
+ "filter.removed foo 0 0", |
+ "filter.removed foo 2 1" |
+ ], "Received changes"); |
+ |
+ changes = []; |
+ removeFilter("foo"); |
+ compareFiltersList(test, "Removing unknown filter", [[], ["@@bar", "foo##bar", "foo#@#bar"], ["!foobar"]]); |
+ test.deepEqual(changes, [], "Received changes"); |
+ |
+ test.done(); |
+}; |