/* 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/. */ /* General Complete MAR File Background Patch Apply Test */ const TEST_ID = "0113"; // All we care about is that the last modified time has changed so that Mac OS // X Launch Services invalidates its cache so the test allows up to one minute // difference in the last modified time. const MAX_TIME_DIFFERENCE = 60000; // The files are listed in the same order as they are applied from the mar's // update.manifest. Complete updates have remove file and rmdir directory // operations located in the precomplete file performed first. var TEST_FILES = [ { description : "Should never change", fileName : "channel-prefs.js", relPathDir : "a/b/defaults/pref/", originalContents : "ShouldNotBeReplaced\n", compareContents : "ShouldNotBeReplaced\n", originalFile : null, compareFile : null, originalPerms : 0767, comparePerms : 0767 }, { description : "Added by update.manifest (add)", fileName : "precomplete", relPathDir : "", originalContents : null, compareContents : null, originalFile : "data/partial_precomplete", compareFile : "data/complete_precomplete", originalPerms : 0666, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "searchpluginstext0", relPathDir : "a/b/searchplugins/", originalContents : "ToBeReplacedWithFromComplete\n", compareContents : "FromComplete\n", originalFile : null, compareFile : null, originalPerms : 0775, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "searchpluginspng1.png", relPathDir : "a/b/searchplugins/", originalContents : null, compareContents : null, originalFile : null, compareFile : "data/complete.png", originalPerms : null, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "searchpluginspng0.png", relPathDir : "a/b/searchplugins/", originalContents : null, compareContents : null, originalFile : "data/partial.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "removed-files", relPathDir : "a/b/", originalContents : null, compareContents : null, originalFile : "data/partial_removed-files", compareFile : "data/complete_removed-files", originalPerms : 0666, comparePerms : 0644 }, { description : "Added by update.manifest if the parent directory " + "exists (add-if)", fileName : "extensions1text0", relPathDir : "a/b/extensions/extensions1/", originalContents : null, compareContents : "FromComplete\n", originalFile : null, compareFile : null, originalPerms : null, comparePerms : 0644 }, { description : "Added by update.manifest if the parent directory " + "exists (add-if)", fileName : "extensions1png1.png", relPathDir : "a/b/extensions/extensions1/", originalContents : null, compareContents : null, originalFile : "data/partial.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0644 }, { description : "Added by update.manifest if the parent directory " + "exists (add-if)", fileName : "extensions1png0.png", relPathDir : "a/b/extensions/extensions1/", originalContents : null, compareContents : null, originalFile : null, compareFile : "data/complete.png", originalPerms : null, comparePerms : 0644 }, { description : "Added by update.manifest if the parent directory " + "exists (add-if)", fileName : "extensions0text0", relPathDir : "a/b/extensions/extensions0/", originalContents : "ToBeReplacedWithFromComplete\n", compareContents : "FromComplete\n", originalFile : null, compareFile : null, originalPerms : null, comparePerms : 0644 }, { description : "Added by update.manifest if the parent directory " + "exists (add-if)", fileName : "extensions0png1.png", relPathDir : "a/b/extensions/extensions0/", originalContents : null, compareContents : null, originalFile : null, compareFile : "data/complete.png", originalPerms : null, comparePerms : 0644 }, { description : "Added by update.manifest if the parent directory " + "exists (add-if)", fileName : "extensions0png0.png", relPathDir : "a/b/extensions/extensions0/", originalContents : null, compareContents : null, originalFile : null, compareFile : "data/complete.png", originalPerms : null, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "exe0.exe", relPathDir : "a/b/", originalContents : null, compareContents : null, originalFile : "data/partial.png", compareFile : "data/complete.png", originalPerms : 0777, comparePerms : 0755 }, { description : "Added by update.manifest (add)", fileName : "10text0", relPathDir : "a/b/1/10/", originalContents : "ToBeReplacedWithFromComplete\n", compareContents : "FromComplete\n", originalFile : null, compareFile : null, originalPerms : 0767, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "0exe0.exe", relPathDir : "a/b/0/", originalContents : null, compareContents : null, originalFile : "data/partial.png", compareFile : "data/complete.png", originalPerms : 0777, comparePerms : 0755 }, { description : "Added by update.manifest (add)", fileName : "00text1", relPathDir : "a/b/0/00/", originalContents : "ToBeReplacedWithFromComplete\n", compareContents : "FromComplete\n", originalFile : null, compareFile : null, originalPerms : 0677, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "00text0", relPathDir : "a/b/0/00/", originalContents : "ToBeReplacedWithFromComplete\n", compareContents : "FromComplete\n", originalFile : null, compareFile : null, originalPerms : 0775, comparePerms : 0644 }, { description : "Added by update.manifest (add)", fileName : "00png0.png", relPathDir : "a/b/0/00/", originalContents : null, compareContents : null, originalFile : null, compareFile : "data/complete.png", originalPerms : 0776, comparePerms : 0644 }, { description : "Removed by precomplete (remove)", fileName : "20text0", relPathDir : "a/b/2/20/", originalContents : "ToBeDeleted\n", compareContents : null, originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }, { description : "Removed by precomplete (remove)", fileName : "20png0.png", relPathDir : "a/b/2/20/", originalContents : "ToBeDeleted\n", compareContents : null, originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }]; ADDITIONAL_TEST_DIRS = [ { description : "Removed by precomplete (rmdir)", relPathDir : "a/b/2/20/", dirRemoved : true }, { description : "Removed by precomplete (rmdir)", relPathDir : "a/b/2/", dirRemoved : true }]; function runHelperProcess(args) { let helperBin = do_get_file(HELPER_BIN_FILE); let process = AUS_Cc["@mozilla.org/process/util;1"]. createInstance(AUS_Ci.nsIProcess); process.init(helperBin); logTestInfo("Running " + helperBin.path + " " + args.join(" ")); process.run(true, args, args.length); do_check_eq(process.exitValue, 0); } function createSymlink() { let args = ["setup-symlink", "moz-foo", "moz-bar", "target", getApplyDirFile().path + "/a/b/link"]; runHelperProcess(args); args = ["setup-symlink", "moz-foo2", "moz-bar2", "target2", getApplyDirFile().path + "/a/b/link2", "change-perm"]; runHelperProcess(args); } function removeSymlink() { let args = ["remove-symlink", "moz-foo", "moz-bar", "target", getApplyDirFile().path + "/a/b/link"]; runHelperProcess(args); args = ["remove-symlink", "moz-foo2", "moz-bar2", "target2", getApplyDirFile().path + "/a/b/link2"]; runHelperProcess(args); } function checkSymlink() { let args = ["check-symlink", getApplyDirFile().path + "/a/b/link"]; runHelperProcess(args); } function run_test() { do_test_pending(); do_register_cleanup(cleanupUpdaterTest); gBackgroundUpdate = true; setupUpdaterTest(MAR_COMPLETE_FILE); let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX); let applyToDir = getApplyDirFile(); // For Mac OS X set the last modified time for the root directory to a date in // the past to test that the last modified time is updated on a successful // update (bug 600098). if (IS_MACOSX) { let now = Date.now(); let yesterday = now - (1000 * 60 * 60 * 24); applyToDir.lastModifiedTime = yesterday; } if (IS_UNIX) { removeSymlink(); createSymlink(); do_register_cleanup(removeSymlink); TEST_FILES.push({ description : "Readable symlink", fileName : "link", relPathDir : "a/b/", originalContents : "test", compareContents : "test", originalFile : null, compareFile : null, originalPerms : 0664, comparePerms : 0664 }); } // apply the complete mar let exitValue = runUpdate(); logTestInfo("testing updater binary process exitValue for success when " + "applying a complete mar"); let updateLog = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX, true); updateLog.append(FILE_UPDATE_LOG); let updateLogContents = readFileBytes(updateLog); logTestInfo(updateLogContents); do_check_eq(exitValue, 0); logTestInfo("testing update.status should be " + STATE_APPLIED); let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX); do_check_eq(readStatusFile(updatesDir), STATE_APPLIED); // For Mac OS X check that the last modified time for a directory has been // updated after a successful update (bug 600098). if (IS_MACOSX) { logTestInfo("testing last modified time on the apply to directory has " + "changed after a successful update (bug 600098)"); let now = Date.now(); let timeDiff = Math.abs(applyToDir.lastModifiedTime - now); do_check_true(timeDiff < MAX_TIME_DIFFERENCE); } checkFilesAfterUpdateSuccess(); // Sorting on Linux is different so skip this check for now. if (!IS_UNIX) { checkUpdateLogContents(LOG_COMPLETE_SUCCESS); } // This shouldn't exist anyways in background updates, but let's make sure logTestInfo("testing tobedeleted directory doesn't exist"); let toBeDeletedDir = getApplyDirFile("tobedeleted", true); do_check_false(toBeDeletedDir.exists()); toBeDeletedDir = getTargetDirFile("tobedeleted", true); do_check_false(toBeDeletedDir.exists()); // Now switch the application and its updated version gBackgroundUpdate = false; gSwitchApp = true; exitValue = runUpdate(); logTestInfo("testing updater binary process exitValue for success when " + "switching to the updated application"); do_check_eq(exitValue, 0); logTestInfo("testing update.status should be " + STATE_SUCCEEDED); do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED); // For Mac OS X check that the last modified time for a directory has been // updated after a successful update (bug 600098). if (IS_MACOSX) { logTestInfo("testing last modified time on the apply to directory has " + "changed after a successful update (bug 600098)"); let now = Date.now(); let timeDiff = Math.abs(applyToDir.lastModifiedTime - now); do_check_true(timeDiff < MAX_TIME_DIFFERENCE); } checkFilesAfterUpdateSuccess(); if (IS_UNIX) { checkSymlink(); } else { // Sorting on Linux is different so skip this check for now. checkUpdateLogContents(LOG_COMPLETE_SWITCH_SUCCESS); } // This shouldn't exist anyways in background updates, but let's make sure logTestInfo("testing tobedeleted directory doesn't exist"); toBeDeletedDir = getApplyDirFile("tobedeleted", true); do_check_false(toBeDeletedDir.exists()); // Make sure that the intermediate directory has been removed let updatedDir = applyToDir.clone(); updatedDir.append(UPDATED_DIR_SUFFIX.replace("/", "")); do_check_false(updatedDir.exists()); checkCallbackAppLog(); }