toolkit/mozapps/extensions/test/xpcshell/test_locked.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
-rwxr-xr-x

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 rebuild something sensible from a corrupt database
     7 Components.utils.import("resource://testing-common/httpd.js");
     8 Components.utils.import("resource://gre/modules/osfile.jsm");
    10 var testserver = new HttpServer();
    11 testserver.start(-1);
    12 gPort = testserver.identity.primaryPort;
    13 mapFile("/data/test_corrupt.rdf", testserver);
    14 testserver.registerDirectory("/addons/", do_get_file("addons"));
    16 // The test extension uses an insecure update url.
    17 Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
    18 Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, false);
    20 // Will be enabled
    21 var addon1 = {
    22   id: "addon1@tests.mozilla.org",
    23   version: "1.0",
    24   name: "Test 1",
    25   targetApplications: [{
    26     id: "xpcshell@tests.mozilla.org",
    27     minVersion: "2",
    28     maxVersion: "2"
    29   }]
    30 };
    32 // Will be disabled
    33 var addon2 = {
    34   id: "addon2@tests.mozilla.org",
    35   version: "1.0",
    36   name: "Test 2",
    37   targetApplications: [{
    38     id: "xpcshell@tests.mozilla.org",
    39     minVersion: "2",
    40     maxVersion: "2"
    41   }]
    42 };
    44 // Will get a compatibility update and stay enabled
    45 var addon3 = {
    46   id: "addon3@tests.mozilla.org",
    47   version: "1.0",
    48   name: "Test 3",
    49   updateURL: "http://localhost:" + gPort + "/data/test_corrupt.rdf",
    50   targetApplications: [{
    51     id: "xpcshell@tests.mozilla.org",
    52     minVersion: "1",
    53     maxVersion: "1"
    54   }]
    55 };
    57 // Will get a compatibility update and be enabled
    58 var addon4 = {
    59   id: "addon4@tests.mozilla.org",
    60   version: "1.0",
    61   name: "Test 4",
    62   updateURL: "http://localhost:" + gPort + "/data/test_corrupt.rdf",
    63   targetApplications: [{
    64     id: "xpcshell@tests.mozilla.org",
    65     minVersion: "1",
    66     maxVersion: "1"
    67   }]
    68 };
    70 // Would stay incompatible with strict compat
    71 var addon5 = {
    72   id: "addon5@tests.mozilla.org",
    73   version: "1.0",
    74   name: "Test 5",
    75   targetApplications: [{
    76     id: "xpcshell@tests.mozilla.org",
    77     minVersion: "1",
    78     maxVersion: "1"
    79   }]
    80 };
    82 // Enabled bootstrapped
    83 var addon6 = {
    84   id: "addon6@tests.mozilla.org",
    85   version: "1.0",
    86   name: "Test 6",
    87   bootstrap: "true",
    88   targetApplications: [{
    89     id: "xpcshell@tests.mozilla.org",
    90     minVersion: "2",
    91     maxVersion: "2"
    92   }]
    93 };
    95 // Disabled bootstrapped
    96 var addon7 = {
    97   id: "addon7@tests.mozilla.org",
    98   version: "1.0",
    99   name: "Test 7",
   100   bootstrap: "true",
   101   targetApplications: [{
   102     id: "xpcshell@tests.mozilla.org",
   103     minVersion: "2",
   104     maxVersion: "2"
   105   }]
   106 };
   108 // The default theme
   109 var theme1 = {
   110   id: "theme1@tests.mozilla.org",
   111   version: "1.0",
   112   name: "Theme 1",
   113   internalName: "classic/1.0",
   114   targetApplications: [{
   115     id: "xpcshell@tests.mozilla.org",
   116     minVersion: "2",
   117     maxVersion: "2"
   118   }]
   119 };
   121 // The selected theme
   122 var theme2 = {
   123   id: "theme2@tests.mozilla.org",
   124   version: "1.0",
   125   name: "Theme 2",
   126   internalName: "test/1.0",
   127   targetApplications: [{
   128     id: "xpcshell@tests.mozilla.org",
   129     minVersion: "2",
   130     maxVersion: "2"
   131   }]
   132 };
   134 const profileDir = gProfD.clone();
   135 profileDir.append("extensions");
   137 add_task(function* init() {
   138   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "2", "2");
   140   writeInstallRDFForExtension(addon1, profileDir);
   141   writeInstallRDFForExtension(addon2, profileDir);
   142   writeInstallRDFForExtension(addon3, profileDir);
   143   writeInstallRDFForExtension(addon4, profileDir);
   144   writeInstallRDFForExtension(addon5, profileDir);
   145   writeInstallRDFForExtension(addon6, profileDir);
   146   writeInstallRDFForExtension(addon7, profileDir);
   147   writeInstallRDFForExtension(theme1, profileDir);
   148   writeInstallRDFForExtension(theme2, profileDir);
   150   // Startup the profile and setup the initial state
   151   startupManager();
   153   // New profile so new add-ons are ignored
   154   check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   156   let [a2, a3, a4, a7, t2] =
   157     yield promiseAddonsByIDs(["addon2@tests.mozilla.org",
   158                                "addon3@tests.mozilla.org",
   159                                "addon4@tests.mozilla.org",
   160                                "addon7@tests.mozilla.org",
   161                                "theme2@tests.mozilla.org"]);
   162   let deferredUpdateFinished = Promise.defer();
   163   // Set up the initial state
   164   a2.userDisabled = true;
   165   a4.userDisabled = true;
   166   a7.userDisabled = true;
   167   t2.userDisabled = false;
   168   a3.findUpdates({
   169     onUpdateFinished: function() {
   170       a4.findUpdates({
   171         onUpdateFinished: function() {
   172           // Let the updates finish before restarting the manager
   173           deferredUpdateFinished.resolve();
   174         }
   175       }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
   176     }
   177   }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
   179   yield deferredUpdateFinished.promise;
   180 });
   183 add_task(function* run_test_1() {
   184   restartManager();
   185   let [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   186     yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   187                               "addon2@tests.mozilla.org",
   188                               "addon3@tests.mozilla.org",
   189                               "addon4@tests.mozilla.org",
   190                               "addon5@tests.mozilla.org",
   191                               "addon6@tests.mozilla.org",
   192                               "addon7@tests.mozilla.org",
   193                               "theme1@tests.mozilla.org",
   194                               "theme2@tests.mozilla.org"]);
   196   do_check_neq(a1, null);
   197   do_check_true(a1.isActive);
   198   do_check_false(a1.userDisabled);
   199   do_check_false(a1.appDisabled);
   200   do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   201   do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   203   do_check_neq(a2, null);
   204   do_check_false(a2.isActive);
   205   do_check_true(a2.userDisabled);
   206   do_check_false(a2.appDisabled);
   207   do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   208   do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   210   do_check_neq(a3, null);
   211   do_check_true(a3.isActive);
   212   do_check_false(a3.userDisabled);
   213   do_check_false(a3.appDisabled);
   214   do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   215   do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   217   do_check_neq(a4, null);
   218   do_check_false(a4.isActive);
   219   do_check_true(a4.userDisabled);
   220   do_check_false(a4.appDisabled);
   221   do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   222   do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   224   do_check_neq(a5, null);
   225   do_check_true(a5.isActive);
   226   do_check_false(a5.userDisabled);
   227   do_check_false(a5.appDisabled);
   228   do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   229   do_check_true(isExtensionInAddonsList(profileDir, a5.id));
   231   do_check_neq(a6, null);
   232   do_check_true(a6.isActive);
   233   do_check_false(a6.userDisabled);
   234   do_check_false(a6.appDisabled);
   235   do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   237   do_check_neq(a7, null);
   238   do_check_false(a7.isActive);
   239   do_check_true(a7.userDisabled);
   240   do_check_false(a7.appDisabled);
   241   do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   243   do_check_neq(t1, null);
   244   do_check_false(t1.isActive);
   245   do_check_true(t1.userDisabled);
   246   do_check_false(t1.appDisabled);
   247   do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   248   do_check_false(isThemeInAddonsList(profileDir, t1.id));
   250   do_check_neq(t2, null);
   251   do_check_true(t2.isActive);
   252   do_check_false(t2.userDisabled);
   253   do_check_false(t2.appDisabled);
   254   do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   255   do_check_true(isThemeInAddonsList(profileDir, t2.id));
   257   // Open another handle on the JSON DB with as much Unix and Windows locking
   258   // as we can to simulate some other process interfering with it
   259   shutdownManager();
   260   do_print("Locking " + gExtensionsJSON.path);
   261   let options = {
   262     winShare: 0
   263   };
   264   if (OS.Constants.libc.O_EXLOCK)
   265     options.unixFlags = OS.Constants.libc.O_EXLOCK;
   267   let file = yield OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options);
   269   let filePermissions = gExtensionsJSON.permissions;
   270   if (!OS.Constants.Win) {
   271     gExtensionsJSON.permissions = 0;
   272   }
   273   startupManager(false);
   275   // Shouldn't have seen any startup changes
   276   check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   278   // Accessing the add-ons should open and recover the database
   279   [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   280     yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   281                               "addon2@tests.mozilla.org",
   282                               "addon3@tests.mozilla.org",
   283                               "addon4@tests.mozilla.org",
   284                               "addon5@tests.mozilla.org",
   285                               "addon6@tests.mozilla.org",
   286                               "addon7@tests.mozilla.org",
   287                               "theme1@tests.mozilla.org",
   288                               "theme2@tests.mozilla.org"]);
   290    // Should be correctly recovered
   291    do_check_neq(a1, null);
   292    do_check_true(a1.isActive);
   293    do_check_false(a1.userDisabled);
   294    do_check_false(a1.appDisabled);
   295    do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   296    do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   298    // Should be correctly recovered
   299    do_check_neq(a2, null);
   300    do_check_false(a2.isActive);
   301    do_check_true(a2.userDisabled);
   302    do_check_false(a2.appDisabled);
   303    do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   304    do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   306    // The compatibility update won't be recovered but it should still be
   307    // active for this session
   308    do_check_neq(a3, null);
   309    do_check_true(a3.isActive);
   310    do_check_false(a3.userDisabled);
   311    do_check_false(a3.appDisabled);
   312    do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   313    do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   315    // The compatibility update won't be recovered and with strict
   316    // compatibility it would not have been able to tell that it was
   317    // previously userDisabled. However, without strict compat, it wasn't
   318    // appDisabled, so it knows it must have been userDisabled.
   319    do_check_neq(a4, null);
   320    do_check_false(a4.isActive);
   321    do_check_true(a4.userDisabled);
   322    do_check_false(a4.appDisabled);
   323    do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   324    do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   326    do_check_neq(a5, null);
   327    do_check_true(a5.isActive);
   328    do_check_false(a5.userDisabled);
   329    do_check_false(a5.appDisabled);
   330    do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   331    do_check_true(isExtensionInAddonsList(profileDir, a5.id));
   333    do_check_neq(a6, null);
   334    do_check_true(a6.isActive);
   335    do_check_false(a6.userDisabled);
   336    do_check_false(a6.appDisabled);
   337    do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   339    do_check_neq(a7, null);
   340    do_check_false(a7.isActive);
   341    do_check_true(a7.userDisabled);
   342    do_check_false(a7.appDisabled);
   343    do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   345    // Should be correctly recovered
   346    do_check_neq(t1, null);
   347    do_check_false(t1.isActive);
   348    do_check_true(t1.userDisabled);
   349    do_check_false(t1.appDisabled);
   350    do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   351    do_check_false(isThemeInAddonsList(profileDir, t1.id));
   353    // Should be correctly recovered
   354    do_check_neq(t2, null);
   355    do_check_true(t2.isActive);
   356    do_check_false(t2.userDisabled);
   357    do_check_false(t2.appDisabled);
   358    do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   359    do_check_true(isThemeInAddonsList(profileDir, t2.id));
   361    // Restarting will actually apply changes to extensions.ini which will
   362    // then be put into the in-memory database when we next fail to load the
   363    // real thing
   364    restartManager();
   366    // Shouldn't have seen any startup changes
   367    check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   369    [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   370      yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   371                                "addon2@tests.mozilla.org",
   372                                "addon3@tests.mozilla.org",
   373                                "addon4@tests.mozilla.org",
   374                                "addon5@tests.mozilla.org",
   375                                "addon6@tests.mozilla.org",
   376                                "addon7@tests.mozilla.org",
   377                                "theme1@tests.mozilla.org",
   378                                "theme2@tests.mozilla.org"]);
   380    do_check_neq(a1, null);
   381    do_check_true(a1.isActive);
   382    do_check_false(a1.userDisabled);
   383    do_check_false(a1.appDisabled);
   384    do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   385    do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   387    do_check_neq(a2, null);
   388    do_check_false(a2.isActive);
   389    do_check_true(a2.userDisabled);
   390    do_check_false(a2.appDisabled);
   391    do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   392    do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   394    do_check_neq(a3, null);
   395    do_check_true(a3.isActive);
   396    do_check_false(a3.userDisabled);
   397    do_check_false(a3.appDisabled);
   398    do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   399    do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   401    do_check_neq(a4, null);
   402    do_check_false(a4.isActive);
   403    do_check_true(a4.userDisabled);
   404    do_check_false(a4.appDisabled);
   405    do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   406    do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   408    do_check_neq(a5, null);
   409    do_check_true(a5.isActive);
   410    do_check_false(a5.userDisabled);
   411    do_check_false(a5.appDisabled);
   412    do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   413    do_check_true(isExtensionInAddonsList(profileDir, a5.id));
   415    do_check_neq(a6, null);
   416    do_check_true(a6.isActive);
   417    do_check_false(a6.userDisabled);
   418    do_check_false(a6.appDisabled);
   419    do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   421    do_check_neq(a7, null);
   422    do_check_false(a7.isActive);
   423    do_check_true(a7.userDisabled);
   424    do_check_false(a7.appDisabled);
   425    do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   427    do_check_neq(t1, null);
   428    do_check_false(t1.isActive);
   429    do_check_true(t1.userDisabled);
   430    do_check_false(t1.appDisabled);
   431    do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   432    do_check_false(isThemeInAddonsList(profileDir, t1.id));
   434    do_check_neq(t2, null);
   435    do_check_true(t2.isActive);
   436    do_check_false(t2.userDisabled);
   437    do_check_false(t2.appDisabled);
   438    do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   439    do_check_true(isThemeInAddonsList(profileDir, t2.id));
   441    // After allowing access to the original DB things should go back to as
   442    // they were previously
   443    shutdownManager();
   444    do_print("Unlocking " + gExtensionsJSON.path);
   445    yield file.close();
   446    gExtensionsJSON.permissions = filePermissions;
   447    startupManager();
   450    // Shouldn't have seen any startup changes
   451    check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   453    [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   454      yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   455                                "addon2@tests.mozilla.org",
   456                                "addon3@tests.mozilla.org",
   457                                "addon4@tests.mozilla.org",
   458                                "addon5@tests.mozilla.org",
   459                                "addon6@tests.mozilla.org",
   460                                "addon7@tests.mozilla.org",
   461                                "theme1@tests.mozilla.org",
   462                                "theme2@tests.mozilla.org"]);
   464    do_check_neq(a1, null);
   465    do_check_true(a1.isActive);
   466    do_check_false(a1.userDisabled);
   467    do_check_false(a1.appDisabled);
   468    do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   469    do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   471    do_check_neq(a2, null);
   472    do_check_false(a2.isActive);
   473    do_check_true(a2.userDisabled);
   474    do_check_false(a2.appDisabled);
   475    do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   476    do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   478    do_check_neq(a3, null);
   479    do_check_true(a3.isActive);
   480    do_check_false(a3.userDisabled);
   481    do_check_false(a3.appDisabled);
   482    do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   483    do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   485    do_check_neq(a4, null);
   486    do_check_false(a4.isActive);
   487    do_check_true(a4.userDisabled);
   488    do_check_false(a4.appDisabled);
   489    do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   490    do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   492    do_check_neq(a5, null);
   493    do_check_true(a5.isActive);
   494    do_check_false(a5.userDisabled);
   495    do_check_false(a5.appDisabled);
   496    do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   497    do_check_true(isExtensionInAddonsList(profileDir, a5.id));
   499    do_check_neq(a6, null);
   500    do_check_true(a6.isActive);
   501    do_check_false(a6.userDisabled);
   502    do_check_false(a6.appDisabled);
   503    do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   505    do_check_neq(a7, null);
   506    do_check_false(a7.isActive);
   507    do_check_true(a7.userDisabled);
   508    do_check_false(a7.appDisabled);
   509    do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   511    do_check_neq(t1, null);
   512    do_check_false(t1.isActive);
   513    do_check_true(t1.userDisabled);
   514    do_check_false(t1.appDisabled);
   515    do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   516    do_check_false(isThemeInAddonsList(profileDir, t1.id));
   518    do_check_neq(t2, null);
   519    do_check_true(t2.isActive);
   520    do_check_false(t2.userDisabled);
   521    do_check_false(t2.appDisabled);
   522    do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   523    do_check_true(isThemeInAddonsList(profileDir, t2.id));
   524 });
   527 function run_test() {
   528  run_next_test();
   529 }

mercurial