xref: /aosp_15_r20/external/autotest/client/bin/partition_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3
2*9c5db199SXin Li
3*9c5db199SXin Li"""Tests for autotest_lib.client.bin.partition."""
4*9c5db199SXin Li
5*9c5db199SXin Lifrom __future__ import absolute_import
6*9c5db199SXin Lifrom __future__ import division
7*9c5db199SXin Lifrom __future__ import print_function
8*9c5db199SXin Li
9*9c5db199SXin Li__author__ = '[email protected] (Gregory P. Smith)'
10*9c5db199SXin Li
11*9c5db199SXin Liimport os, sys, unittest
12*9c5db199SXin Lifrom six import StringIO
13*9c5db199SXin Lifrom six.moves import reload_module as reload
14*9c5db199SXin Liimport common
15*9c5db199SXin Lifrom autotest_lib.client.common_lib.test_utils import mock
16*9c5db199SXin Lifrom autotest_lib.client.bin import partition
17*9c5db199SXin Lifrom six.moves import range
18*9c5db199SXin Li
19*9c5db199SXin Li
20*9c5db199SXin Liclass FsOptions_common(object):
21*9c5db199SXin Li    def test_constructor(self):
22*9c5db199SXin Li        self.assertRaises(ValueError, partition.FsOptions, '', '', '', '')
23*9c5db199SXin Li        self.assertRaises(ValueError, partition.FsOptions, 'ext2', '', '', '')
24*9c5db199SXin Li        obj = partition.FsOptions('ext2', 'ext2_vanilla', '', '')
25*9c5db199SXin Li        obj = partition.FsOptions(fstype='ext2', fs_tag='ext2_vanilla')
26*9c5db199SXin Li        obj = partition.FsOptions('fs', 'shortie', 'mkfs opts', 'mount opts')
27*9c5db199SXin Li        self.assertEqual('fs', obj.fstype)
28*9c5db199SXin Li        self.assertEqual('shortie', obj.fs_tag)
29*9c5db199SXin Li        self.assertEqual('mkfs opts', obj.mkfs_flags)
30*9c5db199SXin Li        self.assertEqual('mount opts', obj.mount_options)
31*9c5db199SXin Li
32*9c5db199SXin Li
33*9c5db199SXin Li    def test__str__(self):
34*9c5db199SXin Li        str_obj = str(partition.FsOptions('abc', 'def', 'ghi', 'jkl'))
35*9c5db199SXin Li        self.assert_('FsOptions' in str_obj)
36*9c5db199SXin Li        self.assert_('abc' in str_obj)
37*9c5db199SXin Li        self.assert_('def' in str_obj)
38*9c5db199SXin Li        self.assert_('ghi' in str_obj)
39*9c5db199SXin Li        self.assert_('jkl' in str_obj)
40*9c5db199SXin Li
41*9c5db199SXin Li
42*9c5db199SXin Li# Test data used in GetPartitionTest below.
43*9c5db199SXin Li
44*9c5db199SXin LiSAMPLE_SWAPS = """
45*9c5db199SXin LiFilename                                Type            Size    Used    Priority
46*9c5db199SXin Li/dev/hdc2                               partition       9863868 0       -1
47*9c5db199SXin Li"""
48*9c5db199SXin Li
49*9c5db199SXin LiSAMPLE_PARTITIONS_HDC_ONLY = """
50*9c5db199SXin Limajor minor  #blocks  name
51*9c5db199SXin Li
52*9c5db199SXin Li   8    16  390711384 hdc
53*9c5db199SXin Li   8    18     530113 hdc2
54*9c5db199SXin Li   8    19  390178687 hdc3
55*9c5db199SXin Li"""
56*9c5db199SXin Li
57*9c5db199SXin Li# yes I manually added a hda1 line to this output to test parsing when the Boot
58*9c5db199SXin Li# flag exists.
59*9c5db199SXin LiSAMPLE_FDISK = "/sbin/fdisk -l -u '/dev/hdc'"
60*9c5db199SXin LiSAMPLE_FDISK_OUTPUT = """
61*9c5db199SXin LiDisk /dev/hdc: 400.0 GB, 400088457216 bytes
62*9c5db199SXin Li255 heads, 63 sectors/track, 48641 cylinders, total 781422768 sectors
63*9c5db199SXin LiUnits = sectors of 1 * 512 = 512 bytes
64*9c5db199SXin Li
65*9c5db199SXin Li   Device Boot      Start         End      Blocks   Id  System
66*9c5db199SXin Li/dev/hdc2              63     1060289      530113+  82  Linux swap / Solaris
67*9c5db199SXin Li/dev/hdc3         1060290   781417664   390178687+  83  Linux
68*9c5db199SXin Li/dev/hdc4   *    faketest    FAKETEST      232323+  83  Linux
69*9c5db199SXin Li"""
70*9c5db199SXin Li
71*9c5db199SXin Li
72*9c5db199SXin Liclass get_partition_list_common(object):
73*9c5db199SXin Li    def setUp(self):
74*9c5db199SXin Li        self.god = mock.mock_god()
75*9c5db199SXin Li        self.god.stub_function(os, 'popen')
76*9c5db199SXin Li
77*9c5db199SXin Li
78*9c5db199SXin Li    def tearDown(self):
79*9c5db199SXin Li        self.god.unstub_all()
80*9c5db199SXin Li
81*9c5db199SXin Li
82*9c5db199SXin Li    def test_is_linux_fs_type(self):
83*9c5db199SXin Li        for unused in range(4):
84*9c5db199SXin Li            os.popen.expect_call(SAMPLE_FDISK).and_return(
85*9c5db199SXin Li                    StringIO(SAMPLE_FDISK_OUTPUT))
86*9c5db199SXin Li        self.assertFalse(partition.is_linux_fs_type('/dev/hdc1'))
87*9c5db199SXin Li        self.assertFalse(partition.is_linux_fs_type('/dev/hdc2'))
88*9c5db199SXin Li        self.assertTrue(partition.is_linux_fs_type('/dev/hdc3'))
89*9c5db199SXin Li        self.assertTrue(partition.is_linux_fs_type('/dev/hdc4'))
90*9c5db199SXin Li        self.god.check_playback()
91*9c5db199SXin Li
92*9c5db199SXin Li
93*9c5db199SXin Li    def test_get_partition_list(self):
94*9c5db199SXin Li        def fake_open(filename):
95*9c5db199SXin Li            """Fake open() to pass to get_partition_list as __open."""
96*9c5db199SXin Li            if filename == '/proc/swaps':
97*9c5db199SXin Li                return StringIO(SAMPLE_SWAPS)
98*9c5db199SXin Li            elif filename == '/proc/partitions':
99*9c5db199SXin Li                return StringIO(SAMPLE_PARTITIONS_HDC_ONLY)
100*9c5db199SXin Li            else:
101*9c5db199SXin Li                self.assertFalse("Unexpected open() call: %s" % filename)
102*9c5db199SXin Li
103*9c5db199SXin Li        job = 'FakeJob'
104*9c5db199SXin Li
105*9c5db199SXin Li        # Test a filter func that denies all.
106*9c5db199SXin Li        parts = partition.get_partition_list(job, filter_func=lambda x: False,
107*9c5db199SXin Li                                             open_func=fake_open)
108*9c5db199SXin Li        self.assertEqual([], parts)
109*9c5db199SXin Li        self.god.check_playback()
110*9c5db199SXin Li
111*9c5db199SXin Li        # Test normal operation.
112*9c5db199SXin Li        self.god.stub_function(partition, 'partition')
113*9c5db199SXin Li        partition.partition.expect_call(job, '/dev/hdc3').and_return('3')
114*9c5db199SXin Li        parts = partition.get_partition_list(job, open_func=fake_open)
115*9c5db199SXin Li        self.assertEqual(['3'], parts)
116*9c5db199SXin Li        self.god.check_playback()
117*9c5db199SXin Li
118*9c5db199SXin Li        # Test exclude_swap can be disabled.
119*9c5db199SXin Li        partition.partition.expect_call(job, '/dev/hdc2').and_return('2')
120*9c5db199SXin Li        partition.partition.expect_call(job, '/dev/hdc3').and_return('3')
121*9c5db199SXin Li        parts = partition.get_partition_list(job, exclude_swap=False,
122*9c5db199SXin Li                                             open_func=fake_open)
123*9c5db199SXin Li        self.assertEqual(['2', '3'], parts)
124*9c5db199SXin Li        self.god.check_playback()
125*9c5db199SXin Li
126*9c5db199SXin Li        # Test that min_blocks works.
127*9c5db199SXin Li        partition.partition.expect_call(job, '/dev/hdc3').and_return('3')
128*9c5db199SXin Li        parts = partition.get_partition_list(job, min_blocks=600000,
129*9c5db199SXin Li                                             exclude_swap=False,
130*9c5db199SXin Li                                             open_func=fake_open)
131*9c5db199SXin Li        self.assertEqual(['3'], parts)
132*9c5db199SXin Li        self.god.check_playback()
133*9c5db199SXin Li
134*9c5db199SXin Li
135*9c5db199SXin Li# we want to run the unit test suite once strictly on the non site specific
136*9c5db199SXin Li# version of partition (ie on base_partition.py) and once on the version
137*9c5db199SXin Li# that would result after the site specific overrides take place in order
138*9c5db199SXin Li# to check that the overrides to not break expected functionality of the
139*9c5db199SXin Li# non site specific code
140*9c5db199SXin Liclass FSOptions_base_test(FsOptions_common, unittest.TestCase):
141*9c5db199SXin Li    def setUp(self):
142*9c5db199SXin Li        sys.modules['autotest_lib.client.bin.site_partition'] = None
143*9c5db199SXin Li        reload(partition)
144*9c5db199SXin Li
145*9c5db199SXin Li
146*9c5db199SXin Liclass get_partition_list_base_test(get_partition_list_common, unittest.TestCase):
147*9c5db199SXin Li    def setUp(self):
148*9c5db199SXin Li        sys.modules['autotest_lib.client.bin.site_partition'] = None
149*9c5db199SXin Li        reload(partition)
150*9c5db199SXin Li        get_partition_list_common.setUp(self)
151*9c5db199SXin Li
152*9c5db199SXin Li
153*9c5db199SXin Liclass FSOptions_test(FsOptions_common, unittest.TestCase):
154*9c5db199SXin Li    def setUp(self):
155*9c5db199SXin Li        if 'autotest_lib.client.bin.site_partition' in sys.modules:
156*9c5db199SXin Li            del sys.modules['autotest_lib.client.bin.site_partition']
157*9c5db199SXin Li        reload(partition)
158*9c5db199SXin Li
159*9c5db199SXin Li
160*9c5db199SXin Liclass get_partition_list_test(get_partition_list_common, unittest.TestCase):
161*9c5db199SXin Li    def setUp(self):
162*9c5db199SXin Li        if 'autotest_lib.client.bin.site_partition' in sys.modules:
163*9c5db199SXin Li            del sys.modules['autotest_lib.client.bin.site_partition']
164*9c5db199SXin Li        reload(partition)
165*9c5db199SXin Li        get_partition_list_common.setUp(self)
166*9c5db199SXin Li
167*9c5db199SXin Li
168*9c5db199SXin Liif __name__ == '__main__':
169*9c5db199SXin Li    unittest.main()
170