/* 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 Partial MAR File Patch Apply Failure Test */ const TEST_ID = "0112"; // 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. const 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 : null }, { description : "Not added for failed update (add)", fileName : "precomplete", relPathDir : "", originalContents : null, compareContents : null, originalFile : "data/complete_precomplete", compareFile : "data/complete_precomplete", originalPerms : 0666, comparePerms : 0666 }, { description : "Not added for failed update (add)", fileName : "searchpluginstext0", relPathDir : "a/b/searchplugins/", originalContents : "ShouldNotBeReplaced\n", compareContents : "ShouldNotBeReplaced\n", originalFile : null, compareFile : null, originalPerms : 0775, comparePerms : 0775 }, { description : "Not patched for failed update (patch-if)", fileName : "searchpluginspng1.png", relPathDir : "a/b/searchplugins/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0666 }, { description : "Not patched for failed update (patch-if)", fileName : "searchpluginspng0.png", relPathDir : "a/b/searchplugins/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0666 }, { description : "Not added for failed update (add-if)", fileName : "extensions1text0", relPathDir : "a/b/extensions/extensions1/", originalContents : null, compareContents : null, originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }, { description : "Not patched for failed update (patch-if)", fileName : "extensions1png1.png", relPathDir : "a/b/extensions/extensions1/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0666 }, { description : "Not patched for failed update (patch-if)", fileName : "extensions1png0.png", relPathDir : "a/b/extensions/extensions1/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0666 }, { description : "Not added for failed update (add-if)", fileName : "extensions0text0", relPathDir : "a/b/extensions/extensions0/", originalContents : "ShouldNotBeReplaced\n", compareContents : "ShouldNotBeReplaced\n", originalFile : null, compareFile : null, originalPerms : 0644, comparePerms : 0644 }, { description : "Not patched for failed update (patch-if)", fileName : "extensions0png1.png", relPathDir : "a/b/extensions/extensions0/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0644, comparePerms : 0644 }, { description : "Not patched for failed update (patch-if)", fileName : "extensions0png0.png", relPathDir : "a/b/extensions/extensions0/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0644, comparePerms : 0644 }, { description : "Not patched for failed update (patch)", fileName : "exe0.exe", relPathDir : "a/b/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0755, comparePerms : 0755 }, { description : "Not patched for failed update (patch) and causes " + "LoadSourceFile failed", fileName : "0exe0.exe", relPathDir : "a/b/0/", originalContents : null, compareContents : null, originalFile : "data/partial.png", compareFile : "data/partial.png", originalPerms : 0755, comparePerms : 0755 }, { description : "Not added for failed update (add)", fileName : "00text0", relPathDir : "a/b/0/00/", originalContents : "ShouldNotBeReplaced\n", compareContents : "ShouldNotBeReplaced\n", originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }, { description : "Not patched for failed update (patch)", fileName : "00png0.png", relPathDir : "a/b/0/00/", originalContents : null, compareContents : null, originalFile : "data/complete.png", compareFile : "data/complete.png", originalPerms : 0666, comparePerms : 0666 }, { description : "Not added for failed update (add)", fileName : "20text0", relPathDir : "a/b/2/20/", originalContents : null, compareContents : null, originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }, { description : "Not added for failed update (add)", fileName : "20png0.png", relPathDir : "a/b/2/20/", originalContents : null, compareContents : null, originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }, { description : "Not added for failed update (add)", fileName : "00text2", relPathDir : "a/b/0/00/", originalContents : null, compareContents : null, originalFile : null, compareFile : null, originalPerms : null, comparePerms : null }, { description : "Not removed for failed update (remove)", fileName : "10text0", relPathDir : "a/b/1/10/", originalContents : "ShouldNotBeDeleted\n", compareContents : "ShouldNotBeDeleted\n", originalFile : null, compareFile : null, originalPerms : 0666, comparePerms : 0666 }, { description : "Not removed for failed update (remove)", fileName : "00text1", relPathDir : "a/b/0/00/", originalContents : "ShouldNotBeDeleted\n", compareContents : "ShouldNotBeDeleted\n", originalFile : null, compareFile : null, originalPerms : 0666, comparePerms : 0666 }]; ADDITIONAL_TEST_DIRS = [ { description : "Not removed for failed update (rmdir)", relPathDir : "a/b/1/10/", dirRemoved : false }, { description : "Not removed for failed update (rmdir)", relPathDir : "a/b/1/", dirRemoved : false }]; function run_test() { do_test_pending(); do_register_cleanup(cleanupUpdaterTest); setupUpdaterTest(MAR_PARTIAL_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 all updates since // the precomplete file in the root of the bundle is renamed, etc. (bug 600098). if (IS_MACOSX) { let now = Date.now(); let yesterday = now - (1000 * 60 * 60 * 24); applyToDir.lastModifiedTime = yesterday; } // apply the partial mar let exitValue = runUpdate(); logTestInfo("testing updater binary process exitValue for failure when " + "applying a partial mar"); // Note that on platforms where we use execv, we cannot trust the return code. do_check_eq(exitValue, USE_EXECV ? 0 : 1); logTestInfo("testing update.status should be " + STATE_FAILED); // The update status format for a failure is failed: # where # is the error // code for the failure. do_check_eq(readStatusFile(updatesDir).split(": ")[0], STATE_FAILED); // 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); } checkFilesAfterUpdateFailure(); // Sorting on Linux is different so skip this check for now. if (!IS_UNIX) { checkUpdateLogContents(LOG_PARTIAL_FAILURE); } logTestInfo("testing tobedeleted directory doesn't exist"); let toBeDeletedDir = getApplyDirFile("tobedeleted", true); do_check_false(toBeDeletedDir.exists()); checkCallbackAppLog(); }