From f6aede65fcc7a59575120fb476c151069ee04b2f Mon Sep 17 00:00:00 2001 From: Sebastian Kalinowski Date: Thu, 4 Jun 2015 08:56:33 +0200 Subject: [PATCH] Improved testing of Volume XML building Added factories for Volume and Environment and used in test Increased py.test verbosity (for diffs in asserts) More and better test cases for Volume XML Partial-Bug: #1462906 Change-Id: I765cc572970ebb75290246887c1ff1bf0b773c56 --- devops/tests/factories.py | 34 ++++++++++ devops/tests/test_libvirt_xml_builder.py | 79 +++++++++++++++--------- tox.ini | 2 +- 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/devops/tests/factories.py b/devops/tests/factories.py index 0a02fa28..3835a38a 100644 --- a/devops/tests/factories.py +++ b/devops/tests/factories.py @@ -13,8 +13,42 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. + +import uuid + +import factory from factory import fuzzy +from devops import models + + +class FuzzyUuid(fuzzy.BaseFuzzyAttribute): + + def fuzz(self): + return str(uuid.uuid4()) + + +@factory.use_strategy(factory.BUILD_STRATEGY) +class EnvironmentFactory(factory.django.DjangoModelFactory): + class Meta: + model = models.Environment + + name = fuzzy.FuzzyText('test_env_') + + +@factory.use_strategy(factory.BUILD_STRATEGY) +class VolumeFactory(factory.django.DjangoModelFactory): + class Meta: + model = models.Volume + + environment = factory.SubFactory(EnvironmentFactory) + backing_store = factory.SubFactory('devops.tests.factories.VolumeFactory', + backing_store=None) + name = fuzzy.FuzzyText('test_volume_') + uuid = FuzzyUuid() + capacity = fuzzy.FuzzyInteger(50, 100) + format = fuzzy.FuzzyText('qcow2_') + def fuzzy_string(*args, **kwargs): """Shortcut for getting fuzzy text""" diff --git a/devops/tests/test_libvirt_xml_builder.py b/devops/tests/test_libvirt_xml_builder.py index bda23877..f74c3c9b 100644 --- a/devops/tests/test_libvirt_xml_builder.py +++ b/devops/tests/test_libvirt_xml_builder.py @@ -24,16 +24,17 @@ from devops.tests import factories class BaseTestXMLBuilder(TestCase): def setUp(self): + # TODO(prmtl): make it fuzzy + self.volume_path = "volume_path_mock" self.xml_builder = LibvirtXMLBuilder(mock.Mock()) self.xml_builder.driver.volume_path = mock.Mock( - return_value="volume_path_mock" + return_value=self.volume_path ) self.xml_builder.driver.network_name = mock.Mock( return_value="network_name_mock" ) self.xml_builder.driver.reboot_timeout = None self.net = mock.Mock() - self.vol = mock.Mock() self.node = mock.Mock() @@ -82,39 +83,57 @@ class TestVolumeXml(BaseTestXMLBuilder): def setUp(self): super(TestVolumeXml, self).setUp() - self.vol.name = 'test_name' - self.vol.environment.name = 'test_env_name' - self.vol.id = random.randint(1, 100) - self.vol.format = "qcow2" - self.vol.backing_store = None - def test_general_properties(self): - self.vol.capacity = random.randint(50, 100) - xml = self.xml_builder.build_volume_xml(self.vol) - self.assertIn( - '{0}_{1}' - ''.format(self.vol.environment.name, self.vol.name), - xml) - self.assertIn( - '{0}'.format(self.vol.capacity), xml) - self.assertIn( - ''' + def get_xml(self, volume): + """Generate XML from volume""" + return self.xml_builder.build_volume_xml(volume) + + def test_full_volume_xml(self): + volume = factories.VolumeFactory() + expected = ''' + + {env_name}_{name} + {capacity} - - '''.format(self.vol.format), xml) + + + + {path} + + +'''.format( + env_name=volume.environment.name, + name=volume.name, + capacity=volume.capacity, + format=volume.format, + path=self.volume_path, + store_format=volume.backing_store.format, + ) + xml = self.get_xml(volume) + # NOTE(prmtl): this assert provide better reporting (diff) in py.test + assert expected == xml + self.xml_builder.driver.volume_path.assert_called_with( + volume.backing_store) + + def test_name_without_env(self): + volume = factories.VolumeFactory(environment=None) + xml = self.get_xml(volume) + self.assertIn('{0}'.format(volume.name), xml) + + def test_no_backing_store(self): + volume = factories.VolumeFactory(backing_store=None) + xml = self.get_xml(volume) + self.assertNotIn("", xml) def test_backing_store(self): - self.vol.backing_store = mock.Mock( - uuid="volume_uuid", - format="raw" - ) - xml = self.xml_builder.build_volume_xml(self.vol) - self.assertIn( - ''' + format = "raw" + volume = factories.VolumeFactory(backing_store__format=format) + xml = self.get_xml(volume) + self.assertIn(''' - volume_path_mock - - '''.format(self.vol.backing_store.format), xml) + {path} + + '''.format(path=self.volume_path, format=format), xml) class TestSnapshotXml(BaseTestXMLBuilder): diff --git a/tox.ini b/tox.ini index 9783922b..7bf5b6fc 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ skipsdist = True usedevelop = True deps = -r{toxinidir}/test-requirements.txt commands = - py.test -v {posargs:devops/tests} + py.test -vv {posargs:devops/tests} [testenv:venv] commands = {posargs:}