github.com/Axway/agent-sdk@v1.1.101/pkg/watchmanager/client_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/stretchr/testify/assert"
    11  )
    12  
    13  func Test_watchClient_recv(t *testing.T) {
    14  	tests := []struct {
    15  		name   string
    16  		hasErr bool
    17  		err    error
    18  	}{
    19  		{
    20  			name:   "should call recv and return nil",
    21  			hasErr: false,
    22  			err:    nil,
    23  		},
    24  		{
    25  			name:   "should return an error when calling recv",
    26  			hasErr: true,
    27  			err:    fmt.Errorf("error"),
    28  		},
    29  	}
    30  
    31  	for _, tc := range tests {
    32  		t.Run(tc.name, func(t *testing.T) {
    33  			cfg := clientConfig{
    34  				events: make(chan *proto.Event),
    35  				errors: make(chan error),
    36  			}
    37  			stream := &mockStream{
    38  				event: &proto.Event{},
    39  				err:   tc.err,
    40  			}
    41  			conn := &mockConn{
    42  				stream: stream,
    43  			}
    44  
    45  			c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil))
    46  			assert.Nil(t, err)
    47  			assert.NotNil(t, c)
    48  
    49  			errCh := make(chan error)
    50  			go func() {
    51  				err := c.recv()
    52  				errCh <- err
    53  			}()
    54  
    55  			if !tc.hasErr {
    56  				event := <-cfg.events
    57  				assert.NotNil(t, event)
    58  				assert.Nil(t, err)
    59  			} else {
    60  				err = <-errCh
    61  				assert.NotNil(t, err)
    62  			}
    63  		})
    64  	}
    65  }
    66  
    67  func Test_watchClient_send(t *testing.T) {
    68  	tests := []struct {
    69  		name        string
    70  		getTokenErr error
    71  		streamErr   error
    72  		hasErr      bool
    73  		getToken    getTokenExpFunc
    74  	}{
    75  		{
    76  			name:        "should call send without an error",
    77  			getTokenErr: nil,
    78  			streamErr:   nil,
    79  			hasErr:      false,
    80  			getToken:    mockGetTokenExp,
    81  		},
    82  		{
    83  			name:        "should fail when unable to parse the token",
    84  			getTokenErr: nil,
    85  			streamErr:   nil,
    86  			hasErr:      true,
    87  			getToken:    mockGetTokenExpFail,
    88  		},
    89  		{
    90  			name:        "should fail when unable to retrieve a token",
    91  			getTokenErr: fmt.Errorf("err"),
    92  			streamErr:   nil,
    93  			hasErr:      true,
    94  			getToken:    mockGetTokenExp,
    95  		},
    96  		{
    97  			name:        "should return an error when Send fails",
    98  			getTokenErr: nil,
    99  			streamErr:   fmt.Errorf("err"),
   100  			hasErr:      true,
   101  			getToken:    mockGetTokenExp,
   102  		},
   103  	}
   104  
   105  	for _, tc := range tests {
   106  		t.Run(tc.name, func(t *testing.T) {
   107  			getter := &mockTokenGetter{
   108  				err: tc.getTokenErr,
   109  			}
   110  
   111  			cfg := clientConfig{
   112  				events:      make(chan *proto.Event),
   113  				errors:      make(chan error),
   114  				tokenGetter: getter.GetToken,
   115  			}
   116  
   117  			stream := &mockStream{
   118  				event: &proto.Event{},
   119  				err:   tc.streamErr,
   120  			}
   121  
   122  			conn := &mockConn{
   123  				stream: stream,
   124  			}
   125  
   126  			c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil))
   127  			c.getTokenExpirationTime = tc.getToken
   128  			assert.Nil(t, err)
   129  			assert.NotNil(t, c)
   130  
   131  			err = c.send()
   132  			if tc.hasErr {
   133  				assert.NotNil(t, err)
   134  			} else {
   135  				assert.Nil(t, err)
   136  			}
   137  		})
   138  	}
   139  
   140  }
   141  
   142  // Should write an error to the error channel when calling processEvents
   143  func Test_watchClient_processEvents(t *testing.T) {
   144  	cfg := clientConfig{
   145  		events: make(chan *proto.Event),
   146  		errors: make(chan error),
   147  	}
   148  	stream := &mockStream{
   149  		event: &proto.Event{},
   150  		err:   fmt.Errorf("err"),
   151  	}
   152  	conn := &mockConn{
   153  		stream: stream,
   154  	}
   155  
   156  	c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil))
   157  	assert.Nil(t, err)
   158  	assert.NotNil(t, c)
   159  
   160  	go c.processEvents()
   161  
   162  	err = <-cfg.errors
   163  	assert.NotNil(t, err)
   164  }
   165  
   166  // Should write an error to the error channel when the stream context is cancelled.
   167  func Test_watchClient_processRequest(t *testing.T) {
   168  	getter := &mockTokenGetter{
   169  		err: nil,
   170  	}
   171  	cfg := clientConfig{
   172  		events:      make(chan *proto.Event),
   173  		errors:      make(chan error),
   174  		tokenGetter: getter.GetToken,
   175  	}
   176  	ctx, cancel := context.WithCancel(context.Background())
   177  	stream := &mockStream{
   178  		event:   &proto.Event{},
   179  		err:     fmt.Errorf("err"),
   180  		context: ctx,
   181  	}
   182  	conn := &mockConn{
   183  		stream: stream,
   184  	}
   185  
   186  	c, err := newWatchClient(conn, cfg, newMockWatchClient(stream, nil))
   187  	assert.Nil(t, err)
   188  	assert.NotNil(t, c)
   189  
   190  	go c.processRequest()
   191  
   192  	cancel()
   193  
   194  	err = <-cfg.errors
   195  	assert.NotNil(t, err)
   196  }
   197  
   198  // Should return an error when calling newWatchClient
   199  func Test_newWatchClient(t *testing.T) {
   200  	getter := &mockTokenGetter{}
   201  	cfg := clientConfig{
   202  		events:      make(chan *proto.Event),
   203  		errors:      make(chan error),
   204  		tokenGetter: getter.GetToken,
   205  	}
   206  	stream := &mockStream{
   207  		event:   &proto.Event{},
   208  		err:     fmt.Errorf("err"),
   209  		context: context.Background(),
   210  	}
   211  	conn := &mockConn{
   212  		stream: stream,
   213  	}
   214  
   215  	_, err := newWatchClient(conn, cfg, newMockWatchClient(stream, fmt.Errorf("err")))
   216  	assert.NotNil(t, err)
   217  }
   218  
   219  func Test_getTokenExpirationTime(t *testing.T) {
   220  	futureTokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjk5OTk5OTk5OTksImlzcyI6InRlc3QifQ.XaPiwTklPiU3Ke7byMlSWNfVN7WwkNkmKorNzpM5b9o"
   221  	_, err := getTokenExpirationTime(futureTokenString)
   222  	assert.Nil(t, err)
   223  }
   224  
   225  type mockTokenGetter struct {
   226  	err error
   227  }
   228  
   229  func (m *mockTokenGetter) GetToken() (string, error) {
   230  	return "testToken", m.err
   231  }
   232  
   233  func mockGetTokenExp(_ string) (time.Duration, error) {
   234  	return 30 * time.Second, nil
   235  }
   236  
   237  func mockGetTokenExpFail(_ string) (time.Duration, error) {
   238  	return 0 * time.Second, fmt.Errorf("err")
   239  }