[blivet:master 8/8] Add a bunch of tests for mdadd.

Vratislav Podzimek vpodzime at redhat.com
Sun Jul 27 13:00:47 UTC 2014


On Fri, 2014-07-25 at 12:39 -0400, mulhern wrote:
> Signed-off-by: mulhern <amulhern at redhat.com>
> ---
>  tests/devicelibs_test/mdraid_test.py | 170 ++++++++++++++++++++++++++---------
>  tests/pylint/pylint-false-positives  |   1 +
>  2 files changed, 128 insertions(+), 43 deletions(-)
> 
> diff --git a/tests/devicelibs_test/mdraid_test.py b/tests/devicelibs_test/mdraid_test.py
> index ad0c3c7..c1794a5 100755
> --- a/tests/devicelibs_test/mdraid_test.py
> +++ b/tests/devicelibs_test/mdraid_test.py
> @@ -71,49 +71,133 @@ class MDRaidAsRootTestCase(loopbackedtestcase.LoopBackedTestCase):
>  
>          super(MDRaidAsRootTestCase, self).tearDown()
>  
> -class RAID0Test(MDRaidAsRootTestCase):
> -
> -    def __init__(self, methodName='runTest'):
> -        super(RAID0Test, self).__init__(methodName=methodName, deviceSpec=[102400, 102400, 102400])
> -
> -    def testGrow(self):
> -        self.assertIsNone(mdraid.mdcreate(self._dev_name, raid.RAID0, self.loopDevices[:2]))
> -        time.sleep(2) # wait for raid to settle
> -
> -        # it is not possible to add a managed device to a non-redundant array,
> -        # but it can be grown, by specifying the desired number of members
> -        self.assertIsNone(mdraid.mdadd(self._dev_name, self.loopDevices[2], raid_devices=3))
> -
> -    def testGrowRAID1(self):
> -        self.assertIsNone(mdraid.mdcreate(self._dev_name, raid.RAID1, self.loopDevices[:2]))
> -        time.sleep(2) # wait for raid to settle
> -
> -        # a RAID1 array can be grown as well as a RAID0 array
> -        self.assertIsNone(mdraid.mdadd(self._dev_name, self.loopDevices[2], raid_devices=3))
> -
> -    def testGrowTooBig(self):
> -        self.assertIsNone(mdraid.mdcreate(self._dev_name, raid.RAID0, self.loopDevices[:2]))
> -        time.sleep(2) # wait for raid to settle
> -
> -        # if more devices are specified than are available after the
> -        # addition an error is raised
> -        with self.assertRaises(MDRaidError):
> -            mdraid.mdadd(self._dev_name, self.loopDevices[2], raid_devices=4)
> -
> -    def testGrowSmaller(self):
> -        self.assertIsNone(mdraid.mdcreate(self._dev_name, raid.RAID0, self.loopDevices[:2]))
> -        time.sleep(2) # wait for raid to settle
> -
> -        # it is ok to grow an array smaller than its devices
> -        self.assertIsNone(mdraid.mdadd(self._dev_name, self.loopDevices[2], raid_devices=2))
> -
> -    def testGrowSimple(self):
> -        self.assertIsNone(mdraid.mdcreate(self._dev_name, raid.RAID0, self.loopDevices[:2]))
> -        time.sleep(2) # wait for raid to settle
> -
> -        # try to simply add a device and things go wrong
> -        with self.assertRaises(MDRaidError):
> -            mdraid.mdadd(self._dev_name, self.loopDevices[2])
> +class TestCaseFactory(object):
> +
> +    @staticmethod
> +    def _minMembersForCreation(level):
> +        min_members = level.min_members
> +        return min_members if min_members > 1 else 2
> +
> +class JustAddTestCaseFactory(TestCaseFactory):
> +
> +    @staticmethod
> +    def makeClass(name, level):
> +
> +        def __init__(self, methodName='runTest'):
> +            super(self.__class__, self).__init__(methodName=methodName, deviceSpec=[102400, 102400, 102400, 102400, 102400])
> +            self.longMessage = True
> +
> +        def testAdd(self):
> +            """ Tests adding, not growing, a device. """
> +            initial_members = TestCaseFactory._minMembersForCreation(level)
> +            self.assertIsNone(mdraid.mdcreate(self._dev_name, level, self.loopDevices[:initial_members]))
> +            time.sleep(2) # wait for raid to settle
> +
> +            new_member = self.loopDevices[initial_members]
> +
> +            if level.has_redundancy:
> +                info_pre = mdraid.mddetail(self._dev_name)
> +                self.assertIsNone(mdraid.mdadd(self._dev_name, new_member))
> +                info_post = mdraid.mddetail(self._dev_name)
> +                keys = ['TOTAL DEVICES', 'WORKING DEVICES']
> +                for k in keys:
> +                    self.assertEqual(int(info_pre[k]) + 1, int(info_post[k]), msg="key: %s" % k)
> +                if level is not raid.Container:
> +                    keys = ['ACTIVE DEVICES', 'SPARE DEVICES']
> +                    self.assertEqual(sum(int(info_pre[k]) for k in keys) + 1,
> +                       sum(int(info_post[k]) for k in keys))
> +                    self.assertEqual(info_pre['RAID DEVICES'], info_post['RAID DEVICES'])
> +                    dev_info = mdraid.mdexamine(new_member)
> +                    self.assertEqual(info_post['UUID'], dev_info['MD_UUID'])
> +            else:
> +                with self.assertRaises(MDRaidError):
> +                    mdraid.mdadd(self._dev_name, new_member)
> +
> +        return type(
> +           name,
> +           (MDRaidAsRootTestCase,),
> +           {
> +              '__init__': __init__,
> +              'testAdd': testAdd,
> +           })
> +
> +class GrowTestCaseFactory(object):
> +
> +    @staticmethod
> +    def makeClass(name, level):
> +
> +        def __init__(self, methodName='runTest'):
> +            super(self.__class__, self).__init__(methodName=methodName, deviceSpec=[102400, 102400, 102400, 102400, 102400, 102400])
> +            self.longMessage = True
> +
> +        def testGrow(self):
> +            """ Tests growing a device by exactly 1. """
> +            initial_members = TestCaseFactory._minMembersForCreation(level)
> +            self.assertIsNone(mdraid.mdcreate(self._dev_name, level, self.loopDevices[:initial_members]))
> +            time.sleep(3) # wait for raid to settle
> +
> +            new_member = self.loopDevices[initial_members]
> +            info_pre = mdraid.mddetail(self._dev_name)
> +            raid_devices = None if level is raid.Linear else initial_members + 1
> +            self.assertIsNone(mdraid.mdadd(self._dev_name, new_member, grow_mode=True, raid_devices=raid_devices))
> +            info_post = mdraid.mddetail(self._dev_name)
> +            keys = ['RAID DEVICES', 'TOTAL DEVICES', 'WORKING DEVICES']
> +            for k in keys:
> +                self.assertEqual(int(info_pre[k]) + 1, int(info_post[k]), msg="key: %s" % k)
> +            if level is not raid.Container:
> +                keys = ['ACTIVE DEVICES', 'SPARE DEVICES']
> +                self.assertEqual(sum(int(info_pre[k]) for k in keys) + 1,
> +                   sum(int(info_post[k]) for k in keys),
> +                   msg="%s" % " + ".join(keys))
> +                dev_info = mdraid.mdexamine(new_member)
> +                self.assertEqual(info_post['UUID'], dev_info['MD_UUID'], msg="key: UUID")
> +
> +
> +        def testGrowBig(self):
> +            """ Test growing a device beyond its size. """
> +            initial_members = TestCaseFactory._minMembersForCreation(level)
> +            self.assertIsNone(mdraid.mdcreate(self._dev_name, level, self.loopDevices[:initial_members]))
> +            time.sleep(3) # wait for raid to settle
> +
> +            new_member = self.loopDevices[initial_members]
> +            if level is raid.Linear:
> +                self.assertIsNone(mdraid.mdadd(self._dev_name, new_member, grow_mode=True))
> +            else:
> +                with self.assertRaises(MDRaidError):
> +                    mdraid.mdadd(self._dev_name, new_member, grow_mode=True, raid_devices=initial_members + 2)
> +
> +        def testGrowSmall(self):
> +            """ Test decreasing size of device. """
> +            initial_members = TestCaseFactory._minMembersForCreation(level) + 1
> +            self.assertIsNone(mdraid.mdcreate(self._dev_name, level, self.loopDevices[:initial_members]))
> +            time.sleep(2) # wait for raid to settle
> +
> +            new_member = self.loopDevices[initial_members]
> +            if level is not raid.Linear:
> +                with self.assertRaises(MDRaidError):
> +                    mdraid.mdadd(self._dev_name, new_member, grow_mode=True, raid_devices=initial_members - 1)
> +
> +        return type(
> +           name,
> +           (MDRaidAsRootTestCase,),
> +           {
> +              '__init__': __init__,
> +              'testGrow': testGrow,
> +              'testGrowBig' : testGrowBig,
> +              'testGrowSmall': testGrowSmall
> +           })
> +
> +
> +# make some test cases for every RAID level
> +levels = list(mdraid.RAID_levels)
> +levels.sort(cmp=lambda x, y: cmp(x.name, y.name)) # order tests predictably
These two lines can be made into one as:
    levels = sorted(mdraid.RAID_levels, cmp=....)

> +for l in levels:
> +    classname = "%sJustAddTestCase" % l
> +    globals()[classname] = JustAddTestCaseFactory.makeClass(classname, l)
> +
> +    if l is not raid.Container:
> +        classname = "%sGrowTestCase" % l
> +        globals()[classname] = GrowTestCaseFactory.makeClass(classname, l)
>  
>  class SimpleRaidTest(MDRaidAsRootTestCase):
>  
> diff --git a/tests/pylint/pylint-false-positives b/tests/pylint/pylint-false-positives
> index 78e71ad..6ffaf7b 100644
> --- a/tests/pylint/pylint-false-positives
> +++ b/tests/pylint/pylint-false-positives
> @@ -18,5 +18,6 @@
>  ^blivet/__init__.py:[[:digit:]]+: \[W0612\(unused\-variable\), enable_installer_mode\] Unused variable 'ROOT_PATH'$
>  ^blivet/__init__.py:[[:digit:]]+: \[W0612\(unused\-variable\), enable_installer_mode\] Unused variable 'shortProductName'$
>  ^dm.c: [[:digit:]]+: not running as root returning empty list$
> +^tests/devicelibs_test/mdraid_test.py:[[:digit:]]+: \[E1003\(bad\-super\-call\), ([[:alnum:]\.]+).__init__\] Bad first argument YES given to super\(\)$
>  ^tests/devicelibs_test/raid_test.py:[[:digit:]]+: \[E1120\(no\-value\-for\-parameter\), [[:alnum:]\.]+\] No value [[:alnum:] ]+ 'member_count' in [[:alnum:] ]+ call$
>  ^tests/devicelibs_test/raid_test.py:[[:digit:]]+: \[E1120\(no\-value\-for\-parameter\), [[:alnum:]\.]+\] No value [[:alnum:] ]+ 'smallest_member_size' in [[:alnum:] ]+ call$
Otherwise this patch is really a big dirty hack, I'd say, but I cannot
think of any better solution and I think we can live with something like
this is tests.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list