forked from laravel/framework
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDurationLimiterTest.php
More file actions
101 lines (77 loc) · 2.5 KB
/
DurationLimiterTest.php
File metadata and controls
101 lines (77 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?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;
/**
* @group redislimiters
*/
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->assertEquals('foo', $result);
}
private function redis()
{
return $this->redis['phpredis']->connection();
}
}