1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_locked2.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,292 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +// Checks that we handle a locked database when there are extension changes 1.9 +// in progress 1.10 + 1.11 +Components.utils.import("resource://gre/modules/osfile.jsm"); 1.12 + 1.13 +// Will be left alone 1.14 +var addon1 = { 1.15 + id: "addon1@tests.mozilla.org", 1.16 + version: "1.0", 1.17 + name: "Test 1", 1.18 + targetApplications: [{ 1.19 + id: "xpcshell@tests.mozilla.org", 1.20 + minVersion: "2", 1.21 + maxVersion: "2" 1.22 + }] 1.23 +}; 1.24 + 1.25 +// Will be enabled 1.26 +var addon2 = { 1.27 + id: "addon2@tests.mozilla.org", 1.28 + version: "1.0", 1.29 + name: "Test 2", 1.30 + targetApplications: [{ 1.31 + id: "xpcshell@tests.mozilla.org", 1.32 + minVersion: "2", 1.33 + maxVersion: "2" 1.34 + }] 1.35 +}; 1.36 + 1.37 +// Will be disabled 1.38 +var addon3 = { 1.39 + id: "addon3@tests.mozilla.org", 1.40 + version: "1.0", 1.41 + name: "Test 3", 1.42 + targetApplications: [{ 1.43 + id: "xpcshell@tests.mozilla.org", 1.44 + minVersion: "2", 1.45 + maxVersion: "2" 1.46 + }] 1.47 +}; 1.48 + 1.49 +// Will be uninstalled 1.50 +var addon4 = { 1.51 + id: "addon4@tests.mozilla.org", 1.52 + version: "1.0", 1.53 + name: "Test 4", 1.54 + targetApplications: [{ 1.55 + id: "xpcshell@tests.mozilla.org", 1.56 + minVersion: "2", 1.57 + maxVersion: "2" 1.58 + }] 1.59 +}; 1.60 + 1.61 + 1.62 +// Will be updated 1.63 +var addon5 = { 1.64 + id: "addon5@tests.mozilla.org", 1.65 + version: "1.0", 1.66 + name: "Test 5", 1.67 + targetApplications: [{ 1.68 + id: "xpcshell@tests.mozilla.org", 1.69 + minVersion: "2", 1.70 + maxVersion: "2" 1.71 + }] 1.72 +}; 1.73 + 1.74 +const profileDir = gProfD.clone(); 1.75 +profileDir.append("extensions"); 1.76 + 1.77 +add_task(function() { 1.78 + 1.79 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "2", "2"); 1.80 + 1.81 + writeInstallRDFForExtension(addon1, profileDir); 1.82 + writeInstallRDFForExtension(addon2, profileDir); 1.83 + writeInstallRDFForExtension(addon3, profileDir); 1.84 + writeInstallRDFForExtension(addon4, profileDir); 1.85 + writeInstallRDFForExtension(addon5, profileDir); 1.86 + 1.87 + // Make it look like add-on 5 was installed some time in the past so the update is 1.88 + // detected 1.89 + let path = getFileForAddon(profileDir, addon5.id).path; 1.90 + yield promiseSetExtensionModifiedTime(path, Date.now() - (60000)); 1.91 + 1.92 + // Startup the profile and setup the initial state 1.93 + startupManager(); 1.94 + 1.95 + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); 1.96 + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); 1.97 + 1.98 + let a1, a2, a3, a4, a5, a6; 1.99 + 1.100 + [a2] = yield promiseAddonsByIDs(["addon2@tests.mozilla.org"]); 1.101 + a2.userDisabled = true; 1.102 + 1.103 + restartManager(); 1.104 + 1.105 + [a1, a2, a3, a4, a5] = 1.106 + yield promiseAddonsByIDs(["addon1@tests.mozilla.org", 1.107 + "addon2@tests.mozilla.org", 1.108 + "addon3@tests.mozilla.org", 1.109 + "addon4@tests.mozilla.org", 1.110 + "addon5@tests.mozilla.org"]); 1.111 + 1.112 + a2.userDisabled = false; 1.113 + a3.userDisabled = true; 1.114 + a4.uninstall(); 1.115 + 1.116 + yield promiseInstallAllFiles([do_get_addon("test_locked2_5"), 1.117 + do_get_addon("test_locked2_6")]); 1.118 + do_check_neq(a1, null); 1.119 + do_check_true(a1.isActive); 1.120 + do_check_false(a1.userDisabled); 1.121 + do_check_false(a1.appDisabled); 1.122 + do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE); 1.123 + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); 1.124 + 1.125 + do_check_neq(a2, null); 1.126 + do_check_false(a2.isActive); 1.127 + do_check_false(a2.userDisabled); 1.128 + do_check_false(a2.appDisabled); 1.129 + do_check_eq(a2.pendingOperations, AddonManager.PENDING_ENABLE); 1.130 + do_check_false(isExtensionInAddonsList(profileDir, a2.id)); 1.131 + 1.132 + do_check_neq(a3, null); 1.133 + do_check_true(a3.isActive); 1.134 + do_check_true(a3.userDisabled); 1.135 + do_check_false(a3.appDisabled); 1.136 + do_check_eq(a3.pendingOperations, AddonManager.PENDING_DISABLE); 1.137 + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); 1.138 + 1.139 + do_check_neq(a4, null); 1.140 + do_check_true(a4.isActive); 1.141 + do_check_false(a4.userDisabled); 1.142 + do_check_false(a4.appDisabled); 1.143 + do_check_eq(a4.pendingOperations, AddonManager.PENDING_UNINSTALL); 1.144 + do_check_true(isExtensionInAddonsList(profileDir, a4.id)); 1.145 + 1.146 + do_check_neq(a5, null); 1.147 + do_check_eq(a5.version, "1.0"); 1.148 + do_check_true(a5.isActive); 1.149 + do_check_false(a5.userDisabled); 1.150 + do_check_false(a5.appDisabled); 1.151 + do_check_eq(a5.pendingOperations, AddonManager.PENDING_UPGRADE); 1.152 + do_check_true(isExtensionInAddonsList(profileDir, a5.id)); 1.153 + 1.154 + // Open another handle on the JSON DB with as much Unix and Windows locking 1.155 + // as we can to simulate some other process interfering with it 1.156 + shutdownManager(); 1.157 + do_print("Locking " + gExtensionsJSON.path); 1.158 + let options = { 1.159 + winShare: 0 1.160 + }; 1.161 + if (OS.Constants.libc.O_EXLOCK) 1.162 + options.unixFlags = OS.Constants.libc.O_EXLOCK; 1.163 + 1.164 + let file = yield OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options); 1.165 + 1.166 + let filePermissions = gExtensionsJSON.permissions; 1.167 + if (!OS.Constants.Win) { 1.168 + gExtensionsJSON.permissions = 0; 1.169 + } 1.170 + startupManager(false); 1.171 + 1.172 + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); 1.173 + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); 1.174 + 1.175 + [a1, a2, a3, a4, a5, a6] = 1.176 + yield promiseAddonsByIDs(["addon1@tests.mozilla.org", 1.177 + "addon2@tests.mozilla.org", 1.178 + "addon3@tests.mozilla.org", 1.179 + "addon4@tests.mozilla.org", 1.180 + "addon5@tests.mozilla.org", 1.181 + "addon6@tests.mozilla.org"]); 1.182 + 1.183 + do_check_neq(a1, null); 1.184 + do_check_true(a1.isActive); 1.185 + do_check_false(a1.userDisabled); 1.186 + do_check_false(a1.appDisabled); 1.187 + do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE); 1.188 + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); 1.189 + 1.190 + do_check_neq(a2, null); 1.191 + do_check_true(a2.isActive); 1.192 + do_check_false(a2.userDisabled); 1.193 + do_check_false(a2.appDisabled); 1.194 + do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE); 1.195 + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); 1.196 + 1.197 + do_check_neq(a3, null); 1.198 + do_check_false(a3.isActive); 1.199 + do_check_true(a3.userDisabled); 1.200 + do_check_false(a3.appDisabled); 1.201 + do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE); 1.202 + do_check_false(isExtensionInAddonsList(profileDir, a3.id)); 1.203 + 1.204 + do_check_eq(a4, null); 1.205 + 1.206 + do_check_neq(a5, null); 1.207 + do_check_eq(a5.version, "2.0"); 1.208 + do_check_true(a5.isActive); 1.209 + do_check_false(a5.userDisabled); 1.210 + do_check_false(a5.appDisabled); 1.211 + do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE); 1.212 + do_check_true(isExtensionInAddonsList(profileDir, a5.id)); 1.213 + 1.214 + do_check_neq(a6, null); 1.215 + do_check_true(a6.isActive); 1.216 + do_check_false(a6.userDisabled); 1.217 + do_check_false(a6.appDisabled); 1.218 + do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE); 1.219 + do_check_true(isExtensionInAddonsList(profileDir, a6.id)); 1.220 + 1.221 + // After allowing access to the original DB things should still be 1.222 + // back how they were before the lock 1.223 + shutdownManager(); 1.224 + yield file.close(); 1.225 + gExtensionsJSON.permissions = filePermissions; 1.226 + startupManager(); 1.227 + 1.228 + // On Unix, we can save the DB even when the original file wasn't 1.229 + // readable, so our changes were saved. On Windows, 1.230 + // these things happened when we had no access to the database so 1.231 + // they are seen as external changes when we get the database back 1.232 + if (gXPISaveError) { 1.233 + do_print("Previous XPI save failed"); 1.234 + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, 1.235 + ["addon6@tests.mozilla.org"]); 1.236 + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, 1.237 + ["addon4@tests.mozilla.org"]); 1.238 + } 1.239 + else { 1.240 + do_print("Previous XPI save succeeded"); 1.241 + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); 1.242 + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); 1.243 + } 1.244 + 1.245 + [a1, a2, a3, a4, a5, a6] = 1.246 + yield promiseAddonsByIDs(["addon1@tests.mozilla.org", 1.247 + "addon2@tests.mozilla.org", 1.248 + "addon3@tests.mozilla.org", 1.249 + "addon4@tests.mozilla.org", 1.250 + "addon5@tests.mozilla.org", 1.251 + "addon6@tests.mozilla.org"]); 1.252 + 1.253 + do_check_neq(a1, null); 1.254 + do_check_true(a1.isActive); 1.255 + do_check_false(a1.userDisabled); 1.256 + do_check_false(a1.appDisabled); 1.257 + do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE); 1.258 + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); 1.259 + 1.260 + do_check_neq(a2, null); 1.261 + do_check_true(a2.isActive); 1.262 + do_check_false(a2.userDisabled); 1.263 + do_check_false(a2.appDisabled); 1.264 + do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE); 1.265 + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); 1.266 + 1.267 + do_check_neq(a3, null); 1.268 + do_check_false(a3.isActive); 1.269 + do_check_true(a3.userDisabled); 1.270 + do_check_false(a3.appDisabled); 1.271 + do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE); 1.272 + do_check_false(isExtensionInAddonsList(profileDir, a3.id)); 1.273 + 1.274 + do_check_eq(a4, null); 1.275 + 1.276 + do_check_neq(a5, null); 1.277 + do_check_eq(a5.version, "2.0"); 1.278 + do_check_true(a5.isActive); 1.279 + do_check_false(a5.userDisabled); 1.280 + do_check_false(a5.appDisabled); 1.281 + do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE); 1.282 + do_check_true(isExtensionInAddonsList(profileDir, a5.id)); 1.283 + 1.284 + do_check_neq(a6, null); 1.285 + do_check_true(a6.isActive); 1.286 + do_check_false(a6.userDisabled); 1.287 + do_check_false(a6.appDisabled); 1.288 + do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE); 1.289 + do_check_true(isExtensionInAddonsList(profileDir, a6.id)); 1.290 +}); 1.291 + 1.292 +function run_test() { 1.293 + run_next_test(); 1.294 +} 1.295 +