| #!/usr/bin/python |
| # |
| # Copyright 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. |
| |
| """Test cases for device tree overlays for early mounting partitions.""" |
| |
| import os |
| import unittest |
| |
| |
| # Early mount fstab entry must have following properties defined. |
| REQUIRED_FSTAB_PROPERTIES = [ |
| 'dev', |
| 'type', |
| 'mnt_flags', |
| 'fsmgr_flags', |
| ] |
| |
| |
| def ReadFile(file_path): |
| with open(file_path, 'r') as f: |
| # Strip all trailing spaces, newline and null characters. |
| return f.read().rstrip(' \n\x00') |
| |
| |
| def GetAndroidDtDir(): |
| """Returns location of android device tree directory.""" |
| with open('/proc/cmdline', 'r') as f: |
| cmdline_list = f.read().split() |
| |
| # Find android device tree directory path passed through kernel cmdline. |
| for option in cmdline_list: |
| if option.startswith('androidboot.android_dt_dir'): |
| return option.split('=')[1] |
| |
| # If no custom path found, return the default location. |
| return '/proc/device-tree/firmware/android' |
| |
| |
| class DtEarlyMountTest(unittest.TestCase): |
| """Test device tree overlays for early mounting.""" |
| |
| def setUp(self): |
| self._android_dt_dir = GetAndroidDtDir() |
| self._fstab_dt_dir = os.path.join(self._android_dt_dir, 'fstab') |
| |
| def GetEarlyMountedPartitions(self): |
| """Returns a list of partitions specified in fstab for early mount.""" |
| # Device tree nodes are represented as directories in the filesystem. |
| return [x for x in os.listdir(self._fstab_dt_dir) if os.path.isdir(x)] |
| |
| def VerifyFstabEntry(self, partition): |
| partition_dt_dir = os.path.join(self._fstab_dt_dir, partition) |
| properties = [x for x in os.listdir(partition_dt_dir)] |
| |
| self.assertTrue( |
| set(REQUIRED_FSTAB_PROPERTIES).issubset(properties), |
| 'fstab entry for /%s is missing required properties' % partition) |
| |
| def testFstabCompatible(self): |
| """Verify fstab compatible string.""" |
| compatible = ReadFile(os.path.join(self._fstab_dt_dir, 'compatible')) |
| self.assertEqual('android,fstab', compatible) |
| |
| def testFstabEntries(self): |
| """Verify properties of early mount fstab entries.""" |
| for partition in self.GetEarlyMountedPartitions(): |
| self.VerifyFstabEntry(partition) |
| |
| if __name__ == '__main__': |
| unittest.main() |
| |