Bug 1345922 - Avoid concurrent update and take the failed beginUpdate into account. draft
authorHenry Chang <hchang@mozilla.com>
Fri, 10 Mar 2017 00:47:26 +0800
changeset 496437 d247283327dd5b563aa5efa0954cb0048d73dc2a
parent 495979 847d96177f5367ad90b31df6d8d5637d5a323e43
child 548607 2f7864a223c9b292505eb9ee7d075cbedc443251
push id48592
push userhchang@mozilla.com
push dateFri, 10 Mar 2017 04:34:59 +0000
bugs1345922
milestone55.0a1
Bug 1345922 - Avoid concurrent update and take the failed beginUpdate into account. MozReview-Commit-ID: IfRIazBvAyl
toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm
--- a/toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm
+++ b/toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm
@@ -6,16 +6,18 @@ const {classes: Cc, interfaces: Ci, util
 
 const TRACKING_TABLE_NAME = "mochitest-track-simple";
 const TRACKING_TABLE_PREF = "urlclassifier.trackingTable";
 const WHITELIST_TABLE_NAME = "mochitest-trackwhite-simple";
 const WHITELIST_TABLE_PREF = "urlclassifier.trackingWhitelistTable";
 
 Cu.import("resource://gre/modules/Services.jsm");
 
+let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+
 this.UrlClassifierTestUtils = {
 
   addTestTrackers() {
     // Add some URLs to the tracking databases
     let trackingURL1 = "tracking.example.com/";
     let trackingURL2 = "itisatracker.org/";
     let trackingURL3 = "trackertest.org/";
     let whitelistedURL = "itisatrap.org/?resource=itisatracker.org";
@@ -41,58 +43,76 @@ this.UrlClassifierTestUtils = {
       },
       {
         pref: WHITELIST_TABLE_PREF,
         name: WHITELIST_TABLE_NAME,
         update: whitelistUpdate
       }
     ];
 
-    return this.useTestDatabase(tables);
+    let tableIndex = 0
+    let doOneUpdate = () => {
+      if (tableIndex == tables.length) {
+        return;
+      }
+      return this.useTestDatabase(tables[tableIndex])
+        .then(() => {
+          tableIndex++;
+          return doOneUpdate();
+        }, aErrMsg => {
+          dump("Rejected: " + aErrMsg + ". Retry later.\n");
+          return new Promise(resolve => {
+            timer.initWithCallback(resolve, 100, Ci.nsITimer.TYPE_ONE_SHOT);
+          })
+          .then(doOneUpdate);
+        });
+    }
+
+    return doOneUpdate();
   },
 
   cleanupTestTrackers() {
     Services.prefs.clearUserPref(TRACKING_TABLE_PREF);
     Services.prefs.clearUserPref(WHITELIST_TABLE_PREF);
   },
 
   /**
    * Add some entries to a test tracking protection database, and resets
    * back to the default database after the test ends.
    *
    * @return {Promise}
    */
-  useTestDatabase(tables) {
-    for (var table of tables) {
-      Services.prefs.setCharPref(table.pref, table.name);
-    }
+  useTestDatabase(table) {
+    Services.prefs.setCharPref(table.pref, table.name);
 
     return new Promise((resolve, reject) => {
       let dbService = Cc["@mozilla.org/url-classifier/dbservice;1"].
                       getService(Ci.nsIUrlClassifierDBService);
       let listener = {
         QueryInterface: iid => {
           if (iid.equals(Ci.nsISupports) ||
               iid.equals(Ci.nsIUrlClassifierUpdateObserver))
             return listener;
 
           throw Cr.NS_ERROR_NO_INTERFACE;
         },
         updateUrlRequested: url => { },
         streamFinished: status => { },
         updateError: errorCode => {
-          reject("Couldn't update classifier.");
+          reject('Got updateError when updating ' + table.name);
         },
         updateSuccess: requestedTimeout => {
           resolve();
         }
       };
 
-      for (var table of tables) {
+      try {
         dbService.beginUpdate(listener, table.name, "");
         dbService.beginStream("", "");
         dbService.updateStream(table.update);
         dbService.finishStream();
         dbService.finishUpdate();
+      } catch (e) {
+        reject('Failed to update with dbService: ' + table.name);
       }
     });
   },
 };