X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Ftests%2FDrupal%2FTests%2FCore%2FTempStore%2FSharedTempStoreTest.php;fp=web%2Fcore%2Ftests%2FDrupal%2FTests%2FCore%2FTempStore%2FSharedTempStoreTest.php;h=55a78b9a25a5615c44f0d1abfdf67c45d1b5b584;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php b/web/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php new file mode 100644 index 000000000..55a78b9a2 --- /dev/null +++ b/web/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php @@ -0,0 +1,353 @@ +keyValue = $this->getMock('Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface'); + $this->lock = $this->getMock('Drupal\Core\Lock\LockBackendInterface'); + $this->requestStack = new RequestStack(); + $request = Request::createFromGlobals(); + $this->requestStack->push($request); + + $this->tempStore = new SharedTempStore($this->keyValue, $this->lock, $this->owner, $this->requestStack, 604800); + + $this->ownObject = (object) [ + 'data' => 'test_data', + 'owner' => $this->owner, + 'updated' => (int) $request->server->get('REQUEST_TIME'), + ]; + + // Clone the object but change the owner. + $this->otherObject = clone $this->ownObject; + $this->otherObject->owner = 2; + } + + /** + * @covers ::get + */ + public function testGet() { + $this->keyValue->expects($this->at(0)) + ->method('get') + ->with('test_2') + ->will($this->returnValue(FALSE)); + $this->keyValue->expects($this->at(1)) + ->method('get') + ->with('test') + ->will($this->returnValue($this->ownObject)); + + $this->assertNull($this->tempStore->get('test_2')); + $this->assertSame($this->ownObject->data, $this->tempStore->get('test')); + } + + /** + * Tests the getIfOwner() method. + * + * @covers ::getIfOwner + */ + public function testGetIfOwner() { + $this->keyValue->expects($this->at(0)) + ->method('get') + ->with('test_2') + ->will($this->returnValue(FALSE)); + $this->keyValue->expects($this->at(1)) + ->method('get') + ->with('test') + ->will($this->returnValue($this->ownObject)); + $this->keyValue->expects($this->at(2)) + ->method('get') + ->with('test') + ->will($this->returnValue($this->otherObject)); + + $this->assertNull($this->tempStore->getIfOwner('test_2')); + $this->assertSame($this->ownObject->data, $this->tempStore->getIfOwner('test')); + $this->assertNull($this->tempStore->getIfOwner('test')); + } + + /** + * Tests the set() method with no lock available. + * + * @covers ::set + */ + public function testSetWithNoLockAvailable() { + $this->lock->expects($this->at(0)) + ->method('acquire') + ->with('test') + ->will($this->returnValue(FALSE)); + $this->lock->expects($this->at(1)) + ->method('wait') + ->with('test'); + $this->lock->expects($this->at(2)) + ->method('acquire') + ->with('test') + ->will($this->returnValue(FALSE)); + + $this->keyValue->expects($this->once()) + ->method('getCollectionName'); + + $this->setExpectedException(TempStoreException::class); + $this->tempStore->set('test', 'value'); + } + + /** + * Tests a successful set() call. + * + * @covers ::set + */ + public function testSet() { + $this->lock->expects($this->once()) + ->method('acquire') + ->with('test') + ->will($this->returnValue(TRUE)); + $this->lock->expects($this->never()) + ->method('wait'); + $this->lock->expects($this->once()) + ->method('release') + ->with('test'); + + $this->keyValue->expects($this->once()) + ->method('setWithExpire') + ->with('test', $this->ownObject, 604800); + + $this->tempStore->set('test', 'test_data'); + } + + /** + * Tests the setIfNotExists() methods. + * + * @covers ::setIfNotExists + */ + public function testSetIfNotExists() { + $this->keyValue->expects($this->once()) + ->method('setWithExpireIfNotExists') + ->with('test', $this->ownObject, 604800) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($this->tempStore->setIfNotExists('test', 'test_data')); + } + + /** + * Tests the setIfOwner() method when no key exists. + * + * @covers ::setIfOwner + */ + public function testSetIfOwnerWhenNotExists() { + $this->keyValue->expects($this->once()) + ->method('setWithExpireIfNotExists') + ->will($this->returnValue(TRUE)); + + $this->assertTrue($this->tempStore->setIfOwner('test', 'test_data')); + } + + /** + * Tests the setIfOwner() method when a key already exists but no object. + * + * @covers ::setIfOwner + */ + public function testSetIfOwnerNoObject() { + $this->keyValue->expects($this->once()) + ->method('setWithExpireIfNotExists') + ->will($this->returnValue(FALSE)); + + $this->keyValue->expects($this->once()) + ->method('get') + ->with('test') + ->will($this->returnValue(FALSE)); + + $this->assertFalse($this->tempStore->setIfOwner('test', 'test_data')); + } + + /** + * Tests the setIfOwner() method with matching and non matching owners. + * + * @covers ::setIfOwner + */ + public function testSetIfOwner() { + $this->lock->expects($this->once()) + ->method('acquire') + ->with('test') + ->will($this->returnValue(TRUE)); + + $this->keyValue->expects($this->exactly(2)) + ->method('setWithExpireIfNotExists') + ->will($this->returnValue(FALSE)); + + $this->keyValue->expects($this->exactly(2)) + ->method('get') + ->with('test') + ->will($this->onConsecutiveCalls($this->ownObject, $this->otherObject)); + + $this->assertTrue($this->tempStore->setIfOwner('test', 'test_data')); + $this->assertFalse($this->tempStore->setIfOwner('test', 'test_data')); + } + + /** + * Tests the getMetadata() method. + * + * @covers ::getMetadata + */ + public function testGetMetadata() { + $this->keyValue->expects($this->at(0)) + ->method('get') + ->with('test') + ->will($this->returnValue($this->ownObject)); + + $this->keyValue->expects($this->at(1)) + ->method('get') + ->with('test') + ->will($this->returnValue(FALSE)); + + $metadata = $this->tempStore->getMetadata('test'); + $this->assertObjectHasAttribute('owner', $metadata); + // Data should get removed. + $this->assertObjectNotHasAttribute('data', $metadata); + + $this->assertNull($this->tempStore->getMetadata('test')); + } + + /** + * Tests the delete() method. + * + * @covers ::delete + */ + public function testDelete() { + $this->lock->expects($this->once()) + ->method('acquire') + ->with('test') + ->will($this->returnValue(TRUE)); + $this->lock->expects($this->never()) + ->method('wait'); + $this->lock->expects($this->once()) + ->method('release') + ->with('test'); + + $this->keyValue->expects($this->once()) + ->method('delete') + ->with('test'); + + $this->tempStore->delete('test'); + } + + /** + * Tests the delete() method with no lock available. + * + * @covers ::delete + */ + public function testDeleteWithNoLockAvailable() { + $this->lock->expects($this->at(0)) + ->method('acquire') + ->with('test') + ->will($this->returnValue(FALSE)); + $this->lock->expects($this->at(1)) + ->method('wait') + ->with('test'); + $this->lock->expects($this->at(2)) + ->method('acquire') + ->with('test') + ->will($this->returnValue(FALSE)); + + $this->keyValue->expects($this->once()) + ->method('getCollectionName'); + + $this->setExpectedException(TempStoreException::class); + $this->tempStore->delete('test'); + } + + /** + * Tests the deleteIfOwner() method. + * + * @covers ::deleteIfOwner + */ + public function testDeleteIfOwner() { + $this->lock->expects($this->once()) + ->method('acquire') + ->with('test_2') + ->will($this->returnValue(TRUE)); + + $this->keyValue->expects($this->at(0)) + ->method('get') + ->with('test_1') + ->will($this->returnValue(FALSE)); + $this->keyValue->expects($this->at(1)) + ->method('get') + ->with('test_2') + ->will($this->returnValue($this->ownObject)); + $this->keyValue->expects($this->at(2)) + ->method('delete') + ->with('test_2'); + $this->keyValue->expects($this->at(3)) + ->method('get') + ->with('test_3') + ->will($this->returnValue($this->otherObject)); + + $this->assertTrue($this->tempStore->deleteIfOwner('test_1')); + $this->assertTrue($this->tempStore->deleteIfOwner('test_2')); + $this->assertFalse($this->tempStore->deleteIfOwner('test_3')); + } + +}