| #!/usr/bin/env python |
| # |
| # Copyright (C) 2017 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| import logging |
| import re |
| |
| from vts.runners.host import asserts |
| from vts.runners.host import base_test |
| from vts.runners.host import test_runner |
| from vts.utils.python.controllers import android_device |
| from vts.utils.python.file import file_utils |
| |
| |
| class KernelApiSysfsTest(base_test.BaseTestClass): |
| '''Test cases which check sysfs files.''' |
| |
| def setUpClass(self): |
| self.dut = self.registerController(android_device)[0] |
| self.dut.shell.InvokeTerminal( |
| 'default') # creates a remote shell instance. |
| self.shell = self.dut.shell.default |
| |
| def ConvertToInteger(self, text): |
| '''Check whether a given text is interger. |
| |
| Args: |
| text: object, usually a string representing the content of a file |
| |
| Returns: |
| bool, True if is integer |
| ''' |
| try: |
| return int(text) |
| except ValueError as e: |
| logging.exception(e) |
| asserts.fail('Content "%s" is not integer' % text) |
| |
| def MatchRegex(self, regex, string): |
| '''Check whether a string completely matches a given regex. |
| |
| Assertions will fail if given string is not a complete match. |
| |
| Args: |
| regex: string, regex pattern to match |
| string: string, given string for matching |
| ''' |
| pattern = re.compile(regex) |
| match = pattern.match(string) |
| message = 'String "%s" is not a complete match of regex "%s".' % ( |
| string, regex) |
| asserts.assertTrue(match is not None, message) |
| asserts.assertEqual(match.start(), 0, message) |
| asserts.assertEqual(match.end(), len(string), message) |
| |
| def IsReadOnly(self, path): |
| '''Check whether a given path is read only. |
| |
| Assertion will fail if given path does not exist or is not read only. |
| ''' |
| permission = '' |
| try: |
| permission = file_utils.GetPermission(path, self.shell) |
| except IOError as e: |
| logging.exception(e) |
| asserts.fail('Path "%s" does not exist or has invalid ' |
| 'permission bits' % path) |
| |
| try: |
| asserts.assertTrue( |
| file_utils.IsReadOnly(permission), |
| 'path %s is not read only' % path) |
| except IOError as e: |
| logging.exception(e) |
| asserts.fail('Got invalid permission bits "%s" for path "%s"' % |
| (permission, path)) |
| |
| def testCpuOnlineFormat(self): |
| '''Check the format of cpu online file. |
| |
| Confirm /sys/devices/system/cpu/online exists and is read-only. |
| Parse contents to ensure it is a comma-separated series of ranges |
| (%d-%d) and/or integers. |
| ''' |
| filepath = '/sys/devices/system/cpu/online' |
| self.IsReadOnly(filepath) |
| content = file_utils.ReadFileContent(filepath, self.shell) |
| regex = '(\d+(-\d+)?)(,\d+(-\d+)?)*' |
| if content.endswith('\n'): |
| content = content[:-1] |
| self.MatchRegex(regex, content) |
| |
| def testLastResumeReason(self): |
| '''Check /sys/kernel/wakeup_reasons/last_resume_reason.''' |
| filepath = '/sys/kernel/wakeup_reasons/last_resume_reason' |
| self.IsReadOnly(filepath) |
| |
| def testKernelMax(self): |
| '''Check the value of /sys/devices/system/cpu/kernel_max.''' |
| filepath = '/sys/devices/system/cpu/kernel_max' |
| self.IsReadOnly(filepath) |
| content = file_utils.ReadFileContent(filepath, self.shell) |
| self.ConvertToInteger(content) |
| |
| |
| if __name__ == "__main__": |
| test_runner.main() |