Code
Explorer
You are a developer and looking for Shopware projects?
Apply Now!
createLimiter example
'limits' =>
[
[
'domain' => 'test.limit',
'interval' => '10 seconds',
]
,
]
,
]
;
}
public
function
testConsume
(
)
: void
{
$limiter
=
$this
->
createLimiter
(
[
'test.limit' => 3,
]
)
;
$limit
=
$limiter
->
consume
(
)
;
static
::
assertTrue
(
$limit
->
isAccepted
(
)
)
;
$limiter
->
reset
(
)
;
$limit
=
$limiter
->
consume
(
3
)
;
static
::
assertTrue
(
$limit
->
isAccepted
(
)
)
;
private
InMemoryStorage
$storage
;
protected
function
setUp
(
)
: void
{
$this
->storage =
new
InMemoryStorage
(
)
;
ClockMock::
register
(
InMemoryStorage::
class
)
;
}
public
function
testConsume
(
)
{
$limiter1
=
$this
->
createLimiter
(
4,
new
\
DateInterval
(
'PT1S'
)
)
;
$limiter2
=
$this
->
createLimiter
(
8,
new
\
DateInterval
(
'PT10S'
)
)
;
$limiter3
=
$this
->
createLimiter
(
12,
new
\
DateInterval
(
'PT30S'
)
)
;
$limiter
=
new
CompoundLimiter
(
[
$limiter1
,
$limiter2
,
$limiter3
]
)
;
$this
->
assertEquals
(
0,
$limiter
->
consume
(
4
)
->
getRemainingTokens
(
)
, 'Limiter 1 reached the limit'
)
;
sleep
(
1
)
; // reset limiter1's window
$this
->
assertTrue
(
$limiter
->
consume
(
3
)
->
isAccepted
(
)
)
;
$this
->
assertEquals
(
0,
$limiter
->
consume
(
)
->
getRemainingTokens
(
)
, 'Limiter 2 has no remaining tokens left'
)
;
sleep
(
10
)
; // reset limiter2's window
$this
->
assertTrue
(
$limiter
->
consume
(
3
)
->
isAccepted
(
)
)
;
$this
->storage =
new
InMemoryStorage
(
)
;
ClockMock::
register
(
TokenBucketLimiter::
class
)
;
ClockMock::
register
(
InMemoryStorage::
class
)
;
ClockMock::
register
(
TokenBucket::
class
)
;
ClockMock::
register
(
RateLimit::
class
)
;
}
public
function
testReserve
(
)
{
$limiter
=
$this
->
createLimiter
(
)
;
$this
->
assertEquals
(
0,
$limiter
->
reserve
(
5
)
->
getWaitDuration
(
)
)
;
$this
->
assertEquals
(
0,
$limiter
->
reserve
(
5
)
->
getWaitDuration
(
)
)
;
$this
->
assertEquals
(
1,
$limiter
->
reserve
(
5
)
->
getWaitDuration
(
)
)
;
}
public
function
testReserveMoreTokensThanBucketSize
(
)
{
$this
->
expectException
(
\LogicException::
class
)
;
$this
->
expectExceptionMessage
(
'Cannot reserve more tokens (15) than the burst size of the rate limiter (10).'
)
;
protected
function
setUp
(
)
: void
{
$this
->storage =
new
InMemoryStorage
(
)
;
ClockMock::
register
(
InMemoryStorage::
class
)
;
ClockMock::
register
(
RateLimit::
class
)
;
}
public
function
testConsume
(
)
{
$limiter
=
$this
->
createLimiter
(
)
;
$limiter
->
consume
(
8
)
;
sleep
(
15
)
;
$rateLimit
=
$limiter
->
consume
(
)
;
$this
->
assertTrue
(
$rateLimit
->
isAccepted
(
)
)
;
$this
->
assertSame
(
10,
$rateLimit
->
getLimit
(
)
)
;
// We are 25% into the new window
$rateLimit
=
$limiter
->
consume
(
5
)
;
$this
->
assertFalse
(
$rateLimit
->
isAccepted
(
)
)
;
protected
function
setUp
(
)
: void
{
$this
->storage =
new
InMemoryStorage
(
)
;
ClockMock::
register
(
InMemoryStorage::
class
)
;
ClockMock::
register
(
RateLimit::
class
)
;
}
public
function
testConsume
(
)
{
$now
=
time
(
)
;
$limiter
=
$this
->
createLimiter
(
)
;
// fill 9 tokens in 45 seconds
for
(
$i
= 0;
$i
< 9; ++
$i
)
{
$limiter
->
consume
(
)
;
sleep
(
5
)
;
}
$rateLimit
=
$limiter
->
consume
(
)
;
$this
->
assertSame
(
10,
$rateLimit
->
getLimit
(
)
)
;
$this
->
assertTrue
(
$rateLimit
->
isAccepted
(
)
)
;
$rateLimit
=
$limiter
->
consume
(
)
;