...
1 package acp_test
2
3 import (
4 "context"
5 "fmt"
6 "testing"
7
8 "github.com/datawire/dlib/dlog"
9 "github.com/emissary-ingress/emissary/v3/pkg/acp"
10 )
11
12 type fakeReadyMode string
13
14 const (
15 Happy = fakeReadyMode("happy")
16 Error = fakeReadyMode("error")
17 Failure = fakeReadyMode("failure")
18 )
19
20 type fakeReady struct {
21
22 mode fakeReadyMode
23 }
24
25 func (f *fakeReady) setMode(mode fakeReadyMode) {
26 f.mode = mode
27 }
28
29 func (f *fakeReady) readyCheck(ctx context.Context) (*acp.EnvoyFetcherResponse, error) {
30 var resp *acp.EnvoyFetcherResponse
31 var err error
32
33 switch f.mode {
34 case Happy:
35 resp = &acp.EnvoyFetcherResponse{
36 StatusCode: 200,
37 Text: []byte("Ready"),
38 }
39 err = nil
40
41 case Error:
42 resp = nil
43 err = fmt.Errorf("fakeReady Error always errors")
44
45 case Failure:
46 resp = &acp.EnvoyFetcherResponse{
47 StatusCode: 503,
48 Text: []byte("Not ready"),
49 }
50 err = nil
51 }
52
53 return resp, err
54 }
55
56 type envoyMetadata struct {
57 t *testing.T
58 f *fakeReady
59 ew *acp.EnvoyWatcher
60 }
61
62 func (m *envoyMetadata) check(seq int, alive bool) {
63 if m.ew.IsAlive() != alive {
64 m.t.Errorf("%d: EnvoyWatcher.IsAlive %t, wanted %t", seq, m.ew.IsAlive(), alive)
65 }
66
67 if m.ew.IsReady() != alive {
68 m.t.Errorf("%d: EnvoyWatcher.IsReady %t, wanted %t (same as alive)", seq, m.ew.IsAlive(), alive)
69 }
70 }
71
72 func newEnvoyMetadata(t *testing.T, readyMode fakeReadyMode) *envoyMetadata {
73 f := &fakeReady{mode: readyMode}
74
75 ew := acp.NewEnvoyWatcher()
76 ew.SetReadyCheck(f.readyCheck)
77
78 if ew == nil {
79 t.Error("New EnvoyWatcher is nil?")
80 }
81
82 return &envoyMetadata{t: t, f: f, ew: ew}
83 }
84
85 func TestEnvoyHappyPath(t *testing.T) {
86 m := newEnvoyMetadata(t, Happy)
87 m.check(0, false)
88
89
90 m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
91 m.check(1, true)
92 }
93
94 func TestEnvoyError(t *testing.T) {
95 m := newEnvoyMetadata(t, Error)
96 m.check(0, false)
97
98
99 m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
100 m.check(1, false)
101 }
102
103 func TestEnvoy503(t *testing.T) {
104 m := newEnvoyMetadata(t, Failure)
105 m.check(0, false)
106
107
108 m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
109 m.check(1, false)
110 }
111
112 func TestEnvoySadToHappy(t *testing.T) {
113 m := newEnvoyMetadata(t, Error)
114 m.check(0, false)
115
116
117 m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
118 m.check(1, false)
119
120
121 m.f.setMode(Happy)
122 m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
123 m.check(2, true)
124 }
125
View as plain text