# 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")