cacert-testmgr/external/ZendFramework-1.9.5/tests/Zend/Mail/MaildirWritableTest.php

670 lines
21 KiB
PHP
Raw Normal View History

<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Mail
* @subpackage UnitTests
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: MaildirWritableTest.php 17363 2009-08-03 07:40:18Z bkarwin $
*/
/**
* Zend_Mail_Storage_Folder_Maildir
*/
require_once 'Zend/Mail/Storage/Writable/Maildir.php';
/**
* PHPUnit test case
*/
require_once 'PHPUnit/Framework/TestCase.php';
/**
* @category Zend
* @package Zend_Mail
* @subpackage UnitTests
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @group Zend_Mail
*/
class Zend_Mail_MaildirWritableTest extends PHPUnit_Framework_TestCase
{
protected $_params;
protected $_originalDir;
protected $_tmpdir;
protected $_subdirs = array('.', '.subfolder', '.subfolder.test');
public function setUp()
{
$this->_originalDir = dirname(__FILE__) . '/_files/test.maildir/';
if (!is_dir($this->_originalDir . '/cur/')) {
$this->markTestSkipped('You have to unpack maildir.tar in Zend/Mail/_files/test.maildir/ '
. 'directory before enabling the maildir tests');
return;
}
if ($this->_tmpdir == null) {
if (TESTS_ZEND_MAIL_TEMPDIR != null) {
$this->_tmpdir = TESTS_ZEND_MAIL_TEMPDIR;
} else {
$this->_tmpdir = dirname(__FILE__) . '/_files/test.tmp/';
}
if (!file_exists($this->_tmpdir)) {
mkdir($this->_tmpdir);
}
$count = 0;
$dh = opendir($this->_tmpdir);
while (readdir($dh) !== false) {
++$count;
}
closedir($dh);
if ($count != 2) {
$this->markTestSkipped('Are you sure your tmp dir is a valid empty dir?');
return;
}
}
$this->_params = array();
$this->_params['dirname'] = $this->_tmpdir;
foreach ($this->_subdirs as $dir) {
if ($dir != '.') {
mkdir($this->_tmpdir . $dir);
}
foreach (array('cur', 'new') as $subdir) {
if (!file_exists($this->_originalDir . $dir . '/' . $subdir)) {
continue;
}
mkdir($this->_tmpdir . $dir . '/' . $subdir);
$dh = opendir($this->_originalDir . $dir . '/' . $subdir);
while (($entry = readdir($dh)) !== false) {
$entry = $dir . '/' . $subdir . '/' . $entry;
if (!is_file($this->_originalDir . $entry)) {
continue;
}
copy($this->_originalDir . $entry, $this->_tmpdir . $entry);
}
closedir($dh);
}
copy($this->_originalDir . 'maildirsize', $this->_tmpdir . 'maildirsize');
}
}
public function tearDown()
{
foreach (array_reverse($this->_subdirs) as $dir) {
if (!file_exists($this->_tmpdir . $dir)) {
continue;
}
foreach (array('cur', 'new', 'tmp') as $subdir) {
if (!file_exists($this->_tmpdir . $dir . '/' . $subdir)) {
continue;
}
$dh = opendir($this->_tmpdir . $dir . '/' . $subdir);
while (($entry = readdir($dh)) !== false) {
$entry = $this->_tmpdir . $dir . '/' . $subdir . '/' . $entry;
if (!is_file($entry)) {
continue;
}
unlink($entry);
}
closedir($dh);
rmdir($this->_tmpdir . $dir . '/' . $subdir);
}
if ($dir != '.') {
rmdir($this->_tmpdir . $dir);
}
}
@unlink($this->_tmpdir . 'maildirsize');
}
public function testCreateFolder()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->createFolder('subfolder.test1');
$mail->createFolder('test2', 'INBOX.subfolder');
$mail->createFolder('test3', $mail->getFolders()->subfolder);
$mail->createFolder('foo.bar');
try {
$mail->selectFolder($mail->getFolders()->subfolder->test1);
$mail->selectFolder($mail->getFolders()->subfolder->test2);
$mail->selectFolder($mail->getFolders()->subfolder->test3);
$mail->selectFolder($mail->getFolders()->foo->bar);
} catch (Exception $e) {
$this->fail('could not get new folders');
}
// to tear down
$this->_subdirs[] = '.subfolder.test1';
$this->_subdirs[] = '.subfolder.test2';
$this->_subdirs[] = '.subfolder.test3';
$this->_subdirs[] = '.foo';
$this->_subdirs[] = '.foo.bar';
}
public function testCreateFolderEmtpyPart()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->createFolder('foo..bar');
} catch (Exception $e) {
return; //ok
}
$this->fail('no exception while creating folder with empty part name');
}
public function testCreateFolderSlash()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->createFolder('foo/bar');
} catch (Exception $e) {
return; //ok
}
$this->fail('no exception while creating folder with slash');
}
public function testCreateFolderDirectorySeparator()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->createFolder('foo' . DIRECTORY_SEPARATOR . 'bar');
} catch (Exception $e) {
return; //ok
}
$this->fail('no exception while creating folder with DIRECTORY_SEPARATOR');
}
public function testCreateFolderExistingDir()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
unset($mail->getFolders()->subfolder->test);
try {
$mail->createFolder('subfolder.test');
} catch (Exception $e) {
return; // ok
}
$this->fail('should not be able to create existing folder');
}
public function testCreateExistingFolder()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->createFolder('subfolder.test');
} catch (Exception $e) {
return; // ok
}
$this->fail('should not be able to create existing folder');
}
public function testRemoveFolderName()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->removeFolder('INBOX.subfolder.test');
try {
$mail->selectFolder($mail->getFolders()->subfolder->test);
} catch (Exception $e) {
return; // ok
}
$this->fail('folder still exists');
}
public function testRemoveFolderInstance()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->removeFolder($mail->getFolders()->subfolder->test);
try {
$mail->selectFolder($mail->getFolders()->subfolder->test);
} catch (Exception $e) {
return; // ok
}
$this->fail('folder still exists');
}
public function testRemoveFolderWithChildren()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->removeFolder($mail->getFolders()->subfolder);
} catch (Exception $e) {
return; // ok
}
$this->fail('should not be able to remove a folder with children');
}
public function testRemoveSelectedFolder()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->selectFolder('subfolder.test');
try {
$mail->removeFolder('subfolder.test');
} catch (Exception $e) {
return; // ok
}
$this->fail('no error while removing selected folder');
}
public function testRemoveInvalidFolder()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->removeFolder('thisFolderDoestNotExist');
} catch (Exception $e) {
return; // ok
}
$this->fail('no error while removing invalid folder');
}
public function testRenameFolder()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->renameFolder('INBOX.subfolder', 'INBOX.foo');
$mail->renameFolder($mail->getFolders()->foo, 'subfolder');
} catch (Exception $e) {
$this->fail('renaming failed');
}
try {
$mail->renameFolder('INBOX', 'foo');
} catch (Exception $e) {
return; // ok
}
$this->fail('no error while renaming INBOX');
}
public function testRenameSelectedFolder()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->selectFolder('subfolder.test');
try {
$mail->renameFolder('subfolder.test', 'foo');
} catch (Exception $e) {
return; // ok
}
$this->fail('no error while renaming selected folder');
}
public function testRenameToChild()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
try {
$mail->renameFolder('subfolder.test', 'subfolder.test.foo');
} catch (Exception $e) {
return; // ok
}
$this->fail('no error while renaming folder to child of old');
}
public function testAppend()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$count = $mail->countMessages();
$message = '';
$message .= "From: me@example.org\r\n";
$message .= "To: you@example.org\r\n";
$message .= "Subject: append test\r\n";
$message .= "\r\n";
$message .= "This is a test\r\n";
$mail->appendMessage($message);
$this->assertEquals($count + 1, $mail->countMessages());
$this->assertEquals($mail->getMessage($count + 1)->subject, 'append test');
}
public function testCopy()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->selectFolder('subfolder.test');
$count = $mail->countMessages();
$mail->selectFolder('INBOX');
$message = $mail->getMessage(1);
$mail->copyMessage(1, 'subfolder.test');
$mail->selectFolder('subfolder.test');
$this->assertEquals($count + 1, $mail->countMessages());
$this->assertEquals($mail->getMessage($count + 1)->subject, $message->subject);
$this->assertEquals($mail->getMessage($count + 1)->from, $message->from);
$this->assertEquals($mail->getMessage($count + 1)->to, $message->to);
try {
$mail->copyMessage(1, 'justARandomFolder');
} catch (Exception $e) {
return; // ok
}
$this->fail('no error while copying to wrong folder');
}
public function testSetFlags()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN));
$message = $mail->getMessage(1);
$this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
$this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
$mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN, Zend_Mail_Storage::FLAG_FLAGGED));
$message = $mail->getMessage(1);
$this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
$this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
$mail->setFlags(1, array(Zend_Mail_Storage::FLAG_FLAGGED));
$message = $mail->getMessage(1);
$this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
$this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
try {
$mail->setFlags(1, array(Zend_Mail_Storage::FLAG_RECENT));
} catch (Exception $e) {
return; // ok
}
$this->fail('should not be able to set recent flag');
}
public function testSetFlagsRemovedFile()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
unlink($this->_params['dirname'] . 'cur/1000000000.P1.example.org:2,S');
try {
$mail->setFlags(1, array(Zend_Mail_Storage::FLAG_FLAGGED));
} catch (Exception $e) {
return; // ok
}
$this->fail('should not be able to set flags with removed file');
}
public function testRemove()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$count = $mail->countMessages();
$mail->removeMessage(1);
$this->assertEquals($mail->countMessages(), --$count);
unset($mail[2]);
$this->assertEquals($mail->countMessages(), --$count);
}
public function testRemoveRemovedFile()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
unlink($this->_params['dirname'] . 'cur/1000000000.P1.example.org:2,S');
try {
$mail->removeMessage(1);
} catch (Exception $e) {
return; // ok
}
$this->fail('should not be able to remove message which is already removed in fs');
}
public function testCheckQuota()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$this->assertFalse($mail->checkQuota());
}
public function testCheckQuotaDetailed()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$quotaResult = array(
'size' => 2596,
'count' => 6,
'quota' => array(
'count' => 10,
'L' => 1,
'size' => 3000
),
'over_quota' => false
);
$this->assertEquals($mail->checkQuota(true), $quotaResult);
}
public function testSetQuota()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$this->assertNull($mail->getQuota());
$mail->setQuota(true);
$this->assertTrue($mail->getQuota());
$mail->setQuota(false);
$this->assertFalse($mail->getQuota());
$mail->setQuota(array('size' => 100, 'count' => 2, 'X' => 0));
$this->assertEquals($mail->getQuota(), array('size' => 100, 'count' => 2, 'X' => 0));
$this->assertEquals($mail->getQuota(true), array('size' => 3000, 'L' => 1, 'count' => 10));
$quotaResult = array(
'size' => 2596,
'count' => 6,
'quota' => array(
'size' => 100,
'count' => 2,
'X' => 0
),
'over_quota' => true
);
$this->assertEquals($mail->checkQuota(true, true), $quotaResult);
$this->assertEquals($mail->getQuota(true), array('size' => 100, 'count' => 2, 'X' => 0));
}
public function testMissingMaildirsize()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$this->assertEquals($mail->getQuota(true), array('size' => 3000, 'L' => 1, 'count' => 10));
unlink($this->_tmpdir . 'maildirsize');
$this->assertNull($mail->getQuota());
try {
$mail->getQuota(true);
} catch(Zend_Mail_Exception $e) {
// ok
return;
}
$this->fail('get quota from file should fail if file is missing');
}
public function testMissingMaildirsizeWithFixedQuota()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
unlink($this->_tmpdir . 'maildirsize');
$mail->setQuota(array('size' => 100, 'count' => 2, 'X' => 0));
$quotaResult = array(
'size' => 2596,
'count' => 6,
'quota' => array(
'size' => 100,
'count' => 2,
'X' => 0
),
'over_quota' => true
);
$this->assertEquals($mail->checkQuota(true), $quotaResult);
$this->assertEquals($mail->getQuota(true), $quotaResult['quota']);
}
public function testAppendMessage()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->setQuota(array('size' => 3000, 'count' => 6, 'X' => 0));
$this->assertFalse($mail->checkQuota(false, true));
$mail->appendMessage("Subject: test\r\n\r\n");
$quotaResult = array(
'size' => 2613,
'count' => 7,
'quota' => array(
'size' => 3000,
'count' => 6,
'X' => 0
),
'over_quota' => true
);
$this->assertEquals($mail->checkQuota(true), $quotaResult);
$mail->setQuota(false);
$this->assertTrue($mail->checkQuota());
try {
$mail->appendMessage("Subject: test\r\n\r\n");
} catch(Zend_Mail_Exception $e) {
$this->fail('appending should not fail if quota check is not active');
}
$mail->setQuota(true);
$this->assertTrue($mail->checkQuota());
try {
$mail->appendMessage("Subject: test\r\n\r\n");
} catch(Zend_Mail_Exception $e) {
// ok
return;
}
$this->fail('appending after being over quota should fail');
}
public function testRemoveMessage()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->setQuota(array('size' => 3000, 'count' => 5, 'X' => 0));
$this->assertTrue($mail->checkQuota(false, true));
$mail->removeMessage(1);
$this->assertFalse($mail->checkQuota());
}
public function testCopyMessage()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$mail->setQuota(array('size' => 3000, 'count' => 6, 'X' => 0));
$this->assertFalse($mail->checkQuota(false, true));
$mail->copyMessage(1, 'subfolder');
$quotaResult = array(
'size' => 2993,
'count' => 7,
'quota' => array(
'size' => 3000,
'count' => 6,
'X' => 0
),
'over_quota' => true
);
$this->assertEquals($mail->checkQuota(true), $quotaResult);
}
public function testAppendStream()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$fh = fopen('php://memory', 'rw');
fputs($fh, "Subject: test\r\n\r\n");
fseek($fh, 0);
$mail->appendMessage($fh);
fclose($fh);
$this->assertEquals($mail->getMessage($mail->countMessages())->subject, 'test');
}
public function testMove()
{
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$target = $mail->getFolders()->subfolder->test;
$mail->selectFolder($target);
$toCount = $mail->countMessages();
$mail->selectFolder('INBOX');
$fromCount = $mail->countMessages();
$mail->moveMessage(1, $target);
$this->assertEquals($fromCount - 1, $mail->countMessages());
$mail->selectFolder($target);
$this->assertEquals($toCount + 1, $mail->countMessages());
}
public function testInitExisting()
{
// this should be a noop
Zend_Mail_Storage_Writable_Maildir::initMaildir($this->_params['dirname']);
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$this->assertEquals($mail->countMessages(), 5);
}
public function testInit()
{
$this->tearDown();
// should fail now
$e = null;
try {
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
} catch (Exception $e) {
}
if ($e === null) {
$this->fail('empty maildir should not be accepted');
}
Zend_Mail_Storage_Writable_Maildir::initMaildir($this->_params['dirname']);
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$this->assertEquals($mail->countMessages(), 0);
}
public function testCreate()
{
$this->tearDown();
// should fail now
$e = null;
try {
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
} catch (Exception $e) {
}
if ($e === null) {
$this->fail('empty maildir should not be accepted');
}
$this->_params['create'] = true;
$mail = new Zend_Mail_Storage_Writable_Maildir($this->_params);
$this->assertEquals($mail->countMessages(), 0);
}
}