1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- <?php
- namespace Illuminate\Tests\Redis;
- use Illuminate\Contracts\Redis\LimiterTimeoutException;
- use Illuminate\Foundation\Testing\Concerns\InteractsWithRedis;
- use Illuminate\Redis\Limiters\DurationLimiter;
- use PHPUnit\Framework\TestCase;
- use Throwable;
- class DurationLimiterTest extends TestCase
- {
- use InteractsWithRedis;
- protected function setUp(): void
- {
- parent::setUp();
- $this->setUpRedis();
- }
- protected function tearDown(): void
- {
- parent::tearDown();
- $this->tearDownRedis();
- }
- public function testItLocksTasksWhenNoSlotAvailable()
- {
- $store = [];
- (new DurationLimiter($this->redis(), 'key', 2, 2))->block(0, function () use (&$store) {
- $store[] = 1;
- });
- (new DurationLimiter($this->redis(), 'key', 2, 2))->block(0, function () use (&$store) {
- $store[] = 2;
- });
- try {
- (new DurationLimiter($this->redis(), 'key', 2, 2))->block(0, function () use (&$store) {
- $store[] = 3;
- });
- } catch (Throwable $e) {
- $this->assertInstanceOf(LimiterTimeoutException::class, $e);
- }
- $this->assertEquals([1, 2], $store);
- sleep(2);
- (new DurationLimiter($this->redis(), 'key', 2, 2))->block(0, function () use (&$store) {
- $store[] = 3;
- });
- $this->assertEquals([1, 2, 3], $store);
- }
- public function testItFailsImmediatelyOrRetriesForAWhileBasedOnAGivenTimeout()
- {
- $store = [];
- (new DurationLimiter($this->redis(), 'key', 1, 1))->block(2, function () use (&$store) {
- $store[] = 1;
- });
- try {
- (new DurationLimiter($this->redis(), 'key', 1, 1))->block(0, function () use (&$store) {
- $store[] = 2;
- });
- } catch (Throwable $e) {
- $this->assertInstanceOf(LimiterTimeoutException::class, $e);
- }
- (new DurationLimiter($this->redis(), 'key', 1, 1))->block(2, function () use (&$store) {
- $store[] = 3;
- });
- $this->assertEquals([1, 3], $store);
- }
- public function testItReturnsTheCallbackResult()
- {
- $limiter = new DurationLimiter($this->redis(), 'key', 1, 1);
- $result = $limiter->block(1, function () {
- return 'foo';
- });
- $this->assertSame('foo', $result);
- }
- private function redis()
- {
- return $this->redis['phpredis']->connection();
- }
- }
|