From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../mailnews/base/test/unit/test_compactFailure.js | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 comm/mailnews/base/test/unit/test_compactFailure.js (limited to 'comm/mailnews/base/test/unit/test_compactFailure.js') diff --git a/comm/mailnews/base/test/unit/test_compactFailure.js b/comm/mailnews/base/test/unit/test_compactFailure.js new file mode 100644 index 0000000000..300c8abda7 --- /dev/null +++ b/comm/mailnews/base/test/unit/test_compactFailure.js @@ -0,0 +1,134 @@ +/* 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/. */ + +var { MockRegistrar } = ChromeUtils.importESModule( + "resource://testing-common/MockRegistrar.sys.mjs" +); + +/* import-globals-from ../../../test/resources/logHelper.js */ +load("../../../resources/logHelper.js"); +var { addMessagesToFolder, MessageGenerator, MessageScenarioFactory } = + ChromeUtils.import("resource://testing-common/mailnews/MessageGenerator.jsm"); +var { MessageInjection } = ChromeUtils.import( + "resource://testing-common/mailnews/MessageInjection.jsm" +); +var { PromiseTestUtils } = ChromeUtils.import( + "resource://testing-common/mailnews/PromiseTestUtils.jsm" +); + +Services.prefs.setCharPref( + "mail.serverDefaultStoreContractID", + "@mozilla.org/msgstore/berkeleystore;1" +); + +var gTargetFolder; +var gCid; + +// Allow certain xpcom errors. +logHelperAllowedErrors.push("NS_ERROR_FILE_NOT_FOUND"); + +var MsgDBServiceFailure = { + QueryInterface: ChromeUtils.generateQI(["nsIMsgDBService"]), + + openMailDBFromFile(file, folder, create, leaveInvalidDB) { + if (folder.name == "ShouldFail") { + throw Components.Exception("", Cr.NS_ERROR_FILE_NOT_FOUND); + } + return this._genuine.openMailDBFromFile( + file, + folder, + create, + leaveInvalidDB + ); + }, + + openFolderDB(folder, leaveInvalidDB) { + return this._genuine.openFolderDB(folder, leaveInvalidDB); + }, + createNewDB(folder) { + return this._genuine.createNewDB(folder); + }, + registerPendingListener(folder, listener) { + this._genuine.registerPendingListener(folder, listener); + }, + unregisterPendingListener(listener) { + this._genuine.unregisterPendingListener(listener); + }, + cachedDBForFolder(folder) { + return this._genuine.cachedDBFolder(folder); + }, + get openDBs() { + return this._genuine.openDBs; + }, +}; + +function generate_messages() { + let messageGenerator = new MessageGenerator(); + let scenarioFactory = new MessageScenarioFactory(messageGenerator); + let messages = []; + messages = messages.concat(scenarioFactory.directReply(10)); + return messages; +} + +async function compact_with_exception(expectedException) { + let compactor = Cc["@mozilla.org/messenger/foldercompactor;1"].createInstance( + Ci.nsIMsgFolderCompactor + ); + let listener = new PromiseTestUtils.PromiseUrlListener(); + compactor.compactFolders([gTargetFolder], listener, null); + try { + await listener.promise; + do_throw( + "nsIMsgFolderCompactor listener wasn't called with a failure code." + ); + } catch (failureCode) { + Assert.equal(expectedException, failureCode); + } +} + +function create_local_folders() { + let rootFolder = localAccountUtils.rootFolder; + let localTrashFolder = rootFolder.getChildNamed("Trash"); + localTrashFolder.setFlag(Ci.nsMsgFolderFlags.Trash); +} + +async function delete_all_messages() { + let promiseCopyListener = new PromiseTestUtils.PromiseCopyListener(); + gTargetFolder.deleteMessages( + [...gTargetFolder.messages], + null, + false, // Do not delete storage. + true, // Is a move. + promiseCopyListener, + false // Do not allow undo, currently leaks. + ); + await promiseCopyListener.promise; +} + +add_setup(function () { + localAccountUtils.loadLocalMailAccount(); + create_local_folders(); +}); + +add_task(async function test_compact_without_failure() { + // Setup open failure folder. + gTargetFolder = + localAccountUtils.rootFolder.createLocalSubfolder("ShouldFail"); + addMessagesToFolder(generate_messages(), gTargetFolder); + + await new Promise(resolve => { + mailTestUtils.updateFolderAndNotify(gTargetFolder, resolve); + }); + // Delete messages. + await delete_all_messages(); + // Setup db service mock. + gCid = MockRegistrar.register( + "@mozilla.org/msgDatabase/msgDBService;1", + MsgDBServiceFailure + ); + // Test compact without failure. + await compact_with_exception(Cr.NS_ERROR_FILE_NOT_FOUND); + // Teardown db service mock. + MockRegistrar.unregister(gCid); +}); -- cgit v1.2.3