/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ /** * Helper functions for creating xml strings used by application update tests. * * !IMPORTANT - This file contains everything needed (along with dependencies) * by the updates.sjs file used by the mochitest-chrome tests. Since xpcshell * used by the http server is launched with -v 170 this file must not use * features greater than JavaScript 1.7. */ /* eslint-disable no-undef */ const FILE_SIMPLE_MAR = "simple.mar"; const SIZE_SIMPLE_MAR = "1031"; const MD5_HASH_SIMPLE_MAR = "1f8c038577bb6845d94ccec4999113ee"; const SHA1_HASH_SIMPLE_MAR = "5d49a672c87f10f31d7e326349564a11272a028b"; const SHA256_HASH_SIMPLE_MAR = "1aabbed5b1dd6e16e139afc5b43d479e254e0c26" + "3c8fb9249c0a1bb93071c5fb"; const SHA384_HASH_SIMPLE_MAR = "26615014ea034af32ef5651492d5f493f5a7a1a48522e" + "d24c366442a5ec21d5ef02e23fb58d79729b8ca2f9541" + "99dd53"; const SHA512_HASH_SIMPLE_MAR = "922e5ae22081795f6e8d65a3c508715c9a314054179a8" + "bbfe5f50dc23919ad89888291bc0a07586ab17dd0304a" + "b5347473601127571c66f61f5080348e05c36b"; const STATE_NONE = "null"; const STATE_DOWNLOADING = "downloading"; const STATE_PENDING = "pending"; const STATE_PENDING_SVC = "pending-service"; 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 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; 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_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; /** * 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 "\n" + "\n" + aUpdates + "\n"; } /** * Constructs a string representing an update element for a remote update xml * file. See getUpdateString for parameter information not provided below. * * @param aPatches * String representing the application update patches. * @return The string representing an update element for an update xml file. */ function getRemoteUpdateString(aPatches, aType, aName, aDisplayVersion, aAppVersion, aBuildID, aDetailsURL, aShowPrompt, aShowNeverForVersion, aPromptWaitTime, aBackgroundInterval, aCustom1, aCustom2) { return getUpdateString(aType, aName, aDisplayVersion, aAppVersion, aBuildID, aDetailsURL, aShowPrompt, aShowNeverForVersion, aPromptWaitTime, aBackgroundInterval, aCustom1, aCustom2) + ">\n" + aPatches + " \n"; } /** * Constructs a string representing a patch element for a remote update xml * file. See getPatchString for parameter information not provided below. * * @return The string representing a patch element for a remote update xml file. */ function getRemotePatchString(aType, aURL, aHashFunction, aHashValue, aSize) { return getPatchString(aType, aURL, aHashFunction, aHashValue, aSize) + "/>\n"; } /** * 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 + "").replace(/>\s+\n*<'); } /** * Constructs a string representing an update element for a local update xml * file. See getUpdateString for parameter information not provided below. * * @param aPatches * String representing the application update patches. * @param aServiceURL (optional) * The update's xml url. * If not specified it will default to 'http://test_service/'. * @param aIsCompleteUpdate (optional) * The string 'true' if this update was a complete update or the string * 'false' if this update was a partial update. * If not specified it will default to 'true'. * @param aChannel (optional) * The update channel name. * If not specified it will default to the default preference value of * app.update.channel. * @param aForegroundDownload (optional) * The string 'true' if this update was manually downloaded or the * string 'false' if this update was automatically downloaded. * If not specified it will default to 'true'. * @param aPreviousAppVersion (optional) * The application version prior to applying the update. * If not specified it will not be present. * @return The string representing an update element for an update xml file. */ function getLocalUpdateString(aPatches, aType, aName, aDisplayVersion, aAppVersion, aBuildID, aDetailsURL, aServiceURL, aInstallDate, aStatusText, aIsCompleteUpdate, aChannel, aForegroundDownload, aShowPrompt, aShowNeverForVersion, aPromptWaitTime, aBackgroundInterval, aPreviousAppVersion, aCustom1, aCustom2) { let serviceURL = aServiceURL ? aServiceURL : "http://test_service/"; let installDate = aInstallDate ? aInstallDate : "1238441400314"; let statusText = aStatusText ? aStatusText : "Install Pending"; let isCompleteUpdate = typeof aIsCompleteUpdate == "string" ? aIsCompleteUpdate : "true"; let channel = aChannel ? aChannel : gDefaultPrefBranch.getCharPref(PREF_APP_UPDATE_CHANNEL); let foregroundDownload = typeof aForegroundDownload == "string" ? aForegroundDownload : "true"; let previousAppVersion = aPreviousAppVersion ? "previousAppVersion=\"" + aPreviousAppVersion + "\" " : ""; return getUpdateString(aType, aName, aDisplayVersion, aAppVersion, aBuildID, aDetailsURL, aShowPrompt, aShowNeverForVersion, aPromptWaitTime, aBackgroundInterval, aCustom1, aCustom2) + " " + previousAppVersion + "serviceURL=\"" + serviceURL + "\" " + "installDate=\"" + installDate + "\" " + "statusText=\"" + statusText + "\" " + "isCompleteUpdate=\"" + isCompleteUpdate + "\" " + "channel=\"" + channel + "\" " + "foregroundDownload=\"" + foregroundDownload + "\">" + aPatches + " "; } /** * Constructs a string representing a patch element for a local update xml file. * See getPatchString for parameter information not provided below. * * @param aSelected (optional) * Whether this patch is selected represented or not. The string 'true' * denotes selected and the string 'false' denotes not selected. * If not specified it will default to the string 'true'. * @param aState (optional) * The patch's state. * If not specified it will default to STATE_SUCCEEDED. * @return The string representing a patch element for a local update xml file. */ function getLocalPatchString(aType, aURL, aHashFunction, aHashValue, aSize, aSelected, aState) { let selected = typeof aSelected == "string" ? aSelected : "true"; let state = aState ? aState : STATE_SUCCEEDED; return getPatchString(aType, aURL, aHashFunction, aHashValue, aSize) + " " + "selected=\"" + selected + "\" " + "state=\"" + state + "\"/>\n"; } /** * Constructs a string representing an update element for a remote update xml * file. * * @param aType (optional) * The update's type which should be major or minor. If not specified it * will default to 'major'. * @param aName (optional) * The update's name. * If not specified it will default to 'App Update Test'. * @param aDisplayVersion (optional) * The update's display version. * If not specified it will default to 'version #' where # is the value * of DEFAULT_UPDATE_VERSION. * @param aAppVersion (optional) * The update's application version. * If not specified it will default to the value of * DEFAULT_UPDATE_VERSION. * @param aBuildID (optional) * The update's build id. * If not specified it will default to '20080811053724'. * @param aDetailsURL (optional) * The update's details url. * If not specified it will default to 'http://test_details/' due to due * to bug 470244. * @param aShowPrompt (optional) * Whether to show the prompt for the update when auto update is * enabled. * If not specified it will not be present and the update service will * default to false. * @param aShowNeverForVersion (optional) * Whether to show the 'No Thanks' button in the update prompt. * If not specified it will not be present and the update service will * default to false. * @param aPromptWaitTime (optional) * Override for the app.update.promptWaitTime preference. * @param aBackgroundInterval (optional) * Override for the app.update.download.backgroundInterval preference. * @param aCustom1 (optional) * A custom attribute name and attribute value to add to the xml. * Example: custom1_attribute="custom1 value" * If not specified it will not be present. * @param aCustom2 (optional) * A custom attribute name and attribute value to add to the xml. * Example: custom2_attribute="custom2 value" * If not specified it will not be present. * @return The string representing an update element for an update xml file. */ function getUpdateString(aType, aName, aDisplayVersion, aAppVersion, aBuildID, aDetailsURL, aShowPrompt, aShowNeverForVersion, aPromptWaitTime, aBackgroundInterval, aCustom1, aCustom2) { let type = aType ? aType : "major"; let name = aName ? aName : "App Update Test"; let displayVersion = aDisplayVersion ? "displayVersion=\"" + aDisplayVersion + "\" " : ""; let appVersion = "appVersion=\"" + (aAppVersion ? aAppVersion : DEFAULT_UPDATE_VERSION) + "\" "; let buildID = aBuildID ? aBuildID : "20080811053724"; // XXXrstrong - not specifying a detailsURL will cause a leak due to bug 470244 // let detailsURL = aDetailsURL ? "detailsURL=\"" + aDetailsURL + "\" " : ""; let detailsURL = "detailsURL=\"" + (aDetailsURL ? aDetailsURL : "http://test_details/") + "\" "; let showPrompt = aShowPrompt ? "showPrompt=\"" + aShowPrompt + "\" " : ""; let showNeverForVersion = aShowNeverForVersion ? "showNeverForVersion=\"" + aShowNeverForVersion + "\" " : ""; let promptWaitTime = aPromptWaitTime ? "promptWaitTime=\"" + aPromptWaitTime + "\" " : ""; let backgroundInterval = aBackgroundInterval ? "backgroundInterval=\"" + aBackgroundInterval + "\" " : ""; let custom1 = aCustom1 ? aCustom1 + " " : ""; let custom2 = aCustom2 ? aCustom2 + " " : ""; return "