gitee.com/leisunstar/runtime@v0.0.0-20200521203717-5cef3e7b53f9/virtcontainers/acrn_arch_base_test.go (about) 1 // Copyright (c) 2019 Intel Corporation 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 // 5 6 package virtcontainers 7 8 import ( 9 "fmt" 10 "io/ioutil" 11 "net" 12 "os" 13 "path/filepath" 14 "testing" 15 16 "github.com/kata-containers/runtime/virtcontainers/device/config" 17 "github.com/kata-containers/runtime/virtcontainers/persist/fs" 18 "github.com/kata-containers/runtime/virtcontainers/types" 19 "github.com/stretchr/testify/assert" 20 ) 21 22 const ( 23 acrnArchBaseAcrnPath = "/usr/bin/acrn" 24 acrnArchBaseAcrnCtlPath = "/usr/bin/acrnctl" 25 ) 26 27 var acrnArchBaseKernelParamsNonDebug = []Param{ 28 {"quiet", ""}, 29 } 30 31 var acrnArchBaseKernelParamsDebug = []Param{ 32 {"debug", ""}, 33 } 34 35 var acrnArchBaseKernelParams = []Param{ 36 {"root", "/dev/vda"}, 37 } 38 39 func newAcrnArchBase() *acrnArchBase { 40 return &acrnArchBase{ 41 path: acrnArchBaseAcrnPath, 42 ctlpath: acrnArchBaseAcrnCtlPath, 43 kernelParamsNonDebug: acrnArchBaseKernelParamsNonDebug, 44 kernelParamsDebug: acrnArchBaseKernelParamsDebug, 45 kernelParams: acrnArchBaseKernelParams, 46 } 47 } 48 49 func TestAcrnArchBaseAcrnPaths(t *testing.T) { 50 assert := assert.New(t) 51 acrnArchBase := newAcrnArchBase() 52 53 p, err := acrnArchBase.acrnPath() 54 assert.NoError(err) 55 assert.Equal(p, acrnArchBaseAcrnPath) 56 57 ctlp, err := acrnArchBase.acrnctlPath() 58 assert.NoError(err) 59 assert.Equal(ctlp, acrnArchBaseAcrnCtlPath) 60 } 61 62 func TestAcrnArchBaseKernelParameters(t *testing.T) { 63 assert := assert.New(t) 64 acrnArchBase := newAcrnArchBase() 65 66 // with debug params 67 expectedParams := acrnArchBaseKernelParams 68 debugParams := acrnArchBaseKernelParamsDebug 69 expectedParams = append(expectedParams, debugParams...) 70 p := acrnArchBase.kernelParameters(true) 71 assert.Equal(expectedParams, p) 72 73 // with non-debug params 74 expectedParams = acrnArchBaseKernelParams 75 nonDebugParams := acrnArchBaseKernelParamsNonDebug 76 expectedParams = append(expectedParams, nonDebugParams...) 77 p = acrnArchBase.kernelParameters(false) 78 assert.Equal(expectedParams, p) 79 } 80 81 func TestAcrnArchBaseCapabilities(t *testing.T) { 82 assert := assert.New(t) 83 acrnArchBase := newAcrnArchBase() 84 85 c := acrnArchBase.capabilities() 86 assert.True(c.IsBlockDeviceSupported()) 87 assert.True(c.IsBlockDeviceHotplugSupported()) 88 assert.False(c.IsFsSharingSupported()) 89 } 90 91 func TestAcrnArchBaseMemoryTopology(t *testing.T) { 92 assert := assert.New(t) 93 acrnArchBase := newAcrnArchBase() 94 95 mem := uint64(8192) 96 97 expectedMemory := Memory{ 98 Size: fmt.Sprintf("%dM", mem), 99 } 100 101 m := acrnArchBase.memoryTopology(mem) 102 assert.Equal(expectedMemory, m) 103 } 104 105 func TestAcrnArchBaseAppendConsoles(t *testing.T) { 106 var devices []Device 107 assert := assert.New(t) 108 acrnArchBase := newAcrnArchBase() 109 110 path := filepath.Join(filepath.Join(fs.MockRunStoragePath(), sandboxID), consoleSocket) 111 112 expectedOut := []Device{ 113 ConsoleDevice{ 114 Name: "console0", 115 Backend: Socket, 116 PortType: ConsoleBE, 117 Path: path, 118 }, 119 } 120 121 devices = acrnArchBase.appendConsole(devices, path) 122 assert.Equal(expectedOut, devices) 123 } 124 125 func TestAcrnArchBaseAppendImage(t *testing.T) { 126 var devices []Device 127 assert := assert.New(t) 128 acrnArchBase := newAcrnArchBase() 129 130 image, err := ioutil.TempFile("", "img") 131 assert.NoError(err) 132 defer os.Remove(image.Name()) 133 err = image.Close() 134 assert.NoError(err) 135 136 devices, err = acrnArchBase.appendImage(devices, image.Name()) 137 assert.NoError(err) 138 assert.Len(devices, 1) 139 140 expectedOut := []Device{ 141 BlockDevice{ 142 FilePath: image.Name(), 143 Index: 0, 144 }, 145 } 146 147 assert.Equal(expectedOut, devices) 148 } 149 150 func TestAcrnArchBaseAppendBridges(t *testing.T) { 151 function := 0 152 emul := acrnHostBridge 153 config := "" 154 155 var devices []Device 156 assert := assert.New(t) 157 acrnArchBase := newAcrnArchBase() 158 159 devices = acrnArchBase.appendBridges(devices) 160 assert.Len(devices, 1) 161 162 expectedOut := []Device{ 163 BridgeDevice{ 164 Function: function, 165 Emul: emul, 166 Config: config, 167 }, 168 } 169 170 assert.Equal(expectedOut, devices) 171 } 172 173 func TestAcrnArchBaseAppendLpcDevice(t *testing.T) { 174 function := 0 175 emul := acrnLPCDev 176 177 var devices []Device 178 assert := assert.New(t) 179 acrnArchBase := newAcrnArchBase() 180 181 devices = acrnArchBase.appendLPC(devices) 182 assert.Len(devices, 1) 183 184 expectedOut := []Device{ 185 LPCDevice{ 186 Function: function, 187 Emul: emul, 188 }, 189 } 190 191 assert.Equal(expectedOut, devices) 192 } 193 194 func testAcrnArchBaseAppend(t *testing.T, structure interface{}, expected []Device) { 195 var devices []Device 196 var err error 197 assert := assert.New(t) 198 acrnArchBase := newAcrnArchBase() 199 200 switch s := structure.(type) { 201 case types.Socket: 202 devices = acrnArchBase.appendSocket(devices, s) 203 case config.BlockDrive: 204 devices = acrnArchBase.appendBlockDevice(devices, s) 205 } 206 207 assert.NoError(err) 208 assert.Equal(devices, expected) 209 } 210 211 func TestAcrnArchBaseAppendSocket(t *testing.T) { 212 name := "archserial.test" 213 hostPath := "/tmp/archserial.sock" 214 215 expectedOut := []Device{ 216 ConsoleDevice{ 217 Name: name, 218 Backend: Socket, 219 PortType: SerialBE, 220 Path: hostPath, 221 }, 222 } 223 224 socket := types.Socket{ 225 HostPath: hostPath, 226 Name: name, 227 } 228 229 testAcrnArchBaseAppend(t, socket, expectedOut) 230 } 231 232 func TestAcrnArchBaseAppendBlockDevice(t *testing.T) { 233 path := "/tmp/archtest.img" 234 index := 5 235 236 expectedOut := []Device{ 237 BlockDevice{ 238 FilePath: path, 239 Index: index, 240 }, 241 } 242 243 drive := config.BlockDrive{ 244 File: path, 245 Index: index, 246 } 247 248 testAcrnArchBaseAppend(t, drive, expectedOut) 249 } 250 251 func TestAcrnArchBaseAppendNetwork(t *testing.T) { 252 var devices []Device 253 assert := assert.New(t) 254 acrnArchBase := newAcrnArchBase() 255 256 macAddr := net.HardwareAddr{0x02, 0x00, 0xCA, 0xFE, 0x00, 0x04} 257 258 vethEp := &VethEndpoint{ 259 NetPair: NetworkInterfacePair{ 260 TapInterface: TapInterface{ 261 ID: "uniqueTestID0", 262 Name: "br0_kata", 263 TAPIface: NetworkInterface{ 264 Name: "tap0_kata", 265 }, 266 }, 267 VirtIface: NetworkInterface{ 268 Name: "eth0", 269 HardAddr: macAddr.String(), 270 }, 271 NetInterworkingModel: DefaultNetInterworkingModel, 272 }, 273 EndpointType: VethEndpointType, 274 } 275 276 macvtapEp := &MacvtapEndpoint{ 277 EndpointType: MacvtapEndpointType, 278 EndpointProperties: NetworkInfo{ 279 Iface: NetlinkIface{ 280 Type: "macvtap", 281 }, 282 }, 283 } 284 285 expectedOut := []Device{ 286 NetDevice{ 287 Type: TAP, 288 IFName: vethEp.NetPair.TAPIface.Name, 289 MACAddress: vethEp.NetPair.TAPIface.HardAddr, 290 }, 291 NetDevice{ 292 Type: MACVTAP, 293 IFName: macvtapEp.Name(), 294 MACAddress: macvtapEp.HardwareAddr(), 295 }, 296 } 297 298 devices = acrnArchBase.appendNetwork(devices, vethEp) 299 devices = acrnArchBase.appendNetwork(devices, macvtapEp) 300 assert.Equal(expectedOut, devices) 301 }