1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/browser/browser_experiments.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,646 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +let {AddonTestUtils} = Components.utils.import("resource://testing-common/AddonManagerTesting.jsm", {}); 1.9 +let {HttpServer} = Components.utils.import("resource://testing-common/httpd.js", {}); 1.10 + 1.11 +let gManagerWindow; 1.12 +let gCategoryUtilities; 1.13 +let gExperiments; 1.14 +let gHttpServer; 1.15 + 1.16 +let gSavedManifestURI; 1.17 +let gIsEnUsLocale; 1.18 + 1.19 +const SEC_IN_ONE_DAY = 24 * 60 * 60; 1.20 +const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000; 1.21 + 1.22 +function getExperimentAddons() { 1.23 + let deferred = Promise.defer(); 1.24 + AddonManager.getAddonsByTypes(["experiment"], (addons) => { 1.25 + deferred.resolve(addons); 1.26 + }); 1.27 + return deferred.promise; 1.28 +} 1.29 + 1.30 +function getInstallItem() { 1.31 + let doc = gManagerWindow.document; 1.32 + let view = doc.getElementById("view-port").selectedPanel; 1.33 + let list = doc.getElementById("addon-list"); 1.34 + 1.35 + let node = list.firstChild; 1.36 + while (node) { 1.37 + if (node.getAttribute("status") == "installing") { 1.38 + return node; 1.39 + } 1.40 + node = node.nextSibling; 1.41 + } 1.42 + 1.43 + return null; 1.44 +} 1.45 + 1.46 +function patchPolicy(policy, data) { 1.47 + for (let key of Object.keys(data)) { 1.48 + Object.defineProperty(policy, key, { 1.49 + value: data[key], 1.50 + writable: true, 1.51 + }); 1.52 + } 1.53 +} 1.54 + 1.55 +function defineNow(policy, time) { 1.56 + patchPolicy(policy, { now: () => new Date(time) }); 1.57 +} 1.58 + 1.59 +function openDetailsView(aId) { 1.60 + let item = get_addon_element(gManagerWindow, aId); 1.61 + Assert.ok(item, "Should have got add-on element."); 1.62 + is_element_visible(item, "Add-on element should be visible."); 1.63 + 1.64 + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow); 1.65 + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow); 1.66 + 1.67 + let deferred = Promise.defer(); 1.68 + wait_for_view_load(gManagerWindow, deferred.resolve); 1.69 + return deferred.promise; 1.70 +} 1.71 + 1.72 +function clickRemoveButton(addonElement) { 1.73 + let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "remove-btn"); 1.74 + if (!btn) { 1.75 + return Promise.reject(); 1.76 + } 1.77 + 1.78 + EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow); 1.79 + let deferred = Promise.defer(); 1.80 + setTimeout(deferred.resolve, 0); 1.81 + return deferred; 1.82 +} 1.83 + 1.84 +function clickUndoButton(addonElement) { 1.85 + let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "undo-btn"); 1.86 + if (!btn) { 1.87 + return Promise.reject(); 1.88 + } 1.89 + 1.90 + EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow); 1.91 + let deferred = Promise.defer(); 1.92 + setTimeout(deferred.resolve, 0); 1.93 + return deferred; 1.94 +} 1.95 + 1.96 +add_task(function* initializeState() { 1.97 + gManagerWindow = yield open_manager(); 1.98 + gCategoryUtilities = new CategoryUtilities(gManagerWindow); 1.99 + 1.100 + registerCleanupFunction(() => { 1.101 + Services.prefs.clearUserPref("experiments.enabled"); 1.102 + if (gHttpServer) { 1.103 + gHttpServer.stop(() => {}); 1.104 + Services.prefs.clearUserPref("experiments.manifest.cert.checkAttributes"); 1.105 + if (gSavedManifestURI !== undefined) { 1.106 + Services.prefs.setCharPref("experments.manifest.uri", gSavedManifestURI); 1.107 + } 1.108 + } 1.109 + if (gExperiments) { 1.110 + let tmp = {}; 1.111 + Cu.import("resource:///modules/experiments/Experiments.jsm", tmp); 1.112 + gExperiments._policy = new tmp.Experiments.Policy(); 1.113 + } 1.114 + }); 1.115 + 1.116 + let chrome = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry); 1.117 + gIsEnUsLocale = chrome.getSelectedLocale("global") == "en-US"; 1.118 + 1.119 + // The Experiments Manager will interfere with us by preventing installs 1.120 + // of experiments it doesn't know about. We remove it from the equation 1.121 + // because here we are only concerned with core Addon Manager operation, 1.122 + // not the superset Experiments Manager has imposed. 1.123 + if ("@mozilla.org/browser/experiments-service;1" in Components.classes) { 1.124 + let tmp = {}; 1.125 + Cu.import("resource:///modules/experiments/Experiments.jsm", tmp); 1.126 + // There is a race condition between XPCOM service initialization and 1.127 + // this test running. We have to initialize the instance first, then 1.128 + // uninitialize it to prevent this. 1.129 + gExperiments = tmp.Experiments.instance(); 1.130 + yield gExperiments._mainTask; 1.131 + yield gExperiments.uninit(); 1.132 + } 1.133 +}); 1.134 + 1.135 +// On an empty profile with no experiments, the experiment category 1.136 +// should be hidden. 1.137 +add_task(function* testInitialState() { 1.138 + Assert.ok(gCategoryUtilities.get("experiment", false), "Experiment tab is defined."); 1.139 + Assert.ok(!gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab hidden by default."); 1.140 +}); 1.141 + 1.142 +add_task(function* testExperimentInfoNotVisible() { 1.143 + yield gCategoryUtilities.openType("extension"); 1.144 + let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0]; 1.145 + is_element_hidden(el, "Experiment info not visible on other types."); 1.146 +}); 1.147 + 1.148 +// If we have an active experiment, we should see the experiments tab 1.149 +// and that tab should have some messages. 1.150 +add_task(function* testActiveExperiment() { 1.151 + let addon = yield install_addon("addons/browser_experiment1.xpi"); 1.152 + 1.153 + Assert.ok(addon.userDisabled, "Add-on is disabled upon initial install."); 1.154 + Assert.equal(addon.isActive, false, "Add-on is not active."); 1.155 + 1.156 + Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible."); 1.157 + 1.158 + yield gCategoryUtilities.openType("experiment"); 1.159 + let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0]; 1.160 + is_element_visible(el, "Experiment info is visible on experiment tab."); 1.161 +}); 1.162 + 1.163 +add_task(function* testExperimentLearnMore() { 1.164 + // Actual URL is irrelevant. 1.165 + Services.prefs.setCharPref("toolkit.telemetry.infoURL", 1.166 + "http://mochi.test:8888/server.js"); 1.167 + 1.168 + yield gCategoryUtilities.openType("experiment"); 1.169 + let btn = gManagerWindow.document.getElementById("experiments-learn-more"); 1.170 + 1.171 + if (!gUseInContentUI) { 1.172 + is_element_hidden(btn, "Learn more button hidden if not using in-content UI."); 1.173 + Services.prefs.clearUserPref("toolkit.telemetry.infoURL"); 1.174 + 1.175 + return; 1.176 + } 1.177 + 1.178 + is_element_visible(btn, "Learn more button visible."); 1.179 + 1.180 + let deferred = Promise.defer(); 1.181 + window.addEventListener("DOMContentLoaded", function onLoad(event) { 1.182 + info("Telemetry privacy policy window opened."); 1.183 + window.removeEventListener("DOMContentLoaded", onLoad, false); 1.184 + 1.185 + let browser = gBrowser.selectedTab.linkedBrowser; 1.186 + let expected = Services.prefs.getCharPref("toolkit.telemetry.infoURL"); 1.187 + Assert.equal(browser.currentURI.spec, expected, "New tab should have loaded privacy policy."); 1.188 + browser.contentWindow.close(); 1.189 + 1.190 + Services.prefs.clearUserPref("toolkit.telemetry.infoURL"); 1.191 + 1.192 + deferred.resolve(); 1.193 + }, false); 1.194 + 1.195 + info("Opening telemetry privacy policy."); 1.196 + EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow); 1.197 + 1.198 + yield deferred.promise; 1.199 +}); 1.200 + 1.201 +add_task(function* testOpenPreferences() { 1.202 + yield gCategoryUtilities.openType("experiment"); 1.203 + let btn = gManagerWindow.document.getElementById("experiments-change-telemetry"); 1.204 + if (!gUseInContentUI) { 1.205 + is_element_hidden(btn, "Change telemetry button not enabled in out of window UI."); 1.206 + info("Skipping preferences open test because not using in-content UI."); 1.207 + return; 1.208 + } 1.209 + 1.210 + is_element_visible(btn, "Change telemetry button visible in in-content UI."); 1.211 + 1.212 + let deferred = Promise.defer(); 1.213 + Services.obs.addObserver(function observer(prefWin, topic, data) { 1.214 + Services.obs.removeObserver(observer, "advanced-pane-loaded"); 1.215 + 1.216 + info("Advanced preference pane opened."); 1.217 + 1.218 + // We want this test to fail if the preferences pane changes. 1.219 + let el = prefWin.document.getElementById("dataChoicesPanel"); 1.220 + is_element_visible(el); 1.221 + 1.222 + prefWin.close(); 1.223 + info("Closed preferences pane."); 1.224 + 1.225 + deferred.resolve(); 1.226 + }, "advanced-pane-loaded", false); 1.227 + 1.228 + info("Loading preferences pane."); 1.229 + EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow); 1.230 + 1.231 + yield deferred.promise; 1.232 +}); 1.233 + 1.234 +add_task(function* testButtonPresence() { 1.235 + yield gCategoryUtilities.openType("experiment"); 1.236 + let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); 1.237 + Assert.ok(item, "Got add-on element."); 1.238 + item.parentNode.ensureElementIsVisible(item); 1.239 + 1.240 + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); 1.241 + // Corresponds to the uninstall permission. 1.242 + is_element_visible(el, "Remove button is visible."); 1.243 + // Corresponds to lack of disable permission. 1.244 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); 1.245 + is_element_hidden(el, "Disable button not visible."); 1.246 + // Corresponds to lack of enable permission. 1.247 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); 1.248 + is_element_hidden(el, "Enable button not visible."); 1.249 +}); 1.250 + 1.251 +// Remove the add-on we've been testing with. 1.252 +add_task(function* testCleanup() { 1.253 + yield AddonTestUtils.uninstallAddonByID("test-experiment1@experiments.mozilla.org"); 1.254 + // Verify some conditions, just in case. 1.255 + let addons = yield getExperimentAddons(); 1.256 + Assert.equal(addons.length, 0, "No experiment add-ons are installed."); 1.257 +}); 1.258 + 1.259 +// The following tests should ideally live in browser/experiments/. However, 1.260 +// they rely on some of the helper functions from head.js, which can't easily 1.261 +// be consumed from other directories. So, they live here. 1.262 + 1.263 +add_task(function* testActivateExperiment() { 1.264 + if (!gExperiments) { 1.265 + info("Skipping experiments test because that feature isn't available."); 1.266 + return; 1.267 + } 1.268 + 1.269 + gHttpServer = new HttpServer(); 1.270 + gHttpServer.start(-1); 1.271 + let root = "http://localhost:" + gHttpServer.identity.primaryPort + "/"; 1.272 + gHttpServer.registerPathHandler("/manifest", (request, response) => { 1.273 + response.setStatusLine(null, 200, "OK"); 1.274 + response.write(JSON.stringify({ 1.275 + "version": 1, 1.276 + "experiments": [ 1.277 + { 1.278 + id: "experiment-1", 1.279 + xpiURL: TESTROOT + "addons/browser_experiment1.xpi", 1.280 + xpiHash: "IRRELEVANT", 1.281 + startTime: Date.now() / 1000 - 3600, 1.282 + endTime: Date.now() / 1000 + 3600, 1.283 + maxActiveSeconds: 600, 1.284 + appName: [Services.appinfo.name], 1.285 + channel: [gExperiments._policy.updatechannel()], 1.286 + }, 1.287 + ], 1.288 + })); 1.289 + response.processAsync(); 1.290 + response.finish(); 1.291 + }); 1.292 + 1.293 + Services.prefs.setBoolPref("experiments.manifest.cert.checkAttributes", false); 1.294 + gSavedManifestURI = Services.prefs.getCharPref("experiments.manifest.uri"); 1.295 + Services.prefs.setCharPref("experiments.manifest.uri", root + "manifest"); 1.296 + 1.297 + // We need to remove the cache file to help ensure consistent state. 1.298 + yield OS.File.remove(gExperiments._cacheFilePath); 1.299 + 1.300 + Services.prefs.setBoolPref("experiments.enabled", true); 1.301 + 1.302 + info("Initializing experiments service."); 1.303 + yield gExperiments.init(); 1.304 + info("Experiments service finished first run."); 1.305 + 1.306 + // Check conditions, just to be sure. 1.307 + let experiments = yield gExperiments.getExperiments(); 1.308 + Assert.equal(experiments.length, 0, "No experiments known to the service."); 1.309 + 1.310 + // This makes testing easier. 1.311 + gExperiments._policy.ignoreHashes = true; 1.312 + 1.313 + info("Manually updating experiments manifest."); 1.314 + yield gExperiments.updateManifest(); 1.315 + info("Experiments update complete."); 1.316 + 1.317 + let deferred = Promise.defer(); 1.318 + gHttpServer.stop(() => { 1.319 + gHttpServer = null; 1.320 + 1.321 + info("getting experiment by ID"); 1.322 + AddonManager.getAddonByID("test-experiment1@experiments.mozilla.org", (addon) => { 1.323 + Assert.ok(addon, "Add-on installed via Experiments manager."); 1.324 + 1.325 + deferred.resolve(); 1.326 + }); 1.327 + }); 1.328 + 1.329 + yield deferred.promise; 1.330 + 1.331 + Assert.ok(gCategoryUtilities.isTypeVisible, "experiment", "Experiment tab visible."); 1.332 + yield gCategoryUtilities.openType("experiment"); 1.333 + let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0]; 1.334 + is_element_visible(el, "Experiment info is visible on experiment tab."); 1.335 +}); 1.336 + 1.337 +add_task(function testDeactivateExperiment() { 1.338 + if (!gExperiments) { 1.339 + return; 1.340 + } 1.341 + 1.342 + // Fake an empty manifest to purge data from previous manifest. 1.343 + yield gExperiments._updateExperiments({ 1.344 + "version": 1, 1.345 + "experiments": [], 1.346 + }); 1.347 + 1.348 + yield gExperiments.disableExperiment("testing"); 1.349 + 1.350 + // We should have a record of the previously-active experiment. 1.351 + let experiments = yield gExperiments.getExperiments(); 1.352 + Assert.equal(experiments.length, 1, "1 experiment is known."); 1.353 + Assert.equal(experiments[0].active, false, "Experiment is not active."); 1.354 + 1.355 + // We should have a previous experiment in the add-ons manager. 1.356 + let deferred = Promise.defer(); 1.357 + AddonManager.getAddonsByTypes(["experiment"], (addons) => { 1.358 + deferred.resolve(addons); 1.359 + }); 1.360 + let addons = yield deferred.promise; 1.361 + Assert.equal(addons.length, 1, "1 experiment add-on known."); 1.362 + Assert.ok(addons[0].appDisabled, "It is a previous experiment."); 1.363 + Assert.equal(addons[0].id, "experiment-1", "Add-on ID matches expected."); 1.364 + 1.365 + // Verify the UI looks sane. 1.366 + 1.367 + Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible."); 1.368 + let item = get_addon_element(gManagerWindow, "experiment-1"); 1.369 + Assert.ok(item, "Got add-on element."); 1.370 + Assert.ok(!item.active, "Element should not be active."); 1.371 + item.parentNode.ensureElementIsVisible(item); 1.372 + 1.373 + // User control buttons should not be present because previous experiments 1.374 + // should have no permissions. 1.375 + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); 1.376 + is_element_hidden(el, "Remove button is not visible."); 1.377 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); 1.378 + is_element_hidden(el, "Disable button is not visible."); 1.379 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); 1.380 + is_element_hidden(el, "Enable button is not visible."); 1.381 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "preferences-btn"); 1.382 + is_element_hidden(el, "Preferences button is not visible."); 1.383 +}); 1.384 + 1.385 +add_task(function testActivateRealExperiments() { 1.386 + if (!gExperiments) { 1.387 + info("Skipping experiments test because that feature isn't available."); 1.388 + return; 1.389 + } 1.390 + 1.391 + yield gExperiments._updateExperiments({ 1.392 + "version": 1, 1.393 + "experiments": [ 1.394 + { 1.395 + id: "experiment-2", 1.396 + xpiURL: TESTROOT + "addons/browser_experiment1.xpi", 1.397 + xpiHash: "IRRELEVANT", 1.398 + startTime: Date.now() / 1000 - 3600, 1.399 + endTime: Date.now() / 1000 + 3600, 1.400 + maxActiveSeconds: 600, 1.401 + appName: [Services.appinfo.name], 1.402 + channel: [gExperiments._policy.updatechannel()], 1.403 + }, 1.404 + ], 1.405 + }); 1.406 + yield gExperiments._run(); 1.407 + 1.408 + // Check the active experiment. 1.409 + 1.410 + let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); 1.411 + Assert.ok(item, "Got add-on element."); 1.412 + item.parentNode.ensureElementIsVisible(item); 1.413 + 1.414 + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); 1.415 + is_element_visible(el, "Experiment state label should be visible."); 1.416 + if (gIsEnUsLocale) { 1.417 + Assert.equal(el.value, "Active"); 1.418 + } 1.419 + 1.420 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); 1.421 + is_element_visible(el, "Experiment time label should be visible."); 1.422 + if (gIsEnUsLocale) { 1.423 + Assert.equal(el.value, "Less than a day remaining"); 1.424 + } 1.425 + 1.426 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container"); 1.427 + is_element_hidden(el, "error-container should be hidden."); 1.428 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container"); 1.429 + is_element_hidden(el, "warning-container should be hidden."); 1.430 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container"); 1.431 + is_element_hidden(el, "pending-container should be hidden."); 1.432 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "version"); 1.433 + is_element_hidden(el, "version should be hidden."); 1.434 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); 1.435 + is_element_hidden(el, "disabled-postfix should be hidden."); 1.436 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix"); 1.437 + is_element_hidden(el, "update-postfix should be hidden."); 1.438 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet"); 1.439 + is_element_visible(el, "experiment-bullet should be visible."); 1.440 + 1.441 + // Check the previous experiment. 1.442 + 1.443 + item = get_addon_element(gManagerWindow, "experiment-1"); 1.444 + Assert.ok(item, "Got add-on element."); 1.445 + item.parentNode.ensureElementIsVisible(item); 1.446 + 1.447 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); 1.448 + is_element_visible(el, "Experiment state label should be visible."); 1.449 + if (gIsEnUsLocale) { 1.450 + Assert.equal(el.value, "Complete"); 1.451 + } 1.452 + 1.453 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); 1.454 + is_element_visible(el, "Experiment time label should be visible."); 1.455 + if (gIsEnUsLocale) { 1.456 + Assert.equal(el.value, "Less than a day ago"); 1.457 + } 1.458 + 1.459 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container"); 1.460 + is_element_hidden(el, "error-container should be hidden."); 1.461 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container"); 1.462 + is_element_hidden(el, "warning-container should be hidden."); 1.463 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container"); 1.464 + is_element_hidden(el, "pending-container should be hidden."); 1.465 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "version"); 1.466 + is_element_hidden(el, "version should be hidden."); 1.467 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); 1.468 + is_element_hidden(el, "disabled-postfix should be hidden."); 1.469 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix"); 1.470 + is_element_hidden(el, "update-postfix should be hidden."); 1.471 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet"); 1.472 + is_element_visible(el, "experiment-bullet should be visible."); 1.473 + 1.474 + // Install an "older" experiment. 1.475 + 1.476 + yield gExperiments.disableExperiment("experiment-2"); 1.477 + 1.478 + let now = Date.now(); 1.479 + let fakeNow = now - 5 * MS_IN_ONE_DAY; 1.480 + defineNow(gExperiments._policy, fakeNow); 1.481 + 1.482 + yield gExperiments._updateExperiments({ 1.483 + "version": 1, 1.484 + "experiments": [ 1.485 + { 1.486 + id: "experiment-3", 1.487 + xpiURL: TESTROOT + "addons/browser_experiment1.xpi", 1.488 + xpiHash: "IRRELEVANT", 1.489 + startTime: fakeNow / 1000 - SEC_IN_ONE_DAY, 1.490 + endTime: now / 1000 + 10 * SEC_IN_ONE_DAY, 1.491 + maxActiveSeconds: 100 * SEC_IN_ONE_DAY, 1.492 + appName: [Services.appinfo.name], 1.493 + channel: [gExperiments._policy.updatechannel()], 1.494 + }, 1.495 + ], 1.496 + }); 1.497 + yield gExperiments._run(); 1.498 + 1.499 + // Check the active experiment. 1.500 + 1.501 + item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); 1.502 + Assert.ok(item, "Got add-on element."); 1.503 + item.parentNode.ensureElementIsVisible(item); 1.504 + 1.505 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); 1.506 + is_element_visible(el, "Experiment state label should be visible."); 1.507 + if (gIsEnUsLocale) { 1.508 + Assert.equal(el.value, "Active"); 1.509 + } 1.510 + 1.511 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); 1.512 + is_element_visible(el, "Experiment time label should be visible."); 1.513 + if (gIsEnUsLocale) { 1.514 + Assert.equal(el.value, "10 days remaining"); 1.515 + } 1.516 + 1.517 + // Disable it and check it's previous experiment entry. 1.518 + 1.519 + yield gExperiments.disableExperiment("experiment-3"); 1.520 + 1.521 + item = get_addon_element(gManagerWindow, "experiment-3"); 1.522 + Assert.ok(item, "Got add-on element."); 1.523 + item.parentNode.ensureElementIsVisible(item); 1.524 + 1.525 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); 1.526 + is_element_visible(el, "Experiment state label should be visible."); 1.527 + if (gIsEnUsLocale) { 1.528 + Assert.equal(el.value, "Complete"); 1.529 + } 1.530 + 1.531 + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); 1.532 + is_element_visible(el, "Experiment time label should be visible."); 1.533 + if (gIsEnUsLocale) { 1.534 + Assert.equal(el.value, "5 days ago"); 1.535 + } 1.536 +}); 1.537 + 1.538 +add_task(function testDetailView() { 1.539 + if (!gExperiments) { 1.540 + info("Skipping experiments test because that feature isn't available."); 1.541 + return; 1.542 + } 1.543 + 1.544 + defineNow(gExperiments._policy, Date.now()); 1.545 + yield gExperiments._updateExperiments({ 1.546 + "version": 1, 1.547 + "experiments": [ 1.548 + { 1.549 + id: "experiment-4", 1.550 + xpiURL: TESTROOT + "addons/browser_experiment1.xpi", 1.551 + xpiHash: "IRRELEVANT", 1.552 + startTime: Date.now() / 1000 - 3600, 1.553 + endTime: Date.now() / 1000 + 3600, 1.554 + maxActiveSeconds: 600, 1.555 + appName: [Services.appinfo.name], 1.556 + channel: [gExperiments._policy.updatechannel()], 1.557 + }, 1.558 + ], 1.559 + }); 1.560 + yield gExperiments._run(); 1.561 + 1.562 + // Check active experiment. 1.563 + 1.564 + yield openDetailsView("test-experiment1@experiments.mozilla.org"); 1.565 + 1.566 + let el = gManagerWindow.document.getElementById("detail-experiment-state"); 1.567 + is_element_visible(el, "Experiment state label should be visible."); 1.568 + if (gIsEnUsLocale) { 1.569 + Assert.equal(el.value, "Active"); 1.570 + } 1.571 + 1.572 + el = gManagerWindow.document.getElementById("detail-experiment-time"); 1.573 + is_element_visible(el, "Experiment time label should be visible."); 1.574 + if (gIsEnUsLocale) { 1.575 + Assert.equal(el.value, "Less than a day remaining"); 1.576 + } 1.577 + 1.578 + el = gManagerWindow.document.getElementById("detail-version"); 1.579 + is_element_hidden(el, "detail-version should be hidden."); 1.580 + el = gManagerWindow.document.getElementById("detail-creator"); 1.581 + is_element_hidden(el, "detail-creator should be hidden."); 1.582 + el = gManagerWindow.document.getElementById("detail-experiment-bullet"); 1.583 + is_element_visible(el, "experiment-bullet should be visible."); 1.584 + 1.585 + // Check previous experiment. 1.586 + 1.587 + yield gCategoryUtilities.openType("experiment"); 1.588 + yield openDetailsView("experiment-3"); 1.589 + 1.590 + let el = gManagerWindow.document.getElementById("detail-experiment-state"); 1.591 + is_element_visible(el, "Experiment state label should be visible."); 1.592 + if (gIsEnUsLocale) { 1.593 + Assert.equal(el.value, "Complete"); 1.594 + } 1.595 + 1.596 + el = gManagerWindow.document.getElementById("detail-experiment-time"); 1.597 + is_element_visible(el, "Experiment time label should be visible."); 1.598 + if (gIsEnUsLocale) { 1.599 + Assert.equal(el.value, "5 days ago"); 1.600 + } 1.601 + 1.602 + el = gManagerWindow.document.getElementById("detail-version"); 1.603 + is_element_hidden(el, "detail-version should be hidden."); 1.604 + el = gManagerWindow.document.getElementById("detail-creator"); 1.605 + is_element_hidden(el, "detail-creator should be hidden."); 1.606 + el = gManagerWindow.document.getElementById("detail-experiment-bullet"); 1.607 + is_element_visible(el, "experiment-bullet should be visible."); 1.608 +}); 1.609 + 1.610 +add_task(function* testRemoveAndUndo() { 1.611 + if (!gExperiments) { 1.612 + info("Skipping experiments test because that feature isn't available."); 1.613 + return; 1.614 + } 1.615 + 1.616 + yield gCategoryUtilities.openType("experiment"); 1.617 + 1.618 + let addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); 1.619 + Assert.ok(addon, "Got add-on element."); 1.620 + 1.621 + yield clickRemoveButton(addon); 1.622 + addon.parentNode.ensureElementIsVisible(addon); 1.623 + 1.624 + let el = gManagerWindow.document.getAnonymousElementByAttribute(addon, "class", "pending"); 1.625 + is_element_visible(el, "Uninstall undo information should be visible."); 1.626 + 1.627 + yield clickUndoButton(addon); 1.628 + addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); 1.629 + Assert.ok(addon, "Got add-on element."); 1.630 +}); 1.631 + 1.632 +add_task(function* testCleanup() { 1.633 + if (gExperiments) { 1.634 + Services.prefs.clearUserPref("experiments.enabled"); 1.635 + Services.prefs.clearUserPref("experiments.manifest.cert.checkAttributes"); 1.636 + Services.prefs.setCharPref("experiments.manifest.uri", gSavedManifestURI); 1.637 + 1.638 + // We perform the uninit/init cycle to purge any leftover state. 1.639 + yield OS.File.remove(gExperiments._cacheFilePath); 1.640 + yield gExperiments.uninit(); 1.641 + yield gExperiments.init(); 1.642 + } 1.643 + 1.644 + // Check post-conditions. 1.645 + let addons = yield getExperimentAddons(); 1.646 + Assert.equal(addons.length, 0, "No experiment add-ons are installed."); 1.647 + 1.648 + yield close_manager(gManagerWindow); 1.649 +});