|
ferencd@0
|
1 //
|
|
ferencd@0
|
2 // VMime library (http://www.vmime.org)
|
|
ferencd@0
|
3 // Copyright (C) 2002-2013 Vincent Richard <vincent@vmime.org>
|
|
ferencd@0
|
4 //
|
|
ferencd@0
|
5 // This program is free software; you can redistribute it and/or
|
|
ferencd@0
|
6 // modify it under the terms of the GNU General Public License as
|
|
ferencd@0
|
7 // published by the Free Software Foundation; either version 3 of
|
|
ferencd@0
|
8 // the License, or (at your option) any later version.
|
|
ferencd@0
|
9 //
|
|
ferencd@0
|
10 // This program is distributed in the hope that it will be useful,
|
|
ferencd@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ferencd@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
ferencd@0
|
13 // General Public License for more details.
|
|
ferencd@0
|
14 //
|
|
ferencd@0
|
15 // You should have received a copy of the GNU General Public License along
|
|
ferencd@0
|
16 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ferencd@0
|
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ferencd@0
|
18 //
|
|
ferencd@0
|
19 // Linking this library statically or dynamically with other modules is making
|
|
ferencd@0
|
20 // a combined work based on this library. Thus, the terms and conditions of
|
|
ferencd@0
|
21 // the GNU General Public License cover the whole combination.
|
|
ferencd@0
|
22 //
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 #include "tests/testUtils.hpp"
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26 #include "vmime/platform.hpp"
|
|
ferencd@0
|
27
|
|
ferencd@0
|
28 #include "vmime/net/maildir/maildirStore.hpp"
|
|
ferencd@0
|
29 #include "vmime/net/maildir/maildirFormat.hpp"
|
|
ferencd@0
|
30
|
|
ferencd@0
|
31
|
|
ferencd@0
|
32 // Shortcuts and helpers
|
|
ferencd@0
|
33 typedef vmime::utility::file::path fspath;
|
|
ferencd@0
|
34 typedef vmime::utility::file::path::component fspathc;
|
|
ferencd@0
|
35
|
|
ferencd@0
|
36 typedef vmime::net::folder::path fpath;
|
|
ferencd@0
|
37 typedef vmime::net::folder::path::component fpathc;
|
|
ferencd@0
|
38
|
|
ferencd@0
|
39
|
|
ferencd@0
|
40 const fpath operator/(const fpath& path, const std::string& c)
|
|
ferencd@0
|
41 {
|
|
ferencd@0
|
42 return path / fpathc(c);
|
|
ferencd@0
|
43 }
|
|
ferencd@0
|
44
|
|
ferencd@0
|
45
|
|
ferencd@0
|
46 /** Test messages */
|
|
ferencd@0
|
47 static const vmime::string TEST_MESSAGE_1 =
|
|
ferencd@0
|
48 "From: <test@vmime.org>\r\n"
|
|
ferencd@0
|
49 "Subject: VMime Test\r\n"
|
|
ferencd@0
|
50 "Date: Thu, 01 Mar 2007 09:49:35 +0100\r\n"
|
|
ferencd@0
|
51 "\r\n"
|
|
ferencd@0
|
52 "Hello, world!";
|
|
ferencd@0
|
53
|
|
ferencd@0
|
54
|
|
ferencd@0
|
55 /** Maildir trees used in tests.
|
|
ferencd@0
|
56 * Structure:
|
|
ferencd@0
|
57 *
|
|
ferencd@0
|
58 * .
|
|
ferencd@0
|
59 * |-- Folder
|
|
ferencd@0
|
60 * | `-- SubFolder
|
|
ferencd@0
|
61 * | |-- SubSubFolder1
|
|
ferencd@0
|
62 * | `-- SubSubFolder2
|
|
ferencd@0
|
63 * `-- Folder2
|
|
ferencd@0
|
64 *
|
|
ferencd@0
|
65 */
|
|
ferencd@0
|
66
|
|
ferencd@0
|
67 // KMail format
|
|
ferencd@0
|
68 static const vmime::string TEST_MAILDIR_KMAIL[] = // directories to create
|
|
ferencd@0
|
69 {
|
|
ferencd@0
|
70 "/Folder",
|
|
ferencd@0
|
71 "/Folder/new",
|
|
ferencd@0
|
72 "/Folder/tmp",
|
|
ferencd@0
|
73 "/Folder/cur",
|
|
ferencd@0
|
74 "/.Folder.directory",
|
|
ferencd@0
|
75 "/.Folder.directory/SubFolder",
|
|
ferencd@0
|
76 "/.Folder.directory/SubFolder/new",
|
|
ferencd@0
|
77 "/.Folder.directory/SubFolder/tmp",
|
|
ferencd@0
|
78 "/.Folder.directory/SubFolder/cur",
|
|
ferencd@0
|
79 "/.Folder.directory/.SubFolder.directory",
|
|
ferencd@0
|
80 "/.Folder.directory/.SubFolder.directory/SubSubFolder1",
|
|
ferencd@0
|
81 "/.Folder.directory/.SubFolder.directory/SubSubFolder1/new",
|
|
ferencd@0
|
82 "/.Folder.directory/.SubFolder.directory/SubSubFolder1/tmp",
|
|
ferencd@0
|
83 "/.Folder.directory/.SubFolder.directory/SubSubFolder1/cur",
|
|
ferencd@0
|
84 "/.Folder.directory/.SubFolder.directory/SubSubFolder2",
|
|
ferencd@0
|
85 "/.Folder.directory/.SubFolder.directory/SubSubFolder2/new",
|
|
ferencd@0
|
86 "/.Folder.directory/.SubFolder.directory/SubSubFolder2/tmp",
|
|
ferencd@0
|
87 "/.Folder.directory/.SubFolder.directory/SubSubFolder2/cur",
|
|
ferencd@0
|
88 "/Folder2",
|
|
ferencd@0
|
89 "/Folder2/new",
|
|
ferencd@0
|
90 "/Folder2/tmp",
|
|
ferencd@0
|
91 "/Folder2/cur",
|
|
ferencd@0
|
92 "*" // end
|
|
ferencd@0
|
93 };
|
|
ferencd@0
|
94
|
|
ferencd@0
|
95 static const vmime::string TEST_MAILDIRFILES_KMAIL[] = // files to create and their contents
|
|
ferencd@0
|
96 {
|
|
ferencd@0
|
97 "/.Folder.directory/.SubFolder.directory/SubSubFolder2/cur/1043236113.351.EmqD:S", TEST_MESSAGE_1,
|
|
ferencd@0
|
98 "*" // end
|
|
ferencd@0
|
99 };
|
|
ferencd@0
|
100
|
|
ferencd@0
|
101 // Courier format
|
|
ferencd@0
|
102 static const vmime::string TEST_MAILDIR_COURIER[] = // directories to create
|
|
ferencd@0
|
103 {
|
|
ferencd@0
|
104 "/.Folder",
|
|
ferencd@0
|
105 "/.Folder/new",
|
|
ferencd@0
|
106 "/.Folder/tmp",
|
|
ferencd@0
|
107 "/.Folder/cur",
|
|
ferencd@0
|
108 "/.Folder.SubFolder",
|
|
ferencd@0
|
109 "/.Folder.SubFolder",
|
|
ferencd@0
|
110 "/.Folder.SubFolder/new",
|
|
ferencd@0
|
111 "/.Folder.SubFolder/tmp",
|
|
ferencd@0
|
112 "/.Folder.SubFolder/cur",
|
|
ferencd@0
|
113 "/.Folder.SubFolder.SubSubFolder1",
|
|
ferencd@0
|
114 "/.Folder.SubFolder.SubSubFolder1/new",
|
|
ferencd@0
|
115 "/.Folder.SubFolder.SubSubFolder1/tmp",
|
|
ferencd@0
|
116 "/.Folder.SubFolder.SubSubFolder1/cur",
|
|
ferencd@0
|
117 "/.Folder.SubFolder.SubSubFolder2",
|
|
ferencd@0
|
118 "/.Folder.SubFolder.SubSubFolder2/new",
|
|
ferencd@0
|
119 "/.Folder.SubFolder.SubSubFolder2/tmp",
|
|
ferencd@0
|
120 "/.Folder.SubFolder.SubSubFolder2/cur",
|
|
ferencd@0
|
121 "/.Folder2",
|
|
ferencd@0
|
122 "/.Folder2/new",
|
|
ferencd@0
|
123 "/.Folder2/tmp",
|
|
ferencd@0
|
124 "/.Folder2/cur",
|
|
ferencd@0
|
125 "*" // end
|
|
ferencd@0
|
126 };
|
|
ferencd@0
|
127
|
|
ferencd@0
|
128 static const vmime::string TEST_MAILDIRFILES_COURIER[] = // files to create and their contents
|
|
ferencd@0
|
129 {
|
|
ferencd@0
|
130 "/.Folder/maildirfolder", "",
|
|
ferencd@0
|
131 "/.Folder.SubFolder/maildirfolder", "",
|
|
ferencd@0
|
132 "/.Folder.SubFolder.SubSubFolder1/maildirfolder", "",
|
|
ferencd@0
|
133 "/.Folder.SubFolder.SubSubFolder2/maildirfolder", "",
|
|
ferencd@0
|
134 "/.Folder.SubFolder.SubSubFolder2/cur/1043236113.351.EmqD:S", TEST_MESSAGE_1,
|
|
ferencd@0
|
135 "/.Folder2/maildirfolder", "",
|
|
ferencd@0
|
136 "*" // end
|
|
ferencd@0
|
137 };
|
|
ferencd@0
|
138
|
|
ferencd@0
|
139
|
|
ferencd@0
|
140
|
|
ferencd@0
|
141 VMIME_TEST_SUITE_BEGIN(maildirStoreTest)
|
|
ferencd@0
|
142
|
|
ferencd@0
|
143 VMIME_TEST_LIST_BEGIN
|
|
ferencd@0
|
144 VMIME_TEST(testDetectFormat_KMail)
|
|
ferencd@0
|
145 VMIME_TEST(testDetectFormat_Courier)
|
|
ferencd@0
|
146
|
|
ferencd@0
|
147 VMIME_TEST(testListRootFolders_KMail)
|
|
ferencd@0
|
148 VMIME_TEST(testListAllFolders_KMail)
|
|
ferencd@0
|
149
|
|
ferencd@0
|
150 VMIME_TEST(testListRootFolders_Courier)
|
|
ferencd@0
|
151 VMIME_TEST(testListAllFolders_Courier)
|
|
ferencd@0
|
152
|
|
ferencd@0
|
153 VMIME_TEST(testListMessages_KMail)
|
|
ferencd@0
|
154 VMIME_TEST(testListMessages_Courier)
|
|
ferencd@0
|
155
|
|
ferencd@0
|
156 VMIME_TEST(testRenameFolder_KMail)
|
|
ferencd@0
|
157 VMIME_TEST(testRenameFolder_Courier)
|
|
ferencd@0
|
158
|
|
ferencd@0
|
159 VMIME_TEST(testDestroyFolder_KMail)
|
|
ferencd@0
|
160 VMIME_TEST(testDestroyFolder_Courier)
|
|
ferencd@0
|
161
|
|
ferencd@0
|
162 VMIME_TEST(testFolderExists_KMail)
|
|
ferencd@0
|
163 VMIME_TEST(testFolderExists_Courier)
|
|
ferencd@0
|
164
|
|
ferencd@0
|
165 VMIME_TEST(testCreateFolder_KMail)
|
|
ferencd@0
|
166 VMIME_TEST(testCreateFolder_Courier)
|
|
ferencd@0
|
167 VMIME_TEST_LIST_END
|
|
ferencd@0
|
168
|
|
ferencd@0
|
169
|
|
ferencd@0
|
170 public:
|
|
ferencd@0
|
171
|
|
ferencd@0
|
172 maildirStoreTest()
|
|
ferencd@0
|
173 {
|
|
ferencd@0
|
174 // Temporary directory
|
|
ferencd@0
|
175 m_tempPath = fspath() / fspathc("tmp") // Use /tmp
|
|
ferencd@0
|
176 / fspathc("vmime" + vmime::utility::stringUtils::toString(std::time(NULL))
|
|
ferencd@0
|
177 + vmime::utility::stringUtils::toString(std::rand()));
|
|
ferencd@0
|
178 }
|
|
ferencd@0
|
179
|
|
ferencd@0
|
180 void tearDown()
|
|
ferencd@0
|
181 {
|
|
ferencd@0
|
182 // In case of an uncaught exception
|
|
ferencd@0
|
183 destroyMaildir();
|
|
ferencd@0
|
184 }
|
|
ferencd@0
|
185
|
|
ferencd@0
|
186 void testDetectFormat_KMail()
|
|
ferencd@0
|
187 {
|
|
ferencd@0
|
188 createMaildir(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
189
|
|
ferencd@0
|
190 vmime::shared_ptr <vmime::net::maildir::maildirStore> store =
|
|
ferencd@0
|
191 vmime::dynamicCast <vmime::net::maildir::maildirStore>(createAndConnectStore());
|
|
ferencd@0
|
192
|
|
ferencd@0
|
193 VASSERT_EQ("*", "kmail", store->getFormat()->getName());
|
|
ferencd@0
|
194
|
|
ferencd@0
|
195 destroyMaildir();
|
|
ferencd@0
|
196 }
|
|
ferencd@0
|
197
|
|
ferencd@0
|
198 void testDetectFormat_Courier()
|
|
ferencd@0
|
199 {
|
|
ferencd@0
|
200 createMaildir(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
201
|
|
ferencd@0
|
202 vmime::shared_ptr <vmime::net::maildir::maildirStore> store =
|
|
ferencd@0
|
203 vmime::dynamicCast <vmime::net::maildir::maildirStore>(createAndConnectStore());
|
|
ferencd@0
|
204
|
|
ferencd@0
|
205 VASSERT_EQ("*", "courier", store->getFormat()->getName());
|
|
ferencd@0
|
206
|
|
ferencd@0
|
207 destroyMaildir();
|
|
ferencd@0
|
208 }
|
|
ferencd@0
|
209
|
|
ferencd@0
|
210
|
|
ferencd@0
|
211 void testListRootFolders_KMail()
|
|
ferencd@0
|
212 {
|
|
ferencd@0
|
213 testListRootFoldersImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
214 }
|
|
ferencd@0
|
215
|
|
ferencd@0
|
216 void testListRootFolders_Courier()
|
|
ferencd@0
|
217 {
|
|
ferencd@0
|
218 testListRootFoldersImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
219 }
|
|
ferencd@0
|
220
|
|
ferencd@0
|
221 void testListRootFoldersImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
222 {
|
|
ferencd@0
|
223 createMaildir(dirs, files);
|
|
ferencd@0
|
224
|
|
ferencd@0
|
225 // Connect to store
|
|
ferencd@0
|
226 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
227 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
228
|
|
ferencd@0
|
229 // Get root folders, not recursive
|
|
ferencd@0
|
230 const std::vector <vmime::shared_ptr <vmime::net::folder> >
|
|
ferencd@0
|
231 rootFolders = rootFolder->getFolders(false);
|
|
ferencd@0
|
232
|
|
ferencd@0
|
233 VASSERT_EQ("1", 2, rootFolders.size());
|
|
ferencd@0
|
234 VASSERT("2", findFolder(rootFolders, fpath() / "Folder") != NULL);
|
|
ferencd@0
|
235 VASSERT("3", findFolder(rootFolders, fpath() / "Folder2") != NULL);
|
|
ferencd@0
|
236
|
|
ferencd@0
|
237 destroyMaildir();
|
|
ferencd@0
|
238 }
|
|
ferencd@0
|
239
|
|
ferencd@0
|
240
|
|
ferencd@0
|
241 void testListAllFolders_KMail()
|
|
ferencd@0
|
242 {
|
|
ferencd@0
|
243 testListAllFoldersImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
244 }
|
|
ferencd@0
|
245
|
|
ferencd@0
|
246 void testListAllFolders_Courier()
|
|
ferencd@0
|
247 {
|
|
ferencd@0
|
248 testListAllFoldersImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
249 }
|
|
ferencd@0
|
250
|
|
ferencd@0
|
251 void testListAllFoldersImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
252 {
|
|
ferencd@0
|
253 createMaildir(dirs, files);
|
|
ferencd@0
|
254
|
|
ferencd@0
|
255 // Connect to store
|
|
ferencd@0
|
256 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
257 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
258
|
|
ferencd@0
|
259 // Get all folders, recursive
|
|
ferencd@0
|
260 const std::vector <vmime::shared_ptr <vmime::net::folder> >
|
|
ferencd@0
|
261 allFolders = rootFolder->getFolders(true);
|
|
ferencd@0
|
262
|
|
ferencd@0
|
263 VASSERT_EQ("1", 5, allFolders.size());
|
|
ferencd@0
|
264 VASSERT("2", findFolder(allFolders, fpath() / "Folder") != NULL);
|
|
ferencd@0
|
265 VASSERT("3", findFolder(allFolders, fpath() / "Folder" / "SubFolder") != NULL);
|
|
ferencd@0
|
266 VASSERT("4", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder1") != NULL);
|
|
ferencd@0
|
267 VASSERT("5", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder2") != NULL);
|
|
ferencd@0
|
268 VASSERT("6", findFolder(allFolders, fpath() / "Folder2") != NULL);
|
|
ferencd@0
|
269
|
|
ferencd@0
|
270 destroyMaildir();
|
|
ferencd@0
|
271 }
|
|
ferencd@0
|
272
|
|
ferencd@0
|
273
|
|
ferencd@0
|
274 void testListMessages_KMail()
|
|
ferencd@0
|
275 {
|
|
ferencd@0
|
276 testListMessagesImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
277 }
|
|
ferencd@0
|
278
|
|
ferencd@0
|
279 void testListMessages_Courier()
|
|
ferencd@0
|
280 {
|
|
ferencd@0
|
281 testListMessagesImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
282 }
|
|
ferencd@0
|
283
|
|
ferencd@0
|
284 void testListMessagesImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
285 {
|
|
ferencd@0
|
286 createMaildir(dirs, files);
|
|
ferencd@0
|
287
|
|
ferencd@0
|
288 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
289 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
290
|
|
ferencd@0
|
291 vmime::shared_ptr <vmime::net::folder> folder = store->getFolder
|
|
ferencd@0
|
292 (fpath() / "Folder" / "SubFolder" / "SubSubFolder2");
|
|
ferencd@0
|
293
|
|
ferencd@0
|
294 int count, unseen;
|
|
ferencd@0
|
295 folder->status(count, unseen);
|
|
ferencd@0
|
296
|
|
ferencd@0
|
297 VASSERT_EQ("Message count", 1, count);
|
|
ferencd@0
|
298
|
|
ferencd@0
|
299 folder->open(vmime::net::folder::MODE_READ_ONLY);
|
|
ferencd@0
|
300
|
|
ferencd@0
|
301 vmime::shared_ptr <vmime::net::message> msg = folder->getMessage(1);
|
|
ferencd@0
|
302
|
|
ferencd@0
|
303 folder->fetchMessage(msg, vmime::net::fetchAttributes::SIZE);
|
|
ferencd@0
|
304
|
|
ferencd@0
|
305 VASSERT_EQ("Message size", TEST_MESSAGE_1.length(), msg->getSize());
|
|
ferencd@0
|
306
|
|
ferencd@0
|
307 std::ostringstream oss;
|
|
ferencd@0
|
308 vmime::utility::outputStreamAdapter os(oss);
|
|
ferencd@0
|
309 msg->extract(os);
|
|
ferencd@0
|
310
|
|
ferencd@0
|
311 VASSERT_EQ("Message contents", TEST_MESSAGE_1, oss.str());
|
|
ferencd@0
|
312
|
|
ferencd@0
|
313 folder->close(false);
|
|
ferencd@0
|
314
|
|
ferencd@0
|
315 destroyMaildir();
|
|
ferencd@0
|
316 }
|
|
ferencd@0
|
317
|
|
ferencd@0
|
318
|
|
ferencd@0
|
319 void testRenameFolder_KMail()
|
|
ferencd@0
|
320 {
|
|
ferencd@0
|
321 try
|
|
ferencd@0
|
322 {
|
|
ferencd@0
|
323 testRenameFolderImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
324 }
|
|
ferencd@0
|
325 catch (vmime::exception& e)
|
|
ferencd@0
|
326 {
|
|
ferencd@0
|
327 std::cerr << e;
|
|
ferencd@0
|
328 throw e;
|
|
ferencd@0
|
329 }
|
|
ferencd@0
|
330 }
|
|
ferencd@0
|
331
|
|
ferencd@0
|
332 void testRenameFolder_Courier()
|
|
ferencd@0
|
333 {
|
|
ferencd@0
|
334 try
|
|
ferencd@0
|
335 {
|
|
ferencd@0
|
336 testRenameFolderImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
337 }
|
|
ferencd@0
|
338 catch (vmime::exception& e)
|
|
ferencd@0
|
339 {
|
|
ferencd@0
|
340 std::cerr << e;
|
|
ferencd@0
|
341 throw e;
|
|
ferencd@0
|
342 }
|
|
ferencd@0
|
343 }
|
|
ferencd@0
|
344
|
|
ferencd@0
|
345 void testRenameFolderImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
346 {
|
|
ferencd@0
|
347 createMaildir(dirs, files);
|
|
ferencd@0
|
348
|
|
ferencd@0
|
349 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
350 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
351
|
|
ferencd@0
|
352 // Rename "Folder/SubFolder" to "Folder/foo"
|
|
ferencd@0
|
353 vmime::shared_ptr <vmime::net::folder> folder = store->getFolder
|
|
ferencd@0
|
354 (fpath() / "Folder" / "SubFolder");
|
|
ferencd@0
|
355
|
|
ferencd@0
|
356 folder->rename(fpath() / "Folder" / "foo");
|
|
ferencd@0
|
357
|
|
ferencd@0
|
358 // Ensure folder and its subfolders have been renamed
|
|
ferencd@0
|
359 const std::vector <vmime::shared_ptr <vmime::net::folder> >
|
|
ferencd@0
|
360 allFolders = rootFolder->getFolders(true);
|
|
ferencd@0
|
361
|
|
ferencd@0
|
362 VASSERT_EQ("1", 5, allFolders.size());
|
|
ferencd@0
|
363 VASSERT("2", findFolder(allFolders, fpath() / "Folder") != NULL);
|
|
ferencd@0
|
364 VASSERT("3", findFolder(allFolders, fpath() / "Folder" / "SubFolder") == NULL);
|
|
ferencd@0
|
365 VASSERT("4", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder1") == NULL);
|
|
ferencd@0
|
366 VASSERT("5", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder2") == NULL);
|
|
ferencd@0
|
367 VASSERT("6", findFolder(allFolders, fpath() / "Folder2") != NULL);
|
|
ferencd@0
|
368 VASSERT("7", findFolder(allFolders, fpath() / "Folder" / "foo") != NULL);
|
|
ferencd@0
|
369 VASSERT("8", findFolder(allFolders, fpath() / "Folder" / "foo" / "SubSubFolder1") != NULL);
|
|
ferencd@0
|
370 VASSERT("9", findFolder(allFolders, fpath() / "Folder" / "foo" / "SubSubFolder2") != NULL);
|
|
ferencd@0
|
371
|
|
ferencd@0
|
372 destroyMaildir();
|
|
ferencd@0
|
373 }
|
|
ferencd@0
|
374
|
|
ferencd@0
|
375
|
|
ferencd@0
|
376 void testDestroyFolder_KMail()
|
|
ferencd@0
|
377 {
|
|
ferencd@0
|
378 testDestroyFolderImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
379 }
|
|
ferencd@0
|
380
|
|
ferencd@0
|
381 void testDestroyFolder_Courier()
|
|
ferencd@0
|
382 {
|
|
ferencd@0
|
383 testDestroyFolderImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
384 }
|
|
ferencd@0
|
385
|
|
ferencd@0
|
386 void testDestroyFolderImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
387 {
|
|
ferencd@0
|
388 createMaildir(dirs, files);
|
|
ferencd@0
|
389
|
|
ferencd@0
|
390 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
391 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
392
|
|
ferencd@0
|
393 // Destroy "Folder/SubFolder" (total: 3 folders)
|
|
ferencd@0
|
394 vmime::shared_ptr <vmime::net::folder> folder = store->getFolder
|
|
ferencd@0
|
395 (fpath() / "Folder" / "SubFolder");
|
|
ferencd@0
|
396
|
|
ferencd@0
|
397 folder->destroy();
|
|
ferencd@0
|
398
|
|
ferencd@0
|
399 // Ensure folder and its subfolders have been deleted and other folders still exist
|
|
ferencd@0
|
400 const std::vector <vmime::shared_ptr <vmime::net::folder> >
|
|
ferencd@0
|
401 allFolders = rootFolder->getFolders(true);
|
|
ferencd@0
|
402
|
|
ferencd@0
|
403 VASSERT_EQ("1", 2, allFolders.size());
|
|
ferencd@0
|
404 VASSERT("2", findFolder(allFolders, fpath() / "Folder") != NULL);
|
|
ferencd@0
|
405 VASSERT("3", findFolder(allFolders, fpath() / "Folder" / "SubFolder") == NULL);
|
|
ferencd@0
|
406 VASSERT("4", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder1") == NULL);
|
|
ferencd@0
|
407 VASSERT("5", findFolder(allFolders, fpath() / "Folder" / "SubFolder" / "SubSubFolder2") == NULL);
|
|
ferencd@0
|
408 VASSERT("6", findFolder(allFolders, fpath() / "Folder2") != NULL);
|
|
ferencd@0
|
409
|
|
ferencd@0
|
410 destroyMaildir();
|
|
ferencd@0
|
411 }
|
|
ferencd@0
|
412
|
|
ferencd@0
|
413
|
|
ferencd@0
|
414 void testFolderExists_KMail()
|
|
ferencd@0
|
415 {
|
|
ferencd@0
|
416 testFolderExistsImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
417 }
|
|
ferencd@0
|
418
|
|
ferencd@0
|
419 void testFolderExists_Courier()
|
|
ferencd@0
|
420 {
|
|
ferencd@0
|
421 testFolderExistsImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
422 }
|
|
ferencd@0
|
423
|
|
ferencd@0
|
424 void testFolderExistsImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
425 {
|
|
ferencd@0
|
426 createMaildir(dirs, files);
|
|
ferencd@0
|
427
|
|
ferencd@0
|
428 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
429 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
430
|
|
ferencd@0
|
431 VASSERT("1", store->getFolder(fpath() / "Folder" / "SubFolder")->exists());
|
|
ferencd@0
|
432 VASSERT("2", !store->getFolder(fpath() / "Folder" / "SubSubFolder1")->exists());
|
|
ferencd@0
|
433 VASSERT("3", store->getFolder(fpath() / "Folder2")->exists());
|
|
ferencd@0
|
434 VASSERT("4", store->getFolder(fpath() / "Folder" / "SubFolder" / "SubSubFolder2")->exists());
|
|
ferencd@0
|
435
|
|
ferencd@0
|
436 destroyMaildir();
|
|
ferencd@0
|
437 }
|
|
ferencd@0
|
438
|
|
ferencd@0
|
439
|
|
ferencd@0
|
440 void testCreateFolder_KMail()
|
|
ferencd@0
|
441 {
|
|
ferencd@0
|
442 testCreateFolderImpl(TEST_MAILDIR_KMAIL, TEST_MAILDIRFILES_KMAIL);
|
|
ferencd@0
|
443 }
|
|
ferencd@0
|
444
|
|
ferencd@0
|
445 void testCreateFolder_Courier()
|
|
ferencd@0
|
446 {
|
|
ferencd@0
|
447 testCreateFolderImpl(TEST_MAILDIR_COURIER, TEST_MAILDIRFILES_COURIER);
|
|
ferencd@0
|
448 }
|
|
ferencd@0
|
449
|
|
ferencd@0
|
450 void testCreateFolderImpl(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
451 {
|
|
ferencd@0
|
452 createMaildir(dirs, files);
|
|
ferencd@0
|
453
|
|
ferencd@0
|
454 vmime::shared_ptr <vmime::net::store> store = createAndConnectStore();
|
|
ferencd@0
|
455 vmime::shared_ptr <vmime::net::folder> rootFolder = store->getRootFolder();
|
|
ferencd@0
|
456
|
|
ferencd@0
|
457 VASSERT("Before", !store->getFolder(fpath() / "Folder" / "NewFolder")->exists());
|
|
ferencd@0
|
458
|
|
ferencd@0
|
459 vmime::net::folderAttributes attribs;
|
|
ferencd@0
|
460 attribs.setType(vmime::net::folderAttributes::TYPE_CONTAINS_MESSAGES);
|
|
ferencd@0
|
461
|
|
ferencd@0
|
462 VASSERT_NO_THROW("Creation", store->getFolder(fpath() / "Folder" / "NewFolder")->create(attribs));
|
|
ferencd@0
|
463
|
|
ferencd@0
|
464 VASSERT("After", store->getFolder(fpath() / "Folder" / "NewFolder")->exists());
|
|
ferencd@0
|
465
|
|
ferencd@0
|
466 destroyMaildir();
|
|
ferencd@0
|
467 }
|
|
ferencd@0
|
468
|
|
ferencd@0
|
469 private:
|
|
ferencd@0
|
470
|
|
ferencd@0
|
471 vmime::utility::file::path m_tempPath;
|
|
ferencd@0
|
472
|
|
ferencd@0
|
473
|
|
ferencd@0
|
474 vmime::shared_ptr <vmime::net::store> createAndConnectStore()
|
|
ferencd@0
|
475 {
|
|
ferencd@0
|
476 vmime::shared_ptr <vmime::net::session> session =
|
|
ferencd@0
|
477 vmime::make_shared <vmime::net::session>();
|
|
ferencd@0
|
478
|
|
ferencd@0
|
479 vmime::shared_ptr <vmime::net::store> store =
|
|
ferencd@0
|
480 session->getStore(getStoreURL());
|
|
ferencd@0
|
481
|
|
ferencd@0
|
482 store->connect();
|
|
ferencd@0
|
483
|
|
ferencd@0
|
484 return store;
|
|
ferencd@0
|
485 }
|
|
ferencd@0
|
486
|
|
ferencd@0
|
487 const vmime::shared_ptr <vmime::net::folder> findFolder
|
|
ferencd@0
|
488 (const std::vector <vmime::shared_ptr <vmime::net::folder> >& folders,
|
|
ferencd@0
|
489 const vmime::net::folder::path& path)
|
|
ferencd@0
|
490 {
|
|
ferencd@0
|
491 for (unsigned int i = 0, n = folders.size() ; i < n ; ++i)
|
|
ferencd@0
|
492 {
|
|
ferencd@0
|
493 if (folders[i]->getFullPath() == path)
|
|
ferencd@0
|
494 return folders[i];
|
|
ferencd@0
|
495 }
|
|
ferencd@0
|
496
|
|
ferencd@0
|
497 return vmime::null;
|
|
ferencd@0
|
498 }
|
|
ferencd@0
|
499
|
|
ferencd@0
|
500 const vmime::utility::url getStoreURL()
|
|
ferencd@0
|
501 {
|
|
ferencd@0
|
502 vmime::shared_ptr <vmime::utility::fileSystemFactory> fsf =
|
|
ferencd@0
|
503 vmime::platform::getHandler()->getFileSystemFactory();
|
|
ferencd@0
|
504
|
|
ferencd@0
|
505 vmime::utility::url url(std::string("maildir://localhost")
|
|
ferencd@0
|
506 + fsf->pathToString(m_tempPath));
|
|
ferencd@0
|
507
|
|
ferencd@0
|
508 return url;
|
|
ferencd@0
|
509 }
|
|
ferencd@0
|
510
|
|
ferencd@0
|
511 void createMaildir(const vmime::string* const dirs, const vmime::string* const files)
|
|
ferencd@0
|
512 {
|
|
ferencd@0
|
513 vmime::shared_ptr <vmime::utility::fileSystemFactory> fsf =
|
|
ferencd@0
|
514 vmime::platform::getHandler()->getFileSystemFactory();
|
|
ferencd@0
|
515
|
|
ferencd@0
|
516 vmime::shared_ptr <vmime::utility::file> rootDir = fsf->create(m_tempPath);
|
|
ferencd@0
|
517 rootDir->createDirectory(false);
|
|
ferencd@0
|
518
|
|
ferencd@0
|
519 for (vmime::string const* dir = dirs ; *dir != "*" ; ++dir)
|
|
ferencd@0
|
520 {
|
|
ferencd@0
|
521 vmime::shared_ptr <vmime::utility::file> fdir = fsf->create(m_tempPath / fsf->stringToPath(*dir));
|
|
ferencd@0
|
522 fdir->createDirectory(false);
|
|
ferencd@0
|
523 }
|
|
ferencd@0
|
524
|
|
ferencd@0
|
525 for (vmime::string const* file = files ; *file != "*" ; file += 2)
|
|
ferencd@0
|
526 {
|
|
ferencd@0
|
527 const vmime::string& contents = *(file + 1);
|
|
ferencd@0
|
528
|
|
ferencd@0
|
529 vmime::shared_ptr <vmime::utility::file> ffile = fsf->create(m_tempPath / fsf->stringToPath(*file));
|
|
ferencd@0
|
530 ffile->createFile();
|
|
ferencd@0
|
531
|
|
ferencd@0
|
532 vmime::shared_ptr <vmime::utility::fileWriter> fileWriter = ffile->getFileWriter();
|
|
ferencd@0
|
533 vmime::shared_ptr <vmime::utility::outputStream> os = fileWriter->getOutputStream();
|
|
ferencd@0
|
534
|
|
ferencd@0
|
535 os->write(contents.data(), contents.length());
|
|
ferencd@0
|
536 os->flush();
|
|
ferencd@0
|
537
|
|
ferencd@0
|
538 fileWriter = vmime::null;
|
|
ferencd@0
|
539 }
|
|
ferencd@0
|
540
|
|
ferencd@0
|
541 }
|
|
ferencd@0
|
542
|
|
ferencd@0
|
543 void destroyMaildir()
|
|
ferencd@0
|
544 {
|
|
ferencd@0
|
545 vmime::shared_ptr <vmime::utility::fileSystemFactory> fsf =
|
|
ferencd@0
|
546 vmime::platform::getHandler()->getFileSystemFactory();
|
|
ferencd@0
|
547
|
|
ferencd@0
|
548 recursiveDelete(fsf->create(m_tempPath));
|
|
ferencd@0
|
549 }
|
|
ferencd@0
|
550
|
|
ferencd@0
|
551 void recursiveDelete(vmime::shared_ptr <vmime::utility::file> dir)
|
|
ferencd@0
|
552 {
|
|
ferencd@0
|
553 if (!dir->exists() || !dir->isDirectory())
|
|
ferencd@0
|
554 return;
|
|
ferencd@0
|
555
|
|
ferencd@0
|
556 vmime::shared_ptr <vmime::utility::fileIterator> files = dir->getFiles();
|
|
ferencd@0
|
557
|
|
ferencd@0
|
558 // First, delete files and subdirectories in this directory
|
|
ferencd@0
|
559 while (files->hasMoreElements())
|
|
ferencd@0
|
560 {
|
|
ferencd@0
|
561 vmime::shared_ptr <vmime::utility::file> file = files->nextElement();
|
|
ferencd@0
|
562
|
|
ferencd@0
|
563 if (file->isDirectory())
|
|
ferencd@0
|
564 {
|
|
ferencd@0
|
565 recursiveDelete(file);
|
|
ferencd@0
|
566 }
|
|
ferencd@0
|
567 else
|
|
ferencd@0
|
568 {
|
|
ferencd@0
|
569 try
|
|
ferencd@0
|
570 {
|
|
ferencd@0
|
571 file->remove();
|
|
ferencd@0
|
572 }
|
|
ferencd@0
|
573 catch (vmime::exceptions::filesystem_exception&)
|
|
ferencd@0
|
574 {
|
|
ferencd@0
|
575 // Ignore
|
|
ferencd@0
|
576 }
|
|
ferencd@0
|
577 }
|
|
ferencd@0
|
578 }
|
|
ferencd@0
|
579
|
|
ferencd@0
|
580 // Then, delete this (empty) directory
|
|
ferencd@0
|
581 try
|
|
ferencd@0
|
582 {
|
|
ferencd@0
|
583 dir->remove();
|
|
ferencd@0
|
584 }
|
|
ferencd@0
|
585 catch (vmime::exceptions::filesystem_exception&)
|
|
ferencd@0
|
586 {
|
|
ferencd@0
|
587 // Ignore
|
|
ferencd@0
|
588 }
|
|
ferencd@0
|
589 }
|
|
ferencd@0
|
590
|
|
ferencd@0
|
591 VMIME_TEST_SUITE_END
|
|
ferencd@0
|
592
|