Home | History | Annotate | Download | only in kernel_FirmwareRequest
      1 # Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 import os
      7 
      8 from autotest_lib.client.bin import test, utils
      9 from autotest_lib.client.common_lib import error
     10 from autotest_lib.client.cros import kernel_config
     11 
     12 
     13 class kernel_FirmwareRequest(test.test):
     14     """
     15     Test asynchronous firmware loading
     16     """
     17     version = 1
     18 
     19     def set_module_locking(self, enabled):
     20         """
     21         Enable/disable LSM request_firmware location locking
     22         Inspired by security_ModuleLocking
     23         """
     24         sysctl = "/proc/sys/kernel/chromiumos/module_locking"
     25         value = '1\n' if enabled else '0\n'
     26 
     27         if os.path.exists(sysctl):
     28             open(sysctl, "w").write(value)
     29         else:
     30             raise error.TestNAError("module locking sysctl not available; may not be able to load test FW")
     31 
     32 
     33     def test_is_valid(self):
     34         """
     35         Check if this test is worth running, based on whether the kernel
     36         .config has the right features
     37         """
     38         config = kernel_config.KernelConfig()
     39         config.initialize()
     40         config.is_enabled('TEST_FIRMWARE')
     41         return len(config.failures()) == 0
     42 
     43 
     44     def do_fw_test(self):
     45         """
     46         Run one iteration of the test
     47         Return non-zero if failed
     48         """
     49         os.chdir(self.srcdir)
     50         ret = utils.system("./fw_filesystem.sh", ignore_status=True)
     51         if ret:
     52             raise error.TestFail("FW request test failed: %d" % (ret))
     53 
     54 
     55     def run_once(self):
     56         """
     57         This test will run the firmware request kernel self test (from
     58         upstream). This tests that the request_firmware() and
     59         request_firmware_nowait() kernel APIs are somewhat sane. It tries to
     60         load the empty filename ("") as well as a small toy firmware, and
     61         checks that it matches. It also makes sure a non-existent firmware
     62         cannot be found.
     63 
     64         We rerun the same test several times to increase the probability of
     65         catching errors.
     66 
     67         Needs to disable module locking so we can load test firmwares from
     68         non-standard locations (e.g., /tmp)
     69         """
     70 
     71         num_loops = 50
     72         module_name = "test_firmware"
     73 
     74         if not self.test_is_valid():
     75             raise error.TestNAError("FW test module is not available for this test")
     76 
     77         utils.load_module(module_name)
     78         if not utils.module_is_loaded(module_name):
     79             raise error.TestNAError("FW test module is not available for this test")
     80 
     81         try:
     82             self.set_module_locking(False)
     83 
     84             logging.info("iterations: %d", num_loops)
     85 
     86             for i in range(0, num_loops):
     87                 self.do_fw_test()
     88 
     89         finally:
     90             self.set_module_locking(True)
     91             utils.unload_module(module_name)
     92