From 2113b6475cbdaa467e55d3af140ef967baeefe8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 4 May 2016 15:22:23 +0200 Subject: [PATCH 1/4] [metadata] Add tests for discinfo files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This tests writing and reading them. Also, it makes sure the description for layered products is correct: there was a missing space. Signed-off-by: Lubomír Sedlář --- pungi/metadata.py | 2 +- tests/test_metadata.py | 123 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/test_metadata.py diff --git a/pungi/metadata.py b/pungi/metadata.py index d57ba77e..b853e1f4 100644 --- a/pungi/metadata.py +++ b/pungi/metadata.py @@ -36,7 +36,7 @@ def get_description(compose, variant, arch): else: result = "%s %s" % (compose.conf["release_name"], compose.conf["release_version"]) if compose.conf.get("release_is_layered", False): - result += "for %s %s" % (compose.conf["base_product_name"], compose.conf["base_product_version"]) + result += " for %s %s" % (compose.conf["base_product_name"], compose.conf["base_product_version"]) result = result % {"variant_name": variant.name, "arch": arch} return result diff --git a/tests/test_metadata.py b/tests/test_metadata.py new file mode 100644 index 00000000..165638fa --- /dev/null +++ b/tests/test_metadata.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +import mock +import unittest +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +from tests import helpers + +from pungi import metadata +from pungi.compose_metadata import discinfo + + +def mock_time(): + return 101010101.01 + + +class DiscInfoTestCase(helpers.PungiTestCase): + + def setUp(self): + super(DiscInfoTestCase, self).setUp() + self.path = os.path.join(self.topdir, 'compose/Server/x86_64/os/.discinfo') + + @mock.patch('time.time', new=mock_time) + def test_write_discinfo_variant(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + }) + + metadata.write_discinfo(compose, 'x86_64', compose.variants['Server']) + + with open(self.path) as f: + self.assertEqual(f.read().strip().split('\n'), + ['101010101.010000', + 'Test 1.0', + 'x86_64', + 'ALL']) + + self.assertEqual(discinfo.read_discinfo(self.path), + {'timestamp': '101010101.010000', + 'description': 'Test 1.0', + 'disc_numbers': ['ALL'], + 'arch': 'x86_64'}) + + @mock.patch('time.time', new=mock_time) + def test_write_discinfo_custom_description(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + 'release_discinfo_description': 'Fuzzy %(variant_name)s.%(arch)s', + }) + compose.variants['Server'].name = 'Server' + + metadata.write_discinfo(compose, 'x86_64', compose.variants['Server']) + + with open(self.path) as f: + self.assertEqual(f.read().strip().split('\n'), + ['101010101.010000', + 'Fuzzy Server.x86_64', + 'x86_64', + 'ALL']) + + @mock.patch('time.time', new=mock_time) + def test_write_discinfo_layered_product(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + 'release_is_layered': True, + 'base_product_name': 'Base', + 'base_product_version': 42, + }) + + metadata.write_discinfo(compose, 'x86_64', compose.variants['Server']) + + with open(self.path) as f: + self.assertEqual(f.read().strip().split('\n'), + ['101010101.010000', + 'Test 1.0 for Base 42', + 'x86_64', + 'ALL']) + + @mock.patch('time.time', new=mock_time) + def test_write_discinfo_integrated_layered_product(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + }) + compose.variants['ILP'] = mock.Mock(uid='Server', arches=['x86_64'], + type='layered-product', is_empty=False, + release_name='Integrated', + release_version='2.1', + parent=compose.variants['Server']) + + metadata.write_discinfo(compose, 'x86_64', compose.variants['ILP']) + + with open(self.path) as f: + self.assertEqual(f.read().strip().split('\n'), + ['101010101.010000', + 'Integrated 2.1 for Test 1', + 'x86_64', + 'ALL']) + + @mock.patch('time.time', new=mock_time) + def test_addons_dont_have_discinfo(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + }) + compose.variants['ILP'] = mock.Mock(uid='Server', arches=['x86_64'], + type='addon', is_empty=False, + parent=compose.variants['Server']) + + metadata.write_discinfo(compose, 'x86_64', compose.variants['ILP']) + + self.assertFalse(os.path.isfile(self.path)) + + +if __name__ == "__main__": + unittest.main() From 8ef94788794688e01f745b3a76fc3104ebb79cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 4 May 2016 15:28:36 +0200 Subject: [PATCH 2/4] [discinfo] Use context manager for file access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lubomír Sedlář --- pungi/compose_metadata/discinfo.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/pungi/compose_metadata/discinfo.py b/pungi/compose_metadata/discinfo.py index fe74fca7..0042015e 100644 --- a/pungi/compose_metadata/discinfo.py +++ b/pungi/compose_metadata/discinfo.py @@ -45,23 +45,22 @@ def write_discinfo(file_path, description, arch, disc_numbers=None, timestamp=No raise TypeError("Invalid type: disc_numbers type is %s; expected: " % type(disc_numbers)) if not timestamp: timestamp = "%f" % time.time() - f = open(file_path, "w") - f.write("%s\n" % timestamp) - f.write("%s\n" % description) - f.write("%s\n" % arch) - if disc_numbers: - f.write("%s\n" % ",".join([str(i) for i in disc_numbers])) - f.close() + with open(file_path, "w") as f: + f.write("%s\n" % timestamp) + f.write("%s\n" % description) + f.write("%s\n" % arch) + if disc_numbers: + f.write("%s\n" % ",".join([str(i) for i in disc_numbers])) return timestamp def read_discinfo(file_path): result = {} - f = open(file_path, "r") - result["timestamp"] = f.readline().strip() - result["description"] = f.readline().strip() - result["arch"] = f.readline().strip() - disc_numbers = f.readline().strip() + with open(file_path, "r") as f: + result["timestamp"] = f.readline().strip() + result["description"] = f.readline().strip() + result["arch"] = f.readline().strip() + disc_numbers = f.readline().strip() if not disc_numbers: result["disc_numbers"] = None elif disc_numbers == "ALL": From 5d849cd050108cf75a322be6a4e59dcd4da81035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 4 May 2016 15:41:32 +0200 Subject: [PATCH 3/4] [metadata] Add test for writing media.repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lubomír Sedlář --- tests/test_metadata.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 165638fa..a3a452d7 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -119,5 +119,44 @@ class DiscInfoTestCase(helpers.PungiTestCase): self.assertFalse(os.path.isfile(self.path)) +class MediaRepoTestCase(helpers.PungiTestCase): + + def setUp(self): + super(MediaRepoTestCase, self).setUp() + self.path = os.path.join(self.topdir, 'compose/Server/x86_64/os/media.repo') + + def test_write_media_repo(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + }) + + metadata.write_media_repo(compose, 'x86_64', compose.variants['Server'], + timestamp=123456) + + with open(self.path) as f: + lines = f.read().strip().split('\n') + self.assertEqual(lines[0], '[InstallMedia]') + self.assertItemsEqual(lines[1:], + ['name=Test 1.0', + 'mediaid=123456', + 'metadata_expire=-1', + 'gpgcheck=0', + 'cost=500']) + + def test_addons_dont_have_media_repo(self): + compose = helpers.DummyCompose(self.topdir, { + 'release_name': 'Test', + 'release_version': '1.0', + }) + compose.variants['ILP'] = mock.Mock(uid='Server', arches=['x86_64'], + type='addon', is_empty=False, + parent=compose.variants['Server']) + + metadata.write_discinfo(compose, 'x86_64', compose.variants['ILP']) + + self.assertFalse(os.path.isfile(self.path)) + + if __name__ == "__main__": unittest.main() From 17bb3d2122851614fd61e40a657699f0cab48ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 4 May 2016 15:41:46 +0200 Subject: [PATCH 4/4] [metadata] Simplify writing media.repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit also removes the ability to generate timestamp. It must now always be passed explicitly. The feature was not used anywhere and it actually did not work. Signed-off-by: Lubomír Sedlář --- pungi/compose_metadata/discinfo.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/pungi/compose_metadata/discinfo.py b/pungi/compose_metadata/discinfo.py index 0042015e..788a2601 100644 --- a/pungi/compose_metadata/discinfo.py +++ b/pungi/compose_metadata/discinfo.py @@ -70,16 +70,11 @@ def read_discinfo(file_path): return result -def write_media_repo(file_path, description, timestamp=None): +def write_media_repo(file_path, description, timestamp): """ Write media.repo file for the disc to be used on installed system. PackageKit uses this. """ - - if not timestamp: - raise - timestamp = "%f" % time.time() - data = [ "[InstallMedia]", "name=%s" % description, @@ -90,7 +85,6 @@ def write_media_repo(file_path, description, timestamp=None): "", ] - repo_file = open(file_path, "w") - repo_file.write("\n".join(data)) - repo_file.close() + with open(file_path, "w") as repo_file: + repo_file.write("\n".join(data)) return timestamp