• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2#
3# Copyright 2017 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Test cases for device tree overlays for early mounting partitions."""
18
19import os
20import unittest
21
22
23# Early mount fstab entry must have following properties defined.
24REQUIRED_FSTAB_PROPERTIES = [
25    'dev',
26    'type',
27    'mnt_flags',
28    'fsmgr_flags',
29]
30
31
32def ReadFile(file_path):
33  with open(file_path, 'r') as f:
34    # Strip all trailing spaces, newline and null characters.
35    return f.read().rstrip(' \n\x00')
36
37
38def GetAndroidDtDir():
39  """Returns location of android device tree directory."""
40  with open('/proc/cmdline', 'r') as f:
41    cmdline_list = f.read().split()
42
43  # Find android device tree directory path passed through kernel cmdline.
44  for option in cmdline_list:
45    if option.startswith('androidboot.android_dt_dir'):
46      return option.split('=')[1]
47
48  # If no custom path found, return the default location.
49  return '/proc/device-tree/firmware/android'
50
51
52class DtEarlyMountTest(unittest.TestCase):
53  """Test device tree overlays for early mounting."""
54
55  def setUp(self):
56    self._android_dt_dir = GetAndroidDtDir()
57    self._fstab_dt_dir = os.path.join(self._android_dt_dir, 'fstab')
58
59  def GetEarlyMountedPartitions(self):
60    """Returns a list of partitions specified in fstab for early mount."""
61    # Device tree nodes are represented as directories in the filesystem.
62    return [x for x in os.listdir(self._fstab_dt_dir) if os.path.isdir(x)]
63
64  def VerifyFstabEntry(self, partition):
65    partition_dt_dir = os.path.join(self._fstab_dt_dir, partition)
66    properties = [x for x in os.listdir(partition_dt_dir)]
67
68    self.assertTrue(
69        set(REQUIRED_FSTAB_PROPERTIES).issubset(properties),
70        'fstab entry for /%s is missing required properties' % partition)
71
72  def testFstabCompatible(self):
73    """Verify fstab compatible string."""
74    compatible = ReadFile(os.path.join(self._fstab_dt_dir, 'compatible'))
75    self.assertEqual('android,fstab', compatible)
76
77  def testFstabEntries(self):
78    """Verify properties of early mount fstab entries."""
79    for partition in self.GetEarlyMountedPartitions():
80      self.VerifyFstabEntry(partition)
81
82if __name__ == '__main__':
83  unittest.main()
84
85