summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/test/unit/test_compactFailure.js
blob: 300c8abda7be0cbc96122e1f9a152fe01b31866b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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);
});