普通文本  |  102行  |  3.88 KB

# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error


class crosvm_Sanity(test.test):
    """Set baseline expectations for hosting Chrome OS VM images.

    In the Chrome OS lab these are based on current Google Compute Engine
    (GCE) server offerings and represent the lowest common denominator to
    effectively run QEMU/kvm. As a result VMs can be thought of as a
    slightly outdated Intel Chromebox. GCE is not the only host
    environment, and it runs in a VM as well. We attempt to control this
    environment as well as possible. This test ensures relevant changes
    are detected over time
    """
    version = 1

    def initialize(self):
        """Initialize baseline parameters."""

        # We expect to use 8 Haswell CPU cores.
        self.cpu_cores = 8
        # The current GCE offering is a stripped Haswell. This is similar to
        # Z840. Matching CPU arch and flags are requested by
        # crosutils/lib/cros_vm_lib.sh.
        # TODO(pwang): Replace with 'Haswell, no TSX' once lab is ready.
        self.cpu_arch = 'Sandy Bridge'

        # These are flags that sampled from GCE builders on cros lab.
        self.cpu_flags = [
            'abm', 'aes', 'apic', 'arat', 'avx', 'avx2', 'bmi1', 'bmi2',
            'clflush', 'cmov', 'constant_tsc', 'cx16', 'cx8', 'de', 'eagerfpu',
            'erms', 'f16c', 'fma', 'fpu', 'fsgsbase', 'fxsr', 'hypervisor',
            'kaiser', 'lahf_lm', 'lm', 'mca', 'mce', 'mmx', 'movbe', 'msr',
            'mtrr', 'nopl', 'nx', 'pae', 'pat', 'pcid', 'pclmulqdq', 'pge',
            'pni', 'popcnt', 'pse', 'pse36', 'rdrand', 'rdtscp', 'rep_good',
            'sep', 'smep', 'sse', 'sse2', 'sse4_1', 'sse4_2', 'ssse3',
            'syscall', 'tsc', 'vme', 'x2apic', 'xsave', 'xsaveopt'
        ]
        self.min_memory_kb = 7.5 * 1024 * 1024

    def cleanup(self):
        """Test cleanup."""

    def run_once(self):
        """Run the test."""
        errors = ''
        warnings = ''
        funcs = [self.test_cpu, self.test_gpu, self.test_mem]
        for func in funcs:
            error_msg, warning_msg = func()
            errors += error_msg
            warnings += warning_msg

        if errors:
            raise error.TestFail('Failed: %s' % (errors + warnings))
        if warnings:
            raise error.TestWarn('Warning: %s' % warnings)

    def test_cpu(self):
        """Test the CPU configuration."""
        errors = ''
        warning = ''
        if self.cpu_cores != utils.count_cpus():
            errors += 'Expecting %d CPU cores but found %d cores\n' % (
                self.cpu_cores, utils.count_cpus())

        for cpu_info in utils.get_cpuinfo():
            if self.cpu_arch not in cpu_info['model name']:
                errors += 'Expecting %s CPU but found %s' % (
                    self.cpu_arch, cpu_info['model name'])

            flags = sorted(cpu_info['flags'].split(' '))
            if flags != self.cpu_flags:
                # TODO(pwang): convert warning to error once VM got better
                # infra support.
                warning += 'Expecting CPU flags %s but found %s\n' % (
                    self.cpu_flags, flags)
        return errors, warning

    def test_gpu(self):
        """Test the GPU configuration."""

        # TODO(pwang): Add check once virgl is fully introduced to VM.
        errors = ''
        warning = ''
        return errors, warning

    def test_mem(self):
        """Test the RAM configuration."""
        errors = ''
        warning = ''
        if self.min_memory_kb > utils.memtotal():
            errors += 'Expecting at least %dKB memory but found %sKB\n' % (
                self.min_memory_kb, utils.memtotal())
        return errors, warning