aboutsummaryrefslogtreecommitdiffstats
path: root/client/go/internal/vespa/document/circuit_breaker_test.go
blob: 05dbd6da2f58b10215d2ec1c8bbfd39eb65198d4 (plain) (blame)
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
package document

import (
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
)

func TestCircuitBreaker(t *testing.T) {
	clock := &manualClock{}
	breaker := NewCircuitBreaker(time.Second, time.Minute)
	breaker.now = clock.now

	assert.Equal(t, CircuitClosed, breaker.State(), "Initial state is closed")

	clock.advance(100 * time.Second)
	assert.Equal(t, CircuitClosed, breaker.State(), "State is closed after some time without activity")

	breaker.Success()
	assert.Equal(t, CircuitClosed, breaker.State(), "State is closed after a success")

	clock.advance(100 * time.Second)
	assert.Equal(t, CircuitClosed, breaker.State(), "State is closed some time after a success")

	breaker.Failure()
	assert.Equal(t, CircuitClosed, breaker.State(), "State is closed right after a failure")

	clock.advance(time.Second)
	assert.Equal(t, CircuitClosed, breaker.State(), "State is closed until grace duration has passed")

	clock.advance(time.Millisecond)
	assert.Equal(t, CircuitHalfOpen, breaker.State(), "State is half-open when grace duration has passed")

	breaker.Success()
	assert.Equal(t, CircuitClosed, breaker.State(), "State is closed after a new success")

	breaker.Failure()
	clock.advance(time.Minute)
	assert.Equal(t, CircuitHalfOpen, breaker.State(), "State is half-open until doom duration has passed")

	clock.advance(time.Millisecond)
	assert.Equal(t, CircuitOpen, breaker.State(), "State is open when doom duration has passed")

	breaker.Success()
	assert.Equal(t, CircuitOpen, breaker.State(), "State remains open in spite of new successes")
}