diff --git a/virtcontainers/hypervisor_amd64_test.go b/virtcontainers/hypervisor_amd64_test.go new file mode 100644 index 0000000000..36c509c805 --- /dev/null +++ b/virtcontainers/hypervisor_amd64_test.go @@ -0,0 +1,84 @@ +// Copyright (c) 2019 ARM Limited +// +// SPDX-License-Identifier: Apache-2.0 +// + +package virtcontainers + +import ( + "io/ioutil" + "os" + "testing" +) + +var dataFlagsFieldWithoutHypervisor = []byte(` +fpu_exception : yes +cpuid level : 20 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase bmi1 hle avx2 smep bmi2 erms rtm rdseed adx smap xsaveopt +bugs : +bogomips : 4589.35 +`) + +var dataFlagsFieldWithHypervisor = []byte(` +fpu_exception : yes +cpuid level : 20 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase bmi1 hle avx2 smep bmi2 erms rtm rdseed adx smap xsaveopt +bugs : +bogomips : 4589.35 +`) + +var dataWithoutFlagsField = []byte(` +fpu_exception : yes +cpuid level : 20 +wp : yes +bugs : +bogomips : 4589.35 +`) + +func TestRunningOnVMM(t *testing.T) { + var data []testNestedVMMData + + //file cpuinfo doesn't contain 'hypervisor' flag + dataNestedVMMFalseSuccessful := testNestedVMMData{ + content: dataFlagsFieldWithoutHypervisor, + expectedErr: false, + expected: false, + } + data = append(data, dataNestedVMMFalseSuccessful) + + //file cpuinfo contains 'hypervisor' flag + dataNestedVMMTrueSuccessful := testNestedVMMData{ + content: dataFlagsFieldWithHypervisor, + expectedErr: false, + expected: true, + } + data = append(data, dataNestedVMMTrueSuccessful) + + //file cpuinfo doesn't contain field flags + dataNestedVMMWithoutFlagsField := testNestedVMMData{ + content: dataWithoutFlagsField, + expectedErr: true, + expected: false, + } + data = append(data, dataNestedVMMWithoutFlagsField) + + genericTestRunningOnVMM(t, data) +} + +func TestRunningOnVMMNotExistingCPUInfoPathFailure(t *testing.T) { + f, err := ioutil.TempFile("", "cpuinfo") + if err != nil { + t.Fatal(err) + } + + filePath := f.Name() + + f.Close() + os.Remove(filePath) + + if _, err := RunningOnVMM(filePath); err == nil { + t.Fatalf("Should fail because %q file path does not exist", filePath) + } +} diff --git a/virtcontainers/hypervisor_arm64_test.go b/virtcontainers/hypervisor_arm64_test.go new file mode 100644 index 0000000000..954cf163ba --- /dev/null +++ b/virtcontainers/hypervisor_arm64_test.go @@ -0,0 +1,30 @@ +// Copyright (c) 2019 ARM Limited +// +// SPDX-License-Identifier: Apache-2.0 +// + +package virtcontainers + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRunningOnVMM(t *testing.T) { + assert := assert.New(t) + expectedOutput := false + + f, err := ioutil.TempFile("", "cpuinfo") + if err != nil { + t.Fatal(err) + } + defer os.Remove(f.Name()) + defer f.Close() + + running, err := RunningOnVMM(f.Name()) + assert.NoError(err) + assert.Equal(expectedOutput, running) +} diff --git a/virtcontainers/hypervisor_test.go b/virtcontainers/hypervisor_test.go index 0a1b2514f4..90d9fe59e2 100644 --- a/virtcontainers/hypervisor_test.go +++ b/virtcontainers/hypervisor_test.go @@ -437,84 +437,40 @@ func TestGetHostMemorySizeKb(t *testing.T) { } } -var dataFlagsFieldWithoutHypervisor = []byte(` -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase bmi1 hle avx2 smep bmi2 erms rtm rdseed adx smap xsaveopt -bugs : -bogomips : 4589.35 -`) - -var dataFlagsFieldWithHypervisor = []byte(` -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase bmi1 hle avx2 smep bmi2 erms rtm rdseed adx smap xsaveopt -bugs : -bogomips : 4589.35 -`) - -var dataWithoutFlagsField = []byte(` -fpu_exception : yes -cpuid level : 20 -wp : yes -bugs : -bogomips : 4589.35 -`) - -func testRunningOnVMMSuccessful(t *testing.T, cpuInfoContent []byte, expectedErr bool, expected bool) { - f, err := ioutil.TempFile("", "cpuinfo") - if err != nil { - t.Fatal(err) - } - defer os.Remove(f.Name()) - defer f.Close() - - n, err := f.Write(cpuInfoContent) - if err != nil { - t.Fatal(err) - } - if n != len(cpuInfoContent) { - t.Fatalf("Only %d bytes written out of %d expected", n, len(cpuInfoContent)) - } - - running, err := RunningOnVMM(f.Name()) - if !expectedErr && err != nil { - t.Fatalf("This test should succeed: %v", err) - } else if expectedErr && err == nil { - t.Fatalf("This test should fail") - } - - if running != expected { - t.Fatalf("Expecting running on VMM = %t, Got %t", expected, running) - } +// nolint: unused +type testNestedVMMData struct { + content []byte + expectedErr bool + expected bool } -func TestRunningOnVMMFalseSuccessful(t *testing.T) { - testRunningOnVMMSuccessful(t, dataFlagsFieldWithoutHypervisor, false, false) -} - -func TestRunningOnVMMTrueSuccessful(t *testing.T) { - testRunningOnVMMSuccessful(t, dataFlagsFieldWithHypervisor, false, true) -} - -func TestRunningOnVMMNoFlagsFieldFailure(t *testing.T) { - testRunningOnVMMSuccessful(t, dataWithoutFlagsField, true, false) -} - -func TestRunningOnVMMNotExistingCPUInfoPathFailure(t *testing.T) { +// nolint: unused +func genericTestRunningOnVMM(t *testing.T, data []testNestedVMMData) { f, err := ioutil.TempFile("", "cpuinfo") if err != nil { t.Fatal(err) } + defer os.Remove(f.Name()) + defer f.Close() - filePath := f.Name() + for _, d := range data { + n, err := f.Write(d.content) + if err != nil { + t.Fatal(err) + } + if n != len(d.content) { + t.Fatalf("Only %d bytes written out of %d expected", n, len(d.content)) + } - f.Close() - os.Remove(filePath) + running, err := RunningOnVMM(f.Name()) + if !d.expectedErr && err != nil { + t.Fatalf("This test should succeed: %v", err) + } else if d.expectedErr && err == nil { + t.Fatalf("This test should fail") + } - if _, err := RunningOnVMM(filePath); err == nil { - t.Fatalf("Should fail because %q file path does not exist", filePath) + if running != d.expected { + t.Fatalf("Expecting running on VMM = %t, Got %t", d.expected, running) + } } }