summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/update/tests/unit_aus_update/backgroundUpdateTaskInternalUpdater.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/update/tests/unit_aus_update/backgroundUpdateTaskInternalUpdater.js')
-rw-r--r--toolkit/mozapps/update/tests/unit_aus_update/backgroundUpdateTaskInternalUpdater.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/toolkit/mozapps/update/tests/unit_aus_update/backgroundUpdateTaskInternalUpdater.js b/toolkit/mozapps/update/tests/unit_aus_update/backgroundUpdateTaskInternalUpdater.js
new file mode 100644
index 0000000000..329b8edbea
--- /dev/null
+++ b/toolkit/mozapps/update/tests/unit_aus_update/backgroundUpdateTaskInternalUpdater.js
@@ -0,0 +1,85 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+"use strict";
+
+/**
+ * This test ensures that we don't resume an update download with the internal
+ * downloader when we are running background updates. Normally, the background
+ * update task won't even run if we can't use BITS. But it is possible for us to
+ * fall back from BITS to the internal downloader. Background update should
+ * prevent this fallback and just abort.
+ *
+ * But interactive Firefox allows that fallback. And once the internal
+ * download has started, the background update task must leave that download
+ * untouched and allow it to finish.
+ */
+
+var TEST_MAR_CONTENTS = "Arbitrary MAR contents";
+
+add_task(async function setup() {
+ setupTestCommon();
+ start_httpserver();
+ setUpdateURL(gURLData + gHTTPHandlerPath);
+ setUpdateChannel("test_channel");
+
+ // Pretend that this is a background task.
+ const bts = Cc["@mozilla.org/backgroundtasks;1"].getService(
+ Ci.nsIBackgroundTasks
+ );
+ bts.overrideBackgroundTaskNameForTesting("test-task");
+
+ // No need for cleanup needed for changing update files. These will be cleaned
+ // up by removeUpdateFiles.
+ const downloadingMarFile = getUpdateDirFile(FILE_UPDATE_MAR, DIR_DOWNLOADING);
+ await IOUtils.writeUTF8(downloadingMarFile.path, TEST_MAR_CONTENTS);
+
+ writeStatusFile(STATE_DOWNLOADING);
+
+ let patchProps = {
+ state: STATE_DOWNLOADING,
+ bitsResult: Cr.NS_ERROR_FAILURE,
+ };
+ let patches = getLocalPatchString(patchProps);
+ let updateProps = { appVersion: "1.0" };
+ let updates = getLocalUpdateString(updateProps, patches);
+ writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
+});
+
+add_task(async function backgroundUpdate() {
+ let patches = getRemotePatchString({});
+ let updateString = getRemoteUpdateString({}, patches);
+ gResponseBody = getRemoteUpdatesXMLString(updateString);
+
+ let { updates } = await waitForUpdateCheck(true);
+ let bestUpdate = gAUS.selectUpdate(updates);
+ let success = await gAUS.downloadUpdate(bestUpdate, false);
+ Assert.equal(
+ success,
+ false,
+ "We should not attempt to download an update in the background when an " +
+ "internal update download is already in progress."
+ );
+ Assert.equal(
+ readStatusFile(),
+ STATE_DOWNLOADING,
+ "Background update during an internally downloading update should not " +
+ "change update status"
+ );
+ const downloadingMarFile = getUpdateDirFile(FILE_UPDATE_MAR, DIR_DOWNLOADING);
+ Assert.ok(
+ await IOUtils.exists(downloadingMarFile.path),
+ "Downloading MAR should still exist"
+ );
+ Assert.equal(
+ await IOUtils.readUTF8(downloadingMarFile.path),
+ TEST_MAR_CONTENTS,
+ "Downloading MAR should not have been modified"
+ );
+});
+
+add_task(async function finish() {
+ stop_httpserver(doTestFinish);
+});