普通文本  |  65行  |  1.91 KB

# Copyright (c) 2012 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 subprocess
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error

class kernel_AsyncDriverProbe(test.test):
    """
    Handle checking asynchronous device probing.
    """
    version = 1

    def module_loaded(self, module):
        """
        Detect if the given module is already loaded in the kernel.

        @param module: name of module to check
        """
        module = module.replace('-', '_')
        match = "%s " % (module)
        for line in open("/proc/modules"):
            if line.startswith(match):
                return True
        return False

    def rmmod(self, module):
        """
        Unload a module if it is already loaded in the kernel.

        @param module: name of module to unload
        """
        if self.module_loaded(module):
            subprocess.call(["rmmod", module])

    def run_once(self):
        """
        Try loading the test module. It will time registration for
        synchronous and asynchronous cases and will fail to load if
        timing is off.
        """

        module = "test_async_driver_probe"

        # Start from a clean slate.
        self.rmmod(module)

        exit_code = subprocess.call(["modprobe", "-n", "-q", module])
        if exit_code:
            raise error.TestNAError(
                "%s.ko module does not seem to be available "
                "(modprobe rc=%s); skipping async probe test" %
                (module, exit_code))

        # Try loading the module. If it loads successfully test passes.
        subprocess.call(["modprobe", module])
        loaded = self.module_loaded(module)

        # Clean up after ourselves
        self.rmmod(module)

        if not loaded:
            raise error.TestFail("Test module failed to load")