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 }