Completed
Push — master ( 0345e1...cc41b9 )
by Jorge
02:39 queued 53s
created

it_closes_the_circuit_after_timeout()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 13
nc 1
nop 0
dl 0
loc 21
rs 9.3142
c 0
b 0
f 0
1
<?php
2
3
namespace JVelasco\CircuitBreaker\AvailabilityStrategy;
4
5
use JVelasco\CircuitBreaker\AvailabilityStrategy\Backoff\Fixed;
6
use PHPUnit\Framework\TestCase;
7
use Prophecy\Argument;
8
9
final class TimeBackoffTest extends TestCase
10
{
11
    const SERVICE_NAME = 'service name';
12
    const MAX_FAILURES = 1;
13
    const ONE_SECOND = 1000;
14
    const LAST_ATTEMPT_KEY = "last_attempt";
15
16
    /** @test */
17
    public function it_report_as_available_when_failures_is_under_threshold()
18
    {
19
        $storage = new InMemoryStorage();
20
        $backoffStrategy = $this->prophesize(BackoffStrategy::class);
21
        $strategy = new TimeBackoff(
22
            $storage,
23
            $backoffStrategy->reveal(),
24
            self::MAX_FAILURES,
25
            self::ONE_SECOND
26
        );
27
28
        $storage->setNumberOfFailures(self::SERVICE_NAME, self::MAX_FAILURES- self::MAX_FAILURES);
29
        $this->assertTrue($strategy->isAvailable(self::SERVICE_NAME));
30
    }
31
32
    /** @test */
33
    public function it_reports_as_non_available_between_attempts()
34
    {
35
        $storage = new InMemoryStorage();;
36
        $backoffStrategy = $this->prophesize(BackoffStrategy::class);
37
        $strategy = new TimeBackoff(
38
            $storage,
39
            $backoffStrategy->reveal(),
40
            self::MAX_FAILURES,
41
            self::ONE_SECOND
42
        );
43
44
        $backoffStrategy->id()->willReturn("test");
45
        $storage->saveStrategyData(
46
            $strategy,
47
            self::SERVICE_NAME,
48
            self::LAST_ATTEMPT_KEY,
49
            floor(microtime(true) * 1000)
50
        );
51
        $storage->setNumberOfFailures(self::SERVICE_NAME, self::MAX_FAILURES);
52
        $backoffStrategy->waitTime(Argument::any(), self::ONE_SECOND)->willReturn(100);
53
        $this->assertFalse($strategy->isAvailable(self::SERVICE_NAME));
54
    }
55
56
    /** @test */
57
    public function it_closes_the_circuit_after_timeout()
58
    {
59
        $storage = new InMemoryStorage();
60
        $strategy = new TimeBackoff(
61
            $storage,
62
            new Fixed(),
63
            0,
64
            0
65
        );
66
67
        $storage->setNumberOfFailures(self::SERVICE_NAME, self::MAX_FAILURES);
68
        $oneSecAndOneMillisecond = floor((microtime(true) * 1000)) - 1001;
69
        $storage->saveStrategyData(
70
            $strategy,
71
            self::SERVICE_NAME,
72
            self::LAST_ATTEMPT_KEY,
73
            (string) $oneSecAndOneMillisecond
74
        );
75
76
        $this->assertTrue($strategy->isAvailable(self::SERVICE_NAME));
77
        $this->assertEquals(0, $storage->numberOfFailures(self::SERVICE_NAME));
78
    }
79
80
    /** @test */
81
    public function it_reports_as_available_on_storage_failures()
82
    {
83
        $storage = new InMemoryStorage();
84
        $strategy = new TimeBackoff(
85
            $storage,
86
            $this->prophesize(BackoffStrategy::class)->reveal(),
87
            self::MAX_FAILURES,
88
            self::ONE_SECOND
89
        );
90
91
        $storage->throwExceptionInNumberOfFailures();
92
        $this->assertTrue($strategy->isAvailable(self::SERVICE_NAME));
93
    }
94
95
96
    /** @test */
97
    public function it_tracks_attempts()
98
    {
99
        $storage = new InMemoryStorage();
100
        $backoffStrategy = $this->prophesize(BackoffStrategy::class);
101
        $strategy = new TimeBackoff(
102
            $storage,
103
            $backoffStrategy->reveal(),
104
            self::MAX_FAILURES,
105
            self::ONE_SECOND
106
        );
107
108
        $storage->setNumberOfFailures(self::SERVICE_NAME, self::MAX_FAILURES);
109
        $backoffStrategy->id()->willReturn("test");
110
        $backoffStrategy->waitTime(Argument::any(), Argument::any())->willReturn(0);
111
112
        $storage->saveStrategyData(
113
            $strategy,
114
            self::SERVICE_NAME,
115
            self::LAST_ATTEMPT_KEY,
116
            floor(microtime(true) * 1000) - self::ONE_SECOND);
117
118
        $strategy->isAvailable(self::SERVICE_NAME);
119
        $this->assertEquals(1, $storage->getStrategyData($strategy, self::SERVICE_NAME, "attempts"));
120
121
        $storage->setNumberOfFailures(self::SERVICE_NAME, self::MAX_FAILURES);
122
        $storage->saveStrategyData(
123
            $strategy,
124
            self::SERVICE_NAME,
125
            self::LAST_ATTEMPT_KEY,
126
            floor(microtime(true) * 1000) - self::ONE_SECOND);
127
        $strategy->isAvailable(self::SERVICE_NAME);
128
        $this->assertEquals(2, $storage->getStrategyData($strategy, self::SERVICE_NAME, "attempts"));
129
    }
130
}
131