[blivet:master 11/11] Move DevicelibsTestCase up to the top level of the testing directory.

Anne Mulhern amulhern at redhat.com
Wed Jun 18 14:38:20 UTC 2014





----- Original Message -----
> From: "David Lehman" <dlehman at redhat.com>
> To: anaconda-patches at lists.fedorahosted.org
> Sent: Wednesday, June 18, 2014 10:06:11 AM
> Subject: Re: [blivet:master 11/11] Move DevicelibsTestCase up to the top level	of the testing directory.
> 
> On 06/17/2014 10:08 AM, mulhern wrote:
> > It is used by formats_test tests as well as tests in devicelibs_test.
> > Change all uses appropriately.
> >
> > Signed-off-by: mulhern <amulhern at redhat.com>
> > ---
> >   tests/devicelibs_test/baseclass.py   | 102
> >   -----------------------------------
> >   tests/devicelibs_test/btrfs_test.py  |  12 ++---
> >   tests/devicelibs_test/crypto_test.py |   6 +--
> >   tests/devicelibs_test/lvm_test.py    |   4 +-
> >   tests/devicelibs_test/mdraid_test.py |   4 +-
> >   tests/devicelibs_test/swap_test.py   |   4 +-
> >   tests/formats_test/fslabeling.py     |   4 +-
> >   tests/formats_test/labeling_test.py  |   4 +-
> >   tests/formats_test/selinux_test.py   |   4 +-
> >   tests/loopbacktestcase.py            | 102
> >   +++++++++++++++++++++++++++++++++++
> >   10 files changed, 123 insertions(+), 123 deletions(-)
> >   delete mode 100644 tests/devicelibs_test/baseclass.py
> >   create mode 100644 tests/loopbacktestcase.py
> >
> > diff --git a/tests/devicelibs_test/baseclass.py
> > b/tests/devicelibs_test/baseclass.py
> > deleted file mode 100644
> > index 5e6d51e..0000000
> > --- a/tests/devicelibs_test/baseclass.py
> > +++ /dev/null
> > @@ -1,102 +0,0 @@
> > -import unittest
> > -import os
> > -import subprocess
> > -
> > -
> > -def makeLoopDev(device_name, file_name, num_blocks=102400):
> > -    """ Set up a loop device with a backing store.
> > -
> > -        :param str device_name: the path of the loop device
> > -        :param str file_name: the path of the backing file
> > -        :param int num_blocks: the size of file_name in number of blocks
> > -    """
> > -    proc = subprocess.Popen(["dd", "if=/dev/zero", "of=%s" % file_name,
> > -                             "bs=1024", "count=%d" % num_blocks],
> > -                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > -    while True:
> > -        proc.communicate()
> > -        if proc.returncode is not None:
> > -            rc = proc.returncode
> > -            break
> > -    if rc:
> > -        raise OSError("dd failed creating the file %s" % file_name)
> > -
> > -    proc = subprocess.Popen(["losetup", device_name, file_name],
> > -                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > -    while True:
> > -        proc.communicate()
> > -        if proc.returncode is not None:
> > -            rc = proc.returncode
> > -            break
> > -    if rc:
> > -        raise OSError("losetup failed setting up the loop device %s" %
> > device_name)
> > -
> > -def removeLoopDev(device_name, file_name):
> > -    proc = subprocess.Popen(["losetup", "-d", device_name],
> > -                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > -    while True:
> > -        proc.communicate()
> > -        if proc.returncode is not None:
> > -            rc = proc.returncode
> > -            break
> > -    if rc:
> > -        raise OSError("losetup failed removing the loop device %s" %
> > device_name)
> > -
> > -    os.unlink(file_name)
> > -
> > -def getFreeLoopDev():
> > -    # There's a race condition here where another process could grab the
> > loop
> > -    # device losetup gives us before we have time to set it up, but that's
> > just
> > -    # a chance we'll have to take.
> > -    proc = subprocess.Popen(["losetup", "-f"],
> > -                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > -    out = None
> > -
> > -    while True:
> > -        (out, _err) = proc.communicate()
> > -        if proc.returncode is not None:
> > -            rc = proc.returncode
> > -            out = out.strip()
> > -            break
> > -
> > -    if rc:
> > -        raise OSError("losetup failed to find a free device")
> > -
> > -    return out
> > -
> > - at unittest.skipUnless(os.geteuid() == 0, "requires root privileges")
> > -class DevicelibsTestCase(unittest.TestCase):
> > -
> > -    DEFAULT_STORE_SIZE = 102400
> > -    _DEFAULT_DEVICE_SPEC = [DEFAULT_STORE_SIZE, DEFAULT_STORE_SIZE]
> > -    _STORE_FILE_BASE_NAME = 'test-virtdev'
> > -    _STORE_FILE_PATH = '/tmp'
> > -
> > -    def __init__(self, methodName='runTest', deviceSpec=None):
> > -        """ DevicelibsTestCase manages loop devices.
> > -
> > -            It constructs loop devices according to loopDeviceSpec,
> > -            sets them up, and tears them down again.
> > -
> > -            :param deviceSpec: Specification for the loop devices.
> > -            :type deviceSpec: list of int
> > -
> > -            deviceSpec is currently just a list of ints corresponding
> > -            to the number of blocks for each backing store.
> > -        """
> > -        unittest.TestCase.__init__(self, methodName=methodName)
> > -        self._deviceSpec = deviceSpec or self._DEFAULT_DEVICE_SPEC
> > -        self._loopMap = {}
> > -        self.loopDevices = []
> > -
> > -    def setUp(self):
> > -        for index, size in enumerate(self._deviceSpec):
> > -            store = os.path.join(self._STORE_FILE_PATH,
> > (self._STORE_FILE_BASE_NAME + "%d") % index)
> > -            dev = getFreeLoopDev()
> > -            makeLoopDev(dev, store, num_blocks=size)
> > -            self._loopMap[dev] = store
> > -            self.loopDevices.append(dev)
> > -
> > -    def tearDown(self):
> > -        for (dev, store) in self._loopMap.iteritems():
> > -            removeLoopDev(dev, store)
> > diff --git a/tests/devicelibs_test/btrfs_test.py
> > b/tests/devicelibs_test/btrfs_test.py
> > index 40a26de..4957855 100755
> > --- a/tests/devicelibs_test/btrfs_test.py
> > +++ b/tests/devicelibs_test/btrfs_test.py
> > @@ -8,9 +8,9 @@ import unittest
> >   import blivet.devicelibs.btrfs as btrfs
> >   from blivet.errors import BTRFSError
> >
> > -import tests.devicelibs_test.baseclass as baseclass
> > +import tests.loopbacktestcase as loopbacktestcase
> >
> > -class BTRFSMountDevice(baseclass.DevicelibsTestCase):
> > +class BTRFSMountDevice(loopbacktestcase.LoopBackTestCase):
> >       """A superclass that mounts and unmounts the filesystem.
> >          It must create the filesystem on its chosen devices before
> >          mounting.
> >          It always mounts the filesystem using self.device at
> >          self.mountpoint.
> > @@ -26,7 +26,7 @@ class BTRFSMountDevice(baseclass.DevicelibsTestCase):
> >
> >              Chooses the device to specify to mount command arbitrarily.
> >           """
> > -        baseclass.DevicelibsTestCase.setUp(self)
> > +        loopbacktestcase.LoopBackTestCase.setUp(self)
> >
> >           btrfs.create_volume(self.loopDevices)
> >           self.device = self.loopDevices[0]
> > @@ -50,9 +50,9 @@ class BTRFSMountDevice(baseclass.DevicelibsTestCase):
> >               raise OSError("failed to unmount device %s" % self.device)
> >
> >           os.rmdir(self.mountpoint)
> > -        baseclass.DevicelibsTestCase.tearDown(self)
> > +        loopbacktestcase.LoopBackTestCase.tearDown(self)
> >
> > -class BTRFSAsRootTestCase1(baseclass.DevicelibsTestCase):
> > +class BTRFSAsRootTestCase1(loopbacktestcase.LoopBackTestCase):
> >
> >       def testUnmountedBTRFS(self):
> >           """A series of simple tests on an unmounted file system.
> > @@ -177,7 +177,7 @@ class BTRFSAsRootTestCase2(BTRFSMountDevice):
> >           subvolumes = btrfs.list_subvolumes(self.mountpoint)
> >           self.assertEqual(len([v for v in subvolumes if
> >           v['path'].find("SV1.1") != -1]), 1)
> >
> > -class BTRFSAsRootTestCase3(baseclass.DevicelibsTestCase):
> > +class BTRFSAsRootTestCase3(loopbacktestcase.LoopBackTestCase):
> >
> >       def __init__(self, methodName='runTest'):
> >           super(BTRFSAsRootTestCase3, self).__init__(methodName=methodName,
> >           deviceSpec=[8192])
> > diff --git a/tests/devicelibs_test/crypto_test.py
> > b/tests/devicelibs_test/crypto_test.py
> > index 8316a21..dc12645 100755
> > --- a/tests/devicelibs_test/crypto_test.py
> > +++ b/tests/devicelibs_test/crypto_test.py
> > @@ -6,7 +6,7 @@ import os
> >
> >   from blivet.devicelibs import crypto
> >   from blivet.errors import CryptoError
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >
> >   #FIXME: some of these tests expect behavior which is not correct
> >   #
> > @@ -27,7 +27,7 @@ from tests.devicelibs_test import baseclass
> >   # CryptSetup.status is informative and that it would be useful to
> >   preserve it.
> >   # The numeric values are enumerated in libcryptsetup.h.
> >
> > -class CryptoTestCase(baseclass.DevicelibsTestCase):
> > +class CryptoTestCase(loopbacktestcase.LoopBackTestCase):
> >
> >       def testCryptoMisc(self):
> >           _LOOP_DEV0 = self.loopDevices[0]
> > @@ -129,7 +129,7 @@ class CryptoTestCase(baseclass.DevicelibsTestCase):
> >           # cleanup
> >           os.unlink(keyfile)
> >
> > -class CryptoTestCase2(baseclass.DevicelibsTestCase):
> > +class CryptoTestCase2(loopbacktestcase.LoopBackTestCase):
> >
> >       def __init__(self, methodName='runTest'):
> >           """Set up the names by which luks knows these devices."""
> > diff --git a/tests/devicelibs_test/lvm_test.py
> > b/tests/devicelibs_test/lvm_test.py
> > index a66c756..fa546f4 100755
> > --- a/tests/devicelibs_test/lvm_test.py
> > +++ b/tests/devicelibs_test/lvm_test.py
> > @@ -5,7 +5,7 @@ import blivet.devicelibs.lvm as lvm
> >   from blivet.size import Size
> >   from blivet.errors import LVMError
> >
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >
> >   class LVMTestCase(unittest.TestCase):
> >
> > @@ -31,7 +31,7 @@ class LVMTestCase(unittest.TestCase):
> >   # call if the device is non-existant, and usually that exception is
> >   caught and
> >   # an LVMError is then raised, but not always.
> >
> > -class LVMAsRootTestCase(baseclass.DevicelibsTestCase):
> > +class LVMAsRootTestCase(loopbacktestcase.LoopBackTestCase):
> >
> >       def __init__(self, methodName='runTest'):
> >           """Set up the structure of the volume group."""
> > diff --git a/tests/devicelibs_test/mdraid_test.py
> > b/tests/devicelibs_test/mdraid_test.py
> > index 3b12aaf..8185132 100755
> > --- a/tests/devicelibs_test/mdraid_test.py
> > +++ b/tests/devicelibs_test/mdraid_test.py
> > @@ -7,7 +7,7 @@ import blivet.devicelibs.mdraid as mdraid
> >   from blivet.errors import MDRaidError
> >   from blivet.size import Size
> >
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >
> >   class MDRaidTestCase(unittest.TestCase):
> >
> > @@ -49,7 +49,7 @@ class MDRaidTestCase(unittest.TestCase):
> >                            mdraid.MD_SUPERBLOCK_SIZE)
> >
> >
> > -class MDRaidAsRootTestCase(baseclass.DevicelibsTestCase):
> > +class MDRaidAsRootTestCase(loopbacktestcase.LoopBackTestCase):
> >
> >       def __init__(self, methodName='runTest'):
> >           """Set up the structure of the mdraid array."""
> > diff --git a/tests/devicelibs_test/swap_test.py
> > b/tests/devicelibs_test/swap_test.py
> > index 8f7d2bb..9fa8240 100755
> > --- a/tests/devicelibs_test/swap_test.py
> > +++ b/tests/devicelibs_test/swap_test.py
> > @@ -4,9 +4,9 @@ import unittest
> >   import blivet.devicelibs.swap as swap
> >   from blivet.errors import SwapError
> >
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >
> > -class SwapTestCase(baseclass.DevicelibsTestCase):
> > +class SwapTestCase(loopbacktestcase.LoopBackTestCase):
> >
> >       def testSwap(self):
> >           _LOOP_DEV0 = self.loopDevices[0]
> > diff --git a/tests/formats_test/fslabeling.py
> > b/tests/formats_test/fslabeling.py
> > index 4cfa9f1..12624a3 100644
> > --- a/tests/formats_test/fslabeling.py
> > +++ b/tests/formats_test/fslabeling.py
> > @@ -2,10 +2,10 @@
> >
> >   import abc
> >
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >   from blivet.errors import FSError
> >
> > -class LabelingAsRoot(baseclass.DevicelibsTestCase):
> > +class LabelingAsRoot(loopbacktestcase.LoopBackTestCase):
> >       """Tests various aspects of labeling a filesystem where there
> >          is no easy way to read the filesystem's label once it has been
> >          set and where the filesystem can not be relabeled.
> > diff --git a/tests/formats_test/labeling_test.py
> > b/tests/formats_test/labeling_test.py
> > index 1519cca..b880ac9 100755
> > --- a/tests/formats_test/labeling_test.py
> > +++ b/tests/formats_test/labeling_test.py
> > @@ -1,7 +1,7 @@
> >   #!/usr/bin/python
> >   import unittest
> >
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >   from blivet.formats import device_formats
> >   import blivet.formats.fs as fs
> >   import blivet.formats.swap as swap
> > @@ -126,7 +126,7 @@ class HFSTestCase(fslabeling.LabelingAsRoot):
> >       def setUp(self):
> >           super(HFSTestCase, self).setUp()
> >
> > -class LabelingSwapSpaceTestCase(baseclass.DevicelibsTestCase):
> > +class LabelingSwapSpaceTestCase(loopbacktestcase.LoopBackTestCase):
> >
> >       def testLabeling(self):
> >           swp = swap.SwapSpace(device=self.loopDevices[0])
> > diff --git a/tests/formats_test/selinux_test.py
> > b/tests/formats_test/selinux_test.py
> > index 9c48ea4..ce3bcb1 100755
> > --- a/tests/formats_test/selinux_test.py
> > +++ b/tests/formats_test/selinux_test.py
> > @@ -5,10 +5,10 @@ import tempfile
> >   import unittest
> >
> >   import blivet
> > -from tests.devicelibs_test import baseclass
> > +from tests import loopbacktestcase
> >   import blivet.formats.fs as fs
> >
> > -class SELinuxContextTestCase(baseclass.DevicelibsTestCase):
> > +class SELinuxContextTestCase(loopbacktestcase.LoopBackTestCase):
> >       """Testing SELinux contexts.
> >       """
> >
> > diff --git a/tests/loopbacktestcase.py b/tests/loopbacktestcase.py
> > new file mode 100644
> > index 0000000..de6cfb0
> > --- /dev/null
> > +++ b/tests/loopbacktestcase.py
> > @@ -0,0 +1,102 @@
> > +import unittest
> > +import os
> > +import subprocess
> > +
> > +
> > +def makeLoopDev(device_name, file_name, num_blocks=102400):
> > +    """ Set up a loop device with a backing store.
> > +
> > +        :param str device_name: the path of the loop device
> > +        :param str file_name: the path of the backing file
> > +        :param int num_blocks: the size of file_name in number of blocks
> > +    """
> > +    proc = subprocess.Popen(["dd", "if=/dev/zero", "of=%s" % file_name,
> > +                             "bs=1024", "count=%d" % num_blocks],
> > +                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > +    while True:
> > +        proc.communicate()
> > +        if proc.returncode is not None:
> > +            rc = proc.returncode
> > +            break
> > +    if rc:
> > +        raise OSError("dd failed creating the file %s" % file_name)
> > +
> > +    proc = subprocess.Popen(["losetup", device_name, file_name],
> > +                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > +    while True:
> > +        proc.communicate()
> > +        if proc.returncode is not None:
> > +            rc = proc.returncode
> > +            break
> > +    if rc:
> > +        raise OSError("losetup failed setting up the loop device %s" %
> > device_name)
> > +
> > +def removeLoopDev(device_name, file_name):
> > +    proc = subprocess.Popen(["losetup", "-d", device_name],
> > +                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > +    while True:
> > +        proc.communicate()
> > +        if proc.returncode is not None:
> > +            rc = proc.returncode
> > +            break
> > +    if rc:
> > +        raise OSError("losetup failed removing the loop device %s" %
> > device_name)
> > +
> > +    os.unlink(file_name)
> > +
> > +def getFreeLoopDev():
> > +    # There's a race condition here where another process could grab the
> > loop
> > +    # device losetup gives us before we have time to set it up, but that's
> > just
> > +    # a chance we'll have to take.
> > +    proc = subprocess.Popen(["losetup", "-f"],
> > +                            stdout=subprocess.PIPE,
> > stderr=subprocess.PIPE)
> > +    out = None
> > +
> > +    while True:
> > +        (out, _err) = proc.communicate()
> > +        if proc.returncode is not None:
> > +            rc = proc.returncode
> > +            out = out.strip()
> > +            break
> > +
> > +    if rc:
> > +        raise OSError("losetup failed to find a free device")
> > +
> > +    return out
> > +
> > + at unittest.skipUnless(os.geteuid() == 0, "requires root privileges")
> > +class LoopBackTestCase(unittest.TestCase):
> > +
> > +    DEFAULT_STORE_SIZE = 102400
> > +    _DEFAULT_DEVICE_SPEC = [DEFAULT_STORE_SIZE, DEFAULT_STORE_SIZE]
> > +    _STORE_FILE_BASE_NAME = 'test-virtdev'
> > +    _STORE_FILE_PATH = '/tmp'
> > +
> > +    def __init__(self, methodName='runTest', deviceSpec=None):
> > +        """ DevicelibsTestCase manages loop devices.
> > +
> > +            It constructs loop devices according to loopDeviceSpec,
> > +            sets them up, and tears them down again.
> > +
> > +            :param deviceSpec: Specification for the loop devices.
> > +            :type deviceSpec: list of int
> > +
> > +            deviceSpec is currently just a list of ints corresponding
> > +            to the number of blocks for each backing store.
> > +        """
> > +        unittest.TestCase.__init__(self, methodName=methodName)
> > +        self._deviceSpec = deviceSpec or self._DEFAULT_DEVICE_SPEC
> > +        self._loopMap = {}
> > +        self.loopDevices = []
> > +
> > +    def setUp(self):
> > +        for index, size in enumerate(self._deviceSpec):
> > +            store = os.path.join(self._STORE_FILE_PATH,
> > (self._STORE_FILE_BASE_NAME + "%d") % index)
> > +            dev = getFreeLoopDev()
> > +            makeLoopDev(dev, store, num_blocks=size)
> > +            self._loopMap[dev] = store
> > +            self.loopDevices.append(dev)
> > +
> > +    def tearDown(self):
> > +        for (dev, store) in self._loopMap.iteritems():
> > +            removeLoopDev(dev, store)
> >
> 
> My only gripe is that it isn't "loopback" unless you're talking
> networking. /dev/loop* are "loop" devices. So it should either be
> LoopTestCase or maybe LoopBackedTestCase, with a corresponding filename.
> 
> David
> _______________________________________________
> anaconda-patches mailing list
> anaconda-patches at lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
> 

Changed to LoopBackedTestCase and rest as appropriate in working copy.

- mulhern


More information about the anaconda-patches mailing list