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

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:dd7cf91de7b3
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/
3 */
4
5 // Checks that we handle a locked database when there are extension changes
6 // in progress
7
8 Components.utils.import("resource://gre/modules/osfile.jsm");
9
10 // Will be left alone
11 var addon1 = {
12 id: "addon1@tests.mozilla.org",
13 version: "1.0",
14 name: "Test 1",
15 targetApplications: [{
16 id: "xpcshell@tests.mozilla.org",
17 minVersion: "2",
18 maxVersion: "2"
19 }]
20 };
21
22 // Will be enabled
23 var addon2 = {
24 id: "addon2@tests.mozilla.org",
25 version: "1.0",
26 name: "Test 2",
27 targetApplications: [{
28 id: "xpcshell@tests.mozilla.org",
29 minVersion: "2",
30 maxVersion: "2"
31 }]
32 };
33
34 // Will be disabled
35 var addon3 = {
36 id: "addon3@tests.mozilla.org",
37 version: "1.0",
38 name: "Test 3",
39 targetApplications: [{
40 id: "xpcshell@tests.mozilla.org",
41 minVersion: "2",
42 maxVersion: "2"
43 }]
44 };
45
46 // Will be uninstalled
47 var addon4 = {
48 id: "addon4@tests.mozilla.org",
49 version: "1.0",
50 name: "Test 4",
51 targetApplications: [{
52 id: "xpcshell@tests.mozilla.org",
53 minVersion: "2",
54 maxVersion: "2"
55 }]
56 };
57
58
59 // Will be updated
60 var addon5 = {
61 id: "addon5@tests.mozilla.org",
62 version: "1.0",
63 name: "Test 5",
64 targetApplications: [{
65 id: "xpcshell@tests.mozilla.org",
66 minVersion: "2",
67 maxVersion: "2"
68 }]
69 };
70
71 const profileDir = gProfD.clone();
72 profileDir.append("extensions");
73
74 add_task(function() {
75
76 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "2", "2");
77
78 writeInstallRDFForExtension(addon1, profileDir);
79 writeInstallRDFForExtension(addon2, profileDir);
80 writeInstallRDFForExtension(addon3, profileDir);
81 writeInstallRDFForExtension(addon4, profileDir);
82 writeInstallRDFForExtension(addon5, profileDir);
83
84 // Make it look like add-on 5 was installed some time in the past so the update is
85 // detected
86 let path = getFileForAddon(profileDir, addon5.id).path;
87 yield promiseSetExtensionModifiedTime(path, Date.now() - (60000));
88
89 // Startup the profile and setup the initial state
90 startupManager();
91
92 check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
93 check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
94
95 let a1, a2, a3, a4, a5, a6;
96
97 [a2] = yield promiseAddonsByIDs(["addon2@tests.mozilla.org"]);
98 a2.userDisabled = true;
99
100 restartManager();
101
102 [a1, a2, a3, a4, a5] =
103 yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
104 "addon2@tests.mozilla.org",
105 "addon3@tests.mozilla.org",
106 "addon4@tests.mozilla.org",
107 "addon5@tests.mozilla.org"]);
108
109 a2.userDisabled = false;
110 a3.userDisabled = true;
111 a4.uninstall();
112
113 yield promiseInstallAllFiles([do_get_addon("test_locked2_5"),
114 do_get_addon("test_locked2_6")]);
115 do_check_neq(a1, null);
116 do_check_true(a1.isActive);
117 do_check_false(a1.userDisabled);
118 do_check_false(a1.appDisabled);
119 do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
120 do_check_true(isExtensionInAddonsList(profileDir, a1.id));
121
122 do_check_neq(a2, null);
123 do_check_false(a2.isActive);
124 do_check_false(a2.userDisabled);
125 do_check_false(a2.appDisabled);
126 do_check_eq(a2.pendingOperations, AddonManager.PENDING_ENABLE);
127 do_check_false(isExtensionInAddonsList(profileDir, a2.id));
128
129 do_check_neq(a3, null);
130 do_check_true(a3.isActive);
131 do_check_true(a3.userDisabled);
132 do_check_false(a3.appDisabled);
133 do_check_eq(a3.pendingOperations, AddonManager.PENDING_DISABLE);
134 do_check_true(isExtensionInAddonsList(profileDir, a3.id));
135
136 do_check_neq(a4, null);
137 do_check_true(a4.isActive);
138 do_check_false(a4.userDisabled);
139 do_check_false(a4.appDisabled);
140 do_check_eq(a4.pendingOperations, AddonManager.PENDING_UNINSTALL);
141 do_check_true(isExtensionInAddonsList(profileDir, a4.id));
142
143 do_check_neq(a5, null);
144 do_check_eq(a5.version, "1.0");
145 do_check_true(a5.isActive);
146 do_check_false(a5.userDisabled);
147 do_check_false(a5.appDisabled);
148 do_check_eq(a5.pendingOperations, AddonManager.PENDING_UPGRADE);
149 do_check_true(isExtensionInAddonsList(profileDir, a5.id));
150
151 // Open another handle on the JSON DB with as much Unix and Windows locking
152 // as we can to simulate some other process interfering with it
153 shutdownManager();
154 do_print("Locking " + gExtensionsJSON.path);
155 let options = {
156 winShare: 0
157 };
158 if (OS.Constants.libc.O_EXLOCK)
159 options.unixFlags = OS.Constants.libc.O_EXLOCK;
160
161 let file = yield OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options);
162
163 let filePermissions = gExtensionsJSON.permissions;
164 if (!OS.Constants.Win) {
165 gExtensionsJSON.permissions = 0;
166 }
167 startupManager(false);
168
169 check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
170 check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
171
172 [a1, a2, a3, a4, a5, a6] =
173 yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
174 "addon2@tests.mozilla.org",
175 "addon3@tests.mozilla.org",
176 "addon4@tests.mozilla.org",
177 "addon5@tests.mozilla.org",
178 "addon6@tests.mozilla.org"]);
179
180 do_check_neq(a1, null);
181 do_check_true(a1.isActive);
182 do_check_false(a1.userDisabled);
183 do_check_false(a1.appDisabled);
184 do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
185 do_check_true(isExtensionInAddonsList(profileDir, a1.id));
186
187 do_check_neq(a2, null);
188 do_check_true(a2.isActive);
189 do_check_false(a2.userDisabled);
190 do_check_false(a2.appDisabled);
191 do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
192 do_check_true(isExtensionInAddonsList(profileDir, a2.id));
193
194 do_check_neq(a3, null);
195 do_check_false(a3.isActive);
196 do_check_true(a3.userDisabled);
197 do_check_false(a3.appDisabled);
198 do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
199 do_check_false(isExtensionInAddonsList(profileDir, a3.id));
200
201 do_check_eq(a4, null);
202
203 do_check_neq(a5, null);
204 do_check_eq(a5.version, "2.0");
205 do_check_true(a5.isActive);
206 do_check_false(a5.userDisabled);
207 do_check_false(a5.appDisabled);
208 do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
209 do_check_true(isExtensionInAddonsList(profileDir, a5.id));
210
211 do_check_neq(a6, null);
212 do_check_true(a6.isActive);
213 do_check_false(a6.userDisabled);
214 do_check_false(a6.appDisabled);
215 do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
216 do_check_true(isExtensionInAddonsList(profileDir, a6.id));
217
218 // After allowing access to the original DB things should still be
219 // back how they were before the lock
220 shutdownManager();
221 yield file.close();
222 gExtensionsJSON.permissions = filePermissions;
223 startupManager();
224
225 // On Unix, we can save the DB even when the original file wasn't
226 // readable, so our changes were saved. On Windows,
227 // these things happened when we had no access to the database so
228 // they are seen as external changes when we get the database back
229 if (gXPISaveError) {
230 do_print("Previous XPI save failed");
231 check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED,
232 ["addon6@tests.mozilla.org"]);
233 check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED,
234 ["addon4@tests.mozilla.org"]);
235 }
236 else {
237 do_print("Previous XPI save succeeded");
238 check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
239 check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
240 }
241
242 [a1, a2, a3, a4, a5, a6] =
243 yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
244 "addon2@tests.mozilla.org",
245 "addon3@tests.mozilla.org",
246 "addon4@tests.mozilla.org",
247 "addon5@tests.mozilla.org",
248 "addon6@tests.mozilla.org"]);
249
250 do_check_neq(a1, null);
251 do_check_true(a1.isActive);
252 do_check_false(a1.userDisabled);
253 do_check_false(a1.appDisabled);
254 do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
255 do_check_true(isExtensionInAddonsList(profileDir, a1.id));
256
257 do_check_neq(a2, null);
258 do_check_true(a2.isActive);
259 do_check_false(a2.userDisabled);
260 do_check_false(a2.appDisabled);
261 do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
262 do_check_true(isExtensionInAddonsList(profileDir, a2.id));
263
264 do_check_neq(a3, null);
265 do_check_false(a3.isActive);
266 do_check_true(a3.userDisabled);
267 do_check_false(a3.appDisabled);
268 do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
269 do_check_false(isExtensionInAddonsList(profileDir, a3.id));
270
271 do_check_eq(a4, null);
272
273 do_check_neq(a5, null);
274 do_check_eq(a5.version, "2.0");
275 do_check_true(a5.isActive);
276 do_check_false(a5.userDisabled);
277 do_check_false(a5.appDisabled);
278 do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
279 do_check_true(isExtensionInAddonsList(profileDir, a5.id));
280
281 do_check_neq(a6, null);
282 do_check_true(a6.isActive);
283 do_check_false(a6.userDisabled);
284 do_check_false(a6.appDisabled);
285 do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
286 do_check_true(isExtensionInAddonsList(profileDir, a6.id));
287 });
288
289 function run_test() {
290 run_next_test();
291 }
292

mercurial