Skip to content

Commit

Permalink
Add test
Browse files Browse the repository at this point in the history
  • Loading branch information
pr00se committed Nov 13, 2024
1 parent 141c3b4 commit 95ae3c0
Showing 1 changed file with 39 additions and 8 deletions.
47 changes: 39 additions & 8 deletions pkg/ingester/circuitbreaker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,6 @@ func TestCircuitBreaker_IsActiveWithDelay_Cancel(t *testing.T) {
cfg := CircuitBreakerConfig{Enabled: true, InitialDelay: 5 * time.Millisecond}
cb = newCircuitBreaker(cfg, prometheus.NewRegistry(), "test-request-type", log.NewNopLogger())

// Inactive by default
requireCircuitBreakerState(t, cb, circuitBreakerInactive)
require.False(t, cb.isActive())

cb.activate()

// When InitialDelay is set, circuit breaker is not immediately activated, but activation is pending
Expand All @@ -186,24 +182,59 @@ func TestCircuitBreaker_IsActiveWithDelay_Cancel(t *testing.T) {
require.Never(t, cb.isActive, 10*time.Millisecond, 1*time.Millisecond)

cb.activate()
_, err := cb.tryAcquirePermit()
require.NoError(t, err)

// When InitialDelay is set, circuit breaker is not immediately activated, but activation is pending
requireCircuitBreakerState(t, cb, circuitBreakerPending)
// Once we get a request, circuit breaker queues the activation
requireCircuitBreakerState(t, cb, circuitBreakerActivating)
require.False(t, cb.isActive())

cb.deactivate()

// Should be inactive immediately, and cancel any queued activation
requireCircuitBreakerState(t, cb, circuitBreakerInactive)
require.False(t, cb.isActive())
require.Never(t, cb.isActive, 10*time.Millisecond, 1*time.Millisecond)
}

func TestCircuitBreaker_IsActiveWithDelay_CancelThenRestart(t *testing.T) {
var cb *circuitBreaker

cfg := CircuitBreakerConfig{Enabled: true, InitialDelay: 150 * time.Millisecond}
cb = newCircuitBreaker(cfg, prometheus.NewRegistry(), "test-request-type", log.NewNopLogger())

cb.activate()
_, err := cb.tryAcquirePermit()
require.NoError(t, err)

// Once we get a request, circuit breaker queues the activation
// t = 0ms, queue an activation
requireCircuitBreakerState(t, cb, circuitBreakerActivating)
require.False(t, cb.isActive())

// We're going to cancel this activation, so it shouldn't trigger at t=150ms
go require.Never(t, cb.isActive, 200*time.Millisecond, 1*time.Millisecond)

time.Sleep(50 * time.Millisecond)

// t = 50ms, cancel the activation
cb.deactivate()

// Should be inactive immediately, and cancel any queued activation
requireCircuitBreakerState(t, cb, circuitBreakerInactive)
require.False(t, cb.isActive())
require.Never(t, cb.isActive, 10*time.Millisecond, 1*time.Millisecond)

time.Sleep(50 * time.Millisecond)

// t = 100ms, queue another activation
cb.activate()
_, err = cb.tryAcquirePermit()
require.NoError(t, err)

// A new activation should be queued, and activate the breaker at t=250ms
requireCircuitBreakerState(t, cb, circuitBreakerActivating)
require.False(t, cb.isActive())
require.Eventually(t, cb.isActive, 200*time.Millisecond, 1*time.Millisecond)
requireCircuitBreakerState(t, cb, circuitBreakerActive)
}

func TestCircuitBreaker_TryAcquirePermit(t *testing.T) {
Expand Down

0 comments on commit 95ae3c0

Please sign in to comment.