annotate 3rdparty/vmime/tests/net/maildir/maildirStoreTest.cpp @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
rev   line source
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