Skip to content

Commit 761c74a

Browse files
authored
Improve unit test coverage (#61)
1 parent 5d559aa commit 761c74a

File tree

3 files changed

+142
-14
lines changed

3 files changed

+142
-14
lines changed

pkg/cloudmap/api_test.go

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cloudmap
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"github.com/aws/aws-cloud-map-mcs-controller-for-k8s/mocks/pkg/cloudmap"
78
"github.com/aws/aws-cloud-map-mcs-controller-for-k8s/pkg/model"
@@ -229,15 +230,85 @@ func TestServiceDiscoveryApi_CreateService_ThrowError(t *testing.T) {
229230
}
230231

231232
func TestServiceDiscoveryApi_RegisterInstance_HappyCase(t *testing.T) {
232-
// TODO: Add unit tests
233+
mockController := gomock.NewController(t)
234+
defer mockController.Finish()
235+
236+
attrs := map[string]string{"a": "b"}
237+
238+
awsFacade := cloudmap.NewMockAwsFacade(mockController)
239+
awsFacade.EXPECT().RegisterInstance(context.TODO(),
240+
&sd.RegisterInstanceInput{
241+
ServiceId: aws.String(test.SvcId),
242+
InstanceId: aws.String(test.EndptId1),
243+
Attributes: attrs}).
244+
Return(&sd.RegisterInstanceOutput{OperationId: aws.String(test.OpId1)}, nil)
245+
246+
sdApi := getServiceDiscoveryApi(t, awsFacade)
247+
opId, err := sdApi.RegisterInstance(context.TODO(), test.SvcId, test.EndptId1, attrs)
248+
assert.Nil(t, err)
249+
assert.Equal(t, test.OpId1, opId)
250+
}
251+
252+
func TestServiceDiscoveryApi_RegisterInstance_Error(t *testing.T) {
253+
mockController := gomock.NewController(t)
254+
defer mockController.Finish()
255+
256+
sdkErr := errors.New("fail")
257+
awsFacade := cloudmap.NewMockAwsFacade(mockController)
258+
awsFacade.EXPECT().RegisterInstance(context.TODO(), gomock.Any()).Return(nil, sdkErr)
259+
260+
sdApi := getServiceDiscoveryApi(t, awsFacade)
261+
_, err := sdApi.RegisterInstance(context.TODO(), test.SvcId, test.EndptId1, map[string]string{})
262+
assert.Equal(t, sdkErr, err)
233263
}
234264

235265
func TestServiceDiscoveryApi_DeregisterInstance_HappyCase(t *testing.T) {
236-
// TODO: Add unit tests
266+
mockController := gomock.NewController(t)
267+
defer mockController.Finish()
268+
269+
awsFacade := cloudmap.NewMockAwsFacade(mockController)
270+
awsFacade.EXPECT().DeregisterInstance(context.TODO(),
271+
&sd.DeregisterInstanceInput{
272+
ServiceId: aws.String(test.SvcId),
273+
InstanceId: aws.String(test.EndptId1)}).
274+
Return(&sd.DeregisterInstanceOutput{OperationId: aws.String(test.OpId1)}, nil)
275+
276+
sdApi := getServiceDiscoveryApi(t, awsFacade)
277+
opId, err := sdApi.DeregisterInstance(context.TODO(), test.SvcId, test.EndptId1)
278+
assert.Nil(t, err)
279+
assert.Equal(t, test.OpId1, opId)
280+
}
281+
282+
func TestServiceDiscoveryApi_DeregisterInstance_Error(t *testing.T) {
283+
mockController := gomock.NewController(t)
284+
defer mockController.Finish()
285+
286+
sdkErr := errors.New("fail")
287+
awsFacade := cloudmap.NewMockAwsFacade(mockController)
288+
awsFacade.EXPECT().DeregisterInstance(context.TODO(), gomock.Any()).Return(nil, sdkErr)
289+
290+
sdApi := getServiceDiscoveryApi(t, awsFacade)
291+
_, err := sdApi.DeregisterInstance(context.TODO(), test.SvcId, test.EndptId1)
292+
assert.Equal(t, sdkErr, err)
237293
}
238294

239-
func TestServiceDiscoveryApi_PollCreateNamespace_HappyCase(t *testing.T) {
240-
// TODO: Add unit tests
295+
func TestServiceDiscoveryApi_PollNamespaceOperation_HappyCase(t *testing.T) {
296+
mockController := gomock.NewController(t)
297+
defer mockController.Finish()
298+
299+
awsFacade := cloudmap.NewMockAwsFacade(mockController)
300+
awsFacade.EXPECT().GetOperation(context.TODO(), &sd.GetOperationInput{OperationId: aws.String(test.OpId1)}).
301+
Return(&sd.GetOperationOutput{Operation: &types.Operation{Status: types.OperationStatusPending}}, nil)
302+
303+
awsFacade.EXPECT().GetOperation(context.TODO(), &sd.GetOperationInput{OperationId: aws.String(test.OpId1)}).
304+
Return(&sd.GetOperationOutput{Operation: &types.Operation{Status: types.OperationStatusSuccess,
305+
Targets: map[string]string{string(types.OperationTargetTypeNamespace): test.NsId}}}, nil)
306+
307+
sdApi := getServiceDiscoveryApi(t, awsFacade)
308+
309+
nsId, err := sdApi.PollNamespaceOperation(context.TODO(), test.OpId1)
310+
assert.Nil(t, err)
311+
assert.Equal(t, test.NsId, nsId)
241312
}
242313

243314
func getServiceDiscoveryApi(t *testing.T, awsFacade *cloudmap.MockAwsFacade) ServiceDiscoveryApi {

pkg/cloudmap/client_test.go

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ func TestServiceDiscoveryClient_ListServices_HappyCase(t *testing.T) {
4040
model.PortAttr: test.EndptPortStr1,
4141
},
4242
},
43+
{
44+
Id: aws.String(test.EndptId2),
45+
Attributes: map[string]string{
46+
model.Ipv4Attr: test.EndptIp2,
47+
model.PortAttr: test.EndptPortStr2,
48+
},
49+
},
4350
}, nil)
4451

4552
sdc := getTestSdClient(t, sdApi)
@@ -52,7 +59,7 @@ func TestServiceDiscoveryClient_ListServices_HappyCase(t *testing.T) {
5259
cachedSvc, _ := sdc.serviceIdCache.Get(fmt.Sprintf("%s/%s", test.NsName, test.SvcName))
5360
assert.Equal(t, test.SvcId, cachedSvc, "Happy case caches service ID")
5461
cachedEndpts, _ := sdc.endpointCache.Get(test.SvcId)
55-
assert.Equal(t, []*model.Endpoint{test.GetTestEndpoint()}, cachedEndpts, "Happy case caches endpoints")
62+
assert.Equal(t, []*model.Endpoint{test.GetTestEndpoint(), test.GetTestEndpoint2()}, cachedEndpts, "Happy case caches endpoints")
5663
}
5764

5865
func TestServiceDiscoveryClient_ListServices_HappyCaseCachedResults(t *testing.T) {
@@ -65,7 +72,7 @@ func TestServiceDiscoveryClient_ListServices_HappyCaseCachedResults(t *testing.T
6572

6673
sdc := getTestSdClient(t, sdApi)
6774
sdc.namespaceCache.Add(test.NsName, *test.GetTestHttpNamespace(), time.Minute)
68-
sdc.endpointCache.Add(test.SvcId, []*model.Endpoint{test.GetTestEndpoint()}, time.Minute)
75+
sdc.endpointCache.Add(test.SvcId, []*model.Endpoint{test.GetTestEndpoint(), test.GetTestEndpoint2()}, time.Minute)
6976

7077
svcs, err := sdc.ListServices(context.TODO(), test.NsName)
7178
assert.Equal(t, []*model.Service{test.GetTestService()}, svcs)
@@ -284,23 +291,61 @@ func TestServiceDiscoveryClient_CreateService_CreatesNamespace_CreateNsError(t *
284291
assert.Equal(t, nsErr, err)
285292
}
286293

287-
func TestServiceDiscoveryClient_GetService(t *testing.T) {
288-
// TODO: Add unit tests
294+
func TestServiceDiscoveryClient_GetService_HappyCase(t *testing.T) {
295+
mockController := gomock.NewController(t)
296+
defer mockController.Finish()
297+
298+
sdApi := cloudmap.NewMockServiceDiscoveryApi(mockController)
299+
sdApi.EXPECT().ListNamespaces(context.TODO()).Return([]*model.Namespace{{Id: test.NsId, Name: test.NsName}}, nil)
300+
sdApi.EXPECT().ListServices(context.TODO(), test.NsId).
301+
Return([]*model.Resource{{Id: test.SvcId, Name: test.SvcName}}, nil)
302+
sdApi.EXPECT().ListInstances(context.TODO(), test.SvcId).
303+
Return([]types.InstanceSummary{
304+
{
305+
Id: aws.String(test.EndptId1),
306+
Attributes: map[string]string{
307+
model.Ipv4Attr: test.EndptIp1,
308+
model.PortAttr: test.EndptPortStr1,
309+
},
310+
},
311+
{
312+
Id: aws.String(test.EndptId2),
313+
Attributes: map[string]string{
314+
model.Ipv4Attr: test.EndptIp2,
315+
model.PortAttr: test.EndptPortStr2,
316+
},
317+
},
318+
}, nil)
319+
sdc := getTestSdClient(t, sdApi)
320+
321+
svc, err := sdc.GetService(context.TODO(), test.NsName, test.SvcName)
322+
assert.Nil(t, err)
323+
assert.Equal(t, test.GetTestService(), svc)
289324
}
290325

291326
func TestServiceDiscoveryClient_GetService_CachedValues(t *testing.T) {
292-
// TODO: Add unit tests
327+
mockController := gomock.NewController(t)
328+
defer mockController.Finish()
329+
330+
sdApi := cloudmap.NewMockServiceDiscoveryApi(mockController)
331+
sdc := getTestSdClient(t, sdApi)
332+
sdc.namespaceCache.Add(test.NsName, *test.GetTestHttpNamespace(), time.Minute)
333+
sdc.serviceIdCache.Add(fmt.Sprintf("%s/%s", test.NsName, test.SvcName), test.SvcId, time.Minute)
334+
sdc.endpointCache.Add(test.SvcId, []*model.Endpoint{test.GetTestEndpoint(), test.GetTestEndpoint2()}, time.Minute)
335+
336+
svc, err := sdc.GetService(context.TODO(), test.NsName, test.SvcName)
337+
assert.Nil(t, err)
338+
assert.Equal(t, test.GetTestService(), svc)
293339
}
294340

295341
func TestServiceDiscoveryClient_RegisterEndpoints(t *testing.T) {
296342
mockController := gomock.NewController(t)
297343
defer mockController.Finish()
298344

299345
sdApi := cloudmap.NewMockServiceDiscoveryApi(mockController)
300-
301346
sdc := getTestSdClient(t, sdApi)
302-
sdc.namespaceCache.Add(test.NsName, test.NsId, time.Minute)
303347
sdc.serviceIdCache.Add(fmt.Sprintf("%s/%s", test.NsName, test.SvcName), test.SvcId, time.Minute)
348+
sdc.endpointCache.Add(test.SvcId, model.Endpoint{}, time.Minute)
304349

305350
attrs1 := map[string]string{"AWS_INSTANCE_IPV4": test.EndptIp1, "AWS_INSTANCE_PORT": test.EndptPortStr1}
306351
attrs2 := map[string]string{"AWS_INSTANCE_IPV4": test.EndptIp2, "AWS_INSTANCE_PORT": test.EndptPortStr2}
@@ -329,6 +374,8 @@ func TestServiceDiscoveryClient_RegisterEndpoints(t *testing.T) {
329374
})
330375

331376
assert.Nil(t, err)
377+
_, entryCached := sdc.endpointCache.Get(test.SvcId)
378+
assert.False(t, entryCached, "Cache entry evicted after register")
332379
}
333380

334381
func TestServiceDiscoveryClient_DeleteEndpoints(t *testing.T) {
@@ -338,8 +385,8 @@ func TestServiceDiscoveryClient_DeleteEndpoints(t *testing.T) {
338385
sdApi := cloudmap.NewMockServiceDiscoveryApi(mockController)
339386

340387
sdc := getTestSdClient(t, sdApi)
341-
sdc.namespaceCache.Add(test.NsName, test.NsId, time.Minute)
342388
sdc.serviceIdCache.Add(fmt.Sprintf("%s/%s", test.NsName, test.SvcName), test.SvcId, time.Minute)
389+
sdc.endpointCache.Add(test.SvcId, model.Endpoint{}, time.Minute)
343390

344391
sdApi.EXPECT().DeregisterInstance(context.TODO(), test.SvcId, test.EndptId1).Return(test.OpId1, nil)
345392
sdApi.EXPECT().DeregisterInstance(context.TODO(), test.SvcId, test.EndptId2).Return(test.OpId2, nil)
@@ -352,6 +399,8 @@ func TestServiceDiscoveryClient_DeleteEndpoints(t *testing.T) {
352399
[]*model.Endpoint{{Id: test.EndptId1}, {Id: test.EndptId2}})
353400

354401
assert.Nil(t, err)
402+
_, entryCached := sdc.endpointCache.Get(test.SvcId)
403+
assert.False(t, entryCached, "Cache entry evicted after de-register")
355404
}
356405

357406
func TestServiceDiscoveryClient_getNamespace_HappyCase(t *testing.T) {

test/test-constants.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,10 @@ func GetTestDnsNamespace() *model.Namespace {
3939
}
4040

4141
func GetTestService() *model.Service {
42-
endPt := GetTestEndpoint()
4342
return &model.Service{
4443
Namespace: NsName,
4544
Name: SvcName,
46-
Endpoints: []*model.Endpoint{endPt},
45+
Endpoints: []*model.Endpoint{GetTestEndpoint(), GetTestEndpoint2()},
4746
}
4847
}
4948

@@ -55,3 +54,12 @@ func GetTestEndpoint() *model.Endpoint {
5554
Attributes: make(map[string]string, 0),
5655
}
5756
}
57+
58+
func GetTestEndpoint2() *model.Endpoint {
59+
return &model.Endpoint{
60+
Id: EndptId2,
61+
IP: EndptIp2,
62+
Port: EndptPort2,
63+
Attributes: make(map[string]string, 0),
64+
}
65+
}

0 commit comments

Comments
 (0)