|
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 } |