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