Skip to content

Commit

Permalink
Merge pull request microsoft#1182 from katiewasnothere/add_compute_ag…
Browse files Browse the repository at this point in the history
…ent_unit_tests

Add unit tests for computeagent
  • Loading branch information
katiewasnothere authored Oct 1, 2021
2 parents 1326108 + 9fb3668 commit 9788298
Show file tree
Hide file tree
Showing 2 changed files with 245 additions and 4 deletions.
20 changes: 16 additions & 4 deletions uvm/computeagent.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,22 @@ import (

const ComputeAgentAddrFmt = "\\\\.\\pipe\\computeagent-%s"

// create an interface here so we can mock out calls to the UtilityVM in our tests
type agentComputeSystem interface {
AddEndpointToNSWithID(context.Context, string, string, *hns.HNSEndpoint) error
UpdateNIC(context.Context, string, *hcsschema.NetworkAdapter) error
RemoveEndpointFromNS(context.Context, string, *hns.HNSEndpoint) error
}

var _ agentComputeSystem = &UtilityVM{}

// mock hcn function for tests
var hnsGetHNSEndpointByName = hns.GetHNSEndpointByName

// computeAgent implements the ComputeAgent ttrpc service for adding and deleting NICs to a
// Utility VM.
type computeAgent struct {
uvm *UtilityVM
uvm agentComputeSystem
}

var _ computeagent.ComputeAgentService = &computeAgent{}
Expand All @@ -43,7 +55,7 @@ func (ca *computeAgent) AddNIC(ctx context.Context, req *computeagent.AddNICInte
return nil, status.Error(codes.InvalidArgument, "received empty field in request")
}

endpoint, err := hns.GetHNSEndpointByName(req.EndpointName)
endpoint, err := hnsGetHNSEndpointByName(req.EndpointName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get endpoint with name %q", req.EndpointName)
}
Expand All @@ -64,7 +76,7 @@ func (ca *computeAgent) ModifyNIC(ctx context.Context, req *computeagent.ModifyN
return nil, status.Error(codes.InvalidArgument, "received empty field in request")
}

endpoint, err := hns.GetHNSEndpointByName(req.EndpointName)
endpoint, err := hnsGetHNSEndpointByName(req.EndpointName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get endpoint with name `%s`", req.EndpointName)
}
Expand Down Expand Up @@ -103,7 +115,7 @@ func (ca *computeAgent) DeleteNIC(ctx context.Context, req *computeagent.DeleteN
return nil, status.Error(codes.InvalidArgument, "received empty field in request")
}

endpoint, err := hns.GetHNSEndpointByName(req.EndpointName)
endpoint, err := hnsGetHNSEndpointByName(req.EndpointName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get endpoint with name %q", req.EndpointName)
}
Expand Down
229 changes: 229 additions & 0 deletions uvm/computeagent_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
package uvm

import (
"context"
"testing"

"github.com/Microsoft/hcsshim/internal/computeagent"
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
"github.com/Microsoft/hcsshim/internal/hns"
)

type testUtilityVM struct{}

func (t *testUtilityVM) AddEndpointToNSWithID(ctx context.Context, nsID, nicID string, endpoint *hns.HNSEndpoint) error {
return nil
}

func (t *testUtilityVM) RemoveEndpointFromNS(ctx context.Context, id string, endpoint *hns.HNSEndpoint) error {
return nil
}

func (t *testUtilityVM) UpdateNIC(ctx context.Context, id string, settings *hcsschema.NetworkAdapter) error {
return nil
}

func TestAddNIC(t *testing.T) {
ctx := context.Background()

agent := &computeAgent{
uvm: &testUtilityVM{},
}

hnsGetHNSEndpointByName = func(endpointName string) (*hns.HNSEndpoint, error) {
return &hns.HNSEndpoint{
Namespace: &hns.Namespace{ID: "test-namespace-ID"},
}, nil
}

var (
testNICID = "test-NIC-ID"
testEndpointName = "test-endpoint-name"
)

type config struct {
name string
nicID string
endpointName string
errorExpected bool
}
tests := []config{
{
name: "AddNIC returns no error",
nicID: testNICID,
endpointName: testEndpointName,
errorExpected: false,
},
{
name: "AddNIC returns error with blank nic ID",
nicID: "",
endpointName: testEndpointName,
errorExpected: true,
},
{
name: "AddNIC returns error with blank endpoint name",
nicID: testNICID,
endpointName: "",
errorExpected: true,
},
}

for _, test := range tests {
t.Run(test.name, func(_ *testing.T) {

req := &computeagent.AddNICInternalRequest{
NicID: test.nicID,
EndpointName: test.endpointName,
}

_, err := agent.AddNIC(ctx, req)
if test.errorExpected && err == nil {
t.Fatalf("expected AddNIC to return an error")
}
if !test.errorExpected && err != nil {
t.Fatalf("expected AddNIC to return no error, instead got %v", err)
}
})
}
}

func TestModifyNIC(t *testing.T) {
ctx := context.Background()

agent := &computeAgent{
uvm: &testUtilityVM{},
}

hnsGetHNSEndpointByName = func(endpointName string) (*hns.HNSEndpoint, error) {
return &hns.HNSEndpoint{
Id: "test-ID",
MacAddress: "00-00-00-00-00-00",
}, nil
}

var (
testNICID = "test-NIC-ID"
testEndpointName = "test-endpoint-name"
)

iovSettingsOn := &computeagent.IovSettings{
IovOffloadWeight: 100,
}

type config struct {
name string
nicID string
endpointName string
iovSettings *computeagent.IovSettings
errorExpected bool
}
tests := []config{
{
name: "ModifyNIC returns no error",
nicID: testNICID,
endpointName: testEndpointName,
iovSettings: iovSettingsOn,
errorExpected: false,
},
{
name: "ModifyNIC returns error with blank nic ID",
nicID: "",
endpointName: testEndpointName,
iovSettings: iovSettingsOn,
errorExpected: true,
},
{
name: "ModifyNIC returns error with blank endpoint name",
nicID: testNICID,
endpointName: "",
iovSettings: iovSettingsOn,
errorExpected: true,
},
{
name: "ModifyNIC returns error with nil IOV settings",
nicID: testNICID,
endpointName: testEndpointName,
iovSettings: nil,
errorExpected: true,
},
}
for _, test := range tests {
t.Run(test.name, func(_ *testing.T) {
req := &computeagent.ModifyNICInternalRequest{
NicID: test.nicID,
EndpointName: test.endpointName,
IovPolicySettings: test.iovSettings,
}

_, err := agent.ModifyNIC(ctx, req)
if test.errorExpected && err == nil {
t.Fatalf("expected ModifyNIC to return an error")
}
if !test.errorExpected && err != nil {
t.Fatalf("expected ModifyNIC to return no error, instead got %v", err)
}
})
}
}

func TestDeleteNIC(t *testing.T) {
ctx := context.Background()

agent := &computeAgent{
uvm: &testUtilityVM{},
}

hnsGetHNSEndpointByName = func(endpointName string) (*hns.HNSEndpoint, error) {
return &hns.HNSEndpoint{
Namespace: &hns.Namespace{ID: "test-namespace-ID"},
}, nil
}

var (
testNICID = "test-NIC-ID"
testEndpointName = "test-endpoint-name"
)

type config struct {
name string
nicID string
endpointName string
errorExpected bool
}
tests := []config{
{
name: "DeleteNIC returns no error",
nicID: testNICID,
endpointName: testEndpointName,
errorExpected: false,
},
{
name: "DeleteNIC returns error with blank nic ID",
nicID: "",
endpointName: testEndpointName,
errorExpected: true,
},
{
name: "DeleteNIC returns error with blank endpoint name",
nicID: testNICID,
endpointName: "",
errorExpected: true,
},
}
for _, test := range tests {
t.Run(test.name, func(_ *testing.T) {
req := &computeagent.DeleteNICInternalRequest{
NicID: test.nicID,
EndpointName: test.endpointName,
}

_, err := agent.DeleteNIC(ctx, req)
if test.errorExpected && err == nil {
t.Fatalf("expected DeleteNIC to return an error")
}
if !test.errorExpected && err != nil {
t.Fatalf("expected DeleteNIC to return no error, instead got %v", err)
}
})
}
}

0 comments on commit 9788298

Please sign in to comment.