# HG changeset patch
# User t_mrc-ct@users.sourceforge.jp
# Date 1379511761 -32400
# Branch GECKO1709esr_2013091117_RELBRANCH
# Node ID b2584057809c8fc707f1e883103696dee25648fa
# Parent  0ee636878172b8646cb9bfc8a80e530d7449a100
add test for mozBug 786487

diff --git a/mailnews/base/test/unit/test_compactFailure.js b/mailnews/base/test/unit/test_compactFailure.js
new file mode 100644
--- /dev/null
+++ b/mailnews/base/test/unit/test_compactFailure.js
@@ -0,0 +1,117 @@
+const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1";
+const kRegistrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+
+load("../../../resources/logHelper.js");
+load("../../../resources/asyncTestUtils.js");
+load("../../../resources/messageGenerator.js");
+
+Services.prefs.setCharPref("mail.serverDefaultStoreContractID",
+                           "@mozilla.org/msgstore/berkeleystore;1");
+
+let gTargetFolder;
+let gUuid;
+let gOriginalCID =
+  Components.manager.contractIDToCID(NS_LOCALFILEOUTPUTSTREAM_CONTRACTID);
+
+function LockedFileOutputStream() {
+}
+
+LockedFileOutputStream.prototype = {
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIFileOutputStream]),
+
+  init: function(file, ioFlags, perm, behaviorFlags) {
+    throw Cr.NS_ERROR_FILE_IS_LOCKED;
+  },
+}
+
+var FileOutputStreamFactory = {
+  createInstance: function(aOuter, aIid) {
+    if (aOuter)
+      do_throw(Cr.NS_ERROR_NO_AGGREGATION);
+
+    return new LockedFileOutputStream().QueryInterface(aIid);
+  },
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory])
+};
+
+function setup_output_stream_stub() {
+  gUuid = Cc["@mozilla.org/uuid-generator;1"]
+            .getService(Ci.nsIUUIDGenerator)
+            .generateUUID()
+            .toString();
+
+  kRegistrar.registerFactory(Components.ID(gUuid),
+                            "Stub for nsIFileOutputStream",
+                            NS_LOCALFILEOUTPUTSTREAM_CONTRACTID,
+                            FileOutputStreamFactory);
+}
+
+function teardown_output_stream_stub() {
+  kRegistrar.unregisterFactory(Components.ID(gUuid),
+                              FileOutputStreamFactory);
+  kRegistrar.registerFactory(gOriginalCID,
+                            "",
+                            NS_LOCALFILEOUTPUTSTREAM_CONTRACTID,
+                            null);
+}
+
+function setup_target_folder() {
+  let messageGenerator = new MessageGenerator();
+  let scenarioFactory = new MessageScenarioFactory(messageGenerator);
+  let messages = [];
+  messages = messages.concat(scenarioFactory.directReply(10));
+
+  gTargetFolder = gLocalIncomingServer.rootMsgFolder.createLocalSubfolder("Target");
+  addMessagesToFolder(messages, gTargetFolder);
+
+  updateFolderAndNotify(gTargetFolder, async_driver);
+  yield false;
+}
+
+function delete_all_messages() {
+  let enumerator = gTargetFolder.messages;
+  let headers = [];
+  while (enumerator.hasMoreElements())
+    headers.push(enumerator.getNext().QueryInterface(Ci.nsIMsgDBHdr));
+
+  let array = toXPCOMArray(headers, Ci.nsIMutableArray);
+
+  gTargetFolder.deleteMessages(array, null, false, true, asyncCopyListener, false);
+  yield false;
+}
+
+function test_compact_without_crash() {
+  let compactor = Cc["@mozilla.org/messenger/localfoldercompactor;1"]
+                    .createInstance(Ci.nsIMsgFolderCompactor);
+  let listener = new AsyncUrlListener(null, function(url, exitCode) {
+    do_throw("This listener should not be called back.");
+  });
+  try {
+    compactor.compact(gTargetFolder, false, listener, null);
+    do_throw("nsIMsgFolderCompactor.compact did not fail.");
+  } catch(ex) {
+    do_check_eq(Cr.NS_ERROR_FILE_IS_LOCKED, ex.result);
+  }
+}
+
+var tests = [
+  setup_target_folder,
+  delete_all_messages,
+  setup_output_stream_stub,
+  test_compact_without_crash,
+  teardown_output_stream_stub,
+];
+
+function create_local_folders() {
+  let rootFolder = gLocalIncomingServer.rootMsgFolder;
+  let localTrashFolder = rootFolder.getChildNamed("Trash");
+  localTrashFolder.setFlag(Ci.nsMsgFolderFlags.Trash);
+}
+
+function run_test() {
+  loadLocalMailAccount();
+  create_local_folders();
+
+  async_run_tests(tests);
+}
+
diff --git a/mailnews/base/test/unit/xpcshell.ini b/mailnews/base/test/unit/xpcshell.ini
--- a/mailnews/base/test/unit/xpcshell.ini
+++ b/mailnews/base/test/unit/xpcshell.ini
@@ -12,16 +12,17 @@
 [test_bccInDatabase.js]
 [test_bug366491.js]
 [test_bug404489.js]
 [test_bug428427.js]
 [test_bug434810.js]
 [test_bug465805.js]
 [test_bug471682.js]
 [test_bug514945.js]
+[test_compactFailure.js]
 [test_compactColumnSave.js]
 [test_copyChaining.js]
 [test_copyThenMoveManual.js]
 [test_copyToInvalidDB.js]
 [test_detachToFile.js]
 [test_emptyTrash.js]
 [test_fix_deferred_accounts.js]
 [test_folderCompact.js]
