зеркало из https://github.com/mozilla/gecko-dev.git
Test code - Bug 1358336 - app update tries to install staged updates for older versions. r=mhowell
This commit is contained in:
Родитель
e03471bf82
Коммит
be8977ae34
|
@ -3199,16 +3199,6 @@ function checkFilesAfterUpdateCommon(aGetFileFunc, aStageDirExists,
|
|||
applyToDir = getApplyDirFile(null, true);
|
||||
checkFilesInDirRecursive(stageDir, checkForBackupFiles);
|
||||
}
|
||||
|
||||
debugDump("testing patch files should not be left behind");
|
||||
let updatesDir = getUpdatesPatchDir();
|
||||
let entries = updatesDir.QueryInterface(Ci.nsIFile).directoryEntries;
|
||||
while (entries.hasMoreElements()) {
|
||||
let entry = entries.getNext().QueryInterface(Ci.nsIFile);
|
||||
Assert.notEqual(getFileExtension(entry), "patch",
|
||||
"the file's extension should not equal patch" +
|
||||
getMsgPath(entry.path));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3864,20 +3854,27 @@ function runUpdateUsingApp(aExpectedStatus) {
|
|||
aExpectedStatus +
|
||||
", current status: " + status);
|
||||
} else {
|
||||
do_execute_soon(afterAppExits);
|
||||
do_timeout(FILE_IN_USE_TIMEOUT_MS, afterAppExits);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the update log has been created.
|
||||
let log = getUpdateLog(FILE_UPDATE_LOG);
|
||||
if (!log.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update log " +
|
||||
"to be created. Path: " + log.path);
|
||||
// Don't check for an update log when the code in nsUpdateDriver.cpp skips
|
||||
// updating.
|
||||
if (aExpectedStatus != STATE_PENDING &&
|
||||
aExpectedStatus != STATE_PENDING_SVC &&
|
||||
aExpectedStatus != STATE_APPLIED &&
|
||||
aExpectedStatus != STATE_APPLIED_SVC) {
|
||||
// Don't proceed until the update log has been created.
|
||||
let log = getUpdateLog(FILE_UPDATE_LOG);
|
||||
if (!log.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update " +
|
||||
"log to be created. Path: " + log.path);
|
||||
}
|
||||
do_timeout(FILE_IN_USE_TIMEOUT_MS, afterAppExits);
|
||||
return;
|
||||
}
|
||||
do_execute_soon(afterAppExits);
|
||||
return;
|
||||
}
|
||||
|
||||
do_execute_soon(runUpdateFinished);
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test a replace request for a staged update with a version file that specifies
|
||||
* an older version failure. The same check is used in nsUpdateDriver.cpp for
|
||||
* all update types which is why there aren't tests for the maintenance service
|
||||
* as well as for other update types.
|
||||
*/
|
||||
|
||||
const STATE_AFTER_STAGE = STATE_APPLIED;
|
||||
|
||||
function run_test() {
|
||||
if (!setupTestCommon()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the call to setupUpdaterTest finishes.
|
||||
*/
|
||||
function setupUpdaterTestFinished() {
|
||||
stageUpdate(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the call to stageUpdate finishes.
|
||||
*/
|
||||
function stageUpdateFinished() {
|
||||
checkPostUpdateRunningFile(false);
|
||||
checkFilesAfterUpdateSuccess(getStageDirFile, true);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS, true);
|
||||
// Change the active update to an older version to simulate installing a new
|
||||
// version of the application while there is an update that has been staged.
|
||||
let channel = gDefaultPrefBranch.getCharPref(PREF_APP_UPDATE_CHANNEL);
|
||||
let patches = getLocalPatchString(null, null, null, null, null, "true",
|
||||
STATE_AFTER_STAGE);
|
||||
let updates = getLocalUpdateString(patches, null, null, null, "1.0", null,
|
||||
null, null, null, null, "true", channel);
|
||||
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
|
||||
// Change the version file to an older version to simulate installing a new
|
||||
// version of the application while there is an update that has been staged.
|
||||
writeVersionFile("1.0");
|
||||
reloadUpdateManagerData();
|
||||
// Try to switch the application to the staged application that was updated.
|
||||
runUpdateUsingApp(STATE_AFTER_STAGE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the call to runUpdateUsingApp finishes.
|
||||
*/
|
||||
function runUpdateFinished() {
|
||||
standardInit();
|
||||
Assert.equal(readStatusState(), STATE_NONE,
|
||||
"the status file state" + MSG_SHOULD_EQUAL);
|
||||
Assert.ok(!gUpdateManager.activeUpdate,
|
||||
"the active update should not be defined");
|
||||
Assert.equal(gUpdateManager.updateCount, 1,
|
||||
"the update manager updateCount attribute" + MSG_SHOULD_EQUAL);
|
||||
Assert.equal(gUpdateManager.getUpdateAt(0).state, STATE_AFTER_STAGE,
|
||||
"the update state" + MSG_SHOULD_EQUAL);
|
||||
checkPostUpdateRunningFile(false);
|
||||
setTestFilesAndDirsForFailure();
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, true, false);
|
||||
|
||||
let updatesDir = getUpdatesPatchDir();
|
||||
Assert.ok(updatesDir.exists(),
|
||||
MSG_SHOULD_EXIST + getMsgPath(updatesDir.path));
|
||||
|
||||
let log = getUpdateLog(FILE_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(),
|
||||
MSG_SHOULD_NOT_EXIST + getMsgPath(log.path));
|
||||
|
||||
log = getUpdateLog(FILE_LAST_UPDATE_LOG);
|
||||
Assert.ok(log.exists(),
|
||||
MSG_SHOULD_EXIST + getMsgPath(log.path));
|
||||
|
||||
log = getUpdateLog(FILE_BACKUP_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(),
|
||||
MSG_SHOULD_NOT_EXIST + getMsgPath(log.path));
|
||||
|
||||
waitForFilesInUse();
|
||||
}
|
|
@ -96,3 +96,4 @@ skip-if = os != 'win'
|
|||
reason = Windows only test
|
||||
[marAppApplyUpdateSuccess.js]
|
||||
[marAppApplyUpdateStageSuccess.js]
|
||||
[marAppApplyUpdateStageOldVersionFailure.js]
|
||||
|
|
Загрузка…
Ссылка в новой задаче