Restructure for DI.
authorGunnar Wrobel <p@rdus.de>
Sun, 20 Sep 2009 11:40:40 +0000 (13:40 +0200)
committerGunnar Wrobel <p@rdus.de>
Sun, 20 Sep 2009 11:40:40 +0000 (13:40 +0200)
framework/Kolab_Server/lib/Horde/Kolab/Server.php
framework/Kolab_Server/lib/Horde/Kolab/Server/File.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Structure.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Kolab.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Test.php
framework/Kolab_Server/test/Horde/Kolab/Server/ServerTest.php
framework/Kolab_Server/test/Horde/Kolab/Server/TestTest.php

index d1da1c1..25acdf4 100644 (file)
@@ -77,26 +77,43 @@ abstract class Horde_Kolab_Server
     protected $attributes;
 
     /**
+     * The data cache.
+     *
+     * @var Horde_Cache
+     */
+    protected $cache;
+
+    /**
+     * The log handler.
+     *
+     * @var Horde_Log_Logger
+     */
+    protected $logger;
+
+    /**
      * Construct a new Horde_Kolab_Server object.
      *
      * @param array $params Parameter array.
      */
-    public function __construct($params = array())
+    public function __construct(Horde_Kolab_Server_Structure $structure,
+                                Horde_Cache $cache = null,
+                                Horde_Log_Logger $logger = null,
+                                $params = array())
     {
-        $this->params = $params;
+        $structure->setServer($this);
+        $this->structure = $structure;
+        $this->cache     = $cache;
+        $this->logger    = $logger;
+        $this->params    = $params;
+
+        if (!isset($this->params['cache_lifetime'])) {
+            $this->params['cache_lifetime'] = 300;
+        }
+
         if (isset($params['uid'])) {
             $this->uid = $params['uid'];
         }
 
-        $structure        = isset($params['structure']['driver'])
-            ? $params['structure']['driver'] : 'kolab';
-        $structure_params = isset($params['structure']['params'])
-            ? $params['structure']['params'] : array();
-
-        $this->structure = &Horde_Kolab_Server_Structure::factory($structure,
-                                                                  $this,
-                                                                  $structure_params);
-
         // Initialize the search operations supported by this server.
         $this->searches = $this->getSearchOperations();
     }
@@ -117,12 +134,15 @@ abstract class Horde_Kolab_Server
      * @throws Horde_Kolab_Server_Exception If the requested Horde_Kolab_Server
      *                                      subclass could not be found.
      */
-    static public function &factory($driver, $params = array())
+    static public function &factory($provider)
     {
-        $class = 'Horde_Kolab_Server_' . ucfirst(basename($driver));
+        $class = 'Horde_Kolab_Server_' . ucfirst(basename($provider->kolab_server_driver));
         if (class_exists($class)) {
-            $db = new $class($params);
-            return $db;
+            $server = new $class($provider->kolab_server_structure,
+                                 isset($provider->cache) ? $provider->cache : null,
+                                 isset($provider->logger) ? $provider->logger : null,
+                                 $provider->kolab_server_params);
+            return $server;
         }
         throw new Horde_Kolab_Server_Exception(
             'Server type definition "' . $class . '" missing.');
@@ -154,6 +174,8 @@ abstract class Horde_Kolab_Server
 
         static $instances = array();
 
+        $provider = new stdClass;
+
         $sparam         = $params;
         $sparam['pass'] = isset($sparam['pass'])
             ? hash('sha256', $sparam['pass']) : '';
@@ -165,10 +187,10 @@ abstract class Horde_Kolab_Server
             $user_pass = '';
 
             if (!empty($params['driver'])) {
-                $driver = $params['driver'];
+                $provider->kolab_server_driver = $params['driver'];
                 unset($params['driver']);
             } else if (isset($conf['kolab']['server']['driver'])) {
-                $driver = $conf['kolab']['server']['driver'];
+                $provider->kolab_server_driver = $conf['kolab']['server']['driver'];
                 if (isset($conf['kolab']['server']['params'])) {
                     if (!is_array($params)) {
                         $params = $conf['kolab']['server']['params'];
@@ -186,9 +208,27 @@ abstract class Horde_Kolab_Server
                     'The configuration for the Kolab server driver is missing!');
             }
 
+            /* Provide caching */
+            if (!empty($params['cache']['driver']) && class_exists('Horde_Cache')) {
+                $provider->cache  = Horde_Cache::singleton($params['cache']['driver'],
+                                                           isset($params['cache']['params'])
+                                                           ? $params['cache']['params'] : null);
+            }
+
+            /* Provide the structure */
+            $structure        = isset($params['structure']['driver'])
+                ? $params['structure']['driver'] : 'kolab';
+            $structure_params = isset($params['structure']['params'])
+                ? $params['structure']['params'] : array();
+
+            $provider->kolab_server_structure = &Horde_Kolab_Server_Structure::factory($structure,
+                                                                                       $structure_params);
+
             if (isset($params['user'])) {
 
-                $tmp_server = &Horde_Kolab_Server::factory($driver, $params);
+                $provider->kolab_server_params = $params;
+
+                $tmp_server = &Horde_Kolab_Server::factory($provider);
 
                 try {
                     $uid = $tmp_server->uidForIdOrMail($params['user']);
@@ -212,8 +252,9 @@ abstract class Horde_Kolab_Server
                 $params['host'] = $params['host_master'];
             }
 
-            $instances[$signature] = &Horde_Kolab_Server::factory($driver,
-                                                                  $params);
+            $provider->kolab_server_params = $params;
+
+            $instances[$signature] = &Horde_Kolab_Server::factory($provider);
         }
 
         return $instances[$signature];
@@ -245,14 +286,9 @@ abstract class Horde_Kolab_Server
     function shutdown()
     {
         if (isset($this->attributes)) {
-            if (!empty($GLOBALS['conf']['kolab']['server']['cache']['driver'])
-               && class_exists('Horde_Cache')) {
-                $params = isset($GLOBALS['conf']['kolab']['server']['cache']['params'])
-                    ? $GLOBALS['conf']['kolab']['server']['cache']['params'] : null;
-                $cache  = Horde_Cache::singleton($GLOBALS['conf']['kolab']['server']['cache']['driver'],
-                                                 $params);
+            if (!empty($this->cache)) {
                 foreach ($this->attributes as $key => $value) {
-                    $cache->set('attributes_' . $key, @serialize($value));
+                    $this->cache->set('attributes_' . $key, @serialize($value));
                 }
             }
         }
@@ -424,25 +460,16 @@ abstract class Horde_Kolab_Server
      */
     public function &getAttributes($class)
     {
-        static $cache = null;
-        static $lifetime;
-
         if (!isset($this->attributes)) {
-            if (!empty($GLOBALS['conf']['kolab']['server']['cache']['driver'])
-                && class_exists('Horde_Cache')) {
-                $params = isset($GLOBALS['conf']['kolab']['server']['cache']['params'])
-                    ? $GLOBALS['conf']['kolab']['server']['cache']['params'] : null;
-                $cache  = Horde_Cache::singleton($GLOBALS['conf']['kolab']['server']['cache']['driver'],
-                                                 $params);
+            if (!empty($this->cache)) {
                 register_shutdown_function(array($this, 'shutdown'));
-                $lifetime = isset($GLOBALS['conf']['kolab']['server']['cache']['lifetime'])
-                    ? $GLOBALS['conf']['kolab']['server']['cache']['lifetime'] : 300;
             }
         }
         if (empty($this->attributes[$class])) {
 
-            if (!empty($cache)) {
-                $this->attributes[$class] = @unserialize($cache->get('attributes_' . $class, $lifetime));
+            if (!empty($this->cache)) {
+                $this->attributes[$class] = @unserialize($cache->get('attributes_' . $class,
+                                                                     $this->params['cache_lifetime']));
             }
 
             if (empty($this->attributes[$class])) {
@@ -461,9 +488,10 @@ abstract class Horde_Kolab_Server
                 $classes[] = $childclass;
 
                 if ($level == self::MAX_HIERARCHY) {
-                    Horde::logMessage(sprintf('The maximal level of the object hierarchy has been exceeded for class \"%s\"!',
-                                              $class),
-                                      __FILE__, __LINE__, PEAR_LOG_ERROR);
+                    if (!empty($this->logger)) {
+                        $logger->err(sprintf('The maximal level of the object hierarchy has been exceeded for class \"%s\"!',
+                                             $class));
+                    }
                 }
 
                 /**
index 6a32d5a..e1c9903 100644 (file)
@@ -41,14 +41,17 @@ class Horde_Kolab_Server_File extends Horde_Kolab_Server_Test
      *
      * @param array $params Parameter array.
      */
-    public function __construct($params = array())
+    public function __construct(Horde_Kolab_Server_Structure $structure,
+                                Horde_Cache $cache = null,
+                                Horde_Log_Logger $logger = null,
+                                $params = array())
     {
         if (isset($params['file'])) {
             $this->_file = $params['file'];
         } else {
-            $this->_file = Horde::getTempFile('Horde_Kolab_Server', false);
+            throw new Horde_Kolab_Server_Exception('The file based driver requires a \'file\' parameter.');
         }
-        parent::__construct($params);
+        parent::__construct($structure, $cache, $logger, $params);
     }
 
     
@@ -66,9 +69,10 @@ class Horde_Kolab_Server_File extends Horde_Kolab_Server_Test
                 $this->data = $data;
             } else {
                 $error = error_get_last();
-                Horde::logMessage(sprintf('Horde_Kolab_Server_file failed to read the database from %s. Error was: %s',
-                                          $this->_file, $error['message']), __FILE__,
-                                  __LINE__, PEAR_LOG_WARNING);
+                if (!empty($this->logger)) {
+                    $this->logger->warn(sprintf('Horde_Kolab_Server_file failed to read the database from %s. Error was: %s',
+                                                $this->_file, $error['message']));
+                }
                 $this->data = array();
             }
         }
@@ -85,9 +89,10 @@ class Horde_Kolab_Server_File extends Horde_Kolab_Server_Test
         $result = @file_put_contents($this->_file, $raw_data);
         if ($result === false) {
             $error = error_get_last();
-            Horde::logMessage(sprintf('Horde_Kolab_Server_file failed to store the database in %s. Error was: %s',
-                                      $this->_file,  $error['message']), __FILE__,
-                              __LINE__, PEAR_LOG_WARNING);
+            if (!empty($this->logger)) {
+                $this->logger->warn(sprintf('Horde_Kolab_Server_file failed to store the database in %s. Error was: %s',
+                                            $this->_file,  $error['message']));
+            }
         }
     }
 
index f9b753f..f3a41df 100644 (file)
@@ -70,7 +70,10 @@ class Horde_Kolab_Server_Ldap extends Horde_Kolab_Server
      *
      * @param array $params Parameter array.
      */
-    public function __construct($params = array())
+    public function __construct(Horde_Kolab_Server_Structure $structure,
+                                Horde_Cache $cache = null,
+                                Horde_Log_Logger $logger = null,
+                                $params = array())
     {
         if (!isset($params['charset'])) {
             $params['charset'] = 'UTF-8';
@@ -98,7 +101,7 @@ class Horde_Kolab_Server_Ldap extends Horde_Kolab_Server
 
         $this->connect();
 
-        parent::__construct($params);
+        parent::__construct($structure, $cache, $logger, $params);
     }
 
     
@@ -261,9 +264,10 @@ class Horde_Kolab_Server_Ldap extends Horde_Kolab_Server
                                                        Horde_Kolab_Server_Exception::SYSTEM);
             }
         }
-        Horde::logMessage(sprintf('The object \"%s\" has been successfully saved!',
-                                  $uid),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        if (!empty($this->logger)) {
+            $this->logger->debug(sprintf('The object \"%s\" has been successfully saved!',
+                                         $uid));
+        }
         return true;
     }
 
@@ -283,9 +287,10 @@ class Horde_Kolab_Server_Ldap extends Horde_Kolab_Server
             throw new Horde_Kolab_Server_Exception($result,
                                                    Horde_Kolab_Server_Exception::SYSTEM);
         }
-        Horde::logMessage(sprintf('The object \"%s\" has been successfully deleted!',
-                                  $uid),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        if (!empty($this->logger)) {
+            $this->logger(sprintf('The object \"%s\" has been successfully deleted!',
+                                  $uid));
+        }
         return true;
     }
 
@@ -308,9 +313,10 @@ class Horde_Kolab_Server_Ldap extends Horde_Kolab_Server
             throw new Horde_Kolab_Server_Exception($result,
                                                    Horde_Kolab_Server_Exception::SYSTEM);
         }
-        Horde::logMessage(sprintf('The object \"%s\" has been successfully renamed to \"%s\"!',
-                                  $uid, $new),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        if (!empty($this->logger)) {
+            $this->logger->debug(sprintf('The object \"%s\" has been successfully renamed to \"%s\"!',
+                                         $uid, $new));
+        }
         return true;
     }
 
index 2756b4f..857e90e 100644 (file)
@@ -44,16 +44,24 @@ abstract class Horde_Kolab_Server_Structure
     /**
      * Construct a new Horde_Kolab_Server_Structure object.
      *
-     * @param Horde_Kolab_Server &$server A link to the server handler.
      * @param array              $params  Parameter array.
      */
-    public function __construct(&$server, $params = array())
+    public function __construct($params = array())
     {
-        $this->server = &$server;
         $this->params = $params;
     }
 
     /**
+     * Set the server reference for this object.
+     *
+     * @param Horde_Kolab_Server &$server A link to the server handler.
+     */
+    public function setServer($server)
+    {
+        $this->server = $server;
+    }
+
+    /**
      * Attempts to return a concrete Horde_Kolab_Server_Structure instance based
      * on $driver.
      *
@@ -70,18 +78,17 @@ abstract class Horde_Kolab_Server_Structure
      * @throws Horde_Kolab_Server_Exception If the requested Horde_Kolab_Server_Structure
      *                                      subclass could not be found.
      */
-    static public function &factory($driver, &$server, $params = array())
+    static public function &factory($driver, $params = array())
     {
         if (class_exists($driver)) {
             $class = $driver;
         } else {
             $class = 'Horde_Kolab_Server_Structure_' . ucfirst(basename($driver));
             if (!class_exists($class)) {
-                throw new Horde_Kolab_Server_Exception(
-                    'Structure type definition "' . $class . '" missing.');
+                throw new Horde_Kolab_Server_Exception('Structure type definition "' . $class . '" missing.');
             }
         }
-        $structure = new $class($server, $params);
+        $structure = new $class($params);
         return $structure;
     }
 
index d1880ea..ecfac6a 100644 (file)
@@ -68,6 +68,9 @@ class Horde_Kolab_Server_Structure_Kolab extends Horde_Kolab_Server_Structure_Ld
      */
     public function determineType($uid)
     {
+        if (empty($this->server)) {
+            throw new Horde_Kolab_Server_Exception('The server reference is missing!');
+        }
         $oc = $this->server->getObjectClasses($uid);
         // Not a user type?
         if (!in_array('kolabinetorgperson', $oc)) {
index 287a7a3..7c0d6c3 100644 (file)
@@ -51,6 +51,9 @@ class Horde_Kolab_Server_Structure_Ldap extends Horde_Kolab_Server_Structure
      */
     public function determineType($uid)
     {
+        if (empty($this->server)) {
+            throw new Horde_Kolab_Server_Exception('The server reference is missing!');
+        }
         $ocs = $this->server->getObjectClasses($uid);
         $ocs = array_reverse($ocs);
         foreach ($ocs as $oc) {
@@ -81,6 +84,9 @@ class Horde_Kolab_Server_Structure_Ldap extends Horde_Kolab_Server_Structure
      */
     public function generateServerUid($type, $id, $info)
     {
+        if (empty($this->server)) {
+            throw new Horde_Kolab_Server_Exception('The server reference is missing!');
+        }
         return sprintf('%s,%s', $id, $this->server->getBaseUid());
     }
 
@@ -93,8 +99,6 @@ class Horde_Kolab_Server_Structure_Ldap extends Horde_Kolab_Server_Structure
      */
     public function quoteForUid($id)
     {
-        require_once 'Net/LDAP2/Util.php';
-
         $id = Net_LDAP2_Util::escape_dn_value($id);
         return $id[0];
     }
@@ -108,8 +112,6 @@ class Horde_Kolab_Server_Structure_Ldap extends Horde_Kolab_Server_Structure
      */
     public function quoteForFilter($part)
     {
-        require_once 'Net/LDAP2/Util.php';
-
         $part = Net_LDAP2_Util::escape_filter_value($part);
         return $part[0];
     }
index 78fd8b7..af8451f 100644 (file)
@@ -89,7 +89,10 @@ class Horde_Kolab_Server_Test extends Horde_Kolab_Server_Ldap
      *
      * @param array $params Parameter array.
      */
-    public function __construct($params = array())
+    public function __construct(Horde_Kolab_Server_Structure $structure,
+                                Horde_Cache $cache = null,
+                                Horde_Log_Logger $logger = null,
+                                $params = array())
     {
         $this->load();
         if (isset($params['data'])) {
@@ -100,7 +103,7 @@ class Horde_Kolab_Server_Test extends Horde_Kolab_Server_Ldap
             }
         }
 
-        parent::__construct($params);
+        parent::__construct($structure, $cache, $logger, $params);
 
         if (isset($this->params['admin'])
             && isset($this->params['admin']['type'])) {
@@ -593,11 +596,12 @@ class Horde_Kolab_Server_Test extends Horde_Kolab_Server_Ldap
             }
         }
 
-
-        Horde::logMessage(sprintf('The object \"%s\" has been successfully saved!',
-                                  $uid),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
         $this->store();
+
+        if (!empty($this->logger)) {
+            $logger->debug(sprintf('The object \"%s\" has been successfully saved!',
+                                   $uid));
+        }
     }
 
     /**
@@ -639,9 +643,10 @@ class Horde_Kolab_Server_Test extends Horde_Kolab_Server_Ldap
                                                                         $uid));
         }
         $this->store();
-        Horde::logMessage(sprintf('The object \"%s\" has been successfully deleted!',
-                                  $uid),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        if (!empty($this->logger)) {
+            $logger->debug(sprintf('The object \"%s\" has been successfully deleted!',
+                                   $uid));
+        }
         return true;
     }
 
@@ -662,9 +667,10 @@ class Horde_Kolab_Server_Test extends Horde_Kolab_Server_Ldap
             unset($this->data[$uid]);
         }
         $this->store();
-        Horde::logMessage(sprintf('The object \"%s\" has been successfully renamed to \"%s\"!',
-                                  $uid, $new),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        if (!empty($this->logger)) {
+            $logger->debug(sprintf('The object \"%s\" has been successfully renamed to \"%s\"!',
+                                   $uid, $new));
+        }
         return true;
     }
 
index f80773a..231d334 100644 (file)
@@ -39,7 +39,10 @@ class Horde_Kolab_Server_ServerTest extends PHPUnit_Framework_TestCase
      */
     public function testGenerateUid()
     {
-        $ks = &Horde_Kolab_Server::factory('none');
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'none';
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $ks   = &Horde_Kolab_Server::factory($provider);
         $user = new Horde_Kolab_Server_Object($ks, null, null);
         $this->assertEquals(preg_replace('/[0-9a-f]*/', '', $user->get(Horde_Kolab_Server_Object::ATTRIBUTE_UID)), '');
     }
@@ -52,11 +55,14 @@ class Horde_Kolab_Server_ServerTest extends PHPUnit_Framework_TestCase
     public function testCreation()
     {
         try {
-            Horde_Kolab_Server::factory('dummy');
+            $provider = new stdClass;
+            $provider->kolab_server_driver = 'dummy';
+            $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+            Horde_Kolab_Server::factory($provider);
             $this->assertFail('No error!');
         } catch (Horde_Kolab_Server_Exception $e) {
-            $this->assertEquals($e->getMessage(),
-                                'Server type definition "Horde_Kolab_Server_Dummy" missing.');
+            $this->assertEquals('Server type definition "Horde_Kolab_Server_Dummy" missing.',
+                                $e->getMessage());
         }
     }
 
@@ -69,11 +75,17 @@ class Horde_Kolab_Server_ServerTest extends PHPUnit_Framework_TestCase
      */
     public function testFetch()
     {
-        $ks   = &Horde_Kolab_Server::factory('none');
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'none';
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $ks   = &Horde_Kolab_Server::factory($provider);
         $user = $ks->fetch('test');
         $this->assertEquals('Horde_Kolab_Server_Object_Kolab_User', get_class($user));
 
-        $ks   = &Horde_Kolab_Server::factory('none', array('uid' => 'test'));
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'none';
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $ks   = &Horde_Kolab_Server::factory($provider);
         $user = $ks->fetch();
         $this->assertEquals('Horde_Kolab_Server_Object_Kolab_User', get_class($user));
     }
@@ -85,11 +97,18 @@ class Horde_Kolab_Server_ServerTest extends PHPUnit_Framework_TestCase
      */
     public function testList()
     {
-        $ks   = &Horde_Kolab_Server::factory('none');
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'none';
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $ks   = &Horde_Kolab_Server::factory($provider);
         $hash = $ks->listHash('Horde_Kolab_Server_Object');
         $this->assertEquals($hash, array());
 
-        $ks   = &Horde_Kolab_Server::factory('none', array('whatever'));
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'none';
+        $provider->kolab_server_params = array('whatever');
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $ks   = &Horde_Kolab_Server::factory($provider);
         $hash = $ks->listHash('Horde_Kolab_Server_Object');
         $this->assertEquals($hash, array());
     }
index a9ec3df..9744217 100644 (file)
@@ -440,7 +440,11 @@ class Horde_Kolab_Server_testTest extends Horde_Kolab_Test_Server
      */
     public function testFilterParse()
     {
-        $db = &Horde_Kolab_Server::factory('test', array());
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'test';
+        $provider->kolab_server_params = array();
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $db = &Horde_Kolab_Server::factory($provider);
 
         $a = $db->parse('(a=b)');
         $this->assertNoError($a);
@@ -494,44 +498,46 @@ class Horde_Kolab_Server_testTest extends Horde_Kolab_Test_Server
      */
     public function testSearch()
     {
-        $db = &Horde_Kolab_Server::factory('test',
-                                           array('data' =>
-                                                 array(
-                                                     'cn=a' => array(
-                                                         'dn' => 'cn=a',
-                                                         'data' => array(
-                                                             'a' => '1',
-                                                             'b' => '1',
-                                                             'c' => '1',
-                                                         )
-                                                     ),
-                                                     'cn=b' => array(
-                                                         'dn' => 'cn=b',
-                                                         'data' => array(
-                                                             'a' => '1',
-                                                             'b' => '2',
-                                                             'c' => '2',
-                                                         )
-                                                     ),
-                                                     'cn=c' => array(
-                                                         'dn' => 'cn=c',
-                                                         'data' => array(
-                                                             'a' => '1',
-                                                             'b' => '2',
-                                                             'c' => '3',
-                                                         )
-                                                     ),
-                                                     'cn=d' => array(
-                                                         'dn' => 'cn=d',
-                                                         'data' => array(
-                                                             'a' => '2',
-                                                             'b' => '2',
-                                                             'c' => '1',
-                                                         )
-                                                     ),
-                                                 )
-                                           )
+        $provider = new stdClass;
+        $provider->kolab_server_driver = 'test';
+        $provider->kolab_server_structure = new Horde_Kolab_Server_Structure_Ldap();
+        $provider->kolab_server_params = array('data' =>
+                                               array(
+                                                   'cn=a' => array(
+                                                       'dn' => 'cn=a',
+                                                       'data' => array(
+                                                           'a' => '1',
+                                                           'b' => '1',
+                                                           'c' => '1',
+                                                       )
+                                                   ),
+                                                   'cn=b' => array(
+                                                       'dn' => 'cn=b',
+                                                       'data' => array(
+                                                           'a' => '1',
+                                                           'b' => '2',
+                                                           'c' => '2',
+                                                       )
+                                                   ),
+                                                   'cn=c' => array(
+                                                       'dn' => 'cn=c',
+                                                       'data' => array(
+                                                           'a' => '1',
+                                                           'b' => '2',
+                                                           'c' => '3',
+                                                       )
+                                                   ),
+                                                   'cn=d' => array(
+                                                       'dn' => 'cn=d',
+                                                       'data' => array(
+                                                           'a' => '2',
+                                                           'b' => '2',
+                                                           'c' => '1',
+                                                       )
+                                                   ),
+                                               )
         );
+        $db = &Horde_Kolab_Server::factory($provider);
 
         $a = $db->search('(c=1)');
         $this->assertNoError($a);