forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			133 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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(),
 | |
|     ]);
 | |
|   },
 | |
| };
 | 
