Completed
Push — master ( 19d06a...0345e1 )
by Jorge
01:51
created

NumberOfAttemptsTemplateTest   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 120
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 120
rs 10
c 0
b 0
f 0
wmc 5

5 Methods

Rating   Name   Duplication   Size   Complexity  
A it_reports_as_available_on_storage_failures() 0 12 1
A it_closes_the_circuit_after_timeout() 0 21 1
A it_reports_as_non_available_between_attempts() 0 21 1
A it_report_as_available_when_failures_is_under_threshold() 0 13 1
B it_tracks_attempts() 0 32 1
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 NumberOfAttemptsTemplateTest 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