# Copyright 2015 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.

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


_DEFAULT_MIN_VERSION = '3.10'


class brillo_KernelVersionTest(test.test):
    """Verify that a Brillo device runs a minimum kernel version."""
    version = 1

    def run_once(self, host=None, min_version=_DEFAULT_MIN_VERSION):
        """Runs the test.

        @param host: A host object representing the DUT.
        @param min_version: Minimum kernel version required.

        @raise TestError: Something went wrong while trying to execute the test.
        @raise TestFail: The test failed.
        """
        try:
            result = host.run_output('uname -r').strip()
        except error.GenericHostRunError:
            raise error.TestFail('Failed to check kernel version')

        if utils.compare_versions(result, min_version) < 0:
            raise error.TestFail(
                    'Device kernel version (%s) older than required (%s)' %
                    (result, min_version))
