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  }