|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ |
|
3 */ |
|
4 |
|
5 let {AddonTestUtils} = Components.utils.import("resource://testing-common/AddonManagerTesting.jsm", {}); |
|
6 let {HttpServer} = Components.utils.import("resource://testing-common/httpd.js", {}); |
|
7 |
|
8 let gManagerWindow; |
|
9 let gCategoryUtilities; |
|
10 let gExperiments; |
|
11 let gHttpServer; |
|
12 |
|
13 let gSavedManifestURI; |
|
14 let gIsEnUsLocale; |
|
15 |
|
16 const SEC_IN_ONE_DAY = 24 * 60 * 60; |
|
17 const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000; |
|
18 |
|
19 function getExperimentAddons() { |
|
20 let deferred = Promise.defer(); |
|
21 AddonManager.getAddonsByTypes(["experiment"], (addons) => { |
|
22 deferred.resolve(addons); |
|
23 }); |
|
24 return deferred.promise; |
|
25 } |
|
26 |
|
27 function getInstallItem() { |
|
28 let doc = gManagerWindow.document; |
|
29 let view = doc.getElementById("view-port").selectedPanel; |
|
30 let list = doc.getElementById("addon-list"); |
|
31 |
|
32 let node = list.firstChild; |
|
33 while (node) { |
|
34 if (node.getAttribute("status") == "installing") { |
|
35 return node; |
|
36 } |
|
37 node = node.nextSibling; |
|
38 } |
|
39 |
|
40 return null; |
|
41 } |
|
42 |
|
43 function patchPolicy(policy, data) { |
|
44 for (let key of Object.keys(data)) { |
|
45 Object.defineProperty(policy, key, { |
|
46 value: data[key], |
|
47 writable: true, |
|
48 }); |
|
49 } |
|
50 } |
|
51 |
|
52 function defineNow(policy, time) { |
|
53 patchPolicy(policy, { now: () => new Date(time) }); |
|
54 } |
|
55 |
|
56 function openDetailsView(aId) { |
|
57 let item = get_addon_element(gManagerWindow, aId); |
|
58 Assert.ok(item, "Should have got add-on element."); |
|
59 is_element_visible(item, "Add-on element should be visible."); |
|
60 |
|
61 EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow); |
|
62 EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow); |
|
63 |
|
64 let deferred = Promise.defer(); |
|
65 wait_for_view_load(gManagerWindow, deferred.resolve); |
|
66 return deferred.promise; |
|
67 } |
|
68 |
|
69 function clickRemoveButton(addonElement) { |
|
70 let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "remove-btn"); |
|
71 if (!btn) { |
|
72 return Promise.reject(); |
|
73 } |
|
74 |
|
75 EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow); |
|
76 let deferred = Promise.defer(); |
|
77 setTimeout(deferred.resolve, 0); |
|
78 return deferred; |
|
79 } |
|
80 |
|
81 function clickUndoButton(addonElement) { |
|
82 let btn = gManagerWindow.document.getAnonymousElementByAttribute(addonElement, "anonid", "undo-btn"); |
|
83 if (!btn) { |
|
84 return Promise.reject(); |
|
85 } |
|
86 |
|
87 EventUtils.synthesizeMouseAtCenter(btn, { clickCount: 1 }, gManagerWindow); |
|
88 let deferred = Promise.defer(); |
|
89 setTimeout(deferred.resolve, 0); |
|
90 return deferred; |
|
91 } |
|
92 |
|
93 add_task(function* initializeState() { |
|
94 gManagerWindow = yield open_manager(); |
|
95 gCategoryUtilities = new CategoryUtilities(gManagerWindow); |
|
96 |
|
97 registerCleanupFunction(() => { |
|
98 Services.prefs.clearUserPref("experiments.enabled"); |
|
99 if (gHttpServer) { |
|
100 gHttpServer.stop(() => {}); |
|
101 Services.prefs.clearUserPref("experiments.manifest.cert.checkAttributes"); |
|
102 if (gSavedManifestURI !== undefined) { |
|
103 Services.prefs.setCharPref("experments.manifest.uri", gSavedManifestURI); |
|
104 } |
|
105 } |
|
106 if (gExperiments) { |
|
107 let tmp = {}; |
|
108 Cu.import("resource:///modules/experiments/Experiments.jsm", tmp); |
|
109 gExperiments._policy = new tmp.Experiments.Policy(); |
|
110 } |
|
111 }); |
|
112 |
|
113 let chrome = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry); |
|
114 gIsEnUsLocale = chrome.getSelectedLocale("global") == "en-US"; |
|
115 |
|
116 // The Experiments Manager will interfere with us by preventing installs |
|
117 // of experiments it doesn't know about. We remove it from the equation |
|
118 // because here we are only concerned with core Addon Manager operation, |
|
119 // not the superset Experiments Manager has imposed. |
|
120 if ("@mozilla.org/browser/experiments-service;1" in Components.classes) { |
|
121 let tmp = {}; |
|
122 Cu.import("resource:///modules/experiments/Experiments.jsm", tmp); |
|
123 // There is a race condition between XPCOM service initialization and |
|
124 // this test running. We have to initialize the instance first, then |
|
125 // uninitialize it to prevent this. |
|
126 gExperiments = tmp.Experiments.instance(); |
|
127 yield gExperiments._mainTask; |
|
128 yield gExperiments.uninit(); |
|
129 } |
|
130 }); |
|
131 |
|
132 // On an empty profile with no experiments, the experiment category |
|
133 // should be hidden. |
|
134 add_task(function* testInitialState() { |
|
135 Assert.ok(gCategoryUtilities.get("experiment", false), "Experiment tab is defined."); |
|
136 Assert.ok(!gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab hidden by default."); |
|
137 }); |
|
138 |
|
139 add_task(function* testExperimentInfoNotVisible() { |
|
140 yield gCategoryUtilities.openType("extension"); |
|
141 let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0]; |
|
142 is_element_hidden(el, "Experiment info not visible on other types."); |
|
143 }); |
|
144 |
|
145 // If we have an active experiment, we should see the experiments tab |
|
146 // and that tab should have some messages. |
|
147 add_task(function* testActiveExperiment() { |
|
148 let addon = yield install_addon("addons/browser_experiment1.xpi"); |
|
149 |
|
150 Assert.ok(addon.userDisabled, "Add-on is disabled upon initial install."); |
|
151 Assert.equal(addon.isActive, false, "Add-on is not active."); |
|
152 |
|
153 Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible."); |
|
154 |
|
155 yield gCategoryUtilities.openType("experiment"); |
|
156 let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0]; |
|
157 is_element_visible(el, "Experiment info is visible on experiment tab."); |
|
158 }); |
|
159 |
|
160 add_task(function* testExperimentLearnMore() { |
|
161 // Actual URL is irrelevant. |
|
162 Services.prefs.setCharPref("toolkit.telemetry.infoURL", |
|
163 "http://mochi.test:8888/server.js"); |
|
164 |
|
165 yield gCategoryUtilities.openType("experiment"); |
|
166 let btn = gManagerWindow.document.getElementById("experiments-learn-more"); |
|
167 |
|
168 if (!gUseInContentUI) { |
|
169 is_element_hidden(btn, "Learn more button hidden if not using in-content UI."); |
|
170 Services.prefs.clearUserPref("toolkit.telemetry.infoURL"); |
|
171 |
|
172 return; |
|
173 } |
|
174 |
|
175 is_element_visible(btn, "Learn more button visible."); |
|
176 |
|
177 let deferred = Promise.defer(); |
|
178 window.addEventListener("DOMContentLoaded", function onLoad(event) { |
|
179 info("Telemetry privacy policy window opened."); |
|
180 window.removeEventListener("DOMContentLoaded", onLoad, false); |
|
181 |
|
182 let browser = gBrowser.selectedTab.linkedBrowser; |
|
183 let expected = Services.prefs.getCharPref("toolkit.telemetry.infoURL"); |
|
184 Assert.equal(browser.currentURI.spec, expected, "New tab should have loaded privacy policy."); |
|
185 browser.contentWindow.close(); |
|
186 |
|
187 Services.prefs.clearUserPref("toolkit.telemetry.infoURL"); |
|
188 |
|
189 deferred.resolve(); |
|
190 }, false); |
|
191 |
|
192 info("Opening telemetry privacy policy."); |
|
193 EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow); |
|
194 |
|
195 yield deferred.promise; |
|
196 }); |
|
197 |
|
198 add_task(function* testOpenPreferences() { |
|
199 yield gCategoryUtilities.openType("experiment"); |
|
200 let btn = gManagerWindow.document.getElementById("experiments-change-telemetry"); |
|
201 if (!gUseInContentUI) { |
|
202 is_element_hidden(btn, "Change telemetry button not enabled in out of window UI."); |
|
203 info("Skipping preferences open test because not using in-content UI."); |
|
204 return; |
|
205 } |
|
206 |
|
207 is_element_visible(btn, "Change telemetry button visible in in-content UI."); |
|
208 |
|
209 let deferred = Promise.defer(); |
|
210 Services.obs.addObserver(function observer(prefWin, topic, data) { |
|
211 Services.obs.removeObserver(observer, "advanced-pane-loaded"); |
|
212 |
|
213 info("Advanced preference pane opened."); |
|
214 |
|
215 // We want this test to fail if the preferences pane changes. |
|
216 let el = prefWin.document.getElementById("dataChoicesPanel"); |
|
217 is_element_visible(el); |
|
218 |
|
219 prefWin.close(); |
|
220 info("Closed preferences pane."); |
|
221 |
|
222 deferred.resolve(); |
|
223 }, "advanced-pane-loaded", false); |
|
224 |
|
225 info("Loading preferences pane."); |
|
226 EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow); |
|
227 |
|
228 yield deferred.promise; |
|
229 }); |
|
230 |
|
231 add_task(function* testButtonPresence() { |
|
232 yield gCategoryUtilities.openType("experiment"); |
|
233 let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); |
|
234 Assert.ok(item, "Got add-on element."); |
|
235 item.parentNode.ensureElementIsVisible(item); |
|
236 |
|
237 let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); |
|
238 // Corresponds to the uninstall permission. |
|
239 is_element_visible(el, "Remove button is visible."); |
|
240 // Corresponds to lack of disable permission. |
|
241 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); |
|
242 is_element_hidden(el, "Disable button not visible."); |
|
243 // Corresponds to lack of enable permission. |
|
244 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); |
|
245 is_element_hidden(el, "Enable button not visible."); |
|
246 }); |
|
247 |
|
248 // Remove the add-on we've been testing with. |
|
249 add_task(function* testCleanup() { |
|
250 yield AddonTestUtils.uninstallAddonByID("test-experiment1@experiments.mozilla.org"); |
|
251 // Verify some conditions, just in case. |
|
252 let addons = yield getExperimentAddons(); |
|
253 Assert.equal(addons.length, 0, "No experiment add-ons are installed."); |
|
254 }); |
|
255 |
|
256 // The following tests should ideally live in browser/experiments/. However, |
|
257 // they rely on some of the helper functions from head.js, which can't easily |
|
258 // be consumed from other directories. So, they live here. |
|
259 |
|
260 add_task(function* testActivateExperiment() { |
|
261 if (!gExperiments) { |
|
262 info("Skipping experiments test because that feature isn't available."); |
|
263 return; |
|
264 } |
|
265 |
|
266 gHttpServer = new HttpServer(); |
|
267 gHttpServer.start(-1); |
|
268 let root = "http://localhost:" + gHttpServer.identity.primaryPort + "/"; |
|
269 gHttpServer.registerPathHandler("/manifest", (request, response) => { |
|
270 response.setStatusLine(null, 200, "OK"); |
|
271 response.write(JSON.stringify({ |
|
272 "version": 1, |
|
273 "experiments": [ |
|
274 { |
|
275 id: "experiment-1", |
|
276 xpiURL: TESTROOT + "addons/browser_experiment1.xpi", |
|
277 xpiHash: "IRRELEVANT", |
|
278 startTime: Date.now() / 1000 - 3600, |
|
279 endTime: Date.now() / 1000 + 3600, |
|
280 maxActiveSeconds: 600, |
|
281 appName: [Services.appinfo.name], |
|
282 channel: [gExperiments._policy.updatechannel()], |
|
283 }, |
|
284 ], |
|
285 })); |
|
286 response.processAsync(); |
|
287 response.finish(); |
|
288 }); |
|
289 |
|
290 Services.prefs.setBoolPref("experiments.manifest.cert.checkAttributes", false); |
|
291 gSavedManifestURI = Services.prefs.getCharPref("experiments.manifest.uri"); |
|
292 Services.prefs.setCharPref("experiments.manifest.uri", root + "manifest"); |
|
293 |
|
294 // We need to remove the cache file to help ensure consistent state. |
|
295 yield OS.File.remove(gExperiments._cacheFilePath); |
|
296 |
|
297 Services.prefs.setBoolPref("experiments.enabled", true); |
|
298 |
|
299 info("Initializing experiments service."); |
|
300 yield gExperiments.init(); |
|
301 info("Experiments service finished first run."); |
|
302 |
|
303 // Check conditions, just to be sure. |
|
304 let experiments = yield gExperiments.getExperiments(); |
|
305 Assert.equal(experiments.length, 0, "No experiments known to the service."); |
|
306 |
|
307 // This makes testing easier. |
|
308 gExperiments._policy.ignoreHashes = true; |
|
309 |
|
310 info("Manually updating experiments manifest."); |
|
311 yield gExperiments.updateManifest(); |
|
312 info("Experiments update complete."); |
|
313 |
|
314 let deferred = Promise.defer(); |
|
315 gHttpServer.stop(() => { |
|
316 gHttpServer = null; |
|
317 |
|
318 info("getting experiment by ID"); |
|
319 AddonManager.getAddonByID("test-experiment1@experiments.mozilla.org", (addon) => { |
|
320 Assert.ok(addon, "Add-on installed via Experiments manager."); |
|
321 |
|
322 deferred.resolve(); |
|
323 }); |
|
324 }); |
|
325 |
|
326 yield deferred.promise; |
|
327 |
|
328 Assert.ok(gCategoryUtilities.isTypeVisible, "experiment", "Experiment tab visible."); |
|
329 yield gCategoryUtilities.openType("experiment"); |
|
330 let el = gManagerWindow.document.getElementsByClassName("experiment-info-container")[0]; |
|
331 is_element_visible(el, "Experiment info is visible on experiment tab."); |
|
332 }); |
|
333 |
|
334 add_task(function testDeactivateExperiment() { |
|
335 if (!gExperiments) { |
|
336 return; |
|
337 } |
|
338 |
|
339 // Fake an empty manifest to purge data from previous manifest. |
|
340 yield gExperiments._updateExperiments({ |
|
341 "version": 1, |
|
342 "experiments": [], |
|
343 }); |
|
344 |
|
345 yield gExperiments.disableExperiment("testing"); |
|
346 |
|
347 // We should have a record of the previously-active experiment. |
|
348 let experiments = yield gExperiments.getExperiments(); |
|
349 Assert.equal(experiments.length, 1, "1 experiment is known."); |
|
350 Assert.equal(experiments[0].active, false, "Experiment is not active."); |
|
351 |
|
352 // We should have a previous experiment in the add-ons manager. |
|
353 let deferred = Promise.defer(); |
|
354 AddonManager.getAddonsByTypes(["experiment"], (addons) => { |
|
355 deferred.resolve(addons); |
|
356 }); |
|
357 let addons = yield deferred.promise; |
|
358 Assert.equal(addons.length, 1, "1 experiment add-on known."); |
|
359 Assert.ok(addons[0].appDisabled, "It is a previous experiment."); |
|
360 Assert.equal(addons[0].id, "experiment-1", "Add-on ID matches expected."); |
|
361 |
|
362 // Verify the UI looks sane. |
|
363 |
|
364 Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible."); |
|
365 let item = get_addon_element(gManagerWindow, "experiment-1"); |
|
366 Assert.ok(item, "Got add-on element."); |
|
367 Assert.ok(!item.active, "Element should not be active."); |
|
368 item.parentNode.ensureElementIsVisible(item); |
|
369 |
|
370 // User control buttons should not be present because previous experiments |
|
371 // should have no permissions. |
|
372 let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); |
|
373 is_element_hidden(el, "Remove button is not visible."); |
|
374 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); |
|
375 is_element_hidden(el, "Disable button is not visible."); |
|
376 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); |
|
377 is_element_hidden(el, "Enable button is not visible."); |
|
378 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "preferences-btn"); |
|
379 is_element_hidden(el, "Preferences button is not visible."); |
|
380 }); |
|
381 |
|
382 add_task(function testActivateRealExperiments() { |
|
383 if (!gExperiments) { |
|
384 info("Skipping experiments test because that feature isn't available."); |
|
385 return; |
|
386 } |
|
387 |
|
388 yield gExperiments._updateExperiments({ |
|
389 "version": 1, |
|
390 "experiments": [ |
|
391 { |
|
392 id: "experiment-2", |
|
393 xpiURL: TESTROOT + "addons/browser_experiment1.xpi", |
|
394 xpiHash: "IRRELEVANT", |
|
395 startTime: Date.now() / 1000 - 3600, |
|
396 endTime: Date.now() / 1000 + 3600, |
|
397 maxActiveSeconds: 600, |
|
398 appName: [Services.appinfo.name], |
|
399 channel: [gExperiments._policy.updatechannel()], |
|
400 }, |
|
401 ], |
|
402 }); |
|
403 yield gExperiments._run(); |
|
404 |
|
405 // Check the active experiment. |
|
406 |
|
407 let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); |
|
408 Assert.ok(item, "Got add-on element."); |
|
409 item.parentNode.ensureElementIsVisible(item); |
|
410 |
|
411 let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); |
|
412 is_element_visible(el, "Experiment state label should be visible."); |
|
413 if (gIsEnUsLocale) { |
|
414 Assert.equal(el.value, "Active"); |
|
415 } |
|
416 |
|
417 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); |
|
418 is_element_visible(el, "Experiment time label should be visible."); |
|
419 if (gIsEnUsLocale) { |
|
420 Assert.equal(el.value, "Less than a day remaining"); |
|
421 } |
|
422 |
|
423 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container"); |
|
424 is_element_hidden(el, "error-container should be hidden."); |
|
425 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container"); |
|
426 is_element_hidden(el, "warning-container should be hidden."); |
|
427 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container"); |
|
428 is_element_hidden(el, "pending-container should be hidden."); |
|
429 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "version"); |
|
430 is_element_hidden(el, "version should be hidden."); |
|
431 el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); |
|
432 is_element_hidden(el, "disabled-postfix should be hidden."); |
|
433 el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix"); |
|
434 is_element_hidden(el, "update-postfix should be hidden."); |
|
435 el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet"); |
|
436 is_element_visible(el, "experiment-bullet should be visible."); |
|
437 |
|
438 // Check the previous experiment. |
|
439 |
|
440 item = get_addon_element(gManagerWindow, "experiment-1"); |
|
441 Assert.ok(item, "Got add-on element."); |
|
442 item.parentNode.ensureElementIsVisible(item); |
|
443 |
|
444 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); |
|
445 is_element_visible(el, "Experiment state label should be visible."); |
|
446 if (gIsEnUsLocale) { |
|
447 Assert.equal(el.value, "Complete"); |
|
448 } |
|
449 |
|
450 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); |
|
451 is_element_visible(el, "Experiment time label should be visible."); |
|
452 if (gIsEnUsLocale) { |
|
453 Assert.equal(el.value, "Less than a day ago"); |
|
454 } |
|
455 |
|
456 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "error-container"); |
|
457 is_element_hidden(el, "error-container should be hidden."); |
|
458 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning-container"); |
|
459 is_element_hidden(el, "warning-container should be hidden."); |
|
460 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "pending-container"); |
|
461 is_element_hidden(el, "pending-container should be hidden."); |
|
462 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "version"); |
|
463 is_element_hidden(el, "version should be hidden."); |
|
464 el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); |
|
465 is_element_hidden(el, "disabled-postfix should be hidden."); |
|
466 el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "update-postfix"); |
|
467 is_element_hidden(el, "update-postfix should be hidden."); |
|
468 el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "experiment-bullet"); |
|
469 is_element_visible(el, "experiment-bullet should be visible."); |
|
470 |
|
471 // Install an "older" experiment. |
|
472 |
|
473 yield gExperiments.disableExperiment("experiment-2"); |
|
474 |
|
475 let now = Date.now(); |
|
476 let fakeNow = now - 5 * MS_IN_ONE_DAY; |
|
477 defineNow(gExperiments._policy, fakeNow); |
|
478 |
|
479 yield gExperiments._updateExperiments({ |
|
480 "version": 1, |
|
481 "experiments": [ |
|
482 { |
|
483 id: "experiment-3", |
|
484 xpiURL: TESTROOT + "addons/browser_experiment1.xpi", |
|
485 xpiHash: "IRRELEVANT", |
|
486 startTime: fakeNow / 1000 - SEC_IN_ONE_DAY, |
|
487 endTime: now / 1000 + 10 * SEC_IN_ONE_DAY, |
|
488 maxActiveSeconds: 100 * SEC_IN_ONE_DAY, |
|
489 appName: [Services.appinfo.name], |
|
490 channel: [gExperiments._policy.updatechannel()], |
|
491 }, |
|
492 ], |
|
493 }); |
|
494 yield gExperiments._run(); |
|
495 |
|
496 // Check the active experiment. |
|
497 |
|
498 item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); |
|
499 Assert.ok(item, "Got add-on element."); |
|
500 item.parentNode.ensureElementIsVisible(item); |
|
501 |
|
502 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); |
|
503 is_element_visible(el, "Experiment state label should be visible."); |
|
504 if (gIsEnUsLocale) { |
|
505 Assert.equal(el.value, "Active"); |
|
506 } |
|
507 |
|
508 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); |
|
509 is_element_visible(el, "Experiment time label should be visible."); |
|
510 if (gIsEnUsLocale) { |
|
511 Assert.equal(el.value, "10 days remaining"); |
|
512 } |
|
513 |
|
514 // Disable it and check it's previous experiment entry. |
|
515 |
|
516 yield gExperiments.disableExperiment("experiment-3"); |
|
517 |
|
518 item = get_addon_element(gManagerWindow, "experiment-3"); |
|
519 Assert.ok(item, "Got add-on element."); |
|
520 item.parentNode.ensureElementIsVisible(item); |
|
521 |
|
522 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-state"); |
|
523 is_element_visible(el, "Experiment state label should be visible."); |
|
524 if (gIsEnUsLocale) { |
|
525 Assert.equal(el.value, "Complete"); |
|
526 } |
|
527 |
|
528 el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "experiment-time"); |
|
529 is_element_visible(el, "Experiment time label should be visible."); |
|
530 if (gIsEnUsLocale) { |
|
531 Assert.equal(el.value, "5 days ago"); |
|
532 } |
|
533 }); |
|
534 |
|
535 add_task(function testDetailView() { |
|
536 if (!gExperiments) { |
|
537 info("Skipping experiments test because that feature isn't available."); |
|
538 return; |
|
539 } |
|
540 |
|
541 defineNow(gExperiments._policy, Date.now()); |
|
542 yield gExperiments._updateExperiments({ |
|
543 "version": 1, |
|
544 "experiments": [ |
|
545 { |
|
546 id: "experiment-4", |
|
547 xpiURL: TESTROOT + "addons/browser_experiment1.xpi", |
|
548 xpiHash: "IRRELEVANT", |
|
549 startTime: Date.now() / 1000 - 3600, |
|
550 endTime: Date.now() / 1000 + 3600, |
|
551 maxActiveSeconds: 600, |
|
552 appName: [Services.appinfo.name], |
|
553 channel: [gExperiments._policy.updatechannel()], |
|
554 }, |
|
555 ], |
|
556 }); |
|
557 yield gExperiments._run(); |
|
558 |
|
559 // Check active experiment. |
|
560 |
|
561 yield openDetailsView("test-experiment1@experiments.mozilla.org"); |
|
562 |
|
563 let el = gManagerWindow.document.getElementById("detail-experiment-state"); |
|
564 is_element_visible(el, "Experiment state label should be visible."); |
|
565 if (gIsEnUsLocale) { |
|
566 Assert.equal(el.value, "Active"); |
|
567 } |
|
568 |
|
569 el = gManagerWindow.document.getElementById("detail-experiment-time"); |
|
570 is_element_visible(el, "Experiment time label should be visible."); |
|
571 if (gIsEnUsLocale) { |
|
572 Assert.equal(el.value, "Less than a day remaining"); |
|
573 } |
|
574 |
|
575 el = gManagerWindow.document.getElementById("detail-version"); |
|
576 is_element_hidden(el, "detail-version should be hidden."); |
|
577 el = gManagerWindow.document.getElementById("detail-creator"); |
|
578 is_element_hidden(el, "detail-creator should be hidden."); |
|
579 el = gManagerWindow.document.getElementById("detail-experiment-bullet"); |
|
580 is_element_visible(el, "experiment-bullet should be visible."); |
|
581 |
|
582 // Check previous experiment. |
|
583 |
|
584 yield gCategoryUtilities.openType("experiment"); |
|
585 yield openDetailsView("experiment-3"); |
|
586 |
|
587 let el = gManagerWindow.document.getElementById("detail-experiment-state"); |
|
588 is_element_visible(el, "Experiment state label should be visible."); |
|
589 if (gIsEnUsLocale) { |
|
590 Assert.equal(el.value, "Complete"); |
|
591 } |
|
592 |
|
593 el = gManagerWindow.document.getElementById("detail-experiment-time"); |
|
594 is_element_visible(el, "Experiment time label should be visible."); |
|
595 if (gIsEnUsLocale) { |
|
596 Assert.equal(el.value, "5 days ago"); |
|
597 } |
|
598 |
|
599 el = gManagerWindow.document.getElementById("detail-version"); |
|
600 is_element_hidden(el, "detail-version should be hidden."); |
|
601 el = gManagerWindow.document.getElementById("detail-creator"); |
|
602 is_element_hidden(el, "detail-creator should be hidden."); |
|
603 el = gManagerWindow.document.getElementById("detail-experiment-bullet"); |
|
604 is_element_visible(el, "experiment-bullet should be visible."); |
|
605 }); |
|
606 |
|
607 add_task(function* testRemoveAndUndo() { |
|
608 if (!gExperiments) { |
|
609 info("Skipping experiments test because that feature isn't available."); |
|
610 return; |
|
611 } |
|
612 |
|
613 yield gCategoryUtilities.openType("experiment"); |
|
614 |
|
615 let addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); |
|
616 Assert.ok(addon, "Got add-on element."); |
|
617 |
|
618 yield clickRemoveButton(addon); |
|
619 addon.parentNode.ensureElementIsVisible(addon); |
|
620 |
|
621 let el = gManagerWindow.document.getAnonymousElementByAttribute(addon, "class", "pending"); |
|
622 is_element_visible(el, "Uninstall undo information should be visible."); |
|
623 |
|
624 yield clickUndoButton(addon); |
|
625 addon = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); |
|
626 Assert.ok(addon, "Got add-on element."); |
|
627 }); |
|
628 |
|
629 add_task(function* testCleanup() { |
|
630 if (gExperiments) { |
|
631 Services.prefs.clearUserPref("experiments.enabled"); |
|
632 Services.prefs.clearUserPref("experiments.manifest.cert.checkAttributes"); |
|
633 Services.prefs.setCharPref("experiments.manifest.uri", gSavedManifestURI); |
|
634 |
|
635 // We perform the uninit/init cycle to purge any leftover state. |
|
636 yield OS.File.remove(gExperiments._cacheFilePath); |
|
637 yield gExperiments.uninit(); |
|
638 yield gExperiments.init(); |
|
639 } |
|
640 |
|
641 // Check post-conditions. |
|
642 let addons = yield getExperimentAddons(); |
|
643 Assert.equal(addons.length, 0, "No experiment add-ons are installed."); |
|
644 |
|
645 yield close_manager(gManagerWindow); |
|
646 }); |