toolkit/mozapps/extensions/test/xpcshell/test_distribution.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:1826cb0f1ff5
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/
3 */
4
5 // This verifies that add-ons distributed with the application get installed
6 // correctly
7
8 // Allow distributed add-ons to install
9 Services.prefs.setBoolPref("extensions.installDistroAddons", true);
10
11 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
12
13 const profileDir = gProfD.clone();
14 profileDir.append("extensions");
15 const distroDir = gProfD.clone();
16 distroDir.append("distribution");
17 distroDir.append("extensions");
18 registerDirectory("XREAppDist", distroDir.parent);
19
20 var addon1_1 = {
21 id: "addon1@tests.mozilla.org",
22 version: "1.0",
23 name: "Test version 1",
24 targetApplications: [{
25 id: "xpcshell@tests.mozilla.org",
26 minVersion: "1",
27 maxVersion: "5"
28 }]
29 };
30
31 var addon1_2 = {
32 id: "addon1@tests.mozilla.org",
33 version: "2.0",
34 name: "Test version 2",
35 targetApplications: [{
36 id: "xpcshell@tests.mozilla.org",
37 minVersion: "1",
38 maxVersion: "5"
39 }]
40 };
41
42 var addon1_3 = {
43 id: "addon1@tests.mozilla.org",
44 version: "3.0",
45 name: "Test version 3",
46 targetApplications: [{
47 id: "xpcshell@tests.mozilla.org",
48 minVersion: "1",
49 maxVersion: "5"
50 }]
51 };
52
53 function getActiveVersion() {
54 return Services.prefs.getIntPref("bootstraptest.active_version");
55 }
56
57 function getInstalledVersion() {
58 return Services.prefs.getIntPref("bootstraptest.installed_version");
59 }
60
61 function setOldModificationTime() {
62 // Make sure the installed extension has an old modification time so any
63 // changes will be detected
64 shutdownManager()
65 let extension = gProfD.clone();
66 extension.append("extensions");
67 if (Services.prefs.getBoolPref("extensions.alwaysUnpack"))
68 extension.append("addon1@tests.mozilla.org");
69 else
70 extension.append("addon1@tests.mozilla.org.xpi");
71 setExtensionModifiedTime(extension, Date.now - 10000);
72 startupManager(false);
73 }
74
75 function run_test() {
76 do_test_pending();
77
78 run_test_1();
79 }
80
81 // Tests that on the first startup the add-on gets installed
82 function run_test_1() {
83 writeInstallRDFForExtension(addon1_1, distroDir);
84
85 startupManager();
86
87 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
88 do_check_neq(a1, null);
89 do_check_eq(a1.version, "1.0");
90 do_check_true(a1.isActive);
91 do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE);
92 do_check_false(a1.foreignInstall);
93
94 do_execute_soon(run_test_2);
95 });
96 }
97
98 // Tests that starting with a newer version in the distribution dir doesn't
99 // install it yet
100 function run_test_2() {
101 setOldModificationTime();
102
103 writeInstallRDFForExtension(addon1_2, distroDir);
104
105 restartManager();
106
107 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
108 do_check_neq(a1, null);
109 do_check_eq(a1.version, "1.0");
110 do_check_true(a1.isActive);
111 do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE);
112
113 do_execute_soon(run_test_3);
114 });
115 }
116
117 // Test that an app upgrade installs the newer version
118 function run_test_3() {
119 restartManager("2");
120
121 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
122 do_check_neq(a1, null);
123 do_check_eq(a1.version, "2.0");
124 do_check_true(a1.isActive);
125 do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE);
126 do_check_false(a1.foreignInstall);
127
128 do_execute_soon(run_test_4);
129 });
130 }
131
132 // Test that an app upgrade doesn't downgrade the extension
133 function run_test_4() {
134 setOldModificationTime();
135
136 writeInstallRDFForExtension(addon1_1, distroDir);
137
138 restartManager("3");
139
140 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
141 do_check_neq(a1, null);
142 do_check_eq(a1.version, "2.0");
143 do_check_true(a1.isActive);
144 do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE);
145
146 do_execute_soon(run_test_5);
147 });
148 }
149
150 // Tests that after uninstalling a restart doesn't re-install the extension
151 function run_test_5() {
152 AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
153 a1.uninstall();
154
155 restartManager();
156
157 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
158 do_check_eq(a1, null);
159
160 do_execute_soon(run_test_6);
161 });
162 }));
163 }
164
165 // Tests that upgrading the application still doesn't re-install the uninstalled
166 // extension
167 function run_test_6() {
168 restartManager("4");
169
170 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
171 do_check_eq(a1, null);
172
173 do_execute_soon(run_test_7);
174 });
175 }
176
177 // Tests that a pending install of a newer version of a distributed add-on
178 // at app change still gets applied
179 function run_test_7() {
180 Services.prefs.clearUserPref("extensions.installedDistroAddon.addon1@tests.mozilla.org");
181
182 installAllFiles([do_get_addon("test_distribution1_2")], function() {
183 restartManager(2);
184
185 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
186 do_check_neq(a1, null);
187 do_check_eq(a1.version, "2.0");
188 do_check_true(a1.isActive);
189 do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE);
190
191 a1.uninstall();
192 do_execute_soon(run_test_8);
193 });
194 });
195 }
196
197 // Tests that a pending install of a older version of a distributed add-on
198 // at app change gets replaced by the distributed version
199 function run_test_8() {
200 restartManager();
201
202 writeInstallRDFForExtension(addon1_3, distroDir);
203
204 installAllFiles([do_get_addon("test_distribution1_2")], function() {
205 restartManager(3);
206
207 AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
208 do_check_neq(a1, null);
209 do_check_eq(a1.version, "3.0");
210 do_check_true(a1.isActive);
211 do_check_eq(a1.scope, AddonManager.SCOPE_PROFILE);
212
213 a1.uninstall();
214 do_execute_soon(run_test_9);
215 });
216 });
217 }
218
219 // Tests that bootstrapped add-ons distributed start up correctly, also that
220 // add-ons with multiple directories get copied fully
221 function run_test_9() {
222 restartManager();
223
224 // Copy the test add-on to the distro dir
225 let addon = do_get_file("data/test_distribution2_2");
226 addon.copyTo(distroDir, "addon2@tests.mozilla.org");
227
228 restartManager("5");
229
230 AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
231 do_check_neq(a2, null);
232 do_check_true(a2.isActive);
233
234 do_check_eq(getInstalledVersion(), 2);
235 do_check_eq(getActiveVersion(), 2);
236
237 do_check_true(a2.hasResource("bootstrap.js"));
238 do_check_true(a2.hasResource("subdir/dummy.txt"));
239 do_check_true(a2.hasResource("subdir/subdir2/dummy2.txt"));
240
241 // Currently installs are unpacked if the source is a directory regardless
242 // of the install.rdf property or the global preference
243
244 let addonDir = profileDir.clone();
245 addonDir.append("addon2@tests.mozilla.org");
246 do_check_true(addonDir.exists());
247 do_check_true(addonDir.isDirectory());
248 addonDir.append("subdir");
249 do_check_true(addonDir.exists());
250 do_check_true(addonDir.isDirectory());
251 addonDir.append("subdir2");
252 do_check_true(addonDir.exists());
253 do_check_true(addonDir.isDirectory());
254 addonDir.append("dummy2.txt");
255 do_check_true(addonDir.exists());
256 do_check_true(addonDir.isFile());
257
258 a2.uninstall();
259
260 do_execute_soon(do_test_finished);
261 });
262 }

mercurial