#!/usr/bin/python
"""Tests for autotest_lib.client.bin.partition."""
__author__ = 'gps@google.com (Gregory P. Smith)'
import os, sys, unittest
from cStringIO import StringIO
import common
from autotest_lib.client.common_lib.test_utils import mock
from autotest_lib.client.bin import partition
class FsOptions_common(object):
def test_constructor(self):
self.assertRaises(ValueError, partition.FsOptions, '', '', '', '')
self.assertRaises(ValueError, partition.FsOptions, 'ext2', '', '', '')
obj = partition.FsOptions('ext2', 'ext2_vanilla', '', '')
obj = partition.FsOptions(fstype='ext2', fs_tag='ext2_vanilla')
obj = partition.FsOptions('fs', 'shortie', 'mkfs opts', 'mount opts')
self.assertEqual('fs', obj.fstype)
self.assertEqual('shortie', obj.fs_tag)
self.assertEqual('mkfs opts', obj.mkfs_flags)
self.assertEqual('mount opts', obj.mount_options)
def test__str__(self):
str_obj = str(partition.FsOptions('abc', 'def', 'ghi', 'jkl'))
self.assert_('FsOptions' in str_obj)
self.assert_('abc' in str_obj)
self.assert_('def' in str_obj)
self.assert_('ghi' in str_obj)
self.assert_('jkl' in str_obj)
# Test data used in GetPartitionTest below.
SAMPLE_SWAPS = """
Filename Type Size Used Priority
/dev/hdc2 partition 9863868 0 -1
"""
SAMPLE_PARTITIONS_HDC_ONLY = """
major minor #blocks name
8 16 390711384 hdc
8 18 530113 hdc2
8 19 390178687 hdc3
"""
# yes I manually added a hda1 line to this output to test parsing when the Boot
# flag exists.
SAMPLE_FDISK = "/sbin/fdisk -l -u '/dev/hdc'"
SAMPLE_FDISK_OUTPUT = """
Disk /dev/hdc: 400.0 GB, 400088457216 bytes
255 heads, 63 sectors/track, 48641 cylinders, total 781422768 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/hdc2 63 1060289 530113+ 82 Linux swap / Solaris
/dev/hdc3 1060290 781417664 390178687+ 83 Linux
/dev/hdc4 * faketest FAKETEST 232323+ 83 Linux
"""
class get_partition_list_common(object):
def setUp(self):
self.god = mock.mock_god()
self.god.stub_function(os, 'popen')
def tearDown(self):
self.god.unstub_all()
def test_is_linux_fs_type(self):
for unused in xrange(4):
os.popen.expect_call(SAMPLE_FDISK).and_return(
StringIO(SAMPLE_FDISK_OUTPUT))
self.assertFalse(partition.is_linux_fs_type('/dev/hdc1'))
self.assertFalse(partition.is_linux_fs_type('/dev/hdc2'))
self.assertTrue(partition.is_linux_fs_type('/dev/hdc3'))
self.assertTrue(partition.is_linux_fs_type('/dev/hdc4'))
self.god.check_playback()
def test_get_partition_list(self):
def fake_open(filename):
"""Fake open() to pass to get_partition_list as __open."""
if filename == '/proc/swaps':
return StringIO(SAMPLE_SWAPS)
elif filename == '/proc/partitions':
return StringIO(SAMPLE_PARTITIONS_HDC_ONLY)
else:
self.assertFalse("Unexpected open() call: %s" % filename)
job = 'FakeJob'
# Test a filter func that denies all.
parts = partition.get_partition_list(job, filter_func=lambda x: False,
open_func=fake_open)
self.assertEqual([], parts)
self.god.check_playback()
# Test normal operation.
self.god.stub_function(partition, 'partition')
partition.partition.expect_call(job, '/dev/hdc3').and_return('3')
parts = partition.get_partition_list(job, open_func=fake_open)
self.assertEqual(['3'], parts)
self.god.check_playback()
# Test exclude_swap can be disabled.
partition.partition.expect_call(job, '/dev/hdc2').and_return('2')
partition.partition.expect_call(job, '/dev/hdc3').and_return('3')
parts = partition.get_partition_list(job, exclude_swap=False,
open_func=fake_open)
self.assertEqual(['2', '3'], parts)
self.god.check_playback()
# Test that min_blocks works.
partition.partition.expect_call(job, '/dev/hdc3').and_return('3')
parts = partition.get_partition_list(job, min_blocks=600000,
exclude_swap=False,
open_func=fake_open)
self.assertEqual(['3'], parts)
self.god.check_playback()
# we want to run the unit test suite once strictly on the non site specific
# version of partition (ie on base_partition.py) and once on the version
# that would result after the site specific overrides take place in order
# to check that the overrides to not break expected functionality of the
# non site specific code
class FSOptions_base_test(FsOptions_common, unittest.TestCase):
def setUp(self):
sys.modules['autotest_lib.client.bin.site_partition'] = None
reload(partition)
class get_partition_list_base_test(get_partition_list_common, unittest.TestCase):
def setUp(self):
sys.modules['autotest_lib.client.bin.site_partition'] = None
reload(partition)
get_partition_list_common.setUp(self)
class FSOptions_test(FsOptions_common, unittest.TestCase):
def setUp(self):
if 'autotest_lib.client.bin.site_partition' in sys.modules:
del sys.modules['autotest_lib.client.bin.site_partition']
reload(partition)
class get_partition_list_test(get_partition_list_common, unittest.TestCase):
def setUp(self):
if 'autotest_lib.client.bin.site_partition' in sys.modules:
del sys.modules['autotest_lib.client.bin.site_partition']
reload(partition)
get_partition_list_common.setUp(self)
if __name__ == '__main__':
unittest.main()