Bug 633062 p6 - Remove event loop spinning from head_helper.js addon-related methods. r?markh draft
authorEdouard Oger <eoger@fastmail.com>
Fri, 08 Dec 2017 16:07:49 -0500
changeset 749591 0ea264c5e47ff45a1e2c1ca30a3122e7c9116011
parent 749590 c3238b5ac6bb2c3e362e712a8718d2ac4114bf28
child 749592 50c4253bac2d31455407d66ca9da65d05b0b3296
push id97449
push userbmo:eoger@fastmail.com
push dateWed, 31 Jan 2018 19:28:47 +0000
reviewersmarkh
bugs633062
milestone60.0a1
Bug 633062 p6 - Remove event loop spinning from head_helper.js addon-related methods. r?markh MozReview-Commit-ID: 4Be253tJlXq
services/sync/tests/unit/head_helpers.js
services/sync/tests/unit/test_addons_engine.js
services/sync/tests/unit/test_addons_reconciler.js
services/sync/tests/unit/test_addons_store.js
services/sync/tests/unit/test_addons_tracker.js
--- a/services/sync/tests/unit/head_helpers.js
+++ b/services/sync/tests/unit/head_helpers.js
@@ -109,89 +109,76 @@ function webExtensionsTestPath(path) {
 function loadWebExtensionTestFunctions() {
   /* import-globals-from ../../../../toolkit/components/extensions/test/xpcshell/head_sync.js */
   const path = webExtensionsTestPath("/head_sync.js");
   let file = do_get_file(path);
   let uri = Services.io.newFileURI(file);
   Services.scriptloader.loadSubScript(uri.spec, gGlobalScope);
 }
 
+// Returns a promise
 function getAddonInstall(name) {
   let f = do_get_file(ExtensionsTestPath("/addons/" + name + ".xpi"));
-  let cb = Async.makeSyncCallback();
-  AddonManager.getInstallForFile(f, cb);
-
-  return Async.waitForSyncCallback(cb);
+  return AddonManager.getInstallForFile(f);
 }
 
 /**
- * Obtains an addon from the add-on manager by id.
- *
- * This is merely a synchronous wrapper.
- *
- * @param  id
- *         ID of add-on to fetch
- * @return addon object on success or undefined or null on failure
- */
-function getAddonFromAddonManagerByID(id) {
-   let cb = Async.makeSyncCallback();
-   AddonManager.getAddonByID(id, cb);
-   return Async.waitForSyncCallback(cb);
-}
-
-/**
- * Installs an add-on synchronously from an addonInstall
+ * Installs an add-on from an addonInstall
  *
  * @param  install addonInstall instance to install
  */
-function installAddonFromInstall(install) {
-  let cb = Async.makeSyncCallback();
-  let listener = {onInstallEnded: cb};
-  AddonManager.addInstallListener(listener);
-  install.install();
-  Async.waitForSyncCallback(cb);
-  AddonManager.removeAddonListener(listener);
+async function installAddonFromInstall(install) {
+  await new Promise(res => {
+    let listener = {
+      onInstallEnded() {
+        AddonManager.removeAddonListener(listener);
+        res();
+      }
+    };
+    AddonManager.addInstallListener(listener);
+    install.install();
+  });
 
   Assert.notEqual(null, install.addon);
   Assert.notEqual(null, install.addon.syncGUID);
 
   return install.addon;
 }
 
 /**
  * Convenience function to install an add-on from the extensions unit tests.
  *
  * @param  name
  *         String name of add-on to install. e.g. test_install1
  * @return addon object that was installed
  */
-function installAddon(name) {
-  let install = getAddonInstall(name);
+async function installAddon(name) {
+  let install = await getAddonInstall(name);
   Assert.notEqual(null, install);
   return installAddonFromInstall(install);
 }
 
 /**
- * Convenience function to uninstall an add-on synchronously.
+ * Convenience function to uninstall an add-on.
  *
  * @param addon
  *        Addon instance to uninstall
  */
 function uninstallAddon(addon) {
-  let cb = Async.makeSyncCallback();
-  let listener = {onUninstalled(uninstalled) {
-    if (uninstalled.id == addon.id) {
-      AddonManager.removeAddonListener(listener);
-      cb(uninstalled);
-    }
-  }};
+  return new Promise(res => {
+    let listener = {onUninstalled(uninstalled) {
+      if (uninstalled.id == addon.id) {
+        AddonManager.removeAddonListener(listener);
+        res(uninstalled);
+      }
+    }};
 
-  AddonManager.addAddonListener(listener);
-  addon.uninstall();
-  Async.waitForSyncCallback(cb);
+    AddonManager.addAddonListener(listener);
+    addon.uninstall();
+  });
 }
 
 async function generateNewKeys(collectionKeys, collections = null) {
   let wbo = await collectionKeys.generateNewKeysWBO(collections);
   let modified = new_timestamp();
   collectionKeys.setContents(wbo.cleartext, modified);
 }
 
--- a/services/sync/tests/unit/test_addons_engine.js
+++ b/services/sync/tests/unit/test_addons_engine.js
@@ -48,49 +48,49 @@ add_task(async function setup() {
   await resetReconciler();
 });
 
 // This is a basic sanity test for the unit test itself. If this breaks, the
 // add-ons API likely changed upstream.
 add_task(async function test_addon_install() {
   _("Ensure basic add-on APIs work as expected.");
 
-  let install = getAddonInstall("test_bootstrap1_1");
+  let install = await getAddonInstall("test_bootstrap1_1");
   Assert.notEqual(install, null);
   Assert.equal(install.type, "extension");
   Assert.equal(install.name, "Test Bootstrap 1");
 
   await resetReconciler();
 });
 
 add_task(async function test_find_dupe() {
   _("Ensure the _findDupe() implementation is sane.");
 
   // This gets invoked at the top of sync, which is bypassed by this
   // test, so we do it manually.
   await engine._refreshReconcilerState();
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
 
   let record = {
     id:            Utils.makeGUID(),
     addonID:       addon.id,
     enabled:       true,
     applicationID: Services.appinfo.ID,
     source:        "amo"
   };
 
   let dupe = await engine._findDupe(record);
   Assert.equal(addon.syncGUID, dupe);
 
   record.id = addon.syncGUID;
   dupe = await engine._findDupe(record);
   Assert.equal(null, dupe);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   await resetReconciler();
 });
 
 add_task(async function test_get_changed_ids() {
   _("Ensure getChangedIDs() has the appropriate behavior.");
 
   _("Ensure getChangedIDs() returns an empty object by default.");
   let changes = await engine.getChangedIDs();
@@ -107,28 +107,28 @@ add_task(async function test_get_changed
   Assert.equal("object", typeof(changes));
   Assert.equal(1, Object.keys(changes).length);
   Assert.ok(guid1 in changes);
   Assert.equal(changeTime, changes[guid1]);
 
   tracker.clearChangedIDs();
 
   _("Ensure reconciler changes are populated.");
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   tracker.clearChangedIDs(); // Just in case.
   changes = await engine.getChangedIDs();
   Assert.equal("object", typeof(changes));
   Assert.equal(1, Object.keys(changes).length);
   Assert.ok(addon.syncGUID in changes);
   _("Change time: " + changeTime + ", addon change: " + changes[addon.syncGUID]);
   Assert.ok(changes[addon.syncGUID] >= changeTime);
 
   let oldTime = changes[addon.syncGUID];
   let guid2 = addon.syncGUID;
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   changes = await engine.getChangedIDs();
   Assert.equal(1, Object.keys(changes).length);
   Assert.ok(guid2 in changes);
   Assert.ok(changes[guid2] > oldTime);
 
   _("Ensure non-syncable add-ons aren't picked up by reconciler changes.");
   reconciler._addons  = {};
   reconciler._changes = [];
--- a/services/sync/tests/unit/test_addons_reconciler.js
+++ b/services/sync/tests/unit/test_addons_reconciler.js
@@ -47,17 +47,17 @@ add_task(async function test_load_state_
 add_task(async function test_install_detection() {
   _("Ensure that add-on installation results in appropriate side-effects.");
 
   let reconciler = new AddonsReconciler();
   await reconciler.ensureStateLoaded();
   reconciler.startListening();
 
   let before = new Date();
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   let after = new Date();
 
   Assert.equal(1, Object.keys(reconciler.addons).length);
   Assert.ok(addon.id in reconciler.addons);
   let record = reconciler.addons[addon.id];
 
   const KEYS = ["id", "guid", "enabled", "installed", "modified", "type",
                 "scope", "foreignInstall"];
@@ -75,34 +75,34 @@ add_task(async function test_install_det
   Assert.ok(!record.foreignInstall);
 
   Assert.equal(1, reconciler._changes.length);
   let change = reconciler._changes[0];
   Assert.ok(change[0] >= before && change[1] <= after);
   Assert.equal(CHANGE_INSTALLED, change[1]);
   Assert.equal(addon.id, change[2]);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 });
 
 add_task(async function test_uninstall_detection() {
   _("Ensure that add-on uninstallation results in appropriate side-effects.");
 
   let reconciler = new AddonsReconciler();
   await reconciler.ensureStateLoaded();
   reconciler.startListening();
 
   reconciler._addons = {};
   reconciler._changes = [];
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   let id = addon.id;
 
   reconciler._changes = [];
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 
   Assert.equal(1, Object.keys(reconciler.addons).length);
   Assert.ok(id in reconciler.addons);
 
   let record = reconciler.addons[id];
   Assert.ok(!record.installed);
 
   Assert.equal(1, reconciler._changes.length);
--- a/services/sync/tests/unit/test_addons_store.js
+++ b/services/sync/tests/unit/test_addons_store.js
@@ -114,156 +114,156 @@ add_task(async function setup() {
   // Don't flush to disk in the middle of an event listener!
   // This causes test hangs on WinXP.
   reconciler._shouldPersist = false;
 });
 
 add_task(async function test_remove() {
   _("Ensure removing add-ons from deleted records works.");
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   let record = createRecordForThisApp(addon.syncGUID, addon.id, true, true);
 
   let failed = await store.applyIncomingBatch([record]);
   Assert.equal(0, failed.length);
 
-  let newAddon = getAddonFromAddonManagerByID(addon.id);
+  let newAddon = await AddonManager.getAddonByID(addon.id);
   Assert.equal(null, newAddon);
 });
 
 add_task(async function test_apply_enabled() {
   _("Ensures that changes to the userEnabled flag apply.");
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   Assert.ok(addon.isActive);
   Assert.ok(!addon.userDisabled);
 
   _("Ensure application of a disable record works as expected.");
   let records = [];
   records.push(createRecordForThisApp(addon.syncGUID, addon.id, false, false));
   let failed = await store.applyIncomingBatch(records);
   Assert.equal(0, failed.length);
-  addon = getAddonFromAddonManagerByID(addon.id);
+  addon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(addon.userDisabled);
   checkReconcilerUpToDate(addon);
   records = [];
 
   _("Ensure enable record works as expected.");
   records.push(createRecordForThisApp(addon.syncGUID, addon.id, true, false));
   failed = await store.applyIncomingBatch(records);
   Assert.equal(0, failed.length);
-  addon = getAddonFromAddonManagerByID(addon.id);
+  addon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(!addon.userDisabled);
   checkReconcilerUpToDate(addon);
   records = [];
 
   _("Ensure enabled state updates don't apply if the ignore pref is set.");
   records.push(createRecordForThisApp(addon.syncGUID, addon.id, false, false));
   Svc.Prefs.set("addons.ignoreUserEnabledChanges", true);
   failed = await store.applyIncomingBatch(records);
   Assert.equal(0, failed.length);
-  addon = getAddonFromAddonManagerByID(addon.id);
+  addon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(!addon.userDisabled);
   records = [];
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   Svc.Prefs.reset("addons.ignoreUserEnabledChanges");
 });
 
 add_task(async function test_apply_enabled_appDisabled() {
   _("Ensures that changes to the userEnabled flag apply when the addon is appDisabled.");
 
-  let addon = installAddon("test_install3"); // this addon is appDisabled by default.
+  let addon = await installAddon("test_install3"); // this addon is appDisabled by default.
   Assert.ok(addon.appDisabled);
   Assert.ok(!addon.isActive);
   Assert.ok(!addon.userDisabled);
 
   _("Ensure application of a disable record works as expected.");
   store.reconciler.pruneChangesBeforeDate(Date.now() + 10);
   store.reconciler._changes = [];
   let records = [];
   records.push(createRecordForThisApp(addon.syncGUID, addon.id, false, false));
   let failed = await store.applyIncomingBatch(records);
   Assert.equal(0, failed.length);
-  addon = getAddonFromAddonManagerByID(addon.id);
+  addon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(addon.userDisabled);
   checkReconcilerUpToDate(addon);
   records = [];
 
   _("Ensure enable record works as expected.");
   records.push(createRecordForThisApp(addon.syncGUID, addon.id, true, false));
   failed = await store.applyIncomingBatch(records);
   Assert.equal(0, failed.length);
-  addon = getAddonFromAddonManagerByID(addon.id);
+  addon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(!addon.userDisabled);
   checkReconcilerUpToDate(addon);
   records = [];
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 });
 
 add_task(async function test_ignore_different_appid() {
   _("Ensure that incoming records with a different application ID are ignored.");
 
   // We test by creating a record that should result in an update.
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   Assert.ok(!addon.userDisabled);
 
   let record = createRecordForThisApp(addon.syncGUID, addon.id, false, false);
   record.applicationID = "FAKE_ID";
 
   let failed = await store.applyIncomingBatch([record]);
   Assert.equal(0, failed.length);
 
-  let newAddon = getAddonFromAddonManagerByID(addon.id);
+  let newAddon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(!newAddon.userDisabled);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 });
 
 add_task(async function test_ignore_unknown_source() {
   _("Ensure incoming records with unknown source are ignored.");
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
 
   let record = createRecordForThisApp(addon.syncGUID, addon.id, false, false);
   record.source = "DUMMY_SOURCE";
 
   let failed = await store.applyIncomingBatch([record]);
   Assert.equal(0, failed.length);
 
-  let newAddon = getAddonFromAddonManagerByID(addon.id);
+  let newAddon = await AddonManager.getAddonByID(addon.id);
   Assert.ok(!newAddon.userDisabled);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 });
 
 add_task(async function test_apply_uninstall() {
   _("Ensures that uninstalling an add-on from a record works.");
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
 
   let records = [];
   records.push(createRecordForThisApp(addon.syncGUID, addon.id, true, true));
   let failed = await store.applyIncomingBatch(records);
   Assert.equal(0, failed.length);
 
-  addon = getAddonFromAddonManagerByID(addon.id);
+  addon = await AddonManager.getAddonByID(addon.id);
   Assert.equal(null, addon);
 });
 
 add_task(async function test_addon_syncability() {
   _("Ensure isAddonSyncable functions properly.");
 
   Svc.Prefs.set("addons.trustedSourceHostnames",
                 "addons.mozilla.org,other.example.com");
 
   Assert.ok(!(await store.isAddonSyncable(null)));
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   Assert.ok((await store.isAddonSyncable(addon)));
 
   let dummy = {};
   const KEYS = ["id", "syncGUID", "type", "scope", "foreignInstall", "isSyncable"];
   for (let k of KEYS) {
     dummy[k] = addon[k];
   }
 
@@ -280,17 +280,17 @@ add_task(async function test_addon_synca
   dummy.isSyncable = false;
   Assert.ok(!(await store.isAddonSyncable(dummy)));
   dummy.isSyncable = addon.isSyncable;
 
   dummy.foreignInstall = true;
   Assert.ok(!(await store.isAddonSyncable(dummy)));
   dummy.foreignInstall = false;
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 
   Assert.ok(!store.isSourceURITrusted(null));
 
   let trusted = [
     "https://addons.mozilla.org/foo",
     "https://other.example.com/foo"
   ];
 
@@ -323,77 +323,77 @@ add_task(async function test_get_all_ids
   _("Ensures that getAllIDs() returns an appropriate set.");
 
   _("Installing two addons.");
   // XXX - this test seems broken - at this point, before we've installed the
   // addons below, store.getAllIDs() returns all addons installed by previous
   // tests, even though those tests uninstalled the addon.
   // So if any tests above ever add a new addon ID, they are going to need to
   // be added here too.
-  // do_check_eq(0, Object.keys(store.getAllIDs()).length);
-  let addon1 = installAddon("test_install1");
-  let addon2 = installAddon("test_bootstrap1_1");
-  let addon3 = installAddon("test_install3");
+  // Assert.equal(0, Object.keys(store.getAllIDs()).length);
+  let addon1 = await installAddon("test_install1");
+  let addon2 = await installAddon("test_bootstrap1_1");
+  let addon3 = await installAddon("test_install3");
 
   _("Ensure they're syncable.");
   Assert.ok((await store.isAddonSyncable(addon1)));
   Assert.ok((await store.isAddonSyncable(addon2)));
   Assert.ok((await store.isAddonSyncable(addon3)));
 
   let ids = await store.getAllIDs();
 
   Assert.equal("object", typeof(ids));
   Assert.equal(3, Object.keys(ids).length);
   Assert.ok(addon1.syncGUID in ids);
   Assert.ok(addon2.syncGUID in ids);
   Assert.ok(addon3.syncGUID in ids);
 
   addon1.install.cancel();
-  uninstallAddon(addon2);
-  uninstallAddon(addon3);
+  await uninstallAddon(addon2);
+  await uninstallAddon(addon3);
 });
 
 add_task(async function test_change_item_id() {
   _("Ensures that changeItemID() works properly.");
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
 
   let oldID = addon.syncGUID;
   let newID = Utils.makeGUID();
 
   await store.changeItemID(oldID, newID);
 
-  let newAddon = getAddonFromAddonManagerByID(addon.id);
+  let newAddon = await AddonManager.getAddonByID(addon.id);
   Assert.notEqual(null, newAddon);
   Assert.equal(newID, newAddon.syncGUID);
 
-  uninstallAddon(newAddon);
+  await uninstallAddon(newAddon);
 });
 
 add_task(async function test_create() {
   _("Ensure creating/installing an add-on from a record works.");
 
   let server = createAndStartHTTPServer(HTTP_PORT);
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   let id = addon.id;
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
 
   let guid = Utils.makeGUID();
   let record = createRecordForThisApp(guid, id, true, false);
 
   let failed = await store.applyIncomingBatch([record]);
   Assert.equal(0, failed.length);
 
-  let newAddon = getAddonFromAddonManagerByID(id);
+  let newAddon = await AddonManager.getAddonByID(id);
   Assert.notEqual(null, newAddon);
   Assert.equal(guid, newAddon.syncGUID);
   Assert.ok(!newAddon.userDisabled);
 
-  uninstallAddon(newAddon);
+  await uninstallAddon(newAddon);
 
   await promiseStopServer(server);
 });
 
 add_task(async function test_create_missing_search() {
   _("Ensures that failed add-on searches are handled gracefully.");
 
   let server = createAndStartHTTPServer(HTTP_PORT);
@@ -402,17 +402,17 @@ add_task(async function test_create_miss
   const id = "missing@tests.mozilla.org";
   let guid = Utils.makeGUID();
   let record = createRecordForThisApp(guid, id, true, false);
 
   let failed = await store.applyIncomingBatch([record]);
   Assert.equal(1, failed.length);
   Assert.equal(guid, failed[0]);
 
-  let addon = getAddonFromAddonManagerByID(id);
+  let addon = await AddonManager.getAddonByID(id);
   Assert.equal(null, addon);
 
   await promiseStopServer(server);
 });
 
 add_task(async function test_create_bad_install() {
   _("Ensures that add-ons without a valid install are handled gracefully.");
 
@@ -430,19 +430,19 @@ add_task(async function test_create_bad_
   // was not being installed due to requireSecureURL checking *before* we'd
   // attempted to get the XPI.
   // With requireSecureURL disabled we do see a download failure, but the addon
   // *does* get added to |failed|.
   // FTR: onDownloadFailed() is called with ERROR_NETWORK_FAILURE, so it's going
   // to be tricky to distinguish a 404 from other transient network errors
   // where we do want the addon to end up in |failed|.
   // This is being tracked in bug 1284778.
-  // do_check_eq(0, failed.length);
+  // Assert.equal(0, failed.length);
 
-  let addon = getAddonFromAddonManagerByID(id);
+  let addon = await AddonManager.getAddonByID(id);
   Assert.equal(null, addon);
 
   await promiseStopServer(server);
 });
 
 add_task(async function test_ignore_system() {
   _("Ensure we ignore system addons");
   // Our system addon should not appear in getAllIDs
@@ -459,70 +459,69 @@ add_task(async function test_ignore_syst
 
 add_task(async function test_incoming_system() {
   _("Ensure we handle incoming records that refer to a system addon");
   // eg, loop initially had a normal addon but it was then "promoted" to be a
   // system addon but wanted to keep the same ID. The server record exists due
   // to this.
 
   // before we start, ensure the system addon isn't disabled.
-  Assert.ok(!getAddonFromAddonManagerByID(SYSTEM_ADDON_ID).userDisabled);
+  Assert.ok(!(await AddonManager.getAddonByID(SYSTEM_ADDON_ID).userDisabled));
 
   // Now simulate an incoming record with the same ID as the system addon,
   // but flagged as disabled - it should not be applied.
   let server = createAndStartHTTPServer(HTTP_PORT);
   // We make the incoming record flag the system addon as disabled - it should
   // be ignored.
   let guid = Utils.makeGUID();
   let record = createRecordForThisApp(guid, SYSTEM_ADDON_ID, false, false);
 
   let failed = await store.applyIncomingBatch([record]);
   Assert.equal(0, failed.length);
 
   // The system addon should still not be userDisabled.
-  Assert.ok(!getAddonFromAddonManagerByID(SYSTEM_ADDON_ID).userDisabled);
+  Assert.ok(!(await AddonManager.getAddonByID(SYSTEM_ADDON_ID).userDisabled));
 
   await promiseStopServer(server);
 });
 
 add_task(async function test_wipe() {
   _("Ensures that wiping causes add-ons to be uninstalled.");
 
-  let addon1 = installAddon("test_bootstrap1_1");
+  let addon1 = await installAddon("test_bootstrap1_1");
 
   await store.wipe();
 
-  let addon = getAddonFromAddonManagerByID(addon1.id);
+  let addon = await AddonManager.getAddonByID(addon1.id);
   Assert.equal(null, addon);
 });
 
 add_task(async function test_wipe_and_install() {
   _("Ensure wipe followed by install works.");
 
   // This tests the reset sync flow where remote data is replaced by local. The
   // receiving client will see a wipe followed by a record which should undo
   // the wipe.
-  let installed = installAddon("test_bootstrap1_1");
+  let installed = await installAddon("test_bootstrap1_1");
 
   let record = createRecordForThisApp(installed.syncGUID, installed.id, true,
                                       false);
 
   await store.wipe();
 
-  let deleted = getAddonFromAddonManagerByID(installed.id);
+  let deleted = await AddonManager.getAddonByID(installed.id);
   Assert.equal(null, deleted);
 
   // Re-applying the record can require re-fetching the XPI.
   let server = createAndStartHTTPServer(HTTP_PORT);
 
   await store.applyIncoming(record);
 
-  let fetched = getAddonFromAddonManagerByID(record.addonID);
+  let fetched = await AddonManager.getAddonByID(record.addonID);
   Assert.ok(!!fetched);
 
   await promiseStopServer(server);
 });
 
-add_test(function cleanup() {
+add_task(async function cleanup() {
   // There's an xpcom-shutdown hook for this, but let's give this a shot.
   reconciler.stopListening();
-  run_next_test();
 });
--- a/services/sync/tests/unit/test_addons_tracker.js
+++ b/services/sync/tests/unit/test_addons_tracker.js
@@ -52,70 +52,70 @@ add_task(async function test_empty() {
   Assert.equal(0, tracker.score);
 
   await cleanup();
 });
 
 add_task(async function test_not_tracking() {
   _("Ensures the tracker doesn't do anything when it isn't tracking.");
 
-  let addon = installAddon("test_bootstrap1_1");
-  uninstallAddon(addon);
+  let addon = await installAddon("test_bootstrap1_1");
+  await uninstallAddon(addon);
 
   Assert.equal(0, Object.keys(tracker.changedIDs).length);
   Assert.equal(0, tracker.score);
 
   await cleanup();
 });
 
 add_task(async function test_track_install() {
   _("Ensure that installing an add-on notifies tracker.");
 
   reconciler.startListening();
 
   Svc.Obs.notify("weave:engine:start-tracking");
 
   Assert.equal(0, tracker.score);
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   let changed = tracker.changedIDs;
 
   Assert.equal(1, Object.keys(changed).length);
   Assert.ok(addon.syncGUID in changed);
   Assert.equal(SCORE_INCREMENT_XLARGE, tracker.score);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   await cleanup();
 });
 
 add_task(async function test_track_uninstall() {
   _("Ensure that uninstalling an add-on notifies tracker.");
 
   reconciler.startListening();
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   let guid = addon.syncGUID;
   Assert.equal(0, tracker.score);
 
   Svc.Obs.notify("weave:engine:start-tracking");
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   let changed = tracker.changedIDs;
   Assert.equal(1, Object.keys(changed).length);
   Assert.ok(guid in changed);
   Assert.equal(SCORE_INCREMENT_XLARGE, tracker.score);
 
   await cleanup();
 });
 
 add_task(async function test_track_user_disable() {
   _("Ensure that tracker sees disabling of add-on");
 
   reconciler.startListening();
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   Assert.ok(!addon.userDisabled);
   Assert.ok(!addon.appDisabled);
   Assert.ok(addon.isActive);
 
   Svc.Obs.notify("weave:engine:start-tracking");
   Assert.equal(0, tracker.score);
 
   let disabledPromise = new Promise(res => {
@@ -139,35 +139,35 @@ add_task(async function test_track_user_
   _("Disabling started...");
   await disabledPromise;
 
   let changed = tracker.changedIDs;
   Assert.equal(1, Object.keys(changed).length);
   Assert.ok(addon.syncGUID in changed);
   Assert.equal(SCORE_INCREMENT_XLARGE, tracker.score);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   await cleanup();
 });
 
 add_task(async function test_track_enable() {
   _("Ensure that enabling a disabled add-on notifies tracker.");
 
   reconciler.startListening();
 
-  let addon = installAddon("test_bootstrap1_1");
+  let addon = await installAddon("test_bootstrap1_1");
   addon.userDisabled = true;
   await Async.promiseYield();
 
   Assert.equal(0, tracker.score);
 
   Svc.Obs.notify("weave:engine:start-tracking");
   addon.userDisabled = false;
   await Async.promiseYield();
 
   let changed = tracker.changedIDs;
   Assert.equal(1, Object.keys(changed).length);
   Assert.ok(addon.syncGUID in changed);
   Assert.equal(SCORE_INCREMENT_XLARGE, tracker.score);
 
-  uninstallAddon(addon);
+  await uninstallAddon(addon);
   await cleanup();
 });