github.com/Axway/agent-sdk@v1.1.101/pkg/agent/stream/client_test.go (about) 1 package stream 2 3 import ( 4 "testing" 5 6 agentcache "github.com/Axway/agent-sdk/pkg/agent/cache" 7 "github.com/Axway/agent-sdk/pkg/apic/mock" 8 9 apiv1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 10 hc "github.com/Axway/agent-sdk/pkg/util/healthcheck" 11 wm "github.com/Axway/agent-sdk/pkg/watchmanager" 12 13 "github.com/Axway/agent-sdk/pkg/watchmanager/proto" 14 15 management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1" 16 17 "github.com/Axway/agent-sdk/pkg/config" 18 19 "github.com/stretchr/testify/assert" 20 ) 21 22 func NewConfig() config.CentralConfiguration { 23 return config.CentralConfiguration{ 24 AgentType: 1, 25 TenantID: "12345", 26 Environment: "stream-test", 27 EnvironmentID: "123", 28 AgentName: "discoveryagents", 29 URL: "http://abc.com", 30 TLS: &config.TLSConfiguration{}, 31 SingleURL: "https://abc.com", 32 } 33 } 34 35 // should create a new streamer and call Start 36 func TestNewStreamer(t *testing.T) { 37 getToken := &mockTokenGetter{} 38 wt := &management.WatchTopic{} 39 httpClient := &mockAPIClient{} 40 cfg := NewConfig() 41 cacheManager := agentcache.NewAgentCacheManager(&cfg, false) 42 43 streamer, err := NewStreamerClient( 44 httpClient, 45 &cfg, 46 getToken, 47 nil, 48 WithOnStreamConnection(), 49 WithCacheManager(cacheManager), 50 WithWatchTopic(wt), 51 ) 52 assert.NotNil(t, streamer) 53 assert.Nil(t, err) 54 55 manager := &mockManager{ 56 status: true, 57 readyCh: make(chan struct{}), 58 } 59 60 streamer.newManager = func(cfg *wm.Config, opts ...wm.Option) (wm.Manager, error) { 61 return manager, nil 62 } 63 64 assert.Nil(t, streamer.Status()) 65 66 errCh := make(chan error) 67 go func() { 68 err := streamer.Start() 69 errCh <- err 70 }() 71 72 <-manager.readyCh 73 74 // should stop the listener and write nil to the listener's error channel 75 streamer.listener.Stop() 76 77 err = <-errCh 78 assert.Nil(t, err) 79 80 assert.Equal(t, hc.OK, hc.RunChecks()) 81 streamer.manager = nil 82 streamer.listener = nil 83 84 go func() { 85 err := streamer.Start() 86 errCh <- err 87 }() 88 89 <-manager.readyCh 90 91 assert.Nil(t, streamer.Status()) 92 stop(t, streamer, errCh) 93 manager.status = false 94 95 assert.NotNil(t, streamer.Status()) 96 assert.Equal(t, hc.FAIL, hc.RunChecks()) 97 } 98 99 func TestClientOptions(t *testing.T) { 100 sequence := &mockSequence{} 101 sequence.SetSequence(1) 102 sc, _ := NewStreamerClient( 103 &mock.Client{}, 104 config.NewCentralConfig(config.DiscoveryAgent), 105 &mockTokenGetter{}, 106 nil, 107 WithHarvester(&mockHarvester{}, sequence), 108 WithEventSyncError(func() { 109 }), 110 WithOnStreamConnection(), 111 ) 112 assert.NotNil(t, sc.harvester) 113 assert.NotNil(t, sc.sequence) 114 assert.NotNil(t, sc.onEventSyncError) 115 assert.NotNil(t, sc.onStreamConnection) 116 } 117 118 func stop(t *testing.T, streamer *StreamerClient, errCh chan error) { 119 t.Helper() 120 // should stop the listener and write nil to the listener's error channel 121 streamer.listener.Stop() 122 123 err := <-errCh 124 assert.Nil(t, err) 125 } 126 127 type mockManager struct { 128 status bool 129 readyCh chan struct{} 130 } 131 132 func (m *mockManager) RegisterWatch(_ string, _ chan *proto.Event, _ chan error) (string, error) { 133 if m.readyCh != nil { 134 m.readyCh <- struct{}{} 135 } 136 return "", nil 137 } 138 139 func (m *mockManager) CloseWatch(_ string) error { 140 return nil 141 } 142 143 func (m *mockManager) CloseConn() { 144 } 145 146 func (m *mockManager) Status() bool { 147 return m.status 148 } 149 150 type mockAPIClient struct { 151 resource *apiv1.ResourceInstance 152 getErr error 153 createErr error 154 updateErr error 155 deleteErr error 156 paged []*apiv1.ResourceInstance 157 pagedCalled bool 158 pagedErr error 159 } 160 161 func (m mockAPIClient) GetResource(url string) (*apiv1.ResourceInstance, error) { 162 return m.resource, m.getErr 163 } 164 165 func (m mockAPIClient) CreateResourceInstance(_ apiv1.Interface) (*apiv1.ResourceInstance, error) { 166 return nil, m.createErr 167 } 168 169 func (m mockAPIClient) DeleteResourceInstance(_ apiv1.Interface) error { 170 return m.deleteErr 171 } 172 173 func (m *mockAPIClient) GetAPIV1ResourceInstances(map[string]string, string) ([]*apiv1.ResourceInstance, error) { 174 m.pagedCalled = true 175 return m.paged, m.pagedErr 176 } 177 178 type mockTokenGetter struct { 179 token string 180 err error 181 } 182 183 func (m *mockTokenGetter) GetToken() (string, error) { 184 return m.token, m.err 185 } 186 187 type mockHarvester struct{} 188 189 func (m mockHarvester) EventCatchUp(link string, events chan *proto.Event) error { 190 return nil 191 } 192 193 func (m mockHarvester) ReceiveSyncEvents(topicSelfLink string, sequenceID int64, eventCh chan *proto.Event) (int64, error) { 194 return 0, nil 195 } 196 197 type mockSequence struct { 198 seq int64 199 } 200 201 func (m mockSequence) GetSequence() int64 { 202 return m.seq 203 } 204 205 func (m mockSequence) SetSequence(sequenceID int64) { 206 m.seq = sequenceID 207 return 208 }