Mac v2 signing - Bug 1068439 - Move the distribution directory from Content/MacOS to Contents/Resources on app update due to v2 signing requirements. r=spohl

This commit is contained in:
Robert Strong 2014-09-29 11:52:18 -07:00
parent d61019a5de
commit 3715196e39
6 changed files with 179 additions and 69 deletions

View File

@ -654,61 +654,6 @@ var gTestFilesPartialSuccess = [
// Concatenate the common files to the end of the array.
gTestFilesPartialSuccess = gTestFilesPartialSuccess.concat(gTestFilesCommon);
/**
* The mar files used for the updater tests contain the following remove
* operations.
*
* partial and complete test mar remove operations
* -----------------------------------------------
* remove "text1"
* remove "text0"
* rmrfdir "9/99/"
* rmdir "9/99/"
* rmrfdir "9/98/"
* rmrfdir "9/97/"
* rmrfdir "9/96/"
* rmrfdir "9/95/"
* rmrfdir "9/95/"
* rmrfdir "9/94/"
* rmdir "9/94/"
* rmdir "9/93/"
* rmdir "9/92/"
* rmdir "9/91/"
* rmdir "9/90/"
* rmdir "9/90/"
* rmrfdir "8/89/"
* rmdir "8/89/"
* rmrfdir "8/88/"
* rmrfdir "8/87/"
* rmrfdir "8/86/"
* rmrfdir "8/85/"
* rmrfdir "8/85/"
* rmrfdir "8/84/"
* rmdir "8/84/"
* rmdir "8/83/"
* rmdir "8/82/"
* rmdir "8/81/"
* rmdir "8/80/"
* rmdir "8/80/"
* rmrfdir "7/"
* rmdir "6/"
* remove "5/text1"
* remove "5/text0"
* rmrfdir "5/"
* remove "4/text1"
* remove "4/text0"
* remove "4/exe0.exe"
* rmdir "4/"
* remove "3/text1"
* remove "3/text0"
*
* partial test mar additional remove operations
* ---------------------------------------------
* remove "0/00/00text1"
* remove "1/10/10text0"
* rmdir "1/10/"
* rmdir "1/"
*/
var gTestDirsCommon = [
{
relPathDir : DIR_RESOURCES + "3/",
@ -1112,6 +1057,21 @@ function setTestFilesAndDirsForFailure() {
});
}
/**
* Helper function for updater binary tests that prevents the distribution
* directory files from being created.
*/
function preventDistributionFiles() {
gTestFiles = gTestFiles.filter(function(aTestFile) {
return aTestFile.relPathDir.indexOf("distribution/") == -1;
});
gTestDirs = gTestDirs.filter(function(aTestDir) {
return aTestDir.relPathDir.indexOf("distribution/") == -1;
});
}
/**
* Initializes the most commonly used settings and creates an instance of the
* update service stub.
@ -2386,8 +2346,11 @@ function createUpdaterINI(aIsExeAsync) {
*
* @param aCompareLogFile
* The log file to compare the update log with.
* @param aExcludeDistributionDir
* Removes lines containing the distribution directory from the log
* file to compare the update log with.
*/
function checkUpdateLogContents(aCompareLogFile) {
function checkUpdateLogContents(aCompareLogFile, aExcludeDistributionDir) {
if (IS_UNIX && !IS_MACOSX) {
// Sorting on Linux is different so skip checking the logs for now.
return;
@ -2422,16 +2385,14 @@ function checkUpdateLogContents(aCompareLogFile) {
updateLogContents = updateLogContents.replace(/WORKING DIRECTORY.*/g, "");
// Skip lines that log failed attempts to open the callback executable.
updateLogContents = updateLogContents.replace(/NS_main: callback app file .*/g, "");
if (IS_MACOSX) {
// Skip lines that log moving the distribution directory for Mac v2 signing.
updateLogContents = updateLogContents.replace(/Moving old [^\n]*\nrename_file: .*/g, "");
updateLogContents = updateLogContents.replace(/New distribution directory .*/g, "");
}
if (gSwitchApp) {
// Remove the lines which contain absolute paths
updateLogContents = updateLogContents.replace(/^Begin moving.*$/mg, "");
if (IS_MACOSX) {
// Remove the entire section about moving the precomplete file as it contains
// absolute paths.
updateLogContents = updateLogContents.replace(/\n/g, "%%%EOL%%%");
updateLogContents = updateLogContents.replace(/Moving the precomplete file.*Finished moving the precomplete file/, "");
updateLogContents = updateLogContents.replace(/%%%EOL%%%/g, "\n");
}
}
updateLogContents = updateLogContents.replace(/\r/g, "");
// Replace error codes since they are different on each platform.
@ -2468,6 +2429,9 @@ function checkUpdateLogContents(aCompareLogFile) {
!gTestFiles[gTestFiles.length - 2].originalContents) {
compareLogContents = compareLogContents.replace(/.*update-settings.ini.*/g, "");
}
if (aExcludeDistributionDir) {
compareLogContents = compareLogContents.replace(/.*distribution\/.*/g, "");
}
// Remove leading and trailing newlines
compareLogContents = compareLogContents.replace(/\n+/g, "\n");
// Remove leading and trailing newlines

View File

@ -14,6 +14,15 @@ function run_test() {
gTestFiles[gTestFiles.length - 1].comparePerms = 0o644;
gTestDirs = gTestDirsCompleteSuccess;
setupUpdaterTest(FILE_COMPLETE_MAR);
if (IS_MACOSX) {
// Create files in the old distribution directory location to verify that
// the directory and its contents are removed when there is a distribution
// directory in the new location.
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
writeFile(testFile, "test\n");
testFile = getApplyDirFile(DIR_MACOS + "distribution/test1/testFile", true);
writeFile(testFile, "test\n");
}
createUpdaterINI(false);
@ -93,6 +102,17 @@ function finishCheckUpdateApplied() {
do_check_true(timeDiff < MAC_MAX_TIME_DIFFERENCE);
}
if (IS_MACOSX) {
logTestInfo("testing that the distribution directory is removed from the " +
"old location when there is a distribution directory in the " +
"new location");
let distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
logTestInfo("testing " + distributionDir.path + " shouldn't exist");
do_check_false(distributionDir.exists());
checkUpdateLogContains("removing old distribution directory");
}
if (IS_UNIX && !IS_MACOSX) {
checkSymlink();
}

View File

@ -13,7 +13,16 @@ function run_test() {
gTestFiles[gTestFiles.length - 2].compareContents = "FromPartial\n";
gTestFiles[gTestFiles.length - 2].comparePerms = 0o644;
gTestDirs = gTestDirsPartialSuccess;
preventDistributionFiles();
setupUpdaterTest(FILE_PARTIAL_MAR);
if (IS_MACOSX) {
// Create files in the old distribution directory location to verify that
// the directory and its contents are moved to the new location on update.
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
writeFile(testFile, "test\n");
testFile = getApplyDirFile(DIR_MACOS + "distribution/test/testFile", true);
writeFile(testFile, "test\n");
}
createUpdaterINI(false);
@ -30,7 +39,7 @@ function run_test() {
runUpdate(0, STATE_APPLIED, null);
checkFilesAfterUpdateSuccess(getStageDirFile, true, false);
checkUpdateLogContents(LOG_PARTIAL_SUCCESS);
checkUpdateLogContents(LOG_PARTIAL_SUCCESS, true);
if (IS_WIN || IS_MACOSX) {
// Check that the post update process was not launched when staging an
@ -73,7 +82,34 @@ function finishCheckUpdateApplied() {
do_check_true(timeDiff < MAC_MAX_TIME_DIFFERENCE);
}
let distributionDir = getApplyDirFile(DIR_RESOURCES + "distribution", true);
if (IS_MACOSX) {
logTestInfo("testing that the distribution directory is moved from the " +
"old location to the new location");
logTestInfo("testing " + distributionDir.path + " should exist");
do_check_true(distributionDir.exists());
let testFile = getApplyDirFile(DIR_RESOURCES + "distribution/testFile", true);
logTestInfo("testing " + testFile.path + " should exist");
do_check_true(testFile.exists());
testFile = getApplyDirFile(DIR_RESOURCES + "distribution/test/testFile", true);
logTestInfo("testing " + testFile.path + " should exist");
do_check_true(testFile.exists());
distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
logTestInfo("testing " + distributionDir.path + " shouldn't exist");
do_check_false(distributionDir.exists());
checkUpdateLogContains("Moving old distribution directory to new location");
} else {
logTestInfo("testing that files aren't added with an add-if instruction " +
"when the file's destination directory doesn't exist");
logTestInfo("testing " + distributionDir.path + " shouldn't exist");
do_check_false(distributionDir.exists());
}
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
checkUpdateLogContents(LOG_PARTIAL_SUCCESS);
checkUpdateLogContents(LOG_PARTIAL_SUCCESS, true);
checkCallbackAppLog();
}

View File

@ -9,7 +9,16 @@ function run_test() {
setupTestCommon();
gTestFiles = gTestFilesCompleteSuccess;
gTestDirs = gTestDirsCompleteSuccess;
preventDistributionFiles();
setupUpdaterTest(FILE_COMPLETE_MAR);
if (IS_MACOSX) {
// Create files in the old distribution directory location to verify that
// the directory and its contents are moved to the new location on update.
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
writeFile(testFile, "test\n");
testFile = getApplyDirFile(DIR_MACOS + "distribution/test/testFile", true);
writeFile(testFile, "test\n");
}
createUpdaterINI();
@ -53,7 +62,34 @@ function finishCheckUpdateApplied() {
do_check_true(timeDiff < MAC_MAX_TIME_DIFFERENCE);
}
let distributionDir = getApplyDirFile(DIR_RESOURCES + "distribution", true);
if (IS_MACOSX) {
logTestInfo("testing that the distribution directory is moved from the " +
"old location to the new location");
logTestInfo("testing " + distributionDir.path + " should exist");
do_check_true(distributionDir.exists());
let testFile = getApplyDirFile(DIR_RESOURCES + "distribution/testFile", true);
logTestInfo("testing " + testFile.path + " should exist");
do_check_true(testFile.exists());
testFile = getApplyDirFile(DIR_RESOURCES + "distribution/test/testFile", true);
logTestInfo("testing " + testFile.path + " should exist");
do_check_true(testFile.exists());
distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
logTestInfo("testing " + distributionDir.path + " shouldn't exist");
do_check_false(distributionDir.exists());
checkUpdateLogContains("Moving old distribution directory to new location");
} else {
logTestInfo("testing that files aren't added with an add-if instruction " +
"when the file's destination directory doesn't exist");
logTestInfo("testing " + distributionDir.path + " shouldn't exist");
do_check_false(distributionDir.exists());
}
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
checkUpdateLogContents(LOG_COMPLETE_SUCCESS);
checkUpdateLogContents(LOG_COMPLETE_SUCCESS, true);
checkCallbackAppLog();
}

View File

@ -16,6 +16,15 @@ function run_test() {
gTestFiles[gTestFiles.length - 2].comparePerms = 0o644;
gTestDirs = gTestDirsPartialSuccess;
setupUpdaterTest(FILE_PARTIAL_MAR);
if (IS_MACOSX) {
// Create files in the old distribution directory location to verify that
// the directory and its contents are removed when there is a distribution
// directory in the new location.
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
writeFile(testFile, "test\n");
testFile = getApplyDirFile(DIR_MACOS + "distribution/test/testFile", true);
writeFile(testFile, "test\n");
}
createUpdaterINI(true);
@ -59,6 +68,17 @@ function finishCheckUpdateApplied() {
do_check_true(timeDiff < MAC_MAX_TIME_DIFFERENCE);
}
if (IS_MACOSX) {
logTestInfo("testing that the distribution directory is removed from the " +
"old location when there is a distribution directory in the " +
"new location");
let distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
logTestInfo("testing " + distributionDir.path + " shouldn't exist");
do_check_false(distributionDir.exists());
checkUpdateLogContains("removing old distribution directory");
}
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
checkUpdateLogContents(LOG_PARTIAL_SUCCESS);
checkCallbackAppLog();

View File

@ -2678,12 +2678,12 @@ int NS_main(int argc, NS_tchar **argv)
}
}
// If we didn't want to use the service at all, or if an update was
// already happening, or launching the service command failed, then
// If we didn't want to use the service at all, or if an update was
// already happening, or launching the service command failed, then
// launch the elevated updater.exe as we do without the service.
// We don't launch the elevated updater in the case that we did have
// write access all along because in that case the only reason we're
// using the service is because we are testing.
// using the service is because we are testing.
if (!useService && !noServiceFallback &&
updateLockFileHandle == INVALID_HANDLE_VALUE) {
SHELLEXECUTEINFO sinfo;
@ -3020,6 +3020,40 @@ int NS_main(int argc, NS_tchar **argv)
} // end the extra level of scope for the GonkAutoMounter
#endif
#ifdef XP_MACOSX
// When the update is successful move the distribution directory from
// Contents/MacOS to Contents/Resources and if both exist delete the
// directory under Contents/MacOS (see Bug 1068439).
if (gSucceeded) {
NS_tchar oldDistDir[MAXPATHLEN];
NS_tsnprintf(oldDistDir, sizeof(oldDistDir)/sizeof(oldDistDir[0]),
NS_T("%s/Contents/MacOS/distribution"), gInstallDirPath);
int rv = NS_taccess(oldDistDir, F_OK);
if (!rv) {
NS_tchar newDistDir[MAXPATHLEN];
NS_tsnprintf(newDistDir, sizeof(newDistDir)/sizeof(newDistDir[0]),
NS_T("%s/Contents/Resources/distribution"), gInstallDirPath);
rv = NS_taccess(newDistDir, F_OK);
if (!rv) {
LOG(("New distribution directory already exists... removing old " \
"distribution directory: " LOG_S, oldDistDir));
rv = ensure_remove_recursive(oldDistDir);
if (rv) {
LOG(("Removing old distribution directory failed - err: %d", rv));
}
} else {
LOG(("Moving old distribution directory to new location. src: " LOG_S \
", dst:" LOG_S, oldDistDir, newDistDir));
rv = rename_file(oldDistDir, newDistDir, true);
if (rv) {
LOG(("Moving old distribution directory to new location failed - " \
"err: %d", rv));
}
}
}
}
#endif /* XP_MACOSX */
LogFinish();
if (argc > callbackIndex) {