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