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  }