github.com/Axway/agent-sdk@v1.1.101/pkg/watchmanager/manager_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/golang-jwt/jwt"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func getMockToken() (string, error) {
    16  	claims := &jwt.StandardClaims{
    17  		ExpiresAt: time.Now().Add(time.Minute * 1).Unix(),
    18  	}
    19  	t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    20  	signKey := []byte("testsecret")
    21  	token, err := t.SignedString(signKey)
    22  	return token, err
    23  }
    24  
    25  // test register watch
    26  func TestWatchManager_RegisterWatch(t *testing.T) {
    27  	cfg := &Config{
    28  		Host:        "localhost",
    29  		Port:        8080,
    30  		TenantID:    "tenantID",
    31  		TokenGetter: getMockToken,
    32  	}
    33  	sequence := &testSequenceProvider{}
    34  	sequence.SetSequence(1)
    35  	wm, err := New(cfg, WithHarvester(&hClient{}, sequence))
    36  	assert.Nil(t, err)
    37  	assert.NotNil(t, wm)
    38  
    39  	manager := wm.(*watchManager)
    40  	stream := &mockStream{
    41  		context: context.Background(),
    42  	}
    43  	manager.newWatchClientFunc = newMockWatchClient(stream, nil)
    44  
    45  	events, errors := make(chan *proto.Event), make(chan error)
    46  	_, err = manager.RegisterWatch("/watch/topic", events, errors)
    47  	assert.Nil(t, err)
    48  
    49  	assert.Equal(t, len(manager.clientMap), 1)
    50  
    51  	manager.CloseConn()
    52  
    53  	assert.Equal(t, len(manager.clientMap), 0)
    54  }
    55  
    56  func TestWatchManager_OnError(t *testing.T) {
    57  	cfg := &Config{
    58  		Host:        "localhost",
    59  		Port:        8080,
    60  		TenantID:    "tenantID",
    61  		TokenGetter: getMockToken,
    62  	}
    63  	sequence := &testSequenceProvider{}
    64  	sequence.SetSequence(1)
    65  	hc := &hClient{
    66  		err: fmt.Errorf("error"),
    67  	}
    68  	cbChan := make(chan struct{})
    69  	cb := func() {
    70  		go func() {
    71  			cbChan <- struct{}{}
    72  		}()
    73  	}
    74  	wm, err := New(cfg, WithHarvester(hc, sequence), WithEventSyncError(cb))
    75  	assert.Nil(t, err)
    76  	assert.NotNil(t, wm)
    77  
    78  	manager := wm.(*watchManager)
    79  	stream := &mockStream{
    80  		context: context.Background(),
    81  	}
    82  	manager.newWatchClientFunc = newMockWatchClient(stream, nil)
    83  
    84  	events, errors := make(chan *proto.Event), make(chan error)
    85  	_, err = manager.RegisterWatch("/watch/topic", events, errors)
    86  	assert.NotNil(t, err)
    87  
    88  	// expect that the callback func for a harvester error was called
    89  	v := <-cbChan
    90  	assert.NotNil(t, v)
    91  
    92  	assert.Equal(t, len(manager.clientMap), 0)
    93  }
    94  
    95  func TestWatchManager_zeroSequenceID(t *testing.T) {
    96  	cfg := &Config{
    97  		Host:        "localhost",
    98  		Port:        8080,
    99  		TenantID:    "tenantID",
   100  		TokenGetter: getMockToken,
   101  	}
   102  	sequence := &testSequenceProvider{}
   103  	hc := &hClient{
   104  		err: fmt.Errorf("error"),
   105  	}
   106  	cbChan := make(chan struct{})
   107  	cb := func() {
   108  		go func() {
   109  			cbChan <- struct{}{}
   110  		}()
   111  	}
   112  	wm, err := New(cfg, WithHarvester(hc, sequence), WithEventSyncError(cb))
   113  	assert.Nil(t, err)
   114  	assert.NotNil(t, wm)
   115  
   116  	manager := wm.(*watchManager)
   117  	stream := &mockStream{
   118  		context: context.Background(),
   119  	}
   120  	manager.newWatchClientFunc = newMockWatchClient(stream, nil)
   121  
   122  	events, errors := make(chan *proto.Event), make(chan error)
   123  	_, err = manager.RegisterWatch("/watch/topic", events, errors)
   124  	assert.NotNil(t, err)
   125  
   126  	// expect that the callback func for a harvester error was called
   127  	v := <-cbChan
   128  	assert.NotNil(t, v)
   129  
   130  	assert.Equal(t, len(manager.clientMap), 0)
   131  }
   132  
   133  func TestConfig(t *testing.T) {
   134  	cfg := Config{
   135  		Host:        "",
   136  		Port:        0,
   137  		TenantID:    "",
   138  		TokenGetter: nil,
   139  	}
   140  
   141  	err := cfg.validateCfg()
   142  	assert.NotNil(t, err)
   143  
   144  	cfg.Host = "abc.com"
   145  	err = cfg.validateCfg()
   146  	assert.NotNil(t, err)
   147  
   148  	cfg.TenantID = "123"
   149  	err = cfg.validateCfg()
   150  	assert.NotNil(t, err)
   151  
   152  	cfg.TokenGetter = func() (string, error) {
   153  		return "abc", nil
   154  	}
   155  	err = cfg.validateCfg()
   156  	assert.Nil(t, err)
   157  }
   158  
   159  type hClient struct {
   160  	err error
   161  }
   162  
   163  func (h hClient) EventCatchUp(link string, events chan *proto.Event) error {
   164  	return h.err
   165  }
   166  
   167  func (h hClient) ReceiveSyncEvents(topicSelfLink string, sequenceID int64, eventCh chan *proto.Event) (int64, error) {
   168  	return 0, nil
   169  }