summaryrefslogtreecommitdiffstats
path: root/browser/components/doh/DoHTestUtils.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/doh/DoHTestUtils.sys.mjs')
-rw-r--r--browser/components/doh/DoHTestUtils.sys.mjs133
1 files changed, 133 insertions, 0 deletions
diff --git a/browser/components/doh/DoHTestUtils.sys.mjs b/browser/components/doh/DoHTestUtils.sys.mjs
new file mode 100644
index 0000000000..b89c1fe966
--- /dev/null
+++ b/browser/components/doh/DoHTestUtils.sys.mjs
@@ -0,0 +1,133 @@
+/* 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/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
+ TestUtils: "resource://testing-common/TestUtils.sys.mjs",
+});
+
+const kConfigCollectionKey = "doh-config";
+const kProviderCollectionKey = "doh-providers";
+
+const kConfigUpdateTopic = "doh-config-updated";
+const kControllerReloadedTopic = "doh:controller-reloaded";
+
+/*
+ * Some helpers for loading and modifying DoH config in
+ * Remote Settings. Call resetRemoteSettingsConfig to set up
+ * basic default config that omits external URLs. Use
+ * waitForConfigFlush to wait for DoH actors to pick up changes.
+ *
+ * Some tests need to load/reset config while DoH actors are
+ * uninitialized. Pass waitForConfigFlushes = false in these cases.
+ */
+export const DoHTestUtils = {
+ providers: [
+ {
+ uri: "https://example.com/1",
+ UIName: "Example 1",
+ autoDefault: false,
+ canonicalName: "",
+ id: "example-1",
+ },
+ {
+ uri: "https://example.com/2",
+ UIName: "Example 2",
+ autoDefault: false,
+ canonicalName: "",
+ id: "example-2",
+ },
+ ],
+
+ async loadRemoteSettingsProviders(providers, waitForConfigFlushes = true) {
+ let configFlushedPromise = this.waitForConfigFlush(waitForConfigFlushes);
+
+ let providerRS = lazy.RemoteSettings(kProviderCollectionKey);
+ let db = await providerRS.db;
+ await db.importChanges({}, Date.now(), providers, { clear: true });
+
+ // Trigger a sync.
+ await this.triggerSync(providerRS);
+
+ await configFlushedPromise;
+ },
+
+ async loadRemoteSettingsConfig(config, waitForConfigFlushes = true) {
+ let configFlushedPromise = this.waitForConfigFlush(waitForConfigFlushes);
+
+ let configRS = lazy.RemoteSettings(kConfigCollectionKey);
+ let db = await configRS.db;
+ await db.importChanges({}, Date.now(), [config]);
+
+ // Trigger a sync.
+ await this.triggerSync(configRS);
+
+ await configFlushedPromise;
+ },
+
+ // Loads default config for testing without clearing existing entries.
+ async loadDefaultRemoteSettingsConfig(waitForConfigFlushes = true) {
+ await this.loadRemoteSettingsProviders(
+ this.providers,
+ waitForConfigFlushes
+ );
+
+ await this.loadRemoteSettingsConfig(
+ {
+ providers: "example-1, example-2",
+ rolloutEnabled: false,
+ steeringEnabled: false,
+ steeringProviders: "",
+ autoDefaultEnabled: false,
+ autoDefaultProviders: "",
+ id: "global",
+ },
+ waitForConfigFlushes
+ );
+ },
+
+ // Clears existing config AND loads defaults.
+ async resetRemoteSettingsConfig(waitForConfigFlushes = true) {
+ let providerRS = lazy.RemoteSettings(kProviderCollectionKey);
+ let configRS = lazy.RemoteSettings(kConfigCollectionKey);
+ for (let rs of [providerRS, configRS]) {
+ let configFlushedPromise = this.waitForConfigFlush(waitForConfigFlushes);
+ await rs.db.importChanges({}, Date.now(), [], { clear: true });
+ // Trigger a sync to clear.
+ await this.triggerSync(rs);
+ await configFlushedPromise;
+ }
+
+ await this.loadDefaultRemoteSettingsConfig(waitForConfigFlushes);
+ },
+
+ triggerSync(rs) {
+ return rs.emit("sync", {
+ data: {
+ current: [],
+ },
+ });
+ },
+
+ waitForConfigUpdate() {
+ return lazy.TestUtils.topicObserved(kConfigUpdateTopic);
+ },
+
+ waitForControllerReload() {
+ return lazy.TestUtils.topicObserved(kControllerReloadedTopic);
+ },
+
+ waitForConfigFlush(shouldWait = true) {
+ if (!shouldWait) {
+ return Promise.resolve();
+ }
+
+ return Promise.all([
+ this.waitForConfigUpdate(),
+ this.waitForControllerReload(),
+ ]);
+ },
+};