MaildirWritableTest.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. <?php
  2. /**
  3. * @category Zend
  4. * @package Zend_Mail
  5. * @subpackage UnitTests
  6. */
  7. /**
  8. * Zend_Mail_Storage_Folder_Maildir
  9. */
  10. require_once 'Zend/Mail/Storage/Writable/Maildir.php';
  11. /**
  12. * PHPUnit test case
  13. */
  14. require_once 'PHPUnit/Framework/TestCase.php';
  15. /**
  16. * @category Zend
  17. * @package Zend_Mail
  18. * @subpackage UnitTests
  19. */
  20. class Zend_Mail_MaildirWritableTest extends PHPUnit_Framework_TestCase
  21. {
  22. protected $_params;
  23. protected $_originalDir;
  24. protected $_tmpdir;
  25. protected $_subdirs = array('.', '.subfolder', '.subfolder.test');
  26. public function setUp()
  27. {
  28. $this->_originalDir = dirname(__FILE__) . '/_files/test.maildir/';
  29. if (!is_dir($this->_originalDir . '/cur/')) {
  30. $this->markTestSkipped('You have to unpack maildir.tar in Zend/Mail/_files/test.maildir/ '
  31. . 'directory before enabling the maildir tests');
  32. return;
  33. }
  34. if ($this->_tmpdir == null) {
  35. if (TESTS_ZEND_MAIL_TEMPDIR != null) {
  36. $this->_tmpdir = TESTS_ZEND_MAIL_TEMPDIR;
  37. } else {
  38. $this->_tmpdir = dirname(__FILE__) . '/_files/test.tmp/';
  39. }
  40. if (!file_exists($this->_tmpdir)) {
  41. mkdir($this->_tmpdir);
  42. }
  43. $count = 0;
  44. $dh = opendir($this->_tmpdir);
  45. while (readdir($dh) !== false) {
  46. ++$count;
  47. }
  48. closedir($dh);
  49. if ($count != 2) {
  50. $this->markTestSkipped('Are you sure your tmp dir is a valid empty dir?');
  51. return;
  52. }
  53. }
  54. $this->_params = array();
  55. $this->_params['dirname'] = $this->_tmpdir;
  56. foreach ($this->_subdirs as $dir) {
  57. if ($dir != '.') {
  58. mkdir($this->_tmpdir . $dir);
  59. }
  60. foreach (array('cur', 'new') as $subdir) {
  61. if (!file_exists($this->_originalDir . $dir . '/' . $subdir)) {
  62. continue;
  63. }
  64. mkdir($this->_tmpdir . $dir . '/' . $subdir);
  65. $dh = opendir($this->_originalDir . $dir . '/' . $subdir);
  66. while (($entry = readdir($dh)) !== false) {
  67. $entry = $dir . '/' . $subdir . '/' . $entry;
  68. if (!is_file($this->_originalDir . $entry)) {
  69. continue;
  70. }
  71. copy($this->_originalDir . $entry, $this->_tmpdir . $entry);
  72. }
  73. closedir($dh);
  74. }
  75. copy($this->_originalDir . 'maildirsize', $this->_tmpdir . 'maildirsize');
  76. }
  77. }
  78. public function tearDown()
  79. {
  80. foreach (array_reverse($this->_subdirs) as $dir) {
  81. if (!file_exists($this->_tmpdir . $dir)) {
  82. continue;
  83. }
  84. foreach (array('cur', 'new', 'tmp') as $subdir) {
  85. if (!file_exists($this->_tmpdir . $dir . '/' . $subdir)) {
  86. continue;
  87. }
  88. $dh = opendir($this->_tmpdir . $dir . '/' . $subdir);
  89. while (($entry = readdir($dh)) !== false) {
  90. $entry = $this->_tmpdir . $dir . '/' . $subdir . '/' . $entry;
  91. if (!is_file($entry)) {
  92. continue;
  93. }
  94. unlink($entry);
  95. }
  96. closedir($dh);
  97. rmdir($this->_tmpdir . $dir . '/' . $subdir);
  98. }
  99. if ($dir != '.') {
  100. rmdir($this->_tmpdir . $dir);
  101. }
  102. }
  103. @unlink($this->_tmpdir . 'maildirsize');
  104. }
  105. public function testCreateFolder()
  106. {
  107. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  108. $mail->createFolder('subfolder.test1');
  109. $mail->createFolder('test2', 'INBOX.subfolder');
  110. $mail->createFolder('test3', $mail->getFolders()->subfolder);
  111. $mail->createFolder('foo.bar');
  112. try {
  113. $mail->selectFolder($mail->getFolders()->subfolder->test1);
  114. $mail->selectFolder($mail->getFolders()->subfolder->test2);
  115. $mail->selectFolder($mail->getFolders()->subfolder->test3);
  116. $mail->selectFolder($mail->getFolders()->foo->bar);
  117. } catch (Exception $e) {
  118. $this->fail('could not get new folders');
  119. }
  120. // to tear down
  121. $this->_subdirs[] = '.subfolder.test1';
  122. $this->_subdirs[] = '.subfolder.test2';
  123. $this->_subdirs[] = '.subfolder.test3';
  124. $this->_subdirs[] = '.foo';
  125. $this->_subdirs[] = '.foo.bar';
  126. }
  127. public function testCreateFolderEmtpyPart()
  128. {
  129. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  130. try {
  131. $mail->createFolder('foo..bar');
  132. } catch (Exception $e) {
  133. return; //ok
  134. }
  135. $this->fail('no exception while creating folder with empty part name');
  136. }
  137. public function testCreateFolderSlash()
  138. {
  139. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  140. try {
  141. $mail->createFolder('foo/bar');
  142. } catch (Exception $e) {
  143. return; //ok
  144. }
  145. $this->fail('no exception while creating folder with slash');
  146. }
  147. public function testCreateFolderDirectorySeparator()
  148. {
  149. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  150. try {
  151. $mail->createFolder('foo' . DIRECTORY_SEPARATOR . 'bar');
  152. } catch (Exception $e) {
  153. return; //ok
  154. }
  155. $this->fail('no exception while creating folder with DIRECTORY_SEPARATOR');
  156. }
  157. public function testCreateFolderExistingDir()
  158. {
  159. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  160. unset($mail->getFolders()->subfolder->test);
  161. try {
  162. $mail->createFolder('subfolder.test');
  163. } catch (Exception $e) {
  164. return; // ok
  165. }
  166. $this->fail('should not be able to create existing folder');
  167. }
  168. public function testCreateExistingFolder()
  169. {
  170. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  171. try {
  172. $mail->createFolder('subfolder.test');
  173. } catch (Exception $e) {
  174. return; // ok
  175. }
  176. $this->fail('should not be able to create existing folder');
  177. }
  178. public function testRemoveFolderName()
  179. {
  180. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  181. $mail->removeFolder('INBOX.subfolder.test');
  182. try {
  183. $mail->selectFolder($mail->getFolders()->subfolder->test);
  184. } catch (Exception $e) {
  185. return; // ok
  186. }
  187. $this->fail('folder still exists');
  188. }
  189. public function testRemoveFolderInstance()
  190. {
  191. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  192. $mail->removeFolder($mail->getFolders()->subfolder->test);
  193. try {
  194. $mail->selectFolder($mail->getFolders()->subfolder->test);
  195. } catch (Exception $e) {
  196. return; // ok
  197. }
  198. $this->fail('folder still exists');
  199. }
  200. public function testRemoveFolderWithChildren()
  201. {
  202. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  203. try {
  204. $mail->removeFolder($mail->getFolders()->subfolder);
  205. } catch (Exception $e) {
  206. return; // ok
  207. }
  208. $this->fail('should not be able to remove a folder with children');
  209. }
  210. public function testRemoveSelectedFolder()
  211. {
  212. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  213. $mail->selectFolder('subfolder.test');
  214. try {
  215. $mail->removeFolder('subfolder.test');
  216. } catch (Exception $e) {
  217. return; // ok
  218. }
  219. $this->fail('no error while removing selected folder');
  220. }
  221. public function testRemoveInvalidFolder()
  222. {
  223. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  224. try {
  225. $mail->removeFolder('thisFolderDoestNotExist');
  226. } catch (Exception $e) {
  227. return; // ok
  228. }
  229. $this->fail('no error while removing invalid folder');
  230. }
  231. public function testRenameFolder()
  232. {
  233. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  234. try {
  235. $mail->renameFolder('INBOX.subfolder', 'INBOX.foo');
  236. $mail->renameFolder($mail->getFolders()->foo, 'subfolder');
  237. } catch (Exception $e) {
  238. $this->fail('renaming failed');
  239. }
  240. try {
  241. $mail->renameFolder('INBOX', 'foo');
  242. } catch (Exception $e) {
  243. return; // ok
  244. }
  245. $this->fail('no error while renaming INBOX');
  246. }
  247. public function testRenameSelectedFolder()
  248. {
  249. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  250. $mail->selectFolder('subfolder.test');
  251. try {
  252. $mail->renameFolder('subfolder.test', 'foo');
  253. } catch (Exception $e) {
  254. return; // ok
  255. }
  256. $this->fail('no error while renaming selected folder');
  257. }
  258. public function testRenameToChild()
  259. {
  260. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  261. try {
  262. $mail->renameFolder('subfolder.test', 'subfolder.test.foo');
  263. } catch (Exception $e) {
  264. return; // ok
  265. }
  266. $this->fail('no error while renaming folder to child of old');
  267. }
  268. public function testAppend()
  269. {
  270. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  271. $count = $mail->countMessages();
  272. $message = '';
  273. $message .= "From: me@example.org\r\n";
  274. $message .= "To: you@example.org\r\n";
  275. $message .= "Subject: append test\r\n";
  276. $message .= "\r\n";
  277. $message .= "This is a test\r\n";
  278. $mail->appendMessage($message);
  279. $this->assertEquals($count + 1, $mail->countMessages());
  280. $this->assertEquals($mail->getMessage($count + 1)->subject, 'append test');
  281. }
  282. public function testCopy()
  283. {
  284. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  285. $mail->selectFolder('subfolder.test');
  286. $count = $mail->countMessages();
  287. $mail->selectFolder('INBOX');
  288. $message = $mail->getMessage(1);
  289. $mail->copyMessage(1, 'subfolder.test');
  290. $mail->selectFolder('subfolder.test');
  291. $this->assertEquals($count + 1, $mail->countMessages());
  292. $this->assertEquals($mail->getMessage($count + 1)->subject, $message->subject);
  293. $this->assertEquals($mail->getMessage($count + 1)->from, $message->from);
  294. $this->assertEquals($mail->getMessage($count + 1)->to, $message->to);
  295. try {
  296. $mail->copyMessage(1, 'justARandomFolder');
  297. } catch (Exception $e) {
  298. return; // ok
  299. }
  300. $this->fail('no error while copying to wrong folder');
  301. }
  302. public function testSetFlags()
  303. {
  304. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  305. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN));
  306. $message = $mail->getMessage(1);
  307. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  308. $this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  309. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN, Zend_Mail_Storage::FLAG_FLAGGED));
  310. $message = $mail->getMessage(1);
  311. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  312. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  313. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_FLAGGED));
  314. $message = $mail->getMessage(1);
  315. $this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  316. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  317. try {
  318. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_RECENT));
  319. } catch (Exception $e) {
  320. return; // ok
  321. }
  322. $this->fail('should not be able to set recent flag');
  323. }
  324. public function testSetFlagsRemovedFile()
  325. {
  326. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  327. unlink($this->_params['dirname'] . 'cur/1000000000.P1.example.org:2,S');
  328. try {
  329. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_FLAGGED));
  330. } catch (Exception $e) {
  331. return; // ok
  332. }
  333. $this->fail('should not be able to set flags with removed file');
  334. }
  335. public function testRemove()
  336. {
  337. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  338. $count = $mail->countMessages();
  339. $mail->removeMessage(1);
  340. $this->assertEquals($mail->countMessages(), --$count);
  341. unset($mail[2]);
  342. $this->assertEquals($mail->countMessages(), --$count);
  343. }
  344. public function testRemoveRemovedFile()
  345. {
  346. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  347. unlink($this->_params['dirname'] . 'cur/1000000000.P1.example.org:2,S');
  348. try {
  349. $mail->removeMessage(1);
  350. } catch (Exception $e) {
  351. return; // ok
  352. }
  353. $this->fail('should not be able to remove message which is already removed in fs');
  354. }
  355. public function testCheckQuota()
  356. {
  357. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  358. $this->assertFalse($mail->checkQuota());
  359. }
  360. public function testCheckQuotaDetailed()
  361. {
  362. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  363. $quotaResult = array(
  364. 'size' => 2596,
  365. 'count' => 6,
  366. 'quota' => array(
  367. 'count' => 10,
  368. 'L' => 1,
  369. 'size' => 3000
  370. ),
  371. 'over_quota' => false
  372. );
  373. $this->assertEquals($mail->checkQuota(true), $quotaResult);
  374. }
  375. public function testSetQuota()
  376. {
  377. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  378. $this->assertNull($mail->getQuota());
  379. $mail->setQuota(true);
  380. $this->assertTrue($mail->getQuota());
  381. $mail->setQuota(false);
  382. $this->assertFalse($mail->getQuota());
  383. $mail->setQuota(array('size' => 100, 'count' => 2, 'X' => 0));
  384. $this->assertEquals($mail->getQuota(), array('size' => 100, 'count' => 2, 'X' => 0));
  385. $this->assertEquals($mail->getQuota(true), array('size' => 3000, 'L' => 1, 'count' => 10));
  386. $quotaResult = array(
  387. 'size' => 2596,
  388. 'count' => 6,
  389. 'quota' => array(
  390. 'size' => 100,
  391. 'count' => 2,
  392. 'X' => 0
  393. ),
  394. 'over_quota' => true
  395. );
  396. $this->assertEquals($mail->checkQuota(true, true), $quotaResult);
  397. $this->assertEquals($mail->getQuota(true), array('size' => 100, 'count' => 2, 'X' => 0));
  398. }
  399. public function testMissingMaildirsize()
  400. {
  401. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  402. $this->assertEquals($mail->getQuota(true), array('size' => 3000, 'L' => 1, 'count' => 10));
  403. unlink($this->_tmpdir . 'maildirsize');
  404. $this->assertNull($mail->getQuota());
  405. try {
  406. $mail->getQuota(true);
  407. } catch(Zend_Mail_Exception $e) {
  408. // ok
  409. return;
  410. }
  411. $this->fail('get quota from file should fail if file is missing');
  412. }
  413. public function testMissingMaildirsizeWithFixedQuota()
  414. {
  415. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  416. unlink($this->_tmpdir . 'maildirsize');
  417. $mail->setQuota(array('size' => 100, 'count' => 2, 'X' => 0));
  418. $quotaResult = array(
  419. 'size' => 2596,
  420. 'count' => 6,
  421. 'quota' => array(
  422. 'size' => 100,
  423. 'count' => 2,
  424. 'X' => 0
  425. ),
  426. 'over_quota' => true
  427. );
  428. $this->assertEquals($mail->checkQuota(true), $quotaResult);
  429. $this->assertEquals($mail->getQuota(true), $quotaResult['quota']);
  430. }
  431. public function testAppendMessage()
  432. {
  433. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  434. $mail->setQuota(array('size' => 3000, 'count' => 6, 'X' => 0));
  435. $this->assertFalse($mail->checkQuota(false, true));
  436. $mail->appendMessage("Subject: test\r\n\r\n");
  437. $quotaResult = array(
  438. 'size' => 2613,
  439. 'count' => 7,
  440. 'quota' => array(
  441. 'size' => 3000,
  442. 'count' => 6,
  443. 'X' => 0
  444. ),
  445. 'over_quota' => true
  446. );
  447. $this->assertEquals($mail->checkQuota(true), $quotaResult);
  448. $mail->setQuota(false);
  449. $this->assertTrue($mail->checkQuota());
  450. try {
  451. $mail->appendMessage("Subject: test\r\n\r\n");
  452. } catch(Zend_Mail_Exception $e) {
  453. $this->fail('appending should not fail if quota check is not active');
  454. }
  455. $mail->setQuota(true);
  456. $this->assertTrue($mail->checkQuota());
  457. try {
  458. $mail->appendMessage("Subject: test\r\n\r\n");
  459. } catch(Zend_Mail_Exception $e) {
  460. // ok
  461. return;
  462. }
  463. $this->fail('appending after being over quota should fail');
  464. }
  465. public function testRemoveMessage()
  466. {
  467. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  468. $mail->setQuota(array('size' => 3000, 'count' => 5, 'X' => 0));
  469. $this->assertTrue($mail->checkQuota(false, true));
  470. $mail->removeMessage(1);
  471. $this->assertFalse($mail->checkQuota());
  472. }
  473. public function testCopyMessage()
  474. {
  475. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  476. $mail->setQuota(array('size' => 3000, 'count' => 6, 'X' => 0));
  477. $this->assertFalse($mail->checkQuota(false, true));
  478. $mail->copyMessage(1, 'subfolder');
  479. $quotaResult = array(
  480. 'size' => 2993,
  481. 'count' => 7,
  482. 'quota' => array(
  483. 'size' => 3000,
  484. 'count' => 6,
  485. 'X' => 0
  486. ),
  487. 'over_quota' => true
  488. );
  489. $this->assertEquals($mail->checkQuota(true), $quotaResult);
  490. }
  491. public function testAppendStream()
  492. {
  493. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  494. $fh = fopen('php://memory', 'rw');
  495. fputs($fh, "Subject: test\r\n\r\n");
  496. fseek($fh, 0);
  497. $mail->appendMessage($fh);
  498. fclose($fh);
  499. $this->assertEquals($mail->getMessage($mail->countMessages())->subject, 'test');
  500. }
  501. public function testMove()
  502. {
  503. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  504. $target = $mail->getFolders()->subfolder->test;
  505. $mail->selectFolder($target);
  506. $toCount = $mail->countMessages();
  507. $mail->selectFolder('INBOX');
  508. $fromCount = $mail->countMessages();
  509. $mail->moveMessage(1, $target);
  510. $this->assertEquals($fromCount - 1, $mail->countMessages());
  511. $mail->selectFolder($target);
  512. $this->assertEquals($toCount + 1, $mail->countMessages());
  513. }
  514. public function testInitExisting()
  515. {
  516. // this should be a noop
  517. Zend_Mail_Storage_Writable_Maildir::initMaildir($this->_params['dirname']);
  518. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  519. $this->assertEquals($mail->countMessages(), 5);
  520. }
  521. public function testInit()
  522. {
  523. $this->tearDown();
  524. // should fail now
  525. $e = null;
  526. try {
  527. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  528. } catch (Exception $e) {
  529. }
  530. if ($e === null) {
  531. $this->fail('empty maildir should not be accepted');
  532. }
  533. Zend_Mail_Storage_Writable_Maildir::initMaildir($this->_params['dirname']);
  534. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  535. $this->assertEquals($mail->countMessages(), 0);
  536. }
  537. public function testCreate()
  538. {
  539. $this->tearDown();
  540. // should fail now
  541. $e = null;
  542. try {
  543. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  544. } catch (Exception $e) {
  545. }
  546. if ($e === null) {
  547. $this->fail('empty maildir should not be accepted');
  548. }
  549. $this->_params['create'] = true;
  550. $mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
  551. $this->assertEquals($mail->countMessages(), 0);
  552. }
  553. }