test_remote_settings_release_prefs.js (6849B)
1 "use strict"; 2 3 var nextUniqId = 0; 4 function getNewUtils() { 5 const { Utils } = ChromeUtils.importESModule( 6 `resource://services-settings/Utils.sys.mjs?_${++nextUniqId}` 7 ); 8 return Utils; 9 } 10 11 // A collection with a dump that's packaged on all builds where this test runs, 12 // including on Android at mobile/android/installer/package-manifest.in 13 const TEST_BUCKET = "main"; 14 const TEST_COLLECTION = "password-recipes"; 15 16 async function importData(records) { 17 await RemoteSettingsWorker._execute("_test_only_import", [ 18 TEST_BUCKET, 19 TEST_COLLECTION, 20 records, 21 records[0]?.last_modified || 0, 22 ]); 23 } 24 25 async function clear_state() { 26 Services.env.set("MOZ_REMOTE_SETTINGS_DEVTOOLS", "0"); 27 Services.prefs.clearUserPref("services.settings.server"); 28 Services.prefs.clearUserPref("services.settings.preview_enabled"); 29 } 30 31 add_setup(async function () { 32 // Set this env vars in order to test the code path where the 33 // server URL can only be overridden from Dev Tools. 34 // See `isRunningTests` in `services/settings/Utils.sys.mjs`. 35 const before = Services.env.get("MOZ_DISABLE_NONLOCAL_CONNECTIONS"); 36 Services.env.set("MOZ_DISABLE_NONLOCAL_CONNECTIONS", "0"); 37 38 registerCleanupFunction(() => { 39 clear_state(); 40 Services.env.set("MOZ_DISABLE_NONLOCAL_CONNECTIONS", before); 41 }); 42 }); 43 44 add_task(clear_state); 45 46 add_task( 47 { 48 skip_if: () => !AppConstants.RELEASE_OR_BETA, 49 }, 50 async function test_server_url_cannot_be_toggled_in_release() { 51 Services.prefs.setStringPref( 52 "services.settings.server", 53 "http://localhost:8888/v1" 54 ); 55 56 const Utils = getNewUtils(); 57 58 Assert.equal( 59 Utils.SERVER_URL, 60 AppConstants.REMOTE_SETTINGS_SERVER_URL, 61 "Server url pref was not read in release" 62 ); 63 } 64 ); 65 66 add_task( 67 { 68 skip_if: () => AppConstants.RELEASE_OR_BETA, 69 }, 70 async function test_server_url_cannot_be_toggled_in_dev_nightly() { 71 Services.prefs.setStringPref( 72 "services.settings.server", 73 "http://localhost:8888/v1" 74 ); 75 76 const Utils = getNewUtils(); 77 78 Assert.notEqual( 79 Utils.SERVER_URL, 80 AppConstants.REMOTE_SETTINGS_SERVER_URL, 81 "Server url pref was read in nightly/dev" 82 ); 83 } 84 ); 85 add_task(clear_state); 86 87 add_task( 88 { 89 skip_if: () => !AppConstants.RELEASE_OR_BETA, 90 }, 91 async function test_preview_mode_cannot_be_toggled_in_release() { 92 Services.prefs.setBoolPref("services.settings.preview_enabled", true); 93 94 const Utils = getNewUtils(); 95 96 Assert.ok(!Utils.PREVIEW_MODE, "Preview mode pref was not read in release"); 97 } 98 ); 99 add_task(clear_state); 100 101 add_task( 102 { 103 skip_if: () => AppConstants.RELEASE_OR_BETA, 104 }, 105 async function test_preview_mode_cannot_be_toggled_in_dev_nightly() { 106 Services.prefs.setBoolPref("services.settings.preview_enabled", true); 107 108 const Utils = getNewUtils(); 109 110 Assert.ok(Utils.PREVIEW_MODE, "Preview mode pref is read in dev/nightly"); 111 } 112 ); 113 add_task(clear_state); 114 115 add_task( 116 { 117 skip_if: () => !AppConstants.RELEASE_OR_BETA, 118 }, 119 async function test_load_dumps_will_always_be_loaded_in_release() { 120 Services.prefs.setStringPref( 121 "services.settings.server", 122 "http://localhost:8888/v1" 123 ); 124 125 const Utils = getNewUtils(); 126 127 Assert.equal( 128 Utils.SERVER_URL, 129 AppConstants.REMOTE_SETTINGS_SERVER_URL, 130 "Server url pref was not read" 131 ); 132 Assert.ok(Utils.LOAD_DUMPS, "Dumps will always be loaded"); 133 } 134 ); 135 136 add_task( 137 { 138 skip_if: () => AppConstants.RELEASE_OR_BETA, 139 }, 140 async function test_load_dumps_can_be_disabled_in_dev_nightly() { 141 Services.prefs.setStringPref( 142 "services.settings.server", 143 "http://localhost:8888/v1" 144 ); 145 146 const Utils = getNewUtils(); 147 148 Assert.notEqual( 149 Utils.SERVER_URL, 150 AppConstants.REMOTE_SETTINGS_SERVER_URL, 151 "Server url pref was read" 152 ); 153 Assert.ok(!Utils.LOAD_DUMPS, "Dumps are not loaded if server is not prod"); 154 } 155 ); 156 add_task(clear_state); 157 158 add_task( 159 async function test_server_url_can_be_changed_in_all_versions_if_running_for_devtools() { 160 Services.env.set("MOZ_REMOTE_SETTINGS_DEVTOOLS", "1"); 161 Services.prefs.setStringPref( 162 "services.settings.server", 163 "http://localhost:8888/v1" 164 ); 165 166 const Utils = getNewUtils(); 167 168 Assert.notEqual( 169 Utils.SERVER_URL, 170 AppConstants.REMOTE_SETTINGS_SERVER_URL, 171 "Server url pref was read" 172 ); 173 } 174 ); 175 add_task(clear_state); 176 177 add_task( 178 async function test_preview_mode_can_be_changed_in_all_versions_if_running_for_devtools() { 179 Services.env.set("MOZ_REMOTE_SETTINGS_DEVTOOLS", "1"); 180 Services.prefs.setBoolPref("services.settings.preview_enabled", true); 181 182 const Utils = getNewUtils(); 183 184 Assert.ok(Utils.PREVIEW_MODE, "Preview mode pref was read"); 185 } 186 ); 187 add_task(clear_state); 188 189 add_task( 190 async function test_dumps_are_not_loaded_if_server_is_not_prod_if_running_for_devtools() { 191 Services.env.set("MOZ_REMOTE_SETTINGS_DEVTOOLS", "1"); 192 Services.prefs.setStringPref( 193 "services.settings.server", 194 "http://localhost:8888/v1" 195 ); 196 197 const Utils = getNewUtils(); 198 Assert.ok(!Utils.LOAD_DUMPS, "Dumps won't be loaded"); 199 200 // The section below ensures that the LOAD_DUMPS flag properly takes effect. 201 // The client is set up here rather than add_setup to avoid triggering the 202 // lazy getters that are behind the global Utils.LOAD_DUMPS. If they are 203 // triggered too early, then they will potentially cache different values 204 // for the server urls and environment variables and this test then won't be 205 // testing what we expect it to. 206 207 let client = new RemoteSettingsClient(TEST_COLLECTION); 208 209 const dump = await SharedUtils.loadJSONDump(TEST_BUCKET, TEST_COLLECTION); 210 let DUMP_LAST_MODIFIED = dump.timestamp; 211 212 // Dump is updated regularly, verify that the dump matches our expectations 213 // before running the test. 214 Assert.greater( 215 DUMP_LAST_MODIFIED, 216 1234, 217 "Assuming dump to be newer than dummy 1234" 218 ); 219 220 await client.db.clear(); 221 await importData([{ last_modified: 1234, id: "dummy" }]); 222 223 const after = await client.get(); 224 Assert.deepEqual( 225 after, 226 [{ last_modified: 1234, id: "dummy" }], 227 "Should have kept the original import" 228 ); 229 Assert.equal( 230 await client.getLastModified(), 231 1234, 232 "Should have kept the import's timestamp" 233 ); 234 await client.db.clear(); 235 } 236 ); 237 add_task(clear_state); 238 239 add_task( 240 async function test_dumps_are_loaded_if_server_is_prod_if_running_for_devtools() { 241 Services.env.set("MOZ_REMOTE_SETTINGS_DEVTOOLS", "1"); 242 Services.prefs.setStringPref( 243 "services.settings.server", 244 AppConstants.REMOTE_SETTINGS_SERVER_URL 245 ); 246 247 const Utils = getNewUtils(); 248 249 Assert.ok(Utils.LOAD_DUMPS, "dumps are loaded if prod"); 250 } 251 ); 252 add_task(clear_state);