. * */ namespace OCA\user_ldap\tests; use \OCA\user_ldap\lib\Wizard; // use \OCA\user_ldap\USER_LDAP as UserLDAP; // use \OCA\user_ldap\lib\Access; // use \OCA\user_ldap\lib\Configuration; // use \OCA\user_ldap\lib\ILDAPWrapper; class Test_Wizard extends \PHPUnit_Framework_TestCase { public function setUp() { //we need to make sure the consts are defined, otherwise tests will fail //on systems without php5_ldap $ldapConsts = array('LDAP_OPT_PROTOCOL_VERSION', 'LDAP_OPT_REFERRALS', 'LDAP_OPT_NETWORK_TIMEOUT'); foreach($ldapConsts as $const) { if(!defined($const)) { define($const, 42); } } } private function getWizardAndMocks() { static $conMethods; if(is_null($conMethods)) { $conMethods = get_class_methods('\OCA\user_ldap\lib\Configuration'); } $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper'); $conf = $this->getMock('\OCA\user_ldap\lib\Configuration', $conMethods, array($lw, null, null)); return array(new Wizard($conf, $lw), $conf, $lw); } private function prepareLdapWrapperForConnections(&$ldap) { $ldap->expects($this->once()) ->method('connect') //dummy value, usually invalid ->will($this->returnValue(true)); $ldap->expects($this->exactly(3)) ->method('setOption') ->will($this->returnValue(true)); $ldap->expects($this->once()) ->method('bind') ->will($this->returnValue(true)); } public function testCumulativeSearchOnAttributeLimited() { list($wizard, $configuration, $ldap) = $this->getWizardAndMocks(); $configuration->expects($this->any()) ->method('__get') ->will($this->returnCallback(function($name) { if($name === 'ldapBase') { return array('base'); } return null; })); $this->prepareLdapWrapperForConnections($ldap); $ldap->expects($this->any()) ->method('isResource') ->will($this->returnValue(true)); $ldap->expects($this->exactly(2)) ->method('search') //dummy value, usually invalid ->will($this->returnValue(true)); $ldap->expects($this->exactly(2)) ->method('countEntries') //an is_resource check will follow, so we need to return a dummy resource ->will($this->returnValue(23)); //5 DNs per filter means 2x firstEntry and 8x nextEntry $ldap->expects($this->exactly(2)) ->method('firstEntry') //dummy value, usually invalid ->will($this->returnValue(true)); $ldap->expects($this->exactly(8)) ->method('nextEntry') //dummy value, usually invalid ->will($this->returnValue(true)); $ldap->expects($this->exactly(10)) ->method('getAttributes') //dummy value, usually invalid ->will($this->returnValue(array('cn' => array('foo'), 'count' => 1))); global $uidnumber; $uidnumber = 1; $ldap->expects($this->exactly(10)) ->method('getDN') //dummy value, usually invalid ->will($this->returnCallback(function($a, $b) { global $uidnumber; return $uidnumber++; })); # The following expectations are the real test # $filters = array('f1', 'f2', '*'); $wizard->cumulativeSearchOnAttribute($filters, 'cn', 5); unset($uidnumber); } public function testCumulativeSearchOnAttributeUnlimited() { list($wizard, $configuration, $ldap) = $this->getWizardAndMocks(); $configuration->expects($this->any()) ->method('__get') ->will($this->returnCallback(function($name) { if($name === 'ldapBase') { return array('base'); } return null; })); $this->prepareLdapWrapperForConnections($ldap); $ldap->expects($this->any()) ->method('isResource') ->will($this->returnCallback(function($r) { if($r === true) { return true; } if($r % 24 === 0) { global $uidnumber; $uidnumber++; return false; } return true; })); $ldap->expects($this->exactly(2)) ->method('search') //dummy value, usually invalid ->will($this->returnValue(true)); $ldap->expects($this->exactly(2)) ->method('countEntries') //an is_resource check will follow, so we need to return a dummy resource ->will($this->returnValue(23)); //5 DNs per filter means 2x firstEntry and 8x nextEntry $ldap->expects($this->exactly(2)) ->method('firstEntry') //dummy value, usually invalid ->will($this->returnCallback(function($r) { global $uidnumber; return $uidnumber; })); $ldap->expects($this->exactly(46)) ->method('nextEntry') //dummy value, usually invalid ->will($this->returnCallback(function($r) { global $uidnumber; return $uidnumber; })); $ldap->expects($this->exactly(46)) ->method('getAttributes') //dummy value, usually invalid ->will($this->returnValue(array('cn' => array('foo'), 'count' => 1))); global $uidnumber; $uidnumber = 1; $ldap->expects($this->exactly(46)) ->method('getDN') //dummy value, usually invalid ->will($this->returnCallback(function($a, $b) { global $uidnumber; return $uidnumber++; })); # The following expectations are the real test # $filters = array('f1', 'f2', '*'); $wizard->cumulativeSearchOnAttribute($filters, 'cn', 0); unset($uidnumber); } public function testCumulativeSearchOnAttributeSkipReadDN() { // tests that there is no infinite loop, when skipping already processed // DNs (they can be returned multiple times for multiple filters ) list($wizard, $configuration, $ldap) = $this->getWizardAndMocks(); $configuration->expects($this->any()) ->method('__get') ->will($this->returnCallback(function($name) { if($name === 'ldapBase') { return array('base'); } return null; })); $this->prepareLdapWrapperForConnections($ldap); $ldap->expects($this->any()) ->method('isResource') ->will($this->returnCallback(function($res) { return (bool)$res; })); $ldap->expects($this->any()) ->method('search') //dummy value, usually invalid ->will($this->returnValue(true)); $ldap->expects($this->any()) ->method('countEntries') //an is_resource check will follow, so we need to return a dummy resource ->will($this->returnValue(7)); //5 DNs per filter means 2x firstEntry and 8x nextEntry $ldap->expects($this->any()) ->method('firstEntry') //dummy value, usually invalid ->will($this->returnValue(1)); global $mark; $mark = false; // entries return order: 1, 2, 3, 4, 4, 5, 6 $ldap->expects($this->any()) ->method('nextEntry') //dummy value, usually invalid ->will($this->returnCallback(function($a, $prev){ $current = $prev + 1; if($current === 7) { return false; } global $mark; if($prev === 4 && !$mark) { $mark = true; return 4; } return $current; })); $ldap->expects($this->any()) ->method('getAttributes') //dummy value, usually invalid ->will($this->returnCallback(function($a, $entry) { return array('cn' => array($entry), 'count' => 1); })); $ldap->expects($this->any()) ->method('getDN') //dummy value, usually invalid ->will($this->returnCallback(function($a, $b) { return $b; })); # The following expectations are the real test # $filters = array('f1', 'f2', '*'); $resultArray = $wizard->cumulativeSearchOnAttribute($filters, 'cn', true, 0); $this->assertSame(6, count($resultArray)); unset($mark); } }