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 }