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

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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 }

mercurial