summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/folder-display/browser_savedsearchReloadAfterCompact.js
blob: 262e4b3d9413719ac32f80fdb6df90354ea068e0 (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
/* 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/. */

/**
 * Test reload of saved searches over local folders after compaction
 * of local folders.
 */

"use strict";

var utils = ChromeUtils.import("resource://testing-common/mozmill/utils.jsm");
var { gThreadManager } = ChromeUtils.import(
  "resource://testing-common/mailnews/Maild.jsm"
);

var {
  be_in_folder,
  create_folder,
  create_virtual_folder,
  get_about_3pane,
  inboxFolder,
  make_message_sets_in_folders,
  mc,
  press_delete,
  select_click_row,
} = ChromeUtils.import(
  "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
);

var otherFolder;
var folderVirtual;
var synSets;

/**
 * Add some messages to a folder, delete the first one, and create a saved
 * search over the inbox and the folder. Then, compact folders.
 */
add_task(async function test_setup_virtual_folder_and_compact() {
  otherFolder = await create_folder();
  synSets = await make_message_sets_in_folders([otherFolder], [{ count: 2 }]);

  /**
   * We delete the first message in the local folder, so compaction of the
   * folder will invalidate the key of the second message in the folder. Then,
   * we select the second message and issue the compact. This causes saving the
   * selection on the compaction notification to fail. We test the saved search
   * view still gets rebuilt, such that there is a valid msg hdr at row 0.
   */
  await be_in_folder(otherFolder);
  select_click_row(0);
  press_delete();

  folderVirtual = create_virtual_folder(
    [inboxFolder, otherFolder],
    {},
    true,
    "SavedSearch"
  );

  await be_in_folder(folderVirtual);
  select_click_row(0);
  let urlListener = {
    compactDone: false,

    OnStartRunningUrl(aUrl) {},
    OnStopRunningUrl(aUrl, aExitCode) {
      this.compactDone = true;
    },
  };
  if (otherFolder.msgStore.supportsCompaction) {
    otherFolder.compactAll(urlListener, null);

    utils.waitFor(
      () => urlListener.compactDone,
      "Timeout waiting for compact to complete",
      10000,
      100
    );
  }
  // Let the event queue clear.
  await new Promise(resolve => setTimeout(resolve));
  // Check view is still valid
  get_about_3pane().gDBView.getMsgHdrAt(0);

  Assert.report(
    false,
    undefined,
    undefined,
    "Test ran to completion successfully"
  );
});

add_task(async function endTest() {
  // Fixing possible nsIMsgDBHdr.markHasAttachments onEndMsgDownload runs.
  //  Found in chaosmode.
  var thread = gThreadManager.currentThread;
  while (thread.hasPendingEvents()) {
    thread.processNextEvent(true);
  }
  // Cleanup dbView with force.
  get_about_3pane().gDBView.close(true);
  folderVirtual.deleteSelf(null);
  otherFolder.deleteSelf(null);
});