Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/
3 */
5 // This verifies that add-on update checks work
7 const PREF_MATCH_OS_LOCALE = "intl.locale.matchOS";
8 const PREF_SELECTED_LOCALE = "general.useragent.locale";
9 const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
11 // The test extension uses an insecure update url.
12 Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false);
13 // This test requires lightweight themes update to be enabled even if the app
14 // doesn't support lightweight themes.
15 Services.prefs.setBoolPref("lightweightThemes.update.enabled", true);
17 Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm");
19 const PARAMS = "?%REQ_VERSION%/%ITEM_ID%/%ITEM_VERSION%/%ITEM_MAXAPPVERSION%/" +
20 "%ITEM_STATUS%/%APP_ID%/%APP_VERSION%/%CURRENT_APP_VERSION%/" +
21 "%APP_OS%/%APP_ABI%/%APP_LOCALE%/%UPDATE_TYPE%";
23 var gInstallDate;
25 Components.utils.import("resource://testing-common/httpd.js");
26 var testserver = new HttpServer();
27 testserver.start(-1);
28 gPort = testserver.identity.primaryPort;
29 mapFile("/data/test_update.rdf", testserver);
30 mapFile("/data/test_update.xml", testserver);
31 testserver.registerDirectory("/addons/", do_get_file("addons"));
33 const profileDir = gProfD.clone();
34 profileDir.append("extensions");
36 function run_test() {
37 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
38 Services.prefs.setBoolPref(PREF_MATCH_OS_LOCALE, false);
39 Services.prefs.setCharPref(PREF_SELECTED_LOCALE, "fr-FR");
40 Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, true);
42 writeInstallRDFForExtension({
43 id: "addon1@tests.mozilla.org",
44 version: "1.0",
45 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
46 targetApplications: [{
47 id: "xpcshell@tests.mozilla.org",
48 minVersion: "1",
49 maxVersion: "1"
50 }],
51 name: "Test Addon 1",
52 }, profileDir);
54 writeInstallRDFForExtension({
55 id: "addon2@tests.mozilla.org",
56 version: "1.0",
57 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
58 targetApplications: [{
59 id: "xpcshell@tests.mozilla.org",
60 minVersion: "0",
61 maxVersion: "0"
62 }],
63 name: "Test Addon 2",
64 }, profileDir);
66 writeInstallRDFForExtension({
67 id: "addon3@tests.mozilla.org",
68 version: "1.0",
69 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
70 targetApplications: [{
71 id: "xpcshell@tests.mozilla.org",
72 minVersion: "5",
73 maxVersion: "5"
74 }],
75 name: "Test Addon 3",
76 }, profileDir);
78 startupManager();
80 do_test_pending();
81 run_test_1();
82 }
84 function end_test() {
85 Services.prefs.clearUserPref(PREF_EM_STRICT_COMPATIBILITY);
87 testserver.stop(do_test_finished);
88 }
90 // Verify that an update is available and can be installed.
91 function run_test_1() {
92 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
93 do_check_neq(a1, null);
94 do_check_eq(a1.version, "1.0");
95 do_check_eq(a1.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DEFAULT);
96 do_check_eq(a1.releaseNotesURI, null);
98 a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
100 prepare_test({
101 "addon1@tests.mozilla.org": [
102 ["onPropertyChanged", ["applyBackgroundUpdates"]]
103 ]
104 });
105 a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE;
106 check_test_completed();
108 a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE;
110 prepare_test({}, [
111 "onNewInstall",
112 ]);
114 a1.findUpdates({
115 onNoCompatibilityUpdateAvailable: function(addon) {
116 do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification");
117 },
119 onUpdateAvailable: function(addon, install) {
120 ensure_test_completed();
122 AddonManager.getAllInstalls(function(aInstalls) {
123 do_check_eq(aInstalls.length, 1);
124 do_check_eq(aInstalls[0], install);
126 do_check_eq(addon, a1);
127 do_check_eq(install.name, addon.name);
128 do_check_eq(install.version, "2.0");
129 do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
130 do_check_eq(install.existingAddon, addon);
131 do_check_eq(install.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml");
133 // Verify that another update check returns the same AddonInstall
134 a1.findUpdates({
135 onNoCompatibilityUpdateAvailable: function(addon) {
136 do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification");
137 },
139 onUpdateAvailable: function(newAddon, newInstall) {
140 AddonManager.getAllInstalls(function(aInstalls) {
141 do_check_eq(aInstalls.length, 1);
142 do_check_eq(aInstalls[0], install);
143 do_check_eq(newAddon, addon);
144 do_check_eq(newInstall, install);
146 prepare_test({}, [
147 "onDownloadStarted",
148 "onDownloadEnded",
149 ], check_test_1);
150 install.install();
151 });
152 },
154 onNoUpdateAvailable: function(addon) {
155 do_throw("Should not have seen onNoUpdateAvailable notification");
156 }
157 }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
158 });
159 },
161 onNoUpdateAvailable: function(addon) {
162 do_throw("Should not have seen onNoUpdateAvailable notification");
163 }
164 }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
165 });
166 }
168 function check_test_1(install) {
169 ensure_test_completed();
170 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
171 run_test_2(install);
172 return false;
173 }
175 // Continue installing the update.
176 function run_test_2(install) {
177 // Verify that another update check returns no new update
178 install.existingAddon.findUpdates({
179 onNoCompatibilityUpdateAvailable: function(addon) {
180 do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification");
181 },
183 onUpdateAvailable: function(addon, install) {
184 do_throw("Should find no available update when one is already downloading");
185 },
187 onNoUpdateAvailable: function(addon) {
188 AddonManager.getAllInstalls(function(aInstalls) {
189 do_check_eq(aInstalls.length, 1);
190 do_check_eq(aInstalls[0], install);
192 prepare_test({
193 "addon1@tests.mozilla.org": [
194 "onInstalling"
195 ]
196 }, [
197 "onInstallStarted",
198 "onInstallEnded",
199 ], check_test_2);
200 install.install();
201 });
202 }
203 }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
204 }
206 function check_test_2() {
207 ensure_test_completed();
209 AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(olda1) {
210 do_check_neq(olda1, null);
211 do_check_eq(olda1.version, "1.0");
212 do_check_true(isExtensionInAddonsList(profileDir, olda1.id));
214 shutdownManager();
216 startupManager();
218 do_check_true(isExtensionInAddonsList(profileDir, olda1.id));
220 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
221 do_check_neq(a1, null);
222 do_check_eq(a1.version, "2.0");
223 do_check_true(isExtensionInAddonsList(profileDir, a1.id));
224 do_check_eq(a1.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE);
225 do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml");
227 a1.uninstall();
228 do_execute_soon(run_test_3);
229 });
230 }));
231 }
234 // Check that an update check finds compatibility updates and applies them
235 function run_test_3() {
236 restartManager();
238 AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
239 do_check_neq(a2, null);
240 do_check_false(a2.isActive);
241 do_check_false(a2.isCompatible);
242 do_check_true(a2.appDisabled);
243 do_check_true(a2.isCompatibleWith("0"));
245 a2.findUpdates({
246 onCompatibilityUpdateAvailable: function(addon) {
247 do_check_true(a2.isCompatible);
248 do_check_false(a2.appDisabled);
249 do_check_false(a2.isActive);
250 },
252 onUpdateAvailable: function(addon, install) {
253 do_throw("Should not have seen an available update");
254 },
256 onNoUpdateAvailable: function(addon) {
257 do_check_eq(addon, a2);
258 do_execute_soon(check_test_3);
259 }
260 }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
261 });
262 }
264 function check_test_3() {
265 restartManager();
266 AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
267 do_check_neq(a2, null);
268 do_check_true(a2.isActive);
269 do_check_true(a2.isCompatible);
270 do_check_false(a2.appDisabled);
271 a2.uninstall();
273 run_test_4();
274 });
275 }
277 // Checks that we see no compatibility information when there is none.
278 function run_test_4() {
279 AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
280 do_check_neq(a3, null);
281 do_check_false(a3.isActive);
282 do_check_false(a3.isCompatible);
283 do_check_true(a3.appDisabled);
284 do_check_true(a3.isCompatibleWith("5"));
285 do_check_false(a3.isCompatibleWith("2"));
287 a3.findUpdates({
288 sawUpdate: false,
289 onCompatibilityUpdateAvailable: function(addon) {
290 do_throw("Should not have seen compatibility information");
291 },
293 onNoCompatibilityUpdateAvailable: function(addon) {
294 this.sawUpdate = true;
295 },
297 onUpdateAvailable: function(addon, install) {
298 do_throw("Should not have seen an available update");
299 },
301 onNoUpdateAvailable: function(addon) {
302 do_check_true(this.sawUpdate);
303 run_test_5();
304 }
305 }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
306 });
307 }
309 // Checks that compatibility info for future apps are detected but don't make
310 // the item compatibile.
311 function run_test_5() {
312 AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
313 do_check_neq(a3, null);
314 do_check_false(a3.isActive);
315 do_check_false(a3.isCompatible);
316 do_check_true(a3.appDisabled);
317 do_check_true(a3.isCompatibleWith("5"));
318 do_check_false(a3.isCompatibleWith("2"));
320 a3.findUpdates({
321 sawUpdate: false,
322 onCompatibilityUpdateAvailable: function(addon) {
323 do_check_false(a3.isCompatible);
324 do_check_true(a3.appDisabled);
325 do_check_false(a3.isActive);
326 this.sawUpdate = true;
327 },
329 onNoCompatibilityUpdateAvailable: function(addon) {
330 do_throw("Should have seen some compatibility information");
331 },
333 onUpdateAvailable: function(addon, install) {
334 do_throw("Should not have seen an available update");
335 },
337 onNoUpdateAvailable: function(addon) {
338 do_check_true(this.sawUpdate);
339 do_execute_soon(check_test_5);
340 }
341 }, AddonManager.UPDATE_WHEN_USER_REQUESTED, "3.0");
342 });
343 }
345 function check_test_5() {
346 restartManager();
347 AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
348 do_check_neq(a3, null);
349 do_check_false(a3.isActive);
350 do_check_false(a3.isCompatible);
351 do_check_true(a3.appDisabled);
353 a3.uninstall();
354 do_execute_soon(run_test_6);
355 });
356 }
358 // Test that background update checks work
359 function run_test_6() {
360 restartManager();
362 writeInstallRDFForExtension({
363 id: "addon1@tests.mozilla.org",
364 version: "1.0",
365 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
366 targetApplications: [{
367 id: "xpcshell@tests.mozilla.org",
368 minVersion: "1",
369 maxVersion: "1"
370 }],
371 name: "Test Addon 1",
372 }, profileDir);
373 restartManager();
375 prepare_test({}, [
376 "onNewInstall",
377 "onDownloadStarted",
378 "onDownloadEnded"
379 ], continue_test_6);
381 // Fake a timer event to cause a background update and wait for the magic to
382 // happen
383 gInternalManager.notify(null);
384 }
386 function continue_test_6(install) {
387 do_check_neq(install.existingAddon, null);
388 do_check_eq(install.existingAddon.id, "addon1@tests.mozilla.org");
390 prepare_test({
391 "addon1@tests.mozilla.org": [
392 "onInstalling"
393 ]
394 }, [
395 "onInstallStarted",
396 "onInstallEnded",
397 ], callback_soon(check_test_6));
398 }
400 function check_test_6(install) {
401 do_check_eq(install.existingAddon.pendingUpgrade.install, install);
403 restartManager();
404 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
405 do_check_neq(a1, null);
406 do_check_eq(a1.version, "2.0");
407 do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml");
408 a1.uninstall();
409 do_execute_soon(run_test_7);
410 });
411 }
413 // Test that background update checks work for lightweight themes
414 function run_test_7() {
415 restartManager();
417 LightweightThemeManager.currentTheme = {
418 id: "1",
419 version: "1",
420 name: "Test LW Theme",
421 description: "A test theme",
422 author: "Mozilla",
423 homepageURL: "http://localhost:" + gPort + "/data/index.html",
424 headerURL: "http://localhost:" + gPort + "/data/header.png",
425 footerURL: "http://localhost:" + gPort + "/data/footer.png",
426 previewURL: "http://localhost:" + gPort + "/data/preview.png",
427 iconURL: "http://localhost:" + gPort + "/data/icon.png",
428 updateURL: "http://localhost:" + gPort + "/data/lwtheme.js"
429 };
431 // XXX The lightweight theme manager strips non-https updateURLs so hack it
432 // back in.
433 let themes = JSON.parse(Services.prefs.getCharPref("lightweightThemes.usedThemes"));
434 do_check_eq(themes.length, 1);
435 themes[0].updateURL = "http://localhost:" + gPort + "/data/lwtheme.js";
436 Services.prefs.setCharPref("lightweightThemes.usedThemes", JSON.stringify(themes));
438 testserver.registerPathHandler("/data/lwtheme.js", function(request, response) {
439 response.write(JSON.stringify({
440 id: "1",
441 version: "2",
442 name: "Updated Theme",
443 description: "A test theme",
444 author: "Mozilla",
445 homepageURL: "http://localhost:" + gPort + "/data/index2.html",
446 headerURL: "http://localhost:" + gPort + "/data/header.png",
447 footerURL: "http://localhost:" + gPort + "/data/footer.png",
448 previewURL: "http://localhost:" + gPort + "/data/preview.png",
449 iconURL: "http://localhost:" + gPort + "/data/icon2.png",
450 updateURL: "http://localhost:" + gPort + "/data/lwtheme.js"
451 }));
452 });
454 AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) {
455 do_check_neq(p1, null);
456 do_check_eq(p1.version, "1");
457 do_check_eq(p1.name, "Test LW Theme");
458 do_check_true(p1.isActive);
459 do_check_eq(p1.installDate.getTime(), p1.updateDate.getTime());
461 // 5 seconds leeway seems like a lot, but tests can run slow and really if
462 // this is within 5 seconds it is fine. If it is going to be wrong then it
463 // is likely to be hours out at least
464 do_check_true((Date.now() - p1.installDate.getTime()) < 5000);
466 gInstallDate = p1.installDate.getTime();
468 prepare_test({
469 "1@personas.mozilla.org": [
470 ["onInstalling", false],
471 "onInstalled"
472 ]
473 }, [
474 "onExternalInstall"
475 ], check_test_7);
477 // Fake a timer event to cause a background update and wait for the magic to
478 // happen
479 gInternalManager.notify(null);
480 });
481 }
483 function check_test_7() {
484 AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) {
485 do_check_neq(p1, null);
486 do_check_eq(p1.version, "2");
487 do_check_eq(p1.name, "Updated Theme");
488 do_check_eq(p1.installDate.getTime(), gInstallDate);
489 do_check_true(p1.installDate.getTime() < p1.updateDate.getTime());
491 // 5 seconds leeway seems like a lot, but tests can run slow and really if
492 // this is within 5 seconds it is fine. If it is going to be wrong then it
493 // is likely to be hours out at least
494 do_check_true((Date.now() - p1.updateDate.getTime()) < 5000);
496 gInstallDate = p1.installDate.getTime();
498 do_execute_soon(run_test_8);
499 });
500 }
502 // Verify the parameter escaping in update urls.
503 function run_test_8() {
504 writeInstallRDFForExtension({
505 id: "addon1@tests.mozilla.org",
506 version: "5.0",
507 updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS,
508 targetApplications: [{
509 id: "xpcshell@tests.mozilla.org",
510 minVersion: "1",
511 maxVersion: "2"
512 }],
513 name: "Test Addon 1",
514 }, profileDir);
516 writeInstallRDFForExtension({
517 id: "addon2@tests.mozilla.org",
518 version: "67.0.5b1",
519 updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS,
520 targetApplications: [{
521 id: "toolkit@mozilla.org",
522 minVersion: "0",
523 maxVersion: "3"
524 }],
525 name: "Test Addon 2",
526 }, profileDir);
528 writeInstallRDFForExtension({
529 id: "addon3@tests.mozilla.org",
530 version: "1.3+",
531 updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS,
532 targetApplications: [{
533 id: "xpcshell@tests.mozilla.org",
534 minVersion: "0",
535 maxVersion: "0"
536 }, {
537 id: "toolkit@mozilla.org",
538 minVersion: "0",
539 maxVersion: "3"
540 }],
541 name: "Test Addon 3",
542 }, profileDir);
544 writeInstallRDFForExtension({
545 id: "addon4@tests.mozilla.org",
546 version: "0.5ab6",
547 updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS,
548 targetApplications: [{
549 id: "xpcshell@tests.mozilla.org",
550 minVersion: "1",
551 maxVersion: "5"
552 }],
553 name: "Test Addon 4",
554 }, profileDir);
556 writeInstallRDFForExtension({
557 id: "addon5@tests.mozilla.org",
558 version: "1.0",
559 updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS,
560 targetApplications: [{
561 id: "xpcshell@tests.mozilla.org",
562 minVersion: "1",
563 maxVersion: "1"
564 }],
565 name: "Test Addon 5",
566 }, profileDir);
568 writeInstallRDFForExtension({
569 id: "addon6@tests.mozilla.org",
570 version: "1.0",
571 updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS,
572 targetApplications: [{
573 id: "xpcshell@tests.mozilla.org",
574 minVersion: "1",
575 maxVersion: "1"
576 }],
577 name: "Test Addon 6",
578 }, profileDir);
580 restartManager();
582 AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) {
583 a2.userDisabled = true;
584 restartManager();
586 testserver.registerPathHandler("/data/param_test.rdf", function(request, response) {
587 do_check_neq(request.queryString, "");
588 let [req_version, item_id, item_version,
589 item_maxappversion, item_status,
590 app_id, app_version, current_app_version,
591 app_os, app_abi, app_locale, update_type] =
592 [decodeURIComponent(a) for each (a in request.queryString.split("/"))];
594 do_check_eq(req_version, "2");
596 switch(item_id) {
597 case "addon1@tests.mozilla.org":
598 do_check_eq(item_version, "5.0");
599 do_check_eq(item_maxappversion, "2");
600 do_check_eq(item_status, "userEnabled");
601 do_check_eq(app_version, "1");
602 do_check_eq(update_type, "97");
603 break;
604 case "addon2@tests.mozilla.org":
605 do_check_eq(item_version, "67.0.5b1");
606 do_check_eq(item_maxappversion, "3");
607 do_check_eq(item_status, "userDisabled");
608 do_check_eq(app_version, "1");
609 do_check_eq(update_type, "49");
610 break;
611 case "addon3@tests.mozilla.org":
612 do_check_eq(item_version, "1.3+");
613 do_check_eq(item_maxappversion, "0");
614 do_check_eq(item_status, "userEnabled,incompatible");
615 do_check_eq(app_version, "1");
616 do_check_eq(update_type, "112");
617 break;
618 case "addon4@tests.mozilla.org":
619 do_check_eq(item_version, "0.5ab6");
620 do_check_eq(item_maxappversion, "5");
621 do_check_eq(item_status, "userEnabled");
622 do_check_eq(app_version, "2");
623 do_check_eq(update_type, "98");
624 break;
625 case "addon5@tests.mozilla.org":
626 do_check_eq(item_version, "1.0");
627 do_check_eq(item_maxappversion, "1");
628 do_check_eq(item_status, "userEnabled");
629 do_check_eq(app_version, "1");
630 do_check_eq(update_type, "35");
631 break;
632 case "addon6@tests.mozilla.org":
633 do_check_eq(item_version, "1.0");
634 do_check_eq(item_maxappversion, "1");
635 do_check_eq(item_status, "userEnabled");
636 do_check_eq(app_version, "1");
637 do_check_eq(update_type, "99");
638 break;
639 default:
640 do_throw("Update request for unexpected add-on " + item_id);
641 }
643 do_check_eq(app_id, "xpcshell@tests.mozilla.org");
644 do_check_eq(current_app_version, "1");
645 do_check_eq(app_os, "XPCShell");
646 do_check_eq(app_abi, "noarch-spidermonkey");
647 do_check_eq(app_locale, "fr-FR");
649 request.setStatusLine(null, 500, "Server Error");
650 });
652 AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
653 "addon2@tests.mozilla.org",
654 "addon3@tests.mozilla.org",
655 "addon4@tests.mozilla.org",
656 "addon5@tests.mozilla.org",
657 "addon6@tests.mozilla.org"],
658 function([a1, a2, a3, a4, a5, a6]) {
659 let count = 6;
661 function run_next_test() {
662 a1.uninstall();
663 a2.uninstall();
664 a3.uninstall();
665 a4.uninstall();
666 a5.uninstall();
667 a6.uninstall();
669 restartManager();
670 run_test_9();
671 }
673 let compatListener = {
674 onUpdateFinished: function(addon, error) {
675 if (--count == 0)
676 do_execute_soon(run_next_test);
677 }
678 };
680 let updateListener = {
681 onUpdateAvailable: function(addon, update) {
682 // Dummy so the update checker knows we care about new versions
683 },
685 onUpdateFinished: function(addon, error) {
686 if (--count == 0)
687 do_execute_soon(run_next_test);
688 }
689 };
691 a1.findUpdates(updateListener, AddonManager.UPDATE_WHEN_USER_REQUESTED);
692 a2.findUpdates(compatListener, AddonManager.UPDATE_WHEN_ADDON_INSTALLED);
693 a3.findUpdates(updateListener, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
694 a4.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_DETECTED, "2");
695 a5.findUpdates(compatListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
696 a6.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
697 });
698 }));
699 }
701 // Tests that if an install.rdf claims compatibility then the add-on will be
702 // seen as compatible regardless of what the update.rdf says.
703 function run_test_9() {
704 writeInstallRDFForExtension({
705 id: "addon4@tests.mozilla.org",
706 version: "5.0",
707 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
708 targetApplications: [{
709 id: "xpcshell@tests.mozilla.org",
710 minVersion: "0",
711 maxVersion: "1"
712 }],
713 name: "Test Addon 1",
714 }, profileDir);
716 restartManager();
718 AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) {
719 do_check_true(a4.isActive);
720 do_check_true(a4.isCompatible);
722 run_test_10();
723 });
724 }
726 // Tests that a normal update check won't decrease a targetApplication's
727 // maxVersion.
728 function run_test_10() {
729 AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) {
730 a4.findUpdates({
731 onUpdateFinished: function(addon) {
732 do_check_true(addon.isCompatible);
734 run_test_11();
735 }
736 }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
737 });
738 }
740 // Tests that an update check for a new application will decrease a
741 // targetApplication's maxVersion.
742 function run_test_11() {
743 AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) {
744 a4.findUpdates({
745 onUpdateFinished: function(addon) {
746 do_check_false(addon.isCompatible);
748 do_execute_soon(run_test_12);
749 }
750 }, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
751 });
752 }
754 // Check that the decreased maxVersion applied and disables the add-on
755 function run_test_12() {
756 restartManager();
758 AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) {
759 do_check_false(a4.isActive);
760 do_check_false(a4.isCompatible);
762 a4.uninstall();
763 do_execute_soon(run_test_13);
764 });
765 }
767 // Tests that no compatibility update is passed to the listener when there is
768 // compatibility info for the current version of the app but not for the
769 // version of the app that the caller requested an update check for.
770 function run_test_13() {
771 restartManager();
773 // Not initially compatible but the update check will make it compatible
774 writeInstallRDFForExtension({
775 id: "addon7@tests.mozilla.org",
776 version: "1.0",
777 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
778 targetApplications: [{
779 id: "xpcshell@tests.mozilla.org",
780 minVersion: "0",
781 maxVersion: "0"
782 }],
783 name: "Test Addon 7",
784 }, profileDir);
785 restartManager();
787 AddonManager.getAddonByID("addon7@tests.mozilla.org", function(a7) {
788 do_check_neq(a7, null);
789 do_check_false(a7.isActive);
790 do_check_false(a7.isCompatible);
791 do_check_true(a7.appDisabled);
792 do_check_true(a7.isCompatibleWith("0"));
794 a7.findUpdates({
795 sawUpdate: false,
796 onCompatibilityUpdateAvailable: function(addon) {
797 do_throw("Should have not have seen compatibility information");
798 },
800 onUpdateAvailable: function(addon, install) {
801 do_throw("Should not have seen an available update");
802 },
804 onUpdateFinished: function(addon) {
805 do_check_true(addon.isCompatible);
806 do_execute_soon(check_test_13);
807 }
808 }, AddonManager.UPDATE_WHEN_NEW_APP_DETECTED, "3.0");
809 });
810 }
812 function check_test_13() {
813 restartManager();
814 AddonManager.getAddonByID("addon7@tests.mozilla.org", function(a7) {
815 do_check_neq(a7, null);
816 do_check_true(a7.isActive);
817 do_check_true(a7.isCompatible);
818 do_check_false(a7.appDisabled);
820 a7.uninstall();
821 do_execute_soon(run_test_14);
822 });
823 }
825 // Test that background update checks doesn't update an add-on that isn't
826 // allowed to update automatically.
827 function run_test_14() {
828 restartManager();
830 // Have an add-on there that will be updated so we see some events from it
831 writeInstallRDFForExtension({
832 id: "addon1@tests.mozilla.org",
833 version: "1.0",
834 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
835 targetApplications: [{
836 id: "xpcshell@tests.mozilla.org",
837 minVersion: "1",
838 maxVersion: "1"
839 }],
840 name: "Test Addon 1",
841 }, profileDir);
843 writeInstallRDFForExtension({
844 id: "addon8@tests.mozilla.org",
845 version: "1.0",
846 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
847 targetApplications: [{
848 id: "xpcshell@tests.mozilla.org",
849 minVersion: "1",
850 maxVersion: "1"
851 }],
852 name: "Test Addon 8",
853 }, profileDir);
854 restartManager();
856 AddonManager.getAddonByID("addon8@tests.mozilla.org", function(a8) {
857 a8.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE;
859 // The background update check will find updates for both add-ons but only
860 // proceed to install one of them.
861 AddonManager.addInstallListener({
862 onNewInstall: function(aInstall) {
863 if (aInstall.existingAddon.id != "addon1@tests.mozilla.org" &&
864 aInstall.existingAddon.id != "addon8@tests.mozilla.org")
865 do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id);
866 },
868 onDownloadStarted: function(aInstall) {
869 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
870 },
872 onDownloadEnded: function(aInstall) {
873 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
874 },
876 onDownloadFailed: function(aInstall) {
877 do_throw("Should not have seen onDownloadFailed event");
878 },
880 onDownloadCancelled: function(aInstall) {
881 do_throw("Should not have seen onDownloadCancelled event");
882 },
884 onInstallStarted: function(aInstall) {
885 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
886 },
888 onInstallEnded: function(aInstall) {
889 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
890 do_check_eq(aInstall.existingAddon.pendingUpgrade.install, aInstall);
891 do_execute_soon(check_test_14);
892 },
894 onInstallFailed: function(aInstall) {
895 do_throw("Should not have seen onInstallFailed event");
896 },
898 onInstallCancelled: function(aInstall) {
899 do_throw("Should not have seen onInstallCancelled event");
900 },
901 });
903 // Fake a timer event
904 gInternalManager.notify(null);
905 });
906 }
908 function check_test_14() {
909 restartManager();
910 AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
911 "addon8@tests.mozilla.org"], function([a1, a8]) {
912 do_check_neq(a1, null);
913 do_check_eq(a1.version, "2.0");
914 a1.uninstall();
916 do_check_neq(a8, null);
917 do_check_eq(a8.version, "1.0");
918 a8.uninstall();
920 do_execute_soon(run_test_15);
921 });
922 }
924 // Test that background update checks doesn't update an add-on that is
925 // pending uninstall
926 function run_test_15() {
927 restartManager();
929 // Have an add-on there that will be updated so we see some events from it
930 writeInstallRDFForExtension({
931 id: "addon1@tests.mozilla.org",
932 version: "1.0",
933 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
934 targetApplications: [{
935 id: "xpcshell@tests.mozilla.org",
936 minVersion: "1",
937 maxVersion: "1"
938 }],
939 name: "Test Addon 1",
940 }, profileDir);
942 writeInstallRDFForExtension({
943 id: "addon8@tests.mozilla.org",
944 version: "1.0",
945 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
946 targetApplications: [{
947 id: "xpcshell@tests.mozilla.org",
948 minVersion: "1",
949 maxVersion: "1"
950 }],
951 name: "Test Addon 8",
952 }, profileDir);
953 restartManager();
955 AddonManager.getAddonByID("addon8@tests.mozilla.org", function(a8) {
956 a8.uninstall();
957 do_check_false(hasFlag(a8.permissions, AddonManager.PERM_CAN_UPGRADE));
959 // The background update check will find updates for both add-ons but only
960 // proceed to install one of them.
961 AddonManager.addInstallListener({
962 onNewInstall: function(aInstall) {
963 if (aInstall.existingAddon.id != "addon1@tests.mozilla.org" &&
964 aInstall.existingAddon.id != "addon8@tests.mozilla.org")
965 do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id);
966 },
968 onDownloadStarted: function(aInstall) {
969 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
970 },
972 onDownloadEnded: function(aInstall) {
973 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
974 },
976 onDownloadFailed: function(aInstall) {
977 do_throw("Should not have seen onDownloadFailed event");
978 },
980 onDownloadCancelled: function(aInstall) {
981 do_throw("Should not have seen onDownloadCancelled event");
982 },
984 onInstallStarted: function(aInstall) {
985 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
986 },
988 onInstallEnded: function(aInstall) {
989 do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org");
990 do_execute_soon(check_test_15);
991 },
993 onInstallFailed: function(aInstall) {
994 do_throw("Should not have seen onInstallFailed event");
995 },
997 onInstallCancelled: function(aInstall) {
998 do_throw("Should not have seen onInstallCancelled event");
999 },
1000 });
1002 // Fake a timer event
1003 gInternalManager.notify(null);
1004 });
1005 }
1007 function check_test_15() {
1008 restartManager();
1009 AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
1010 "addon8@tests.mozilla.org"], function([a1, a8]) {
1011 do_check_neq(a1, null);
1012 do_check_eq(a1.version, "2.0");
1013 a1.uninstall();
1015 do_check_eq(a8, null);
1017 do_execute_soon(run_test_16);
1018 });
1019 }
1021 // Test that the update check correctly observes the
1022 // extensions.strictCompatibility pref and compatibility overrides.
1023 function run_test_16() {
1024 restartManager();
1026 writeInstallRDFForExtension({
1027 id: "addon9@tests.mozilla.org",
1028 version: "1.0",
1029 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
1030 targetApplications: [{
1031 id: "xpcshell@tests.mozilla.org",
1032 minVersion: "0.1",
1033 maxVersion: "0.2"
1034 }],
1035 name: "Test Addon 9",
1036 }, profileDir);
1037 restartManager();
1039 AddonManager.addInstallListener({
1040 onNewInstall: function(aInstall) {
1041 if (aInstall.existingAddon.id != "addon9@tests.mozilla.org")
1042 do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id);
1043 do_check_eq(aInstall.version, "2.0");
1044 },
1045 onDownloadFailed: function(aInstall) {
1046 do_execute_soon(run_test_17);
1047 }
1048 });
1050 Services.prefs.setCharPref(PREF_GETADDONS_BYIDS_PERFORMANCE,
1051 "http://localhost:" + gPort + "/data/test_update.xml");
1052 Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
1053 // Fake a timer event
1054 gInternalManager.notify(null);
1055 }
1057 // Test that the update check correctly observes when an addon opts-in to
1058 // strict compatibility checking.
1059 function run_test_17() {
1061 writeInstallRDFForExtension({
1062 id: "addon11@tests.mozilla.org",
1063 version: "1.0",
1064 updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
1065 targetApplications: [{
1066 id: "xpcshell@tests.mozilla.org",
1067 minVersion: "0.1",
1068 maxVersion: "0.2"
1069 }],
1070 name: "Test Addon 11",
1071 }, profileDir);
1072 restartManager();
1074 AddonManager.getAddonByID("addon11@tests.mozilla.org", function(a11) {
1075 do_check_neq(a11, null);
1077 a11.findUpdates({
1078 onCompatibilityUpdateAvailable: function() {
1079 do_throw("Should have not have seen compatibility information");
1080 },
1082 onUpdateAvailable: function() {
1083 do_throw("Should not have seen an available update");
1084 },
1086 onUpdateFinished: function() {
1087 do_execute_soon(end_test);
1088 }
1089 }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
1090 });
1091 }