github.com/k8snetworkplumbingwg/sriov-network-operator@v1.2.1-0.20240408194816-2d2e5a45d453/pkg/host/internal/vdpa/vdpa_test.go (about) 1 package vdpa 2 3 import ( 4 "fmt" 5 "syscall" 6 7 "github.com/golang/mock/gomock" 8 "github.com/vishvananda/netlink" 9 10 . "github.com/onsi/ginkgo/v2" 11 . "github.com/onsi/gomega" 12 13 "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/consts" 14 constants "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/consts" 15 netlinkMock "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/host/internal/lib/netlink/mock" 16 hostMock "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/host/mock" 17 "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/host/types" 18 ) 19 20 var _ = Describe("VDPA", func() { 21 var ( 22 v types.VdpaInterface 23 libMock *netlinkMock.MockNetlinkLib 24 kernelMock *hostMock.MockHostManagerInterface 25 26 testCtrl *gomock.Controller 27 testErr = fmt.Errorf("test-error") 28 ) 29 BeforeEach(func() { 30 testCtrl = gomock.NewController(GinkgoT()) 31 libMock = netlinkMock.NewMockNetlinkLib(testCtrl) 32 kernelMock = hostMock.NewMockHostManagerInterface(testCtrl) 33 v = New(kernelMock, libMock) 34 }) 35 AfterEach(func() { 36 testCtrl.Finish() 37 }) 38 Context("CreateVDPADevice", func() { 39 callFunc := func() error { 40 return v.CreateVDPADevice("0000:d8:00.2", constants.VdpaTypeVhost) 41 } 42 It("Created", func() { 43 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV) 44 libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{MaxVQP: 32}).Return(nil) 45 kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(nil) 46 Expect(callFunc()).NotTo(HaveOccurred()) 47 }) 48 It("Created without MaxVQP", func() { 49 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV) 50 libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{MaxVQP: 32}).Return(syscall.ENOTSUP) 51 libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{}).Return(nil) 52 kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(nil) 53 Expect(callFunc()).NotTo(HaveOccurred()) 54 }) 55 It("Already exist", func() { 56 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 57 kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(nil) 58 Expect(callFunc()).NotTo(HaveOccurred()) 59 }) 60 It("Fail to Get device", func() { 61 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, testErr) 62 Expect(callFunc()).To(MatchError(testErr)) 63 }) 64 It("Fail to Create device", func() { 65 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV) 66 libMock.EXPECT().VDPANewDev("vdpa:0000:d8:00.2", "pci", "0000:d8:00.2", netlink.VDPANewDevParams{MaxVQP: 32}).Return(testErr) 67 Expect(callFunc()).To(MatchError(testErr)) 68 }) 69 It("Fail to Bind device", func() { 70 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 71 kernelMock.EXPECT().BindDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2", "vhost_vdpa").Return(testErr) 72 Expect(callFunc()).To(MatchError(testErr)) 73 }) 74 }) 75 Context("DeleteVDPADevice", func() { 76 callFunc := func() error { 77 return v.DeleteVDPADevice("0000:d8:00.2") 78 } 79 It("Removed", func() { 80 libMock.EXPECT().VDPADelDev("vdpa:0000:d8:00.2").Return(nil) 81 Expect(callFunc()).NotTo(HaveOccurred()) 82 }) 83 It("Not found", func() { 84 libMock.EXPECT().VDPADelDev("vdpa:0000:d8:00.2").Return(syscall.ENODEV) 85 Expect(callFunc()).NotTo(HaveOccurred()) 86 }) 87 It("Fail to delete device", func() { 88 libMock.EXPECT().VDPADelDev("vdpa:0000:d8:00.2").Return(testErr) 89 Expect(callFunc()).To(MatchError(testErr)) 90 }) 91 }) 92 Context("DiscoverVDPAType", func() { 93 callFunc := func() string { 94 return v.DiscoverVDPAType("0000:d8:00.2") 95 } 96 It("No device", func() { 97 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, syscall.ENODEV) 98 Expect(callFunc()).To(BeEmpty()) 99 }) 100 It("Fail to read device", func() { 101 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(nil, testErr) 102 Expect(callFunc()).To(BeEmpty()) 103 }) 104 It("No driver", func() { 105 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 106 kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("", nil) 107 Expect(callFunc()).To(BeEmpty()) 108 }) 109 It("Unknown driver", func() { 110 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 111 kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("something", nil) 112 Expect(callFunc()).To(BeEmpty()) 113 }) 114 It("Vhost driver", func() { 115 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 116 kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("vhost_vdpa", nil) 117 Expect(callFunc()).To(Equal("vhost")) 118 }) 119 It("Virtio driver", func() { 120 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 121 kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("virtio_vdpa", nil) 122 Expect(callFunc()).To(Equal("virtio")) 123 }) 124 It("Fail to read driver", func() { 125 libMock.EXPECT().VDPAGetDevByName("vdpa:0000:d8:00.2").Return(&netlink.VDPADev{}, nil) 126 kernelMock.EXPECT().GetDriverByBusAndDevice(consts.BusVdpa, "vdpa:0000:d8:00.2").Return("", testErr) 127 Expect(callFunc()).To(BeEmpty()) 128 }) 129 }) 130 })