github.com/xmidt-org/webpa-common@v1.11.9/service/zk/environment_test.go (about)

     1  package zk
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/go-kit/kit/log"
     8  	gokitzk "github.com/go-kit/kit/sd/zk"
     9  	"github.com/samuel/go-zookeeper/zk"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/mock"
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/xmidt-org/webpa-common/logging"
    14  	"github.com/xmidt-org/webpa-common/service"
    15  )
    16  
    17  func testNewEnvironmentEmpty(t *testing.T) {
    18  	defer resetClientFactory()
    19  
    20  	var (
    21  		assert        = assert.New(t)
    22  		clientFactory = prepareMockClientFactory()
    23  	)
    24  
    25  	e, err := NewEnvironment(nil, Options{})
    26  	assert.Nil(e)
    27  	assert.Equal(service.ErrIncomplete, err)
    28  
    29  	clientFactory.AssertExpectations(t)
    30  }
    31  
    32  func testNewEnvironmentClientError(t *testing.T) {
    33  	defer resetClientFactory()
    34  
    35  	var (
    36  		assert = assert.New(t)
    37  
    38  		clientFactory       = prepareMockClientFactory()
    39  		expectedClientError = errors.New("expected client error")
    40  
    41  		zo = Options{
    42  			Client: Client{
    43  				Connection: "www.shinola.net:383",
    44  			},
    45  			Watches: []string{"/some/where"},
    46  		}
    47  	)
    48  
    49  	clientFactory.On("NewClient",
    50  		[]string{"www.shinola.net:383"},
    51  		mock.MatchedBy(func(l log.Logger) bool { return l != nil }),
    52  		mock.MatchedBy(func(o []gokitzk.Option) bool { return len(o) == 2 }),
    53  	).Return(nil, expectedClientError).Once()
    54  
    55  	e, actualClientError := NewEnvironment(nil, zo)
    56  	assert.Nil(e)
    57  	assert.Equal(expectedClientError, actualClientError)
    58  
    59  	clientFactory.AssertExpectations(t)
    60  }
    61  
    62  func testNewEnvironmentInstancerError(t *testing.T) {
    63  	defer resetClientFactory()
    64  
    65  	var (
    66  		assert = assert.New(t)
    67  
    68  		clientFactory          = prepareMockClientFactory()
    69  		expectedInstancerError = errors.New("expected instancer error")
    70  		client                 = new(mockClient)
    71  		zkEvents               = make(chan zk.Event, 5)
    72  
    73  		zo = Options{
    74  			Client: Client{
    75  				Connection: "sherbert.com:9999",
    76  			},
    77  			Watches: []string{"/good", "/bad"},
    78  		}
    79  	)
    80  
    81  	clientFactory.On("NewClient",
    82  		[]string{"sherbert.com:9999"},
    83  		mock.MatchedBy(func(l log.Logger) bool { return l != nil }),
    84  		mock.MatchedBy(func(o []gokitzk.Option) bool { return len(o) == 2 }),
    85  	).Return(client, error(nil)).Once()
    86  
    87  	client.On("CreateParentNodes", "/good").Return(error(nil)).Once()
    88  	client.On("GetEntries", "/good").Return([]string{"good1", "good2"}, (<-chan zk.Event)(zkEvents), error(nil)).Once()
    89  	client.On("CreateParentNodes", "/bad").Return(expectedInstancerError).Once()
    90  
    91  	client.On("Stop").Once()
    92  
    93  	e, actualInstancerError := NewEnvironment(nil, zo)
    94  	assert.Nil(e)
    95  	assert.Equal(expectedInstancerError, actualInstancerError)
    96  
    97  	clientFactory.AssertExpectations(t)
    98  	client.AssertExpectations(t)
    99  }
   100  
   101  func testNewEnvironmentFull(t *testing.T) {
   102  	defer resetClientFactory()
   103  
   104  	var (
   105  		assert  = assert.New(t)
   106  		require = require.New(t)
   107  
   108  		logger        = logging.NewTestLogger(nil, t)
   109  		clientFactory = prepareMockClientFactory()
   110  		client        = new(mockClient)
   111  		zkEvents      = make(chan zk.Event, 5)
   112  
   113  		zo = Options{
   114  			Client: Client{
   115  				Connection: "someserver.net:7171",
   116  			},
   117  			Registrations: []Registration{
   118  				Registration{
   119  					Name:    "foobar",
   120  					Path:    "/test1",
   121  					Address: "foobar.net",
   122  					Port:    1717,
   123  					Scheme:  "https",
   124  				},
   125  				Registration{
   126  					Name:    "foobar",
   127  					Path:    "/test1",
   128  					Address: "foobar.net",
   129  					Port:    1717,
   130  					Scheme:  "https",
   131  				}, // duplicate should be ignored
   132  			},
   133  			Watches: []string{"/test1", "/test2", "/test2"}, // duplicate should be ignored
   134  		}
   135  	)
   136  
   137  	clientFactory.On("NewClient",
   138  		[]string{"someserver.net:7171"},
   139  		logger,
   140  		mock.MatchedBy(func(o []gokitzk.Option) bool { return len(o) == 2 }),
   141  	).Return(client, error(nil)).Once()
   142  
   143  	client.On("CreateParentNodes", "/test1").Return(error(nil)).Once()
   144  	client.On("GetEntries", "/test1").Return([]string{"instance1"}, (<-chan zk.Event)(zkEvents), error(nil)).Once()
   145  	client.On("CreateParentNodes", "/test2").Return(error(nil)).Once()
   146  	client.On("GetEntries", "/test2").Return([]string{"instance2"}, (<-chan zk.Event)(zkEvents), error(nil)).Once()
   147  
   148  	client.On("Register",
   149  		mock.MatchedBy(func(s *gokitzk.Service) bool {
   150  			return s.Path == "/test1" && s.Name == "foobar" && string(s.Data) == "https://foobar.net:1717"
   151  		}),
   152  	).Return(error(nil)).Once()
   153  
   154  	client.On("Deregister",
   155  		mock.MatchedBy(func(s *gokitzk.Service) bool {
   156  			return s.Path == "/test1" && s.Name == "foobar" && string(s.Data) == "https://foobar.net:1717"
   157  		}),
   158  	).Return(error(nil)).Twice()
   159  
   160  	client.On("Stop").Once()
   161  
   162  	e, err := NewEnvironment(logger, zo)
   163  	require.NoError(err)
   164  	require.NotNil(e)
   165  
   166  	e.Register()
   167  	e.Deregister()
   168  
   169  	assert.NoError(e.Close())
   170  
   171  	clientFactory.AssertExpectations(t)
   172  	client.AssertExpectations(t)
   173  }
   174  
   175  func TestNewEnvironment(t *testing.T) {
   176  	t.Run("Empty", testNewEnvironmentEmpty)
   177  	t.Run("ClientError", testNewEnvironmentClientError)
   178  	t.Run("InstancerError", testNewEnvironmentInstancerError)
   179  	t.Run("Full", testNewEnvironmentFull)
   180  }