/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ /** * Shared code for xpcshell, mochitests-chrome, mochitest-browser-chrome, and * SJS server-side scripts for the test http server. */ /** * Helper functions for creating xml strings used by application update tests. */ /* import-globals-from ../browser/testConstants.js */ /* global Services, UpdateUtils, gURLData */ const FILE_SIMPLE_MAR = "simple.mar"; const SIZE_SIMPLE_MAR = "1419"; const STATE_NONE = "null"; const STATE_DOWNLOADING = "downloading"; const STATE_PENDING = "pending"; const STATE_PENDING_SVC = "pending-service"; const STATE_PENDING_ELEVATE = "pending-elevate"; const STATE_APPLYING = "applying"; const STATE_APPLIED = "applied"; const STATE_APPLIED_SVC = "applied-service"; const STATE_SUCCEEDED = "succeeded"; const STATE_DOWNLOAD_FAILED = "download-failed"; const STATE_FAILED = "failed"; const LOADSOURCE_ERROR_WRONG_SIZE = 2; const CRC_ERROR = 4; const READ_ERROR = 6; const WRITE_ERROR = 7; const MAR_CHANNEL_MISMATCH_ERROR = 22; const VERSION_DOWNGRADE_ERROR = 23; const UPDATE_SETTINGS_FILE_CHANNEL = 38; const SERVICE_COULD_NOT_COPY_UPDATER = 49; const SERVICE_INVALID_APPLYTO_DIR_STAGED_ERROR = 52; const SERVICE_INVALID_APPLYTO_DIR_ERROR = 54; const SERVICE_INVALID_INSTALL_DIR_PATH_ERROR = 55; const SERVICE_INVALID_WORKING_DIR_PATH_ERROR = 56; const INVALID_APPLYTO_DIR_STAGED_ERROR = 72; const INVALID_APPLYTO_DIR_ERROR = 74; const INVALID_INSTALL_DIR_PATH_ERROR = 75; const INVALID_WORKING_DIR_PATH_ERROR = 76; const INVALID_CALLBACK_PATH_ERROR = 77; const INVALID_CALLBACK_DIR_ERROR = 78; // Error codes 80 through 99 are reserved for nsUpdateService.js and are not // defined in common/updatererrors.h const ERR_OLDER_VERSION_OR_SAME_BUILD = 90; const ERR_UPDATE_STATE_NONE = 91; const ERR_CHANNEL_CHANGE = 92; const WRITE_ERROR_BACKGROUND_TASK_SHARING_VIOLATION = 106; const STATE_FAILED_DELIMETER = ": "; const STATE_FAILED_LOADSOURCE_ERROR_WRONG_SIZE = STATE_FAILED + STATE_FAILED_DELIMETER + LOADSOURCE_ERROR_WRONG_SIZE; const STATE_FAILED_CRC_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + CRC_ERROR; const STATE_FAILED_READ_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + READ_ERROR; const STATE_FAILED_WRITE_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + WRITE_ERROR; const STATE_FAILED_MAR_CHANNEL_MISMATCH_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + MAR_CHANNEL_MISMATCH_ERROR; const STATE_FAILED_VERSION_DOWNGRADE_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + VERSION_DOWNGRADE_ERROR; const STATE_FAILED_UPDATE_SETTINGS_FILE_CHANNEL = STATE_FAILED + STATE_FAILED_DELIMETER + UPDATE_SETTINGS_FILE_CHANNEL; const STATE_FAILED_SERVICE_COULD_NOT_COPY_UPDATER = STATE_FAILED + STATE_FAILED_DELIMETER + SERVICE_COULD_NOT_COPY_UPDATER; const STATE_FAILED_SERVICE_INVALID_APPLYTO_DIR_STAGED_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + SERVICE_INVALID_APPLYTO_DIR_STAGED_ERROR; const STATE_FAILED_SERVICE_INVALID_APPLYTO_DIR_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + SERVICE_INVALID_APPLYTO_DIR_ERROR; const STATE_FAILED_SERVICE_INVALID_INSTALL_DIR_PATH_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + SERVICE_INVALID_INSTALL_DIR_PATH_ERROR; const STATE_FAILED_SERVICE_INVALID_WORKING_DIR_PATH_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + SERVICE_INVALID_WORKING_DIR_PATH_ERROR; const STATE_FAILED_INVALID_APPLYTO_DIR_STAGED_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + INVALID_APPLYTO_DIR_STAGED_ERROR; const STATE_FAILED_INVALID_APPLYTO_DIR_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + INVALID_APPLYTO_DIR_ERROR; const STATE_FAILED_INVALID_INSTALL_DIR_PATH_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + INVALID_INSTALL_DIR_PATH_ERROR; const STATE_FAILED_INVALID_WORKING_DIR_PATH_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + INVALID_WORKING_DIR_PATH_ERROR; const STATE_FAILED_INVALID_CALLBACK_PATH_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + INVALID_CALLBACK_PATH_ERROR; const STATE_FAILED_INVALID_CALLBACK_DIR_ERROR = STATE_FAILED + STATE_FAILED_DELIMETER + INVALID_CALLBACK_DIR_ERROR; const STATE_FAILED_WRITE_ERROR_BACKGROUND_TASK_SHARING_VIOLATION = STATE_FAILED + STATE_FAILED_DELIMETER + WRITE_ERROR_BACKGROUND_TASK_SHARING_VIOLATION; const DEFAULT_UPDATE_VERSION = "999999.0"; /** * Constructs a string representing a remote update xml file. * * @param aUpdates * The string representing the update elements. * @return The string representing a remote update xml file. */ function getRemoteUpdatesXMLString(aUpdates) { return '' + aUpdates + ""; } /** * Constructs a string representing an update element for a remote update xml * file. See getUpdateString for parameter information not provided below. * * @param aUpdateProps * An object containing non default test values for an nsIUpdate. * See updateProps names below for possible object names. * @param aPatches * String representing the application update patches. * @return The string representing an update element for an update xml file. */ function getRemoteUpdateString(aUpdateProps, aPatches) { const updateProps = { appVersion: DEFAULT_UPDATE_VERSION, buildID: "20080811053724", custom1: null, custom2: null, detailsURL: URL_HTTP_UPDATE_SJS + "?uiURL=DETAILS", displayVersion: null, name: "App Update Test", promptWaitTime: null, type: "major", }; for (let name in aUpdateProps) { updateProps[name] = aUpdateProps[name]; } // To test that text nodes are handled properly the string returned contains // spaces and newlines. return getUpdateString(updateProps) + ">\n " + aPatches + "\n\n"; } /** * Constructs a string representing a patch element for a remote update xml * file. See getPatchString for parameter information not provided below. * * @param aPatchProps (optional) * An object containing non default test values for an nsIUpdatePatch. * See patchProps below for possible object names. * @return The string representing a patch element for a remote update xml file. */ function getRemotePatchString(aPatchProps) { const patchProps = { type: "complete", _url: null, get url() { if (this._url) { return this._url; } if (gURLData) { return gURLData + FILE_SIMPLE_MAR; } return null; }, set url(val) { this._url = val; }, custom1: null, custom2: null, size: SIZE_SIMPLE_MAR, }; for (let name in aPatchProps) { patchProps[name] = aPatchProps[name]; } return getPatchString(patchProps) + "/>"; } /** * Constructs a string representing a local update xml file. * * @param aUpdates * The string representing the update elements. * @return The string representing a local update xml file. */ function getLocalUpdatesXMLString(aUpdates) { if (!aUpdates || aUpdates == "") { return ''; } return ( '' + aUpdates + "" ); } /** * Constructs a string representing an update element for a local update xml * file. See getUpdateString for parameter information not provided below. * * @param aUpdateProps * An object containing non default test values for an nsIUpdate. * See updateProps names below for possible object names. * @param aPatches * String representing the application update patches. * @return The string representing an update element for an update xml file. */ function getLocalUpdateString(aUpdateProps, aPatches) { const updateProps = { _appVersion: null, get appVersion() { if (this._appVersion) { return this._appVersion; } if (Services && Services.appinfo && Services.appinfo.version) { return Services.appinfo.version; } return DEFAULT_UPDATE_VERSION; }, set appVersion(val) { this._appVersion = val; }, buildID: "20080811053724", channel: UpdateUtils ? UpdateUtils.getUpdateChannel() : "default", custom1: null, custom2: null, detailsURL: URL_HTTP_UPDATE_SJS + "?uiURL=DETAILS", displayVersion: null, foregroundDownload: "true", installDate: "1238441400314", isCompleteUpdate: "true", name: "App Update Test", previousAppVersion: null, promptWaitTime: null, serviceURL: "http://test_service/", statusText: "Install Pending", type: "major", }; for (let name in aUpdateProps) { updateProps[name] = aUpdateProps[name]; } let checkInterval = updateProps.checkInterval ? 'checkInterval="' + updateProps.checkInterval + '" ' : ""; let channel = 'channel="' + updateProps.channel + '" '; let isCompleteUpdate = 'isCompleteUpdate="' + updateProps.isCompleteUpdate + '" '; let foregroundDownload = updateProps.foregroundDownload ? 'foregroundDownload="' + updateProps.foregroundDownload + '" ' : ""; let installDate = 'installDate="' + updateProps.installDate + '" '; let previousAppVersion = updateProps.previousAppVersion ? 'previousAppVersion="' + updateProps.previousAppVersion + '" ' : ""; let statusText = updateProps.statusText ? 'statusText="' + updateProps.statusText + '" ' : ""; let serviceURL = 'serviceURL="' + updateProps.serviceURL + '">'; return ( getUpdateString(updateProps) + " " + checkInterval + channel + isCompleteUpdate + foregroundDownload + installDate + previousAppVersion + statusText + serviceURL + aPatches + "" ); } /** * Constructs a string representing a patch element for a local update xml file. * See getPatchString for parameter information not provided below. * * @param aPatchProps (optional) * An object containing non default test values for an nsIUpdatePatch. * See patchProps below for possible object names. * @return The string representing a patch element for a local update xml file. */ function getLocalPatchString(aPatchProps) { const patchProps = { type: "complete", url: gURLData + FILE_SIMPLE_MAR, size: SIZE_SIMPLE_MAR, custom1: null, custom2: null, selected: "true", state: STATE_SUCCEEDED, }; for (let name in aPatchProps) { patchProps[name] = aPatchProps[name]; } let selected = 'selected="' + patchProps.selected + '" '; let state = 'state="' + patchProps.state + '"/>'; return getPatchString(patchProps) + " " + selected + state; } /** * Constructs a string representing an update element for a remote update xml * file. * * @param aUpdateProps (optional) * An object containing non default test values for an nsIUpdate. * See the aUpdateProps property names below for possible object names. * @return The string representing an update element for an update xml file. */ function getUpdateString(aUpdateProps) { let type = 'type="' + aUpdateProps.type + '" '; let name = 'name="' + aUpdateProps.name + '" '; let displayVersion = aUpdateProps.displayVersion ? 'displayVersion="' + aUpdateProps.displayVersion + '" ' : ""; let appVersion = 'appVersion="' + aUpdateProps.appVersion + '" '; // Not specifying a detailsURL will cause a leak due to bug 470244 let detailsURL = 'detailsURL="' + aUpdateProps.detailsURL + '" '; let promptWaitTime = aUpdateProps.promptWaitTime ? 'promptWaitTime="' + aUpdateProps.promptWaitTime + '" ' : ""; let disableBITS = aUpdateProps.disableBITS ? 'disableBITS="' + aUpdateProps.disableBITS + '" ' : ""; let disableBackgroundUpdates = aUpdateProps.disableBackgroundUpdates ? 'disableBackgroundUpdates="' + aUpdateProps.disableBackgroundUpdates + '" ' : ""; let custom1 = aUpdateProps.custom1 ? aUpdateProps.custom1 + " " : ""; let custom2 = aUpdateProps.custom2 ? aUpdateProps.custom2 + " " : ""; let buildID = 'buildID="' + aUpdateProps.buildID + '"'; return ( " 0) { let bytes = bis.readByteArray(Math.min(65535, count)); data.push(String.fromCharCode.apply(null, bytes)); count -= bytes.length; if (!bytes.length) { throw new Error("Nothing read from input stream!"); } } data = data.join(""); fis.close(); return data.toString(); }