github.com/Axway/agent-sdk@v1.1.101/pkg/agent/events/eventlistener_test.go (about) 1 package events 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 agentcache "github.com/Axway/agent-sdk/pkg/agent/cache" 11 "github.com/Axway/agent-sdk/pkg/agent/handler" 12 apiv1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 13 "github.com/Axway/agent-sdk/pkg/config" 14 15 "github.com/Axway/agent-sdk/pkg/watchmanager/proto" 16 ) 17 18 func TestEventListener_start(t *testing.T) { 19 tests := []struct { 20 name string 21 hasError bool 22 events chan *proto.Event 23 client APIClient 24 handler handler.Handler 25 writeStop bool 26 }{ 27 { 28 name: "should start without an error", 29 hasError: false, 30 events: make(chan *proto.Event), 31 client: &mockAPIClient{}, 32 handler: &mockHandler{}, 33 }, 34 { 35 name: "should return an error when the event channel is closed", 36 hasError: true, 37 events: make(chan *proto.Event), 38 client: &mockAPIClient{}, 39 handler: &mockHandler{}, 40 }, 41 42 { 43 name: "should not return an error, even if the request for a ResourceClient fails", 44 hasError: false, 45 events: make(chan *proto.Event), 46 client: &mockAPIClient{getErr: fmt.Errorf("failed")}, 47 handler: &mockHandler{}, 48 }, 49 { 50 name: "should not return an error, even if a handler fails to process an event", 51 hasError: false, 52 events: make(chan *proto.Event), 53 client: &mockAPIClient{}, 54 handler: &mockHandler{err: fmt.Errorf("failed")}, 55 }, 56 } 57 58 cacheManager := agentcache.NewAgentCacheManager(&config.CentralConfiguration{}, false) 59 sequenceManager := NewSequenceProvider(cacheManager, "testWatch") 60 for _, tc := range tests { 61 t.Run(tc.name, func(t *testing.T) { 62 listener := NewEventListener(tc.events, tc.client, sequenceManager, tc.handler) 63 64 errCh := make(chan error) 65 go func() { 66 _, err := listener.start() 67 errCh <- err 68 }() 69 70 if tc.hasError == false { 71 tc.events <- &proto.Event{ 72 Type: proto.Event_CREATED, 73 Payload: &proto.ResourceInstance{ 74 Metadata: &proto.Metadata{ 75 SelfLink: "/management/v1alpha1/watchtopics/mock-watch-topic", 76 }, 77 }, 78 Metadata: &proto.EventMeta{ 79 SequenceID: 1, 80 }, 81 } 82 } else { 83 close(tc.events) 84 } 85 86 err := <-errCh 87 if tc.hasError == true { 88 assert.NotNil(t, err) 89 } else { 90 assert.Nil(t, err) 91 } 92 }) 93 } 94 95 } 96 97 // Should call Listen and handle a graceful stop, and an error 98 func TestEventListener_Listen(t *testing.T) { 99 cacheManager := agentcache.NewAgentCacheManager(&config.CentralConfiguration{}, false) 100 sequenceManager := NewSequenceProvider(cacheManager, "testWatch") 101 events := make(chan *proto.Event) 102 listener := NewEventListener(events, &mockAPIClient{}, sequenceManager, &mockHandler{}) 103 errCh := listener.Listen() 104 go listener.Stop() 105 err := <-errCh 106 assert.Nil(t, err) 107 108 listener = NewEventListener(events, &mockAPIClient{}, sequenceManager, &mockHandler{}) 109 errCh = listener.Listen() 110 close(events) 111 err = <-errCh 112 assert.NotNil(t, err) 113 } 114 115 func TestEventListener_handleEvent(t *testing.T) { 116 tests := []struct { 117 name string 118 event proto.Event_Type 119 hasError bool 120 client APIClient 121 handler handler.Handler 122 }{ 123 { 124 name: "should process a delete event with no error", 125 event: proto.Event_DELETED, 126 hasError: false, 127 client: &mockAPIClient{}, 128 handler: &mockHandler{}, 129 }, 130 { 131 name: "should return an error when the request to get a ResourceClient fails", 132 event: proto.Event_CREATED, 133 hasError: true, 134 client: &mockAPIClient{getErr: fmt.Errorf("err")}, 135 handler: &mockHandler{}, 136 }, 137 { 138 name: "should get a ResourceClient, and process a create event", 139 event: proto.Event_CREATED, 140 hasError: false, 141 client: &mockAPIClient{}, 142 handler: &mockHandler{}, 143 }, 144 { 145 name: "should get a ResourceClient, and process an update event", 146 event: proto.Event_UPDATED, 147 hasError: false, 148 client: &mockAPIClient{}, 149 handler: &mockHandler{}, 150 }, 151 } 152 cacheManager := agentcache.NewAgentCacheManager(&config.CentralConfiguration{}, false) 153 sequenceManager := NewSequenceProvider(cacheManager, "testWatch") 154 for _, tc := range tests { 155 t.Run(tc.name, func(t *testing.T) { 156 event := &proto.Event{ 157 Type: tc.event, 158 Payload: &proto.ResourceInstance{ 159 Metadata: &proto.Metadata{ 160 SelfLink: "/management/v1alpha1/watchtopics/mock-watch-topic", 161 Scope: &proto.Metadata_ScopeKind{ 162 Kind: "Kind", 163 Name: "Name", 164 SelfLink: "/self/link", 165 }, 166 }, 167 }, 168 Metadata: &proto.EventMeta{ 169 SequenceID: 1, 170 }, 171 } 172 173 listener := NewEventListener(make(chan *proto.Event), tc.client, sequenceManager, tc.handler) 174 175 err := listener.handleEvent(event) 176 177 if tc.hasError == false { 178 assert.Nil(t, err) 179 } else { 180 assert.NotNil(t, err) 181 } 182 }) 183 } 184 } 185 186 type mockHandler struct { 187 err error 188 } 189 190 func (m *mockHandler) Handle(_ context.Context, _ *proto.EventMeta, _ *apiv1.ResourceInstance) error { 191 return m.err 192 }