MemcachedCacheLockTestCase.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace Illuminate\Tests\Integration\Cache;
  3. use Illuminate\Contracts\Cache\LockTimeoutException;
  4. use Illuminate\Support\Carbon;
  5. use Illuminate\Support\Facades\Cache;
  6. /**
  7. * @requires extension memcached
  8. */
  9. class MemcachedCacheLockTestCase extends MemcachedIntegrationTestCase
  10. {
  11. public function testMemcachedLocksCanBeAcquiredAndReleased()
  12. {
  13. Cache::store('memcached')->lock('foo')->forceRelease();
  14. $this->assertTrue(Cache::store('memcached')->lock('foo', 10)->get());
  15. $this->assertFalse(Cache::store('memcached')->lock('foo', 10)->get());
  16. Cache::store('memcached')->lock('foo')->forceRelease();
  17. $this->assertTrue(Cache::store('memcached')->lock('foo', 10)->get());
  18. $this->assertFalse(Cache::store('memcached')->lock('foo', 10)->get());
  19. Cache::store('memcached')->lock('foo')->forceRelease();
  20. }
  21. public function testMemcachedLocksCanBlockForSeconds()
  22. {
  23. Carbon::setTestNow();
  24. Cache::store('memcached')->lock('foo')->forceRelease();
  25. $this->assertSame('taylor', Cache::store('memcached')->lock('foo', 10)->block(1, function () {
  26. return 'taylor';
  27. }));
  28. Cache::store('memcached')->lock('foo')->release();
  29. $this->assertTrue(Cache::store('memcached')->lock('foo', 10)->block(1));
  30. }
  31. public function testLocksCanRunCallbacks()
  32. {
  33. Cache::store('memcached')->lock('foo')->forceRelease();
  34. $this->assertSame('taylor', Cache::store('memcached')->lock('foo', 10)->get(function () {
  35. return 'taylor';
  36. }));
  37. }
  38. public function testLocksThrowTimeoutIfBlockExpires()
  39. {
  40. $this->expectException(LockTimeoutException::class);
  41. Carbon::setTestNow();
  42. Cache::store('memcached')->lock('foo')->release();
  43. Cache::store('memcached')->lock('foo', 5)->get();
  44. $this->assertSame('taylor', Cache::store('memcached')->lock('foo', 10)->block(1, function () {
  45. return 'taylor';
  46. }));
  47. }
  48. public function testConcurrentMemcachedLocksAreReleasedSafely()
  49. {
  50. Cache::store('memcached')->lock('bar')->forceRelease();
  51. $firstLock = Cache::store('memcached')->lock('bar', 1);
  52. $this->assertTrue($firstLock->acquire());
  53. sleep(2);
  54. $secondLock = Cache::store('memcached')->lock('bar', 10);
  55. $this->assertTrue($secondLock->acquire());
  56. $firstLock->release();
  57. $this->assertTrue(Cache::store('memcached')->has('bar'));
  58. }
  59. public function testMemcachedLocksCanBeReleasedUsingOwnerToken()
  60. {
  61. Cache::store('memcached')->lock('foo')->forceRelease();
  62. $firstLock = Cache::store('memcached')->lock('foo', 10);
  63. $this->assertTrue($firstLock->get());
  64. $owner = $firstLock->owner();
  65. $secondLock = Cache::store('memcached')->restoreLock('foo', $owner);
  66. $secondLock->release();
  67. $this->assertTrue(Cache::store('memcached')->lock('foo')->get());
  68. }
  69. }