From 389495a8b234e71db0b5fa1a9b27ad8cf5fb1fce Mon Sep 17 00:00:00 2001 From: Penny Zheng Date: Thu, 31 Jan 2019 16:05:50 +0800 Subject: [PATCH] unit-test: test func for RunningOnVMM should be arch-dependent original tests for func RunningOnVMM are sort of amd64-specific, since all other archs don't support nested VMM for now. Fixes: #1200 Signed-off-by: Penny Zheng --- virtcontainers/hypervisor_amd64_test.go | 66 ++++++++++++++++++++ virtcontainers/hypervisor_arm64_test.go | 30 ++++++++++ virtcontainers/hypervisor_test.go | 80 ++++++++----------------- 3 files changed, 122 insertions(+), 54 deletions(-) create mode 100644 virtcontainers/hypervisor_amd64_test.go create mode 100644 virtcontainers/hypervisor_arm64_test.go diff --git a/virtcontainers/hypervisor_amd64_test.go b/virtcontainers/hypervisor_amd64_test.go new file mode 100644 index 0000000000..e491e1363a --- /dev/null +++ b/virtcontainers/hypervisor_amd64_test.go @@ -0,0 +1,66 @@ +// Copyright (c) 2019 ARM Limited +// +// SPDX-License-Identifier: Apache-2.0 +// + +package virtcontainers + +import ( + "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) +} 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..c349d71385 100644 --- a/virtcontainers/hypervisor_test.go +++ b/virtcontainers/hypervisor_test.go @@ -437,33 +437,15 @@ 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) { +// nolint: unused +type testNestedVMMData struct { + content []byte + expectedErr bool + expected bool +} + +// nolint: unused +func genericTestRunningOnVMM(t *testing.T, data []testNestedVMMData) { f, err := ioutil.TempFile("", "cpuinfo") if err != nil { t.Fatal(err) @@ -471,38 +453,28 @@ func testRunningOnVMMSuccessful(t *testing.T, cpuInfoContent []byte, expectedErr 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)) - } + 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)) + } - 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") - } + 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 running != expected { - t.Fatalf("Expecting running on VMM = %t, Got %t", expected, running) + if running != d.expected { + t.Fatalf("Expecting running on VMM = %t, Got %t", d.expected, running) + } } } -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) { f, err := ioutil.TempFile("", "cpuinfo") if err != nil {