10 "github.com/stretchr/testify/require"
13 func TestGatewaySharesSixSecondRequestStartInterval(t *testing.T) {
14 synctest.Test(t, func(t *testing.T) {
15 client := &fakeGateway{states: []State{testState()}}
16 gateway := &gateway{client: client}
17 _, err := gateway.status(t.Context())
18 require.NoError(t, err)
20 _, err = gateway.action(t.Context(), testMAC, Action{})
21 require.NoError(t, err)
23 _, err = gateway.status(t.Context())
24 require.NoError(t, err)
25 require.Len(t, client.starts, 3)
26 require.Equal(t, 6*time.Second, client.starts[1].Sub(client.starts[0]))
27 require.Equal(t, 6*time.Second, client.starts[2].Sub(client.starts[1]))
31 func TestGatewayDoesNotSpendAnotherIntervalAfterSlowRequests(t *testing.T) {
32 synctest.Test(t, func(t *testing.T) {
33 client := &fakeGateway{
34 states: []State{testState()},
35 delay: 4 * time.Second,
37 gateway := &gateway{client: client}
38 _, err := gateway.status(t.Context())
39 require.NoError(t, err)
41 _, err = gateway.status(t.Context())
42 require.NoError(t, err)
43 require.Equal(t, 6*time.Second, client.starts[1].Sub(client.starts[0]))
47 func TestGatewayExpiryAndCancellationStopRateWaitWithoutIO(t *testing.T) {
48 synctest.Test(t, func(t *testing.T) {
49 client := &fakeGateway{states: []State{testState()}}
50 gateway := &gateway{client: client}
51 _, err := gateway.status(t.Context())
52 require.NoError(t, err)
54 ctx, cancel := context.WithTimeout(t.Context(), time.Second)
57 _, err = gateway.action(ctx, testMAC, Action{})
58 require.ErrorIs(t, err, context.DeadlineExceeded)
60 ctx, cancel = context.WithCancel(t.Context())
63 _, err = gateway.status(ctx)
64 require.ErrorIs(t, err, context.Canceled)
65 require.Len(t, client.starts, 1)
69 func TestGatewayBoundsFakeClientOperationsAndReturnsFailures(t *testing.T) {
70 synctest.Test(t, func(t *testing.T) {
71 client := &fakeGateway{delay: time.Minute}
72 gateway := &gateway{client: client}
73 _, err := gateway.status(t.Context())
74 require.ErrorIs(t, err, context.DeadlineExceeded)
76 _, err = gateway.action(t.Context(), testMAC, Action{})
77 require.ErrorIs(t, err, context.DeadlineExceeded)
80 client.err = errors.New("gateway unavailable")
81 _, err = gateway.status(t.Context())
82 require.ErrorIs(t, err, client.err)
84 _, err = gateway.action(t.Context(), testMAC, Action{})
85 require.ErrorIs(t, err, client.err)