]> git.giacomolli.uk - onehouse/blob - driver/alamo/gateway_test.go
Share the Alamo gateway request budget
[onehouse] / driver / alamo / gateway_test.go
1 package alamo
2
3 import (
4 "context"
5 "errors"
6 "testing"
7 "testing/synctest"
8 "time"
9
10 "github.com/stretchr/testify/require"
11 )
12
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)
19
20 _, err = gateway.action(t.Context(), testMAC, Action{})
21 require.NoError(t, err)
22
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]))
28 })
29 }
30
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,
36 }
37 gateway := &gateway{client: client}
38 _, err := gateway.status(t.Context())
39 require.NoError(t, err)
40
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]))
44 })
45 }
46
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)
53
54 ctx, cancel := context.WithTimeout(t.Context(), time.Second)
55 defer cancel()
56
57 _, err = gateway.action(ctx, testMAC, Action{})
58 require.ErrorIs(t, err, context.DeadlineExceeded)
59
60 ctx, cancel = context.WithCancel(t.Context())
61 cancel()
62
63 _, err = gateway.status(ctx)
64 require.ErrorIs(t, err, context.Canceled)
65 require.Len(t, client.starts, 1)
66 })
67 }
68
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)
75
76 _, err = gateway.action(t.Context(), testMAC, Action{})
77 require.ErrorIs(t, err, context.DeadlineExceeded)
78
79 client.delay = 0
80 client.err = errors.New("gateway unavailable")
81 _, err = gateway.status(t.Context())
82 require.ErrorIs(t, err, client.err)
83
84 _, err = gateway.action(t.Context(), testMAC, Action{})
85 require.ErrorIs(t, err, client.err)
86 })
87 }