From 35c8b3b69bb3e0995e63cdb8781a1c23d66c3154 Mon Sep 17 00:00:00 2001 From: Artsiom Koltun Date: Fri, 19 Jan 2024 13:21:58 +0100 Subject: [PATCH] test(storage/nvme): add client create backend controller tests Signed-off-by: Artsiom Koltun --- storage/backend/client.go | 14 +++- storage/backend/nvme_controller_test.go | 104 ++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 storage/backend/nvme_controller_test.go diff --git a/storage/backend/client.go b/storage/backend/client.go index 52107bf..f4e155f 100644 --- a/storage/backend/client.go +++ b/storage/backend/client.go @@ -26,13 +26,19 @@ func New(addr string) (*Client, error) { return nil, err } - return NewWithConnector(connector) + return NewWithArgs( + connector, + pb.NewNvmeRemoteControllerServiceClient, + ) } -// NewWithConnector creates a new instance of Client with provided connector -func NewWithConnector(connector grpcOpi.Connector) (*Client, error) { +// NewWithArgs creates a new instance of Client with non-default members +func NewWithArgs( + connector grpcOpi.Connector, + createNvmeClient CreateNvmeClient, +) (*Client, error) { return &Client{ connector: connector, - createNvmeClient: pb.NewNvmeRemoteControllerServiceClient, + createNvmeClient: createNvmeClient, }, nil } diff --git a/storage/backend/nvme_controller_test.go b/storage/backend/nvme_controller_test.go new file mode 100644 index 0000000..e3d7ee4 --- /dev/null +++ b/storage/backend/nvme_controller_test.go @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (C) 2024 Intel Corporation + +// Package backend implements the go library for OPI backend storage +package backend + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/opiproject/godpu/mocks" + pb "github.com/opiproject/opi-api/storage/v1alpha1/gen/go" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/protobuf/proto" +) + +func TestCreateNvmeController(t *testing.T) { + testControllerID := "remotenvme0" + testController := &pb.NvmeRemoteController{ + Multipath: pb.NvmeMultipath_NVME_MULTIPATH_FAILOVER, + } + + tests := map[string]struct { + giveClientErr error + giveConnectorErr error + wantErr error + wantRequest *pb.CreateNvmeRemoteControllerRequest + wantResponse *pb.NvmeRemoteController + wantConnClosed bool + }{ + "successful call": { + giveConnectorErr: nil, + giveClientErr: nil, + wantErr: nil, + wantRequest: &pb.CreateNvmeRemoteControllerRequest{ + NvmeRemoteControllerId: testControllerID, + NvmeRemoteController: proto.Clone(testController).(*pb.NvmeRemoteController), + }, + wantResponse: proto.Clone(testController).(*pb.NvmeRemoteController), + wantConnClosed: true, + }, + "client err": { + giveConnectorErr: nil, + giveClientErr: errors.New("Some client error"), + wantErr: errors.New("Some client error"), + wantRequest: &pb.CreateNvmeRemoteControllerRequest{ + NvmeRemoteControllerId: testControllerID, + NvmeRemoteController: proto.Clone(testController).(*pb.NvmeRemoteController), + }, + wantResponse: nil, + wantConnClosed: true, + }, + "connector err": { + giveConnectorErr: errors.New("Some conn error"), + giveClientErr: nil, + wantErr: errors.New("Some conn error"), + wantRequest: nil, + wantResponse: nil, + wantConnClosed: false, + }, + } + + for testName, tt := range tests { + t.Run(testName, func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + mockClient := mocks.NewNvmeRemoteControllerServiceClient(t) + if tt.wantRequest != nil { + toReturn := proto.Clone(tt.wantResponse).(*pb.NvmeRemoteController) + mockClient.EXPECT().CreateNvmeRemoteController(ctx, tt.wantRequest). + Return(toReturn, tt.giveClientErr) + } + + connClosed := false + mockConn := mocks.NewConnector(t) + mockConn.EXPECT().NewConn().Return( + &grpc.ClientConn{}, + func() { connClosed = true }, + tt.giveConnectorErr, + ) + + c, _ := NewWithArgs( + mockConn, + func(grpc.ClientConnInterface) pb.NvmeRemoteControllerServiceClient { + return mockClient + }, + ) + + response, err := c.CreateNvmeController( + ctx, + testControllerID, + pb.NvmeMultipath_NVME_MULTIPATH_FAILOVER, + ) + + require.Equal(t, tt.wantErr, err) + require.True(t, proto.Equal(response, tt.wantResponse)) + require.Equal(t, tt.wantConnClosed, connClosed) + }) + } +}