#!/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()