em = $this->_getTestEntityManager(); $this->cache = new DefaultCache($this->em); } /** * @param string $className * @param array $identifier * @param array $data */ private function putEntityCacheEntry($className, array $identifier, array $data) { $metadata = $this->em->getClassMetadata($className); $cacheKey = new EntityCacheKey($metadata->name, $identifier); $cacheEntry = new EntityCacheEntry($metadata->name, $data); $persister = $this->em->getUnitOfWork()->getEntityPersister($metadata->rootEntityName); $persister->getCacheRegion()->put($cacheKey, $cacheEntry); } /** * @param string $className * @param string $association * @param array $ownerIdentifier * @param array $data */ private function putCollectionCacheEntry($className, $association, array $ownerIdentifier, array $data) { $metadata = $this->em->getClassMetadata($className); $cacheKey = new CollectionCacheKey($metadata->name, $association, $ownerIdentifier); $cacheEntry = new CollectionCacheEntry($data); $persister = $this->em->getUnitOfWork()->getCollectionPersister($metadata->getAssociationMapping($association)); $persister->getCacheRegion()->put($cacheKey, $cacheEntry); } public function testImplementsCache() { $this->assertInstanceOf('Doctrine\ORM\Cache', $this->cache); } public function testGetEntityCacheRegionAccess() { $this->assertInstanceOf('Doctrine\ORM\Cache\Region', $this->cache->getEntityCacheRegion(State::CLASSNAME)); $this->assertNull($this->cache->getEntityCacheRegion(self::NON_CACHEABLE_ENTITY)); } public function testGetCollectionCacheRegionAccess() { $this->assertInstanceOf('Doctrine\ORM\Cache\Region', $this->cache->getCollectionCacheRegion(State::CLASSNAME, 'cities')); $this->assertNull($this->cache->getCollectionCacheRegion(self::NON_CACHEABLE_ENTITY, 'phonenumbers')); } public function testContainsEntity() { $identifier = array('id'=>1); $className = Country::CLASSNAME; $cacheEntry = array_merge($identifier, array('name' => 'Brazil')); $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, 1)); $this->putEntityCacheEntry($className, $identifier, $cacheEntry); $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, 1)); $this->assertFalse($this->cache->containsEntity(self::NON_CACHEABLE_ENTITY, 1)); } public function testEvictEntity() { $identifier = array('id'=>1); $className = Country::CLASSNAME; $cacheEntry = array_merge($identifier, array('name' => 'Brazil')); $this->putEntityCacheEntry($className, $identifier, $cacheEntry); $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, 1)); $this->cache->evictEntity(Country::CLASSNAME, 1); $this->cache->evictEntity(self::NON_CACHEABLE_ENTITY, 1); $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, 1)); } public function testEvictEntityRegion() { $identifier = array('id'=>1); $className = Country::CLASSNAME; $cacheEntry = array_merge($identifier, array('name' => 'Brazil')); $this->putEntityCacheEntry($className, $identifier, $cacheEntry); $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, 1)); $this->cache->evictEntityRegion(Country::CLASSNAME); $this->cache->evictEntityRegion(self::NON_CACHEABLE_ENTITY); $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, 1)); } public function testEvictEntityRegions() { $identifier = array('id'=>1); $className = Country::CLASSNAME; $cacheEntry = array_merge($identifier, array('name' => 'Brazil')); $this->putEntityCacheEntry($className, $identifier, $cacheEntry); $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, 1)); $this->cache->evictEntityRegions(); $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, 1)); } public function testContainsCollection() { $ownerId = array('id'=>1); $className = State::CLASSNAME; $association = 'cities'; $cacheEntry = array( array('id' => 11), array('id' => 12), ); $this->assertFalse($this->cache->containsCollection(State::CLASSNAME, $association, 1)); $this->putCollectionCacheEntry($className, $association, $ownerId, $cacheEntry); $this->assertTrue($this->cache->containsCollection(State::CLASSNAME, $association, 1)); $this->assertFalse($this->cache->containsCollection(self::NON_CACHEABLE_ENTITY, 'phonenumbers', 1)); } public function testEvictCollection() { $ownerId = array('id'=>1); $className = State::CLASSNAME; $association = 'cities'; $cacheEntry = array( array('id' => 11), array('id' => 12), ); $this->putCollectionCacheEntry($className, $association, $ownerId, $cacheEntry); $this->assertTrue($this->cache->containsCollection(State::CLASSNAME, $association, 1)); $this->cache->evictCollection($className, $association, $ownerId); $this->cache->evictCollection(self::NON_CACHEABLE_ENTITY, 'phonenumbers', 1); $this->assertFalse($this->cache->containsCollection(State::CLASSNAME, $association, 1)); } public function testEvictCollectionRegion() { $ownerId = array('id'=>1); $className = State::CLASSNAME; $association = 'cities'; $cacheEntry = array( array('id' => 11), array('id' => 12), ); $this->putCollectionCacheEntry($className, $association, $ownerId, $cacheEntry); $this->assertTrue($this->cache->containsCollection(State::CLASSNAME, $association, 1)); $this->cache->evictCollectionRegion($className, $association); $this->cache->evictCollectionRegion(self::NON_CACHEABLE_ENTITY, 'phonenumbers'); $this->assertFalse($this->cache->containsCollection(State::CLASSNAME, $association, 1)); } public function testEvictCollectionRegions() { $ownerId = array('id'=>1); $className = State::CLASSNAME; $association = 'cities'; $cacheEntry = array( array('id' => 11), array('id' => 12), ); $this->putCollectionCacheEntry($className, $association, $ownerId, $cacheEntry); $this->assertTrue($this->cache->containsCollection(State::CLASSNAME, $association, 1)); $this->cache->evictCollectionRegions(); $this->assertFalse($this->cache->containsCollection(State::CLASSNAME, $association, 1)); } public function testQueryCache() { $this->assertFalse($this->cache->containsQuery('foo')); $defaultQueryCache = $this->cache->getQueryCache(); $fooQueryCache = $this->cache->getQueryCache('foo'); $this->assertInstanceOf('Doctrine\ORM\Cache\QueryCache', $defaultQueryCache); $this->assertInstanceOf('Doctrine\ORM\Cache\QueryCache', $fooQueryCache); $this->assertSame($defaultQueryCache, $this->cache->getQueryCache()); $this->assertSame($fooQueryCache, $this->cache->getQueryCache('foo')); $this->cache->evictQueryRegion(); $this->cache->evictQueryRegion('foo'); $this->cache->evictQueryRegions(); $this->assertTrue($this->cache->containsQuery('foo')); $this->assertSame($defaultQueryCache, $this->cache->getQueryCache()); $this->assertSame($fooQueryCache, $this->cache->getQueryCache('foo')); } public function testToIdentifierArrayShouldLookupForEntityIdentifier() { $identifier = 123; $entity = new Country('Foo'); $metadata = $this->em->getClassMetadata(Country::CLASSNAME); $method = new \ReflectionMethod($this->cache, 'toIdentifierArray'); $property = new \ReflectionProperty($entity, 'id'); $property->setAccessible(true); $method->setAccessible(true); $property->setValue($entity, $identifier); $this->assertEquals(array('id'=>$identifier), $method->invoke($this->cache, $metadata, $identifier)); } }