From 025a223a678509b38fbe5d9ac27d266f98309cbc Mon Sep 17 00:00:00 2001 From: Gunnar Wrobel Date: Tue, 27 Apr 2010 23:41:24 +0200 Subject: [PATCH] Complete the first minor step in testing the various IMAP driver variants. Add server testing using a shared fixture. --- framework/Kolab_Storage/TODO | 4 + .../lib/Horde/Kolab/Storage/Driver/Cclient.php | 34 +--- .../lib/Horde/Kolab/Storage/Driver/Imap.php | 6 +- .../lib/Horde/Kolab/Storage/Driver/Mock.php | 11 -- .../lib/Horde/Kolab/Storage/Driver/Pear.php | 54 +++--- .../Horde/Kolab/Storage/Folder/Decorator/Base.php | 12 +- .../Kolab/Storage/Folder/Decorator/Trigger.php | 57 ++++--- .../lib/Horde/Kolab/Storage/Namespace.php | 35 ++++ .../lib/Horde/Kolab/Storage/Namespace/Element.php | 10 ++ framework/Kolab_Storage/package.xml | 18 +- .../script/Horde/Kolab/Storage/test_drivers.php | 95 +++++++++++ .../test/Horde/Kolab/Storage/AllTests.php | 48 ++++++ .../Kolab/Storage/Class/Driver/CclientTest.php | 91 ++++++++++ .../Horde/Kolab/Storage/Class/Driver/ImapTest.php | 126 ++++++++++++++ .../Horde/Kolab/Storage/Class/Driver/MockTest.php | 39 ++++- .../Horde/Kolab/Storage/Class/Driver/PearTest.php | 129 ++++++++++++++ .../test/Horde/Kolab/Storage/DataTest.php | 4 + .../test/Horde/Kolab/Storage/Server/DriverTest.php | 188 +++++++++++++++++++++ .../test/Horde/Kolab/Storage/TriggerTest.php | 3 + 19 files changed, 857 insertions(+), 107 deletions(-) create mode 100644 framework/Kolab_Storage/script/Horde/Kolab/Storage/test_drivers.php create mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/CclientTest.php create mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/ImapTest.php create mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/PearTest.php create mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/Server/DriverTest.php diff --git a/framework/Kolab_Storage/TODO b/framework/Kolab_Storage/TODO index 8d2c2fa12..c7577c6f6 100644 --- a/framework/Kolab_Storage/TODO +++ b/framework/Kolab_Storage/TODO @@ -7,3 +7,7 @@ - Do not hide the prefix of the shared namespace? - Fix the triggering decorator + + - Test the Driver implementations + + - getNamespace() [DONE] diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Cclient.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Cclient.php index 5f182bf5d..e4a341988 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Cclient.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Cclient.php @@ -26,7 +26,7 @@ * @link http://pear.horde.org/index.php?package=Kolab_Storage */ class Horde_Kolab_Storage_Driver_Cclient -implements Horde_Kolab_Storage_Driver +extends Horde_Kolab_Storage_Driver_Base { /** * The group handler for this connection. @@ -393,36 +393,4 @@ implements Horde_Kolab_Storage_Driver return $this->_imap->setMetadata($mailbox_name, array($entry => $value)); } - - - /** - * Retrieve the namespace information for this connection. - * - * @return Horde_Kolab_Storage_Namespace The initialized namespace handler. - */ - public function getNamespace() - { - if ($this->_imap->queryCapability('NAMESPACE') === true) { - return new Horde_Kolab_Storage_Namespace_Imap( - $this->_imap->getNamespaces(), - isset($this->_params['namespaces']) ? $this->_params['namespaces'] : array() - ); - } else if (isset($this->_params['namespaces'])) { - return new Horde_Kolab_Storage_Namespace_Config( - $this->_params['namespaces'] - ); - } - return new Horde_Kolab_Storage_Namespace_Fixed(); - } - - /** - * Get the group handler for this connection. - * - * @return Horde_Group The group handler. - */ - public function getGroupHandler() - { - return $this->_groups; - } - } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php index 1da8cc397..1f1bf10fd 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php @@ -38,14 +38,16 @@ extends Horde_Kolab_Storage_Driver_Base /** * Constructor. * - * @param array $params Connection parameters. + * @param Horde_Imap_Client_Base $imap The IMAP connection handler. + * @param Group $groups The groups handler. + * @param array $params Connection parameters. */ public function __construct( Horde_Imap_Client_Base $imap, Group $groups, $params = array() ) { - $this->_imap = $imap; + $this->_imap = $imap; parent::__construct($groups, $params); } diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Mock.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Mock.php index fa550bc1c..3a94beb0f 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Mock.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Mock.php @@ -420,15 +420,4 @@ extends Horde_Kolab_Storage_Driver_Base return $this->_imap->setMetadata($mailbox_name, array($entry => $value)); } - - /** - * Get the group handler for this connection. - * - * @return Horde_Group The group handler. - */ - public function getGroupHandler() - { - return $this->_groups; - } - } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Pear.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Pear.php index de54fe754..a26ff7329 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Pear.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Pear.php @@ -26,7 +26,7 @@ * @link http://pear.horde.org/index.php?package=Kolab_Storage */ class Horde_Kolab_Storage_Driver_Pear -implements Horde_Kolab_Storage_Driver +extends Horde_Kolab_Storage_Driver_Base { /** * The group handler for this connection. @@ -38,12 +38,17 @@ implements Horde_Kolab_Storage_Driver /** * Constructor. * - * @param array $params Connection parameters. + * @param Net_IMAP $imap The IMAP connection handler. + * @param Group $groups The groups handler. + * @param array $params Connection parameters. */ public function __construct( - Group $groups + Net_IMAP $imap, + Group $groups, + $params = array() ) { - $this->_groups = $groups; + $this->_imap = $imap; + parent::__construct($groups, $params); } /** @@ -402,27 +407,30 @@ implements Horde_Kolab_Storage_Driver */ public function getNamespace() { - if ($this->_imap->queryCapability('NAMESPACE') === true) { + if ($this->_imap->hasCapability('NAMESPACE') === true) { + $namespaces = array(); + foreach ($this->_imap->getNamespace() as $type => $elements) { + foreach ($elements as $namespace) { + switch ($type) { + case 'personal': + $namespace['type'] = 'personal'; + break; + case 'others': + $namespace['type'] = 'other'; + break; + case 'shared': + $namespace['type'] = 'shared'; + break; + } + $namespace['delimiter'] = $namespace['delimter']; + $namespaces[] = $namespace; + } + } return new Horde_Kolab_Storage_Namespace_Imap( - $this->_imap->getNamespaces(), - isset($this->_params['namespaces']) ? $this->_params['namespaces'] : array() - ); - } else if (isset($this->_params['namespaces'])) { - return new Horde_Kolab_Storage_Namespace_Config( - $this->_params['namespaces'] + $namespaces, + $this->getParam('namespaces', array()) ); } - return new Horde_Kolab_Storage_Namespace_Fixed(); + return parent::getNamespace(); } - - /** - * Get the group handler for this connection. - * - * @return Horde_Group The group handler. - */ - public function getGroupHandler() - { - return $this->_groups; - } - } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php index eb35e3938..eea3ee647 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php @@ -157,9 +157,9 @@ implements Horde_Kolab_Storage_Folder * * @return array An array with IMAP ACL. */ - public function getACL() + public function getAcl() { - return $this->_folder->getACL(); + return $this->_folder->getAcl(); } /** @@ -170,9 +170,9 @@ implements Horde_Kolab_Storage_Folder * * @return NULL */ - public function setACL($user, $acl) + public function setAcl($user, $acl) { - $this->_folder->setACL($user, $acl); + $this->_folder->setAcl($user, $acl); } /** @@ -182,9 +182,9 @@ implements Horde_Kolab_Storage_Folder * * @return NULL */ - public function deleteACL($user) + public function deleteAcl($user) { - $this->_folder->deleteACL($user); + $this->_folder->deleteAcl($user); } } diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Trigger.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Trigger.php index fa345fb97..fa45be798 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Trigger.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Trigger.php @@ -14,7 +14,7 @@ /** * This decorator triggers a URL following certain actions on the folder. * - * Copyright 2010 The Horde Project (http://www.horde.org/) + * Copyright 2008-2010 Klarälvdalens Datakonsult AB * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. @@ -26,6 +26,27 @@ class Horde_Kolab_Storage_Folder_Decorator_Trigger extends Horde_Kolab_Storage_Folder_Decorator_Base { /** + * An output for log messages. + * + * @var Horde_Log_Logger + */ + private $_logger; + + /** + * Constructor + * + * @param Horde_Kolab_Storage_Folder $folder The folder to be decorated. + * @param Horde_Log_Logger $logger The logger. + */ + public function __construct( + Horde_Kolab_Storage_Folder $folder, + Horde_Log_Logger $logger + ) { + $this->_logger = $logger; + parent::__construct($folder); + } + + /** * Saves the folder. * * @param array $attributes An array of folder attributes. You can @@ -92,7 +113,7 @@ extends Horde_Kolab_Storage_Folder_Decorator_Base * @param string $id IMAP id of the message to be moved. * @param string $folder Name of the receiving folder. * - * @return boolean True if successful. + * @return NULL */ public function moveMessage($id, $folder) { @@ -101,12 +122,6 @@ extends Horde_Kolab_Storage_Folder_Decorator_Base //@todo: shouldn't we trigger both folders here? $result = $this->trigger(); - if (is_a($result, 'PEAR_Error')) { - Horde::logMessage(sprintf('Failed triggering folder %s! Error was: %s', - $this->name, $result->getMessage()), 'ERR'); - } - - return true; } /** @@ -123,11 +138,6 @@ extends Horde_Kolab_Storage_Folder_Decorator_Base //@todo: shouldn't we trigger both folders here? $result = $this->trigger(); - if (is_a($result, 'PEAR_Error')) { - Horde::logMessage(sprintf('Failed triggering folder %s! Error was: %s', - $this->name, $result->getMessage()), 'ERR'); - } - return $success; } /** @@ -141,20 +151,13 @@ extends Horde_Kolab_Storage_Folder_Decorator_Base * @param array $old_object The array that holds the current data of the * object. * - * @return boolean True on success. + * @return NULL */ public function saveObject(&$object, $data_version, $object_type, $id = null, &$old_object = null) { $this->_folder->saveObject($object, $data_version, $object_type, $id, $old_object); - try { - $this->trigger(); - } catch (Horde_Kolab_Storage_Exception $e) { - Horde::logMessage(sprintf('Failed triggering folder %s! Error was: %s', - $this->name, $result->getMessage()), 'ERR'); - } - - return true; + $this->trigger(); } /** @@ -165,10 +168,9 @@ extends Horde_Kolab_Storage_Folder_Decorator_Base * * @return NULL */ - public function setACL($user, $acl) + public function setAcl($user, $acl) { - $this->_folder->setACL($user, $acl); - + $this->_folder->setAcl($user, $acl); $this->trigger(); } @@ -179,10 +181,9 @@ extends Horde_Kolab_Storage_Folder_Decorator_Base * * @return NULL */ - public function deleteACL($user) + public function deleteAcl($user) { - $this->_folder->deleteACL($user); - + $this->_folder->deleteAcl($user); $this->trigger(); } diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace.php index 639c71a1f..d162881f5 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace.php @@ -28,6 +28,7 @@ * @link http://pear.horde.org/index.php?package=Kolab_Storage */ abstract class Horde_Kolab_Storage_Namespace +implements Iterator { /** The possible namespace types (RFC 2342 [5]) */ const PERSONAL = 'personal'; @@ -72,6 +73,13 @@ abstract class Horde_Kolab_Storage_Namespace protected $_primaryPersonalNamespace; /** + * A helper for iteration over the namespaces. + * + * @var array + */ + protected $_iteration; + + /** * Constructor. */ public function __construct() @@ -188,4 +196,31 @@ abstract class Horde_Kolab_Storage_Namespace } return Horde_String::convertCharset($namespace->generateName($path), $this->_charset, 'UTF7-IMAP'); } + + function rewind() + { + $this->_iterator = $this->_namespaces; + $this->_iterator[] = $this->_any; + return reset($this->_iterator); + } + + function current() + { + return current($this->_iterator); + } + + function key() + { + return key($this->_iterator); + } + + function next() + { + return next($this->_iterator); + } + + function valid() + { + return key($this->_iterator) !== null; + } } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Element.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Element.php index ab72ec56d..fb1ab2e7c 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Element.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Element.php @@ -49,6 +49,16 @@ abstract class Horde_Kolab_Storage_Namespace_Element } /** + * Return the delimiter for this namespace. + * + * @return string The delimiter. + */ + public function getDelimiter() + { + return $this->_delimiter; + } + + /** * Does the folder name lie in this namespace? * * @param string $name The name of the folder. diff --git a/framework/Kolab_Storage/package.xml b/framework/Kolab_Storage/package.xml index 5e61a2dcf..4fa835795 100644 --- a/framework/Kolab_Storage/package.xml +++ b/framework/Kolab_Storage/package.xml @@ -32,7 +32,7 @@ yes 2010-04-27 - + 0.4.0 0.1.0 @@ -135,6 +135,17 @@ + + + + + + + + + + + @@ -144,6 +155,9 @@ + + + @@ -280,6 +294,7 @@ + @@ -294,6 +309,7 @@ + diff --git a/framework/Kolab_Storage/script/Horde/Kolab/Storage/test_drivers.php b/framework/Kolab_Storage/script/Horde/Kolab/Storage/test_drivers.php new file mode 100644 index 000000000..9dc70fbe8 --- /dev/null +++ b/framework/Kolab_Storage/script/Horde/Kolab/Storage/test_drivers.php @@ -0,0 +1,95 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +require_once 'Horde/Autoloader.php'; + +/** Setup command line */ +$p = new Horde_Argv_Parser( + array( + 'optionList' => + array( + new Horde_Argv_Option( + '-u', + '--user', + array( + 'help' => 'The user name.', + 'type' => 'string', + 'nargs' => 1 + ) + ), + new Horde_Argv_Option( + '-p', + '--pass', + array( + 'help' => 'The password.', + 'type' => 'string', + 'nargs' => 1 + ) + ), + new Horde_Argv_Option( + '-H', + '--host', + array( + 'help' => 'The host to connect to.', + 'type' => 'string', + 'nargs' => 1, + 'default' => 'localhost' + ) + ), + new Horde_Argv_Option( + '-d', + '--debug', + array( + 'help' => 'The path to the IMAP client debug file.', + 'type' => 'string', + 'nargs' => 1 + ) + ), + ) + ) +); + +/** Handle arguments */ +try { + list($options, $args) = $p->parseArgs(); +} catch (InvalidArgumentException $e) { + print $e->getMessage() . "\n\n" . $p->getUsage() . "\n\n"; +} + +/** Setup shared test fixture */ +$fixture = new stdClass; +$fixture->conf = $options; +$fixture->drivers = array(); + +$all_tests = '@PHP-TEST-DIR@/Kolab_Storage/Horde/Kolab/Storage/AllTests.php'; +if (strpos($all_tests, '@PHP-TEST-DIR') !== false) { + $all_tests = dirname(__FILE__) + . '/../../../../test/Horde/Kolab/Storage/AllTests.php'; +} + +define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main'); + +require_once $all_tests; + +$suite = Horde_Kolab_Storage_AllTests::suite(); +$suite->setSharedFixture($fixture); + +PHPUnit_TextUI_TestRunner::run($suite); \ No newline at end of file diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/AllTests.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/AllTests.php index e5c8ca751..9e378a2df 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/AllTests.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/AllTests.php @@ -30,6 +30,54 @@ require_once 'Horde/Test/AllTests.php'; */ class Horde_Kolab_Storage_AllTests extends Horde_Test_AllTests { + /** + * Main entry point for running the suite. + */ + public static function main($package = null, $file = null) + { + if ($package) { + self::$_package = $package; + } + if ($file) { + self::$_file = $file; + } + + PHPUnit_TextUI_TestRunner::run(self::detectTestFixture(self::suite())); + } + + /** + * Collect the unit tests of this directory into a new suite. + * + * @return PHPUnit_Framework_TestSuite The test suite. + */ + public static function suite() + { + return self::detectTestFixture(Horde_Test_AllTests::suite()); + } + + /** + * Detect if test configuration is available for the server integration + * tests. + * + * @param PHPUnit_Framework_TestSuite $suite The current test suite. + */ + public static function detectTestFixture(PHPUnit_Framework_TestSuite $suite) + { + $config = getenv('KOLAB_TEST_CONFIG'); + if ($config === false) { + $config = '/kolab/etc/kolab/php_unit_server_testing.php'; + } + if (file_exists($config)) { + require $config; + if (isset($conf['kolab']['storage']['test'])) { + $fixture = new stdClass; + $fixture->conf = $conf['kolab']['storage']['test']; + $fixture->drivers = array(); + $suite->setSharedFixture($fixture); + } + } + return $suite; + } } Horde_Kolab_Storage_AllTests::init('Horde_Kolab_Storage', __FILE__); diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/CclientTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/CclientTest.php new file mode 100644 index 000000000..75e96f150 --- /dev/null +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/CclientTest.php @@ -0,0 +1,91 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Prepare the test setup. + */ +require_once dirname(__FILE__) . '/../../Autoload.php'; + +/** + * Test the Kolab mock driver. + * + * Copyright 2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Storage + * @subpackage UnitTests + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Class_Driver_CclientTest +extends PHPUnit_Framework_TestCase +{ + public function setUp() + { + require_once 'Horde/Group.php'; + require_once 'Horde/Group/mock.php'; + + $this->group = new Group_mock(); + } + + public function testGetNamespaceReturnsNamespaceHandler() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Cclient( + $this->group, + array() + ); + $this->assertType( + 'Horde_Kolab_Storage_Namespace', + $driver->getNamespace() + ); + } + + public function testGetNamespaceReturnsExpectedNamespaces() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Cclient( + $this->group, + array() + ); + $namespaces = array(); + foreach ($driver->getNamespace() as $namespace) { + $namespaces[$namespace->getName()] = array( + 'type' => $namespace->getType(), + 'delimiter' => $namespace->getDelimiter(), + ); + } + $this->assertEquals( + array( + 'INBOX' => array( + 'type' => 'personal', + 'delimiter' => '/', + ), + 'user' => array( + 'type' => 'other', + 'delimiter' => '/', + ), + '' => array( + 'type' => 'shared', + 'delimiter' => '/', + ), + ), + $namespaces + ); + } +} diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/ImapTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/ImapTest.php new file mode 100644 index 000000000..f52ae749c --- /dev/null +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/ImapTest.php @@ -0,0 +1,126 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Prepare the test setup. + */ +require_once dirname(__FILE__) . '/../../Autoload.php'; + +/** + * Test the Kolab mock driver. + * + * Copyright 2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Storage + * @subpackage UnitTests + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Class_Driver_ImapTest +extends PHPUnit_Framework_TestCase +{ + public function setUp() + { + require_once 'Horde/Group.php'; + require_once 'Horde/Group/mock.php'; + + $this->group = new Group_mock(); + } + + public function testGetNamespaceReturnsNamespaceHandler() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Imap( + $this->_getNamespaceMock(), + $this->group, + array() + ); + $this->assertType( + 'Horde_Kolab_Storage_Namespace', + $driver->getNamespace() + ); + } + + public function testGetNamespaceReturnsExpectedNamespaces() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Imap( + $this->_getNamespaceMock(), + $this->group, + array() + ); + $namespaces = array(); + foreach ($driver->getNamespace() as $namespace) { + $namespaces[$namespace->getName()] = array( + 'type' => $namespace->getType(), + 'delimiter' => $namespace->getDelimiter(), + ); + } + $this->assertEquals( + array( + 'INBOX' => array( + 'type' => 'personal', + 'delimiter' => '/', + ), + 'user' => array( + 'type' => 'other', + 'delimiter' => '/', + ), + '' => array( + 'type' => 'shared', + 'delimiter' => '/', + ), + ), + $namespaces + ); + } + + private function _getNamespaceMock() + { + $imap = $this->getMock('Horde_Imap_Client_Socket', array(), array(), '', false, false); + $imap->expects($this->once()) + ->method('queryCapability') + ->with('NAMESPACE') + ->will($this->returnValue(true)); + $imap->expects($this->once()) + ->method('getNamespaces') + ->will( + $this->returnValue( + array( + array( + 'type' => 'personal', + 'name' => 'INBOX', + 'delimiter' => '/', + ), + array( + 'type' => 'other', + 'name' => 'user', + 'delimiter' => '/', + ), + array( + 'type' => 'shared', + 'name' => '', + 'delimiter' => '/', + ), + ) + ) + ); + return $imap; + } +} diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/MockTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/MockTest.php index a51ae3317..aaed02546 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/MockTest.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/MockTest.php @@ -45,6 +45,8 @@ extends PHPUnit_Framework_TestCase public function testGetAnnotationReturnsAnnotationValue() { + $this->markTestIncomplete(); + $data = array(); $data['INBOX/Contacts']['annotations']['/vendor/kolab/folder-type']['value.shared'] = 'contact.default'; $driver = new Horde_Kolab_Storage_Driver_Mock( @@ -60,15 +62,46 @@ extends PHPUnit_Framework_TestCase public function testGetNamespaceReturnsNamespaceHandler() { Horde_Nls::setCharset('UTF8'); - $data = array(); - $data['INBOX/Contacts']['annotations']['/vendor/kolab/folder-type']['value.shared'] = 'contact.default'; $driver = new Horde_Kolab_Storage_Driver_Mock( $this->group, - $data + array() ); $this->assertType( 'Horde_Kolab_Storage_Namespace', $driver->getNamespace() ); } + + public function testGetNamespaceReturnsExpectedNamespaces() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Mock( + $this->group, + array() + ); + $namespaces = array(); + foreach ($driver->getNamespace() as $namespace) { + $namespaces[$namespace->getName()] = array( + 'type' => $namespace->getType(), + 'delimiter' => $namespace->getDelimiter(), + ); + } + $this->assertEquals( + array( + 'INBOX' => array( + 'type' => 'personal', + 'delimiter' => '/', + ), + 'user' => array( + 'type' => 'other', + 'delimiter' => '/', + ), + '' => array( + 'type' => 'shared', + 'delimiter' => '/', + ), + ), + $namespaces + ); + } } diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/PearTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/PearTest.php new file mode 100644 index 000000000..af0401064 --- /dev/null +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Class/Driver/PearTest.php @@ -0,0 +1,129 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Prepare the test setup. + */ +require_once dirname(__FILE__) . '/../../Autoload.php'; + +/** + * Test the Kolab mock driver. + * + * Copyright 2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Storage + * @subpackage UnitTests + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Class_Driver_PearTest +extends PHPUnit_Framework_TestCase +{ + public function setUp() + { + require_once 'Horde/Group.php'; + require_once 'Horde/Group/mock.php'; + + $this->group = new Group_mock(); + } + + public function testGetNamespaceReturnsNamespaceHandler() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Pear( + $this->_getNamespaceMock(), + $this->group, + array() + ); + $this->assertType( + 'Horde_Kolab_Storage_Namespace', + $driver->getNamespace() + ); + } + + public function testGetNamespaceReturnsExpectedNamespaces() + { + Horde_Nls::setCharset('UTF8'); + $driver = new Horde_Kolab_Storage_Driver_Pear( + $this->_getNamespaceMock(), + $this->group, + array() + ); + $namespaces = array(); + foreach ($driver->getNamespace() as $namespace) { + $namespaces[$namespace->getName()] = array( + 'type' => $namespace->getType(), + 'delimiter' => $namespace->getDelimiter(), + ); + } + $this->assertEquals( + array( + 'INBOX' => array( + 'type' => 'personal', + 'delimiter' => '/', + ), + 'user' => array( + 'type' => 'other', + 'delimiter' => '/', + ), + '' => array( + 'type' => 'shared', + 'delimiter' => '/', + ), + ), + $namespaces + ); + } + + private function _getNamespaceMock() + { + $imap = $this->getMock('Net_IMAP', array(), array(), '', false, false); + $imap->expects($this->once()) + ->method('hasCapability') + ->with('NAMESPACE') + ->will($this->returnValue(true)); + $imap->expects($this->once()) + ->method('getNamespace') + ->will( + $this->returnValue( + array( + 'personal' => array( + array( + 'name' => 'INBOX', + 'delimter' => '/', + ) + ), + 'others' => array( + array( + 'name' => 'user', + 'delimter' => '/', + ) + ), + 'shared' => array( + array( + 'name' => '', + 'delimter' => '/', + ) + ), + ) + ) + ); + return $imap; + } +} diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/DataTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/DataTest.php index 4b7943996..9fd134afc 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/DataTest.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/DataTest.php @@ -51,6 +51,8 @@ class Horde_Kolab_Storage_DataTest extends PHPUnit_Framework_TestCase */ public function testGetCacheKey() { + $this->markTestIncomplete(); + $data = new Horde_Kolab_Storage_Data('test'); $folder = new Horde_Kolab_Storage_Folder_Base('INBOX/Test'); @@ -155,6 +157,8 @@ class Horde_Kolab_Storage_DataTest extends PHPUnit_Framework_TestCase */ public function testSave() { + $this->markTestIncomplete(); + require_once 'Horde/Group.php'; require_once 'Horde/Group/mock.php'; diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Server/DriverTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Server/DriverTest.php new file mode 100644 index 000000000..51507db24 --- /dev/null +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Server/DriverTest.php @@ -0,0 +1,188 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Prepare the test setup. + */ +require_once dirname(__FILE__) . '/../Autoload.php'; + +/** + * Server test of the different driver implementations. + * + * Copyright 2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Storage + * @subpackage UnitTests + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Server_DriverTest extends PHPUnit_Framework_TestCase +{ + const MOCK = 'Mock'; + const CCLIENT = 'Cclient'; + const PEAR = 'Pear'; + const IMAP_SOCKET = 'Imap_Socket'; + const IMAP_CCLIENT = 'Imap_Cclient'; + + public function setUp() + { + if ($this->sharedFixture === null) { + $this->markTestSkipped('Testing of a running server skipped. No configuration fixture available.'); + return; + } + + /** @todo: FIXME -> required for namespace handling */ + Horde_Nls::setCharset('UTF8'); + + /** Setup group handler */ + require_once 'Horde/Group.php'; + require_once 'Horde/Group/mock.php'; + $this->group = new Group_mock(); + + + } + + public function tearDown() + { + /** Reactivate strict reporting as we need to turn it off for PEAR-Net_IMAP */ + if (!empty($this->old_error_reporting)) { + error_reporting($this->old_error_reporting); + } + } + + public function provideDrivers() + { + return array( + 'mock driver' => array(self::MOCK), + 'PHP c-client based driver' => array(self::CCLIENT), + 'PEAR-Net_IMAP based driver' => array(self::PEAR), + 'Horde_Imap_Client_Socket based driver' => array(self::IMAP_SOCKET), + 'Horde_Imap_Client_Cclient based driver' => array(self::IMAP_CCLIENT), + ); + } + + private function _getDriver($driver) + { + if ($driver == self::PEAR) { + /** PEAR-Net_IMAP is not E_STRICT */ + $this->old_error_reporting = error_reporting(E_ALL & ~E_STRICT); + } + if (!isset($this->sharedFixture->drivers[$driver])) { + switch ($driver) { + case self::MOCK: + $connection = new Horde_Kolab_Storage_Driver_Mock($this->group); + break; + case self::CCLIENT: + $connection = new Horde_Kolab_Storage_Driver_Cclient( + $this->group + ); + break; + case self::PEAR: + $client = new Net_IMAP($this->sharedFixture->conf['host'], 143, false); + $client->login( + $this->sharedFixture->conf['user'], + $this->sharedFixture->conf['pass'] + ); + + $connection = new Horde_Kolab_Storage_Driver_Pear( + $client, + $this->group + ); + break; + case self::IMAP_SOCKET: + $params = array( + 'hostspec' => $this->sharedFixture->conf['host'], + 'username' => $this->sharedFixture->conf['user'], + 'password' => $this->sharedFixture->conf['pass'], + 'debug' => $this->sharedFixture->conf['debug'], + 'port' => 143, + 'secure' => false + ); + $client = Horde_Imap_Client::factory('socket', $params); + $client->login(); + + $connection = new Horde_Kolab_Storage_Driver_Imap( + $client, + $this->group + ); + break; + case self::IMAP_CCLIENT: + $params = array( + 'hostspec' => $this->sharedFixture->conf['host'], + 'username' => $this->sharedFixture->conf['user'], + 'password' => $this->sharedFixture->conf['pass'], + 'debug' => $this->sharedFixture->conf['debug'], + 'port' => 143, + 'secure' => false + ); + $client = Horde_Imap_Client::factory('cclient', $params); + $client->login(); + + $connection = new Horde_Kolab_Storage_Driver_Imap( + $client, + $this->group + ); + break; + default: + exit("Undefined storage driver!\n"); + } + $this->sharedFixture->drivers[$driver] = $connection; + } + return $this->sharedFixture->drivers[$driver]; + } + + /** + * @dataProvider provideDrivers + */ + public function testDriverType($driver) + { + $this->assertType('Horde_Kolab_Storage_Driver', $this->_getDriver($driver)); + } + + /** + * @dataProvider provideDrivers + */ + public function testGetNamespace($driver) + { + $namespaces = array(); + foreach ($this->_getDriver($driver)->getNamespace() as $namespace) { + $namespaces[$namespace->getName()] = array( + 'type' => $namespace->getType(), + 'delimiter' => $namespace->getDelimiter(), + ); + } + $this->assertEquals( + array( + 'INBOX' => array( + 'type' => 'personal', + 'delimiter' => '/', + ), + 'user' => array( + 'type' => 'other', + 'delimiter' => '/', + ), + '' => array( + 'type' => 'shared', + 'delimiter' => '/', + ), + ), + $namespaces + ); + } +} \ No newline at end of file diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/TriggerTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/TriggerTest.php index 20d1adcd2..01e371bff 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/TriggerTest.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/TriggerTest.php @@ -40,4 +40,7 @@ class Horde_Kolab_Storage_TriggerTest extends PHPUnit_Framework_TestCase $this->_connection = $this->getMock('Horde_Kolab_Storage_Driver'); } + public function testNothing() + { + } } \ No newline at end of file -- 2.11.0