Bug 1447903: Part 8a - Update test_filepointer to be less insane. r?aswan draft
authorKris Maglione <maglione.k@gmail.com>
Wed, 21 Mar 2018 19:35:38 -0700
changeset 772373 f90e5db2cea8c5db9e22189eee4e656bb311f87c
parent 772372 64a5e50adf937978c6d4262c703d2853b69f4ed7
child 772374 409352b6bc3b817e683f5be97c120d5d6c75fbc8
push id103897
push usermaglione.k@gmail.com
push dateMon, 26 Mar 2018 01:31:53 +0000
reviewersaswan
bugs1447903
milestone61.0a1
Bug 1447903: Part 8a - Update test_filepointer to be less insane. r?aswan MozReview-Commit-ID: 89PLLvOT0qf
toolkit/mozapps/extensions/test/xpcshell/test_filepointer.js
--- a/toolkit/mozapps/extensions/test/xpcshell/test_filepointer.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_filepointer.js
@@ -40,364 +40,308 @@ var addon2 = {
 
 const profileDir = gProfD.clone();
 profileDir.append("extensions");
 profileDir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
 
 const sourceDir = gProfD.clone();
 sourceDir.append("source");
 
-ChromeUtils.import("resource://testing-common/httpd.js");
-var testserver;
-
-function writePointer(aId, aName) {
-  let file = profileDir.clone();
-  file.append(aName ? aName : aId);
+var testserver = AddonTestUtils.createHttpServer({hosts: ["example.com"]});
+testserver.registerDirectory("/data/", do_get_file("data"));
+testserver.registerDirectory("/addons/", do_get_file("addons"));
+gPort = testserver.identity.primaryPort;
 
-  let target = sourceDir.clone();
-  target.append(do_get_expected_addon_name(aId));
+function promiseWritePointer(aId, aName) {
+  let path = OS.Path.join(profileDir.path, aName || aId);
 
-  var fos = AM_Cc["@mozilla.org/network/file-output-stream;1"].
-            createInstance(AM_Ci.nsIFileOutputStream);
-  fos.init(file,
-           FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE,
-           FileUtils.PERMS_FILE, 0);
-  fos.write(target.path, target.path.length);
-  fos.close();
+  let target = OS.Path.join(sourceDir.path,
+                            do_get_expected_addon_name(aId));
+
+  return OS.File.writeAtomic(path, new TextEncoder().encode(target));
 }
 
-function writeRelativePointer(aId, aName) {
-  let file = profileDir.clone();
-  file.append(aName ? aName : aId);
+function promiseWriteRelativePointer(aId, aName) {
+  let path = OS.Path.join(profileDir.path, aName || aId);
 
   let absTarget = sourceDir.clone();
   absTarget.append(do_get_expected_addon_name(aId));
 
-  var relTarget = absTarget.getRelativeDescriptor(profileDir);
-
-  var fos = AM_Cc["@mozilla.org/network/file-output-stream;1"].
-            createInstance(AM_Ci.nsIFileOutputStream);
-  fos.init(file,
-           FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE,
-           FileUtils.PERMS_FILE, 0);
-  fos.write(relTarget, relTarget.length);
-  fos.close();
-}
+  let relTarget = absTarget.getRelativeDescriptor(profileDir);
 
-function run_test() {
-  // pointer files only work with unpacked directories
-  if (!TEST_UNPACKED)
-    return;
-
-  do_test_pending();
-  createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1");
-
-  // Create and configure the HTTP server.
-  testserver = new HttpServer();
-  testserver.registerDirectory("/data/", do_get_file("data"));
-  testserver.registerDirectory("/addons/", do_get_file("addons"));
-  testserver.start(-1);
-  gPort = testserver.identity.primaryPort;
-
-  run_test_1();
+  return OS.File.writeAtomic(path, new TextEncoder().encode(relTarget));
 }
 
-function end_test() {
-  testserver.stop(do_test_finished);
-}
+add_task(async function setup() {
+  ok(TEST_UNPACKED, "Pointer files only work with unpacked directories");
+
+  createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1");
+});
 
 // Tests that installing a new add-on by pointer works
-function run_test_1() {
-  writeInstallRDFForExtension(addon1, sourceDir);
-  writePointer(addon1.id);
+add_task(async function test_new_pointer_install() {
+  await promiseWriteInstallRDFForExtension(addon1, sourceDir);
+  await promiseWritePointer(addon1.id);
+  await promiseStartupManager();
 
-  startupManager();
-
-  AddonManager.getAddonByID(addon1.id, function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
+  let addon = await AddonManager.getAddonByID(addon1.id);
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    let file = a1.getResourceURI().QueryInterface(AM_Ci.nsIFileURL).file;
-    Assert.equal(file.parent.path, sourceDir.path);
+  let file = addon.getResourceURI().QueryInterface(AM_Ci.nsIFileURL).file;
+  equal(file.parent.path, sourceDir.path);
 
-    let rootUri = do_get_addon_root_uri(sourceDir, addon1.id);
-    let uri = a1.getResourceURI("/");
-    Assert.equal(uri.spec, rootUri);
-    uri = a1.getResourceURI("install.rdf");
-    Assert.equal(uri.spec, rootUri + "install.rdf");
+  let rootUri = do_get_addon_root_uri(sourceDir, addon1.id);
+  let uri = addon.getResourceURI("/");
+  equal(uri.spec, rootUri);
+  uri = addon.getResourceURI("install.rdf");
+  equal(uri.spec, rootUri + "install.rdf");
 
-    // Check that upgrade is disabled for addons installed by file-pointers.
-    Assert.equal(a1.permissions & AddonManager.PERM_CAN_UPGRADE, 0);
-    run_test_2();
-  });
-}
+  // Check that upgrade is disabled for addons installed by file-pointers.
+  equal(addon.permissions & AddonManager.PERM_CAN_UPGRADE, 0);
+});
 
 // Tests that installing the addon from some other source doesn't clobber
 // the original sources
-function run_test_2() {
+add_task(async function test_addon_over_pointer() {
   prepare_test({}, [
     "onNewInstall",
   ]);
 
-  let url = "http://localhost:" + gPort + "/addons/test_filepointer.xpi";
-  AddonManager.getInstallForURL(url, function(install) {
+  let xpi = AddonTestUtils.createTempXPIFile({
+    "install.rdf": {
+      id: "addon1@tests.mozilla.org",
+      version: "2.0",
+      name: "File Pointer Test",
+
+      targetApplications: [{
+          id: "xpcshell@tests.mozilla.org",
+          minVersion: "1",
+          maxVersion: "1"}],
+    },
+  });
+
+  testserver.registerFile("/addons/test_filepointer.xpi", xpi);
+
+  let url = "http://example.com/addons/test_filepointer.xpi";
+  let install = await AddonManager.getInstallForURL(url, undefined, "application/x-xpinstall");
+  await new Promise(resolve => {
     ensure_test_completed();
 
     prepare_test({
       "addon1@tests.mozilla.org": [
         "onInstalling"
       ]
     }, [
       "onDownloadStarted",
       "onDownloadEnded",
       "onInstallStarted",
       "onInstallEnded"
-    ], callback_soon(check_test_2));
+    ], callback_soon(resolve));
 
     install.install();
-  }, "application/x-xpinstall");
-}
+  });
 
-function check_test_2() {
-  restartManager();
+  await promiseRestartManager();
 
-  AddonManager.getAddonByID(addon1.id, function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "2.0");
+  let addon = await AddonManager.getAddonByID(addon1.id);
+  notEqual(addon, null);
+  equal(addon.version, "2.0");
 
-    let file = a1.getResourceURI().QueryInterface(AM_Ci.nsIFileURL).file;
-    Assert.equal(file.parent.path, profileDir.path);
+  let file = addon.getResourceURI().QueryInterface(AM_Ci.nsIFileURL).file;
+  equal(file.parent.path, profileDir.path);
 
-    let rootUri = do_get_addon_root_uri(profileDir, addon1.id);
-    let uri = a1.getResourceURI("/");
-    Assert.equal(uri.spec, rootUri);
-    uri = a1.getResourceURI("install.rdf");
-    Assert.equal(uri.spec, rootUri + "install.rdf");
+  let rootUri = do_get_addon_root_uri(profileDir, addon1.id);
+  let uri = addon.getResourceURI("/");
+  equal(uri.spec, rootUri);
+  uri = addon.getResourceURI("install.rdf");
+  equal(uri.spec, rootUri + "install.rdf");
 
-    let source = sourceDir.clone();
-    source.append(addon1.id);
-    Assert.ok(source.exists());
+  let source = sourceDir.clone();
+  source.append(addon1.id);
+  ok(source.exists());
 
-    a1.uninstall();
-
-    executeSoon(run_test_3);
-  });
-}
+  addon.uninstall();
+});
 
 // Tests that uninstalling doesn't clobber the original sources
-function run_test_3() {
-  restartManager();
-
-  writePointer(addon1.id);
+add_task(async function test_uninstall_pointer() {
+  await promiseRestartManager();
+  await promiseWritePointer(addon1.id);
+  await promiseRestartManager();
 
-  restartManager();
-
-  AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
+  let addon = await AddonManager.getAddonByID("addon1@tests.mozilla.org");
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    a1.uninstall();
+  addon.uninstall();
 
-    restartManager();
+  await promiseRestartManager();
 
-    let source = sourceDir.clone();
-    source.append(addon1.id);
-    Assert.ok(source.exists());
-
-    executeSoon(run_test_4);
-  }));
-}
+  let source = sourceDir.clone();
+  source.append(addon1.id);
+  ok(source.exists());
+});
 
 // Tests that misnaming a pointer doesn't clobber the sources
-function run_test_4() {
-  writePointer("addon2@tests.mozilla.org", addon1.id);
-
-  restartManager();
+add_task(async function test_bad_pointer() {
+  await promiseWritePointer("addon2@tests.mozilla.org", addon1.id);
 
-  AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-                               "addon2@tests.mozilla.org"], function([a1, a2]) {
-    Assert.equal(a1, null);
-    Assert.equal(a2, null);
+  await promiseRestartManager();
+
+  let [a1, a2] = await AddonManager.getAddonsByIDs(
+    ["addon1@tests.mozilla.org", "addon2@tests.mozilla.org"]);
 
-    let source = sourceDir.clone();
-    source.append(addon1.id);
-    Assert.ok(source.exists());
+  equal(a1, null);
+  equal(a2, null);
 
-    let pointer = profileDir.clone();
-    pointer.append("addon2@tests.mozilla.org");
-    Assert.ok(!pointer.exists());
+  let source = sourceDir.clone();
+  source.append(addon1.id);
+  ok(source.exists());
 
-    executeSoon(run_test_5);
-  });
-}
+  let pointer = profileDir.clone();
+  pointer.append("addon2@tests.mozilla.org");
+  ok(!pointer.exists());
+});
 
 // Tests that changing the ID of an existing add-on doesn't clobber the sources
-function run_test_5() {
+add_task(async function test_bad_pointer_id() {
   var dest = writeInstallRDFForExtension(addon1, sourceDir);
   // Make sure the modification time changes enough to be detected.
   setExtensionModifiedTime(dest, dest.lastModifiedTime - 5000);
-  writePointer(addon1.id);
-
-  restartManager();
+  await promiseWritePointer(addon1.id);
+  await promiseRestartManager();
 
-  AddonManager.getAddonByID(addon1.id, callback_soon(function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
+  let addon = await AddonManager.getAddonByID(addon1.id);
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    writeInstallRDFForExtension(addon2, sourceDir, addon1.id);
+  writeInstallRDFForExtension(addon2, sourceDir, addon1.id);
 
-    restartManager();
+  await promiseRestartManager();
 
-    AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-                                 "addon2@tests.mozilla.org"], function([a1_2, a2_2]) {
-      Assert.equal(a1_2, null);
-      Assert.equal(a2_2, null);
+  let [a1, a2] = await AddonManager.getAddonsByIDs(
+    ["addon1@tests.mozilla.org", "addon2@tests.mozilla.org"]);
 
-      let source = sourceDir.clone();
-      source.append(addon1.id);
-      Assert.ok(source.exists());
+  equal(a1, null);
+  equal(a2, null);
 
-      let pointer = profileDir.clone();
-      pointer.append(addon1.id);
-      Assert.ok(!pointer.exists());
+  let source = sourceDir.clone();
+  source.append(addon1.id);
+  ok(source.exists());
 
-      executeSoon(run_test_6);
-    });
-  }));
-}
+  let pointer = profileDir.clone();
+  pointer.append(addon1.id);
+  ok(!pointer.exists());
+});
 
 // Removing the pointer file should uninstall the add-on
-function run_test_6() {
+add_task(async function test_remove_pointer() {
   var dest = writeInstallRDFForExtension(addon1, sourceDir);
   // Make sure the modification time changes enough to be detected in run_test_8.
   setExtensionModifiedTime(dest, dest.lastModifiedTime - 5000);
-  writePointer(addon1.id);
+  await promiseWritePointer(addon1.id);
 
-  restartManager();
+  await promiseRestartManager();
 
-  AddonManager.getAddonByID(addon1.id, callback_soon(function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
+  let addon = await AddonManager.getAddonByID(addon1.id);
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    let pointer = profileDir.clone();
-    pointer.append(addon1.id);
-    pointer.remove(false);
-
-    restartManager();
+  let pointer = profileDir.clone();
+  pointer.append(addon1.id);
+  pointer.remove(false);
 
-    AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1_2) {
-      Assert.equal(a1_2, null);
+  await promiseRestartManager();
 
-      executeSoon(run_test_7);
-    });
-  }));
-}
+  addon = await AddonManager.getAddonByID("addon1@tests.mozilla.org");
+  equal(addon, null);
+});
 
 // Removing the pointer file and replacing it with a directory should work
-function run_test_7() {
-  writePointer(addon1.id);
-
-  restartManager();
+add_task(async function test_replace_pointer() {
+  await promiseWritePointer(addon1.id);
+  await promiseRestartManager();
 
-  AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
-
-    let pointer = profileDir.clone();
-    pointer.append(addon1.id);
-    pointer.remove(false);
+  let addon = await AddonManager.getAddonByID("addon1@tests.mozilla.org");
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    writeInstallRDFForExtension(addon1_2, profileDir);
+  let pointer = profileDir.clone();
+  pointer.append(addon1.id);
+  pointer.remove(false);
 
-    restartManager();
+  writeInstallRDFForExtension(addon1_2, profileDir);
 
-    AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1_2) {
-      Assert.notEqual(a1_2, null);
-      Assert.equal(a1_2.version, "2.0");
+  await promiseRestartManager();
 
-      a1_2.uninstall();
+  addon = await AddonManager.getAddonByID("addon1@tests.mozilla.org");
+  notEqual(addon, null);
+  equal(addon.version, "2.0");
 
-      executeSoon(run_test_8);
-    });
-  }));
-}
+  addon.uninstall();
+});
 
 // Changes to the source files should be detected
-function run_test_8() {
-  restartManager();
-
-  writePointer(addon1.id);
+add_task(async function test_change_pointer_sources() {
+  await promiseRestartManager();
+  await promiseWritePointer(addon1.id);
+  await promiseRestartManager();
 
-  restartManager();
-
-  AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
-
-    writeInstallRDFForExtension(addon1_2, sourceDir);
+  let addon = await AddonManager.getAddonByID("addon1@tests.mozilla.org");
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    restartManager();
+  writeInstallRDFForExtension(addon1_2, sourceDir);
 
-    AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1_2) {
-      Assert.notEqual(a1_2, null);
-      Assert.equal(a1_2.version, "2.0");
+  await promiseRestartManager();
 
-      a1_2.uninstall();
+  addon = await AddonManager.getAddonByID("addon1@tests.mozilla.org");
+  notEqual(addon, null);
+  equal(addon.version, "2.0");
 
-      executeSoon(run_test_9);
-    });
-  }));
-}
+  addon.uninstall();
+});
 
 // Removing the add-on the pointer file points at should uninstall the add-on
-function run_test_9() {
-  restartManager();
-
+add_task(async function test_remove_pointer_target() {
+  await promiseRestartManager();
   var dest = writeInstallRDFForExtension(addon1, sourceDir);
-  writePointer(addon1.id);
+  await promiseWritePointer(addon1.id);
+  await promiseRestartManager();
 
-  restartManager();
-
-  AddonManager.getAddonByID(addon1.id, callback_soon(function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
-
-    dest.remove(true);
+  let addon = await AddonManager.getAddonByID(addon1.id);
+  notEqual(addon, null);
+  equal(addon.version, "1.0");
 
-    restartManager();
+  dest.remove(true);
 
-    AddonManager.getAddonByID(addon1.id, function(a1_2) {
-      Assert.equal(a1_2, null);
+  await promiseRestartManager();
 
-      let pointer = profileDir.clone();
-      pointer.append(addon1.id);
-      Assert.ok(!pointer.exists());
+  addon = await AddonManager.getAddonByID(addon1.id);
+  equal(addon, null);
 
-      executeSoon(run_test_10);
-    });
-  }));
-}
+  let pointer = profileDir.clone();
+  pointer.append(addon1.id);
+  ok(!pointer.exists());
+});
 
 // Tests that installing a new add-on by pointer with a relative path works
-function run_test_10() {
+add_task(async function test_new_relative_pointer() {
   writeInstallRDFForExtension(addon1, sourceDir);
-  writeRelativePointer(addon1.id);
+  await promiseWriteRelativePointer(addon1.id);
+  await promiseRestartManager();
 
-  restartManager();
-
-  AddonManager.getAddonByID(addon1.id, function(a1) {
-    Assert.notEqual(a1, null);
-    Assert.equal(a1.version, "1.0");
+  let addon = await AddonManager.getAddonByID(addon1.id);
+  equal(addon.version, "1.0");
 
-    let file = a1.getResourceURI().QueryInterface(AM_Ci.nsIFileURL).file;
-    Assert.equal(file.parent.path, sourceDir.path);
+  let file = addon.getResourceURI().QueryInterface(AM_Ci.nsIFileURL).file;
+  equal(file.parent.path, sourceDir.path);
 
-    let rootUri = do_get_addon_root_uri(sourceDir, addon1.id);
-    let uri = a1.getResourceURI("/");
-    Assert.equal(uri.spec, rootUri);
-    uri = a1.getResourceURI("install.rdf");
-    Assert.equal(uri.spec, rootUri + "install.rdf");
+  let rootUri = do_get_addon_root_uri(sourceDir, addon1.id);
+  let uri = addon.getResourceURI("/");
+  equal(uri.spec, rootUri);
+  uri = addon.getResourceURI("install.rdf");
+  equal(uri.spec, rootUri + "install.rdf");
 
-    // Check that upgrade is disabled for addons installed by file-pointers.
-    Assert.equal(a1.permissions & AddonManager.PERM_CAN_UPGRADE, 0);
-    end_test();
-  });
-}
+  // Check that upgrade is disabled for addons installed by file-pointers.
+  equal(addon.permissions & AddonManager.PERM_CAN_UPGRADE, 0);
+});