PageRenderTime 25ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/Zend/Mail/Storage/MaildirTest.php

https://github.com/MontmereLimited/zf2
PHP | 444 lines | 327 code | 76 blank | 41 comment | 20 complexity | 425ebf87eab6991f563f094ead2e9fd1 MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Mail
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. */
  21. /**
  22. * @namespace
  23. */
  24. namespace ZendTest\Mail\Storage;
  25. use Zend\Mail\Storage;
  26. /**
  27. * @category Zend
  28. * @package Zend_Mail
  29. * @subpackage UnitTests
  30. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  31. * @license http://framework.zend.com/license/new-bsd New BSD License
  32. * @group Zend_Mail
  33. */
  34. class MaildirTest extends \PHPUnit_Framework_TestCase
  35. {
  36. protected $_originalMaildir;
  37. protected $_maildir;
  38. protected $_tmpdir;
  39. public function setUp()
  40. {
  41. $this->_originalMaildir = __DIR__ . '/../_files/test.maildir/';
  42. if (!is_dir($this->_originalMaildir . '/cur/')) {
  43. $this->markTestSkipped('You have to unpack maildir.tar in Zend/Mail/_files/test.maildir/ '
  44. . 'directory before enabling the maildir tests');
  45. return;
  46. }
  47. if ($this->_tmpdir == null) {
  48. if (TESTS_ZEND_MAIL_TEMPDIR != null) {
  49. $this->_tmpdir = TESTS_ZEND_MAIL_TEMPDIR;
  50. } else {
  51. $this->_tmpdir = __DIR__ . '/../_files/test.tmp/';
  52. }
  53. if (!file_exists($this->_tmpdir)) {
  54. mkdir($this->_tmpdir);
  55. }
  56. $count = 0;
  57. $dh = opendir($this->_tmpdir);
  58. while (readdir($dh) !== false) {
  59. ++$count;
  60. }
  61. closedir($dh);
  62. if ($count != 2) {
  63. $this->markTestSkipped('Are you sure your tmp dir is a valid empty dir?');
  64. return;
  65. }
  66. }
  67. $this->_maildir = $this->_tmpdir;
  68. foreach (array('cur', 'new') as $dir) {
  69. mkdir($this->_tmpdir . $dir);
  70. $dh = opendir($this->_originalMaildir . $dir);
  71. while (($entry = readdir($dh)) !== false) {
  72. $entry = $dir . '/' . $entry;
  73. if (!is_file($this->_originalMaildir . $entry)) {
  74. continue;
  75. }
  76. copy($this->_originalMaildir . $entry, $this->_tmpdir . $entry);
  77. }
  78. closedir($dh);
  79. }
  80. }
  81. public function tearDown()
  82. {
  83. foreach (array('cur', 'new') as $dir) {
  84. $dh = opendir($this->_tmpdir . $dir);
  85. while (($entry = readdir($dh)) !== false) {
  86. $entry = $this->_tmpdir . $dir . '/' . $entry;
  87. if (!is_file($entry)) {
  88. continue;
  89. }
  90. unlink($entry);
  91. }
  92. closedir($dh);
  93. rmdir($this->_tmpdir . $dir);
  94. }
  95. }
  96. public function testLoadOk()
  97. {
  98. try {
  99. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  100. } catch (\Exception $e) {
  101. $this->fail('exception raised while loading maildir');
  102. }
  103. }
  104. public function testLoadConfig()
  105. {
  106. try {
  107. $mail = new Storage\Maildir(new \Zend\Config\Config(array('dirname' => $this->_maildir)));
  108. } catch (\Exception $e) {
  109. $this->fail('exception raised while loading maildir');
  110. }
  111. }
  112. public function testLoadFailure()
  113. {
  114. try {
  115. $mail = new Storage\Maildir(array('dirname' => '/This/Dir/Does/Not/Exist'));
  116. } catch (\Exception $e) {
  117. return; // test ok
  118. }
  119. $this->fail('no exception raised while loading unknown dir');
  120. }
  121. public function testLoadInvalid()
  122. {
  123. try {
  124. $mail = new Storage\Maildir(array('dirname' => __DIR__));
  125. } catch (\Exception $e) {
  126. return; // test ok
  127. }
  128. $this->fail('no exception while loading invalid dir');
  129. }
  130. public function testClose()
  131. {
  132. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  133. try {
  134. $mail->close();
  135. } catch (\Exception $e) {
  136. $this->fail('exception raised while closing maildir');
  137. }
  138. }
  139. public function testHasTop()
  140. {
  141. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  142. $this->assertTrue($mail->hasTop);
  143. }
  144. public function testHasCreate()
  145. {
  146. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  147. $this->assertFalse($mail->hasCreate);
  148. }
  149. public function testNoop()
  150. {
  151. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  152. try {
  153. $mail->noop();
  154. } catch (\Exception $e) {
  155. $this->fail('exception raised while doing nothing (noop)');
  156. }
  157. }
  158. public function testCount()
  159. {
  160. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  161. $count = $mail->countMessages();
  162. $this->assertEquals(5, $count);
  163. }
  164. public function testSize()
  165. {
  166. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  167. $shouldSizes = array(1 => 397, 89, 694, 452, 497);
  168. $sizes = $mail->getSize();
  169. $this->assertEquals($shouldSizes, $sizes);
  170. }
  171. public function testSingleSize()
  172. {
  173. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  174. $size = $mail->getSize(2);
  175. $this->assertEquals(89, $size);
  176. }
  177. public function testFetchHeader()
  178. {
  179. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  180. $subject = $mail->getMessage(1)->subject;
  181. $this->assertEquals('Simple Message', $subject);
  182. }
  183. /*
  184. public function testFetchTopBody()
  185. {
  186. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  187. $content = $mail->getHeader(3, 1)->getContent();
  188. $this->assertEquals('Fair river! in thy bright, clear flow', trim($content));
  189. }
  190. */
  191. public function testFetchMessageHeader()
  192. {
  193. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  194. $subject = $mail->getMessage(1)->subject;
  195. $this->assertEquals('Simple Message', $subject);
  196. }
  197. public function testFetchMessageBody()
  198. {
  199. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  200. $content = $mail->getMessage(3)->getContent();
  201. list($content, ) = explode("\n", $content, 2);
  202. $this->assertEquals('Fair river! in thy bright, clear flow', trim($content));
  203. }
  204. public function testFetchWrongSize()
  205. {
  206. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  207. try {
  208. $mail->getSize(0);
  209. } catch (\Exception $e) {
  210. return; // test ok
  211. }
  212. $this->fail('no exception raised while getting size for message 0');
  213. }
  214. public function testFetchWrongMessageBody()
  215. {
  216. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  217. try {
  218. $mail->getMessage(0);
  219. } catch (\Exception $e) {
  220. return; // test ok
  221. }
  222. $this->fail('no exception raised while fetching message 0');
  223. }
  224. public function testFailedRemove()
  225. {
  226. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  227. try {
  228. $mail->removeMessage(1);
  229. } catch (\Exception $e) {
  230. return; // test ok
  231. }
  232. $this->fail('no exception raised while deleting message (maildir is read-only)');
  233. }
  234. public function testHasFlag()
  235. {
  236. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  237. $this->assertFalse($mail->getMessage(5)->hasFlag(Storage::FLAG_SEEN));
  238. $this->assertTrue($mail->getMessage(5)->hasFlag(Storage::FLAG_RECENT));
  239. $this->assertTrue($mail->getMessage(2)->hasFlag(Storage::FLAG_FLAGGED));
  240. $this->assertFalse($mail->getMessage(2)->hasFlag(Storage::FLAG_ANSWERED));
  241. }
  242. public function testGetFlags()
  243. {
  244. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  245. $flags = $mail->getMessage(1)->getFlags();
  246. $this->assertTrue(isset($flags[Storage::FLAG_SEEN]));
  247. $this->assertTrue(in_array(Storage::FLAG_SEEN, $flags));
  248. }
  249. public function testUniqueId()
  250. {
  251. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  252. $this->assertTrue($mail->hasUniqueId);
  253. $this->assertEquals(1, $mail->getNumberByUniqueId($mail->getUniqueId(1)));
  254. $ids = $mail->getUniqueId();
  255. $should_ids = array(1 => '1000000000.P1.example.org', '1000000001.P1.example.org', '1000000002.P1.example.org',
  256. '1000000003.P1.example.org', '1000000004.P1.example.org');
  257. foreach ($ids as $num => $id) {
  258. $this->assertEquals($id, $should_ids[$num]);
  259. if ($mail->getNumberByUniqueId($id) != $num) {
  260. $this->fail('reverse lookup failed');
  261. }
  262. }
  263. }
  264. public function testWrongUniqueId()
  265. {
  266. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  267. try {
  268. $mail->getNumberByUniqueId('this_is_an_invalid_id');
  269. } catch (\Exception $e) {
  270. return; // test ok
  271. }
  272. $this->fail('no exception while getting number for invalid id');
  273. }
  274. public function isFileTest($dir)
  275. {
  276. if (file_exists($this->_maildir . '/' . $dir)) {
  277. rename($this->_maildir . '/' . $dir, $this->_maildir . '/' . $dir . 'bak');
  278. }
  279. touch($this->_maildir . '/' . $dir);
  280. $check = false;
  281. try {
  282. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  283. } catch (\Exception $e) {
  284. $check = true;
  285. // test ok
  286. }
  287. unlink($this->_maildir . '/' . $dir);
  288. if (file_exists($this->_maildir . '/' . $dir . 'bak')) {
  289. rename($this->_maildir . '/' . $dir . 'bak', $this->_maildir . '/' . $dir);
  290. }
  291. if (!$check) {
  292. $this->fail('no exception while loading invalid dir with ' . $dir . ' as file');
  293. }
  294. }
  295. public function testCurIsFile()
  296. {
  297. $this->isFileTest('cur');
  298. }
  299. public function testNewIsFile()
  300. {
  301. $this->isFileTest('new');
  302. }
  303. public function testTmpIsFile()
  304. {
  305. $this->isFileTest('tmp');
  306. }
  307. public function notReadableTest($dir)
  308. {
  309. $stat = stat($this->_maildir . '/' . $dir);
  310. chmod($this->_maildir . '/' . $dir, 0);
  311. $check = false;
  312. try {
  313. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  314. } catch (\Exception $e) {
  315. $check = true;
  316. // test ok
  317. }
  318. chmod($this->_maildir . '/' . $dir, $stat['mode']);
  319. if (!$check) {
  320. $this->fail('no exception while loading invalid dir with ' . $dir . ' not readable');
  321. }
  322. }
  323. public function testNotReadableCur()
  324. {
  325. $this->notReadableTest('cur');
  326. }
  327. public function testNotReadableNew()
  328. {
  329. $this->notReadableTest('new');
  330. }
  331. public function testCountFlags()
  332. {
  333. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  334. $this->assertEquals($mail->countMessages(Storage::FLAG_DELETED), 0);
  335. $this->assertEquals($mail->countMessages(Storage::FLAG_RECENT), 1);
  336. $this->assertEquals($mail->countMessages(Storage::FLAG_FLAGGED), 1);
  337. $this->assertEquals($mail->countMessages(Storage::FLAG_SEEN), 4);
  338. $this->assertEquals($mail->countMessages(array(Storage::FLAG_SEEN, Storage::FLAG_FLAGGED)), 1);
  339. $this->assertEquals($mail->countMessages(array(Storage::FLAG_SEEN, Storage::FLAG_RECENT)), 0);
  340. }
  341. public function testFetchPart()
  342. {
  343. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  344. $this->assertEquals($mail->getMessage(4)->getPart(2)->contentType, 'text/x-vertical');
  345. }
  346. public function testPartSize()
  347. {
  348. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  349. $this->assertEquals($mail->getMessage(4)->getPart(2)->getSize(), 88);
  350. }
  351. public function testSizePlusPlus()
  352. {
  353. rename($this->_maildir . '/cur/1000000000.P1.example.org:2,S', $this->_maildir . '/cur/1000000000.P1.example.org,S=123:2,S');
  354. rename($this->_maildir . '/cur/1000000001.P1.example.org:2,FS', $this->_maildir . '/cur/1000000001.P1.example.org,S=456:2,FS');
  355. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  356. $shouldSizes = array(1 => 123, 456, 694, 452, 497);
  357. $sizes = $mail->getSize();
  358. $this->assertEquals($shouldSizes, $sizes);
  359. }
  360. public function testSingleSizePlusPlus()
  361. {
  362. rename($this->_maildir . '/cur/1000000001.P1.example.org:2,FS', $this->_maildir . '/cur/1000000001.P1.example.org,S=456:2,FS');
  363. $mail = new Storage\Maildir(array('dirname' => $this->_maildir));
  364. $size = $mail->getSize(2);
  365. $this->assertEquals(456, $size);
  366. }
  367. }