github.com/Axway/agent-sdk@v1.1.101/pkg/watchmanager/client_test.go (about) 1 package watchmanager 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/Axway/agent-sdk/pkg/watchmanager/proto" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func Test_watchClient_recv(t *testing.T) { 14 tests := []struct { 15 name string 16 hasErr bool 17 err error 18 }{ 19 { 20 name: "should call recv and return nil", 21 hasErr: false, 22 err: nil, 23 }, 24 { 25 name: "should return an error when calling recv", 26 hasErr: true, 27 err: fmt.Errorf("error"), 28 }, 29 } 30 31 for _, tc := range tests { 32 t.Run(tc.name, func(t *testing.T) { 33 cfg := clientConfig{ 34 events: make(chan *proto.Event), 35 errors: make(chan error), 36 } 37 stream := &mockStream{ 38 event: &proto.Event{}, 39 err: tc.err, 40 } 41 conn := &mockConn{ 42 stream: stream, 43 } 44 45 c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil)) 46 assert.Nil(t, err) 47 assert.NotNil(t, c) 48 49 errCh := make(chan error) 50 go func() { 51 err := c.recv() 52 errCh <- err 53 }() 54 55 if !tc.hasErr { 56 event := <-cfg.events 57 assert.NotNil(t, event) 58 assert.Nil(t, err) 59 } else { 60 err = <-errCh 61 assert.NotNil(t, err) 62 } 63 }) 64 } 65 } 66 67 func Test_watchClient_send(t *testing.T) { 68 tests := []struct { 69 name string 70 getTokenErr error 71 streamErr error 72 hasErr bool 73 getToken getTokenExpFunc 74 }{ 75 { 76 name: "should call send without an error", 77 getTokenErr: nil, 78 streamErr: nil, 79 hasErr: false, 80 getToken: mockGetTokenExp, 81 }, 82 { 83 name: "should fail when unable to parse the token", 84 getTokenErr: nil, 85 streamErr: nil, 86 hasErr: true, 87 getToken: mockGetTokenExpFail, 88 }, 89 { 90 name: "should fail when unable to retrieve a token", 91 getTokenErr: fmt.Errorf("err"), 92 streamErr: nil, 93 hasErr: true, 94 getToken: mockGetTokenExp, 95 }, 96 { 97 name: "should return an error when Send fails", 98 getTokenErr: nil, 99 streamErr: fmt.Errorf("err"), 100 hasErr: true, 101 getToken: mockGetTokenExp, 102 }, 103 } 104 105 for _, tc := range tests { 106 t.Run(tc.name, func(t *testing.T) { 107 getter := &mockTokenGetter{ 108 err: tc.getTokenErr, 109 } 110 111 cfg := clientConfig{ 112 events: make(chan *proto.Event), 113 errors: make(chan error), 114 tokenGetter: getter.GetToken, 115 } 116 117 stream := &mockStream{ 118 event: &proto.Event{}, 119 err: tc.streamErr, 120 } 121 122 conn := &mockConn{ 123 stream: stream, 124 } 125 126 c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil)) 127 c.getTokenExpirationTime = tc.getToken 128 assert.Nil(t, err) 129 assert.NotNil(t, c) 130 131 err = c.send() 132 if tc.hasErr { 133 assert.NotNil(t, err) 134 } else { 135 assert.Nil(t, err) 136 } 137 }) 138 } 139 140 } 141 142 // Should write an error to the error channel when calling processEvents 143 func Test_watchClient_processEvents(t *testing.T) { 144 cfg := clientConfig{ 145 events: make(chan *proto.Event), 146 errors: make(chan error), 147 } 148 stream := &mockStream{ 149 event: &proto.Event{}, 150 err: fmt.Errorf("err"), 151 } 152 conn := &mockConn{ 153 stream: stream, 154 } 155 156 c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil)) 157 assert.Nil(t, err) 158 assert.NotNil(t, c) 159 160 go c.processEvents() 161 162 err = <-cfg.errors 163 assert.NotNil(t, err) 164 } 165 166 // Should write an error to the error channel when the stream context is cancelled. 167 func Test_watchClient_processRequest(t *testing.T) { 168 getter := &mockTokenGetter{ 169 err: nil, 170 } 171 cfg := clientConfig{ 172 events: make(chan *proto.Event), 173 errors: make(chan error), 174 tokenGetter: getter.GetToken, 175 } 176 ctx, cancel := context.WithCancel(context.Background()) 177 stream := &mockStream{ 178 event: &proto.Event{}, 179 err: fmt.Errorf("err"), 180 context: ctx, 181 } 182 conn := &mockConn{ 183 stream: stream, 184 } 185 186 c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil)) 187 assert.Nil(t, err) 188 assert.NotNil(t, c) 189 190 go c.processRequest() 191 192 cancel() 193 194 err = <-cfg.errors 195 assert.NotNil(t, err) 196 } 197 198 // Should return an error when calling newWatchClient 199 func Test_newWatchClient(t *testing.T) { 200 getter := &mockTokenGetter{} 201 cfg := clientConfig{ 202 events: make(chan *proto.Event), 203 errors: make(chan error), 204 tokenGetter: getter.GetToken, 205 } 206 stream := &mockStream{ 207 event: &proto.Event{}, 208 err: fmt.Errorf("err"), 209 context: context.Background(), 210 } 211 conn := &mockConn{ 212 stream: stream, 213 } 214 215 _, err := newWatchClient(conn, cfg, newMockWatchClient(stream, fmt.Errorf("err"))) 216 assert.NotNil(t, err) 217 } 218 219 func Test_getTokenExpirationTime(t *testing.T) { 220 futureTokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjk5OTk5OTk5OTksImlzcyI6InRlc3QifQ.XaPiwTklPiU3Ke7byMlSWNfVN7WwkNkmKorNzpM5b9o" 221 _, err := getTokenExpirationTime(futureTokenString) 222 assert.Nil(t, err) 223 } 224 225 type mockTokenGetter struct { 226 err error 227 } 228 229 func (m *mockTokenGetter) GetToken() (string, error) { 230 return "testToken", m.err 231 } 232 233 func mockGetTokenExp(_ string) (time.Duration, error) { 234 return 30 * time.Second, nil 235 } 236 237 func mockGetTokenExpFail(_ string) (time.Duration, error) { 238 return 0 * time.Second, fmt.Errorf("err") 239 }