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 // Checks that we handle a locked database when there are extension changes
6 // in progress
8 Components.utils.import("resource://gre/modules/osfile.jsm");
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 };
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 };
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 };
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 };
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 };
71 const profileDir = gProfD.clone();
72 profileDir.append("extensions");
74 add_task(function() {
76 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "2", "2");
78 writeInstallRDFForExtension(addon1, profileDir);
79 writeInstallRDFForExtension(addon2, profileDir);
80 writeInstallRDFForExtension(addon3, profileDir);
81 writeInstallRDFForExtension(addon4, profileDir);
82 writeInstallRDFForExtension(addon5, profileDir);
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));
89 // Startup the profile and setup the initial state
90 startupManager();
92 check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
93 check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
95 let a1, a2, a3, a4, a5, a6;
97 [a2] = yield promiseAddonsByIDs(["addon2@tests.mozilla.org"]);
98 a2.userDisabled = true;
100 restartManager();
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"]);
109 a2.userDisabled = false;
110 a3.userDisabled = true;
111 a4.uninstall();
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));
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));
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));
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));
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));
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;
161 let file = yield OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options);
163 let filePermissions = gExtensionsJSON.permissions;
164 if (!OS.Constants.Win) {
165 gExtensionsJSON.permissions = 0;
166 }
167 startupManager(false);
169 check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
170 check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
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"]);
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));
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));
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));
201 do_check_eq(a4, null);
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));
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));
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();
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 }
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"]);
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));
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));
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));
271 do_check_eq(a4, null);
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));
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 });
289 function run_test() {
290 run_next_test();
291 }