260 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| try:
 | |
|     import unittest2 as unittest
 | |
| except ImportError:
 | |
|     import unittest
 | |
| from unittest import mock
 | |
| 
 | |
| import os
 | |
| import tempfile
 | |
| import shutil
 | |
| 
 | |
| from pungi.phases.image_checksum import ImageChecksumPhase, dump_checksums
 | |
| from tests.helpers import DummyCompose, PungiTestCase
 | |
| 
 | |
| 
 | |
| class TestImageChecksumPhase(PungiTestCase):
 | |
|     def test_phase_is_never_skipped(self):
 | |
|         compose = DummyCompose(self.topdir, {})
 | |
|         phase = ImageChecksumPhase(compose)
 | |
|         self.assertFalse(phase.skip())
 | |
| 
 | |
|     def test_config_skip_individual_with_multiple_algorithms(self):
 | |
|         compose = DummyCompose(
 | |
|             self.topdir,
 | |
|             {"media_checksums": ["md5", "sha1"], "media_checksum_one_file": True},
 | |
|         )
 | |
|         phase = ImageChecksumPhase(compose)
 | |
|         with self.assertRaises(ValueError) as ctx:
 | |
|             phase.validate()
 | |
| 
 | |
|         self.assertIn("media_checksum_one_file", str(ctx.exception))
 | |
| 
 | |
|     @mock.patch("os.path.exists")
 | |
|     @mock.patch("kobo.shortcuts.compute_file_checksums")
 | |
|     @mock.patch("pungi.phases.image_checksum.dump_checksums")
 | |
|     def test_checksum_one_file(self, dump_checksums, cc, exists):
 | |
|         compose = DummyCompose(
 | |
|             self.topdir,
 | |
|             {"media_checksums": ["sha256"], "media_checksum_one_file": True},
 | |
|         )
 | |
| 
 | |
|         phase = ImageChecksumPhase(compose)
 | |
| 
 | |
|         exists.return_value = True
 | |
|         cc.return_value = {"sha256": "cafebabe"}
 | |
| 
 | |
|         phase.run()
 | |
| 
 | |
|         dump_checksums.assert_called_once_with(
 | |
|             self.topdir + "/compose/Client/i386/iso/CHECKSUM",
 | |
|             set([("image.iso", 123, "sha256", "cafebabe")]),
 | |
|         )
 | |
|         cc.assert_called_once_with(
 | |
|             self.topdir + "/compose/Client/i386/iso/image.iso", ["sha256"]
 | |
|         )
 | |
|         compose.image.add_checksum.assert_called_once_with(None, "sha256", "cafebabe")
 | |
| 
 | |
|     @mock.patch("os.path.exists")
 | |
|     @mock.patch("kobo.shortcuts.compute_file_checksums")
 | |
|     @mock.patch("pungi.phases.image_checksum.dump_checksums")
 | |
|     def test_checksum_save_individuals(self, dump_checksums, cc, exists):
 | |
|         compose = DummyCompose(self.topdir, {"media_checksums": ["md5", "sha256"]})
 | |
| 
 | |
|         phase = ImageChecksumPhase(compose)
 | |
| 
 | |
|         exists.return_value = True
 | |
|         cc.return_value = {"md5": "cafebabe", "sha256": "deadbeef"}
 | |
| 
 | |
|         phase.run()
 | |
| 
 | |
|         dump_checksums.assert_has_calls(
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/image.iso.MD5SUM",
 | |
|                     set([("image.iso", 123, "md5", "cafebabe")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/image.iso.SHA256SUM",
 | |
|                     set([("image.iso", 123, "sha256", "deadbeef")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/MD5SUM",
 | |
|                     set([("image.iso", 123, "md5", "cafebabe")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/SHA256SUM",
 | |
|                     set([("image.iso", 123, "sha256", "deadbeef")]),
 | |
|                 ),
 | |
|             ],
 | |
|             any_order=True,
 | |
|         )
 | |
|         cc.assert_called_once_with(
 | |
|             self.topdir + "/compose/Client/i386/iso/image.iso", ["md5", "sha256"]
 | |
|         )
 | |
|         compose.image.add_checksum.assert_has_calls(
 | |
|             [mock.call(None, "sha256", "deadbeef"), mock.call(None, "md5", "cafebabe")],
 | |
|             any_order=True,
 | |
|         )
 | |
| 
 | |
|     @mock.patch("os.path.exists")
 | |
|     @mock.patch("kobo.shortcuts.compute_file_checksums")
 | |
|     @mock.patch("pungi.phases.image_checksum.dump_checksums")
 | |
|     def test_checksum_one_file_custom_name(self, dump_checksums, cc, exists):
 | |
|         compose = DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "media_checksums": ["sha256"],
 | |
|                 "media_checksum_one_file": True,
 | |
|                 "media_checksum_base_filename": "%(release_short)s-%(variant)s-%(version)s-%(date)s%(type_suffix)s.%(respin)s_%(label)s-%(dirname)s",  # noqa: E501
 | |
|             },
 | |
|         )
 | |
|         compose.compose_label = "Alpha-1.0"
 | |
| 
 | |
|         phase = ImageChecksumPhase(compose)
 | |
| 
 | |
|         exists.return_value = True
 | |
|         cc.return_value = {"sha256": "cafebabe"}
 | |
| 
 | |
|         phase.run()
 | |
| 
 | |
|         dump_checksums.assert_called_once_with(
 | |
|             self.topdir
 | |
|             + "/compose/Client/i386/iso/test-Client-1.0-20151203.t.0_Alpha-1.0-iso-CHECKSUM",  # noqa: E501
 | |
|             set([("image.iso", 123, "sha256", "cafebabe")]),
 | |
|         )
 | |
|         cc.assert_called_once_with(
 | |
|             self.topdir + "/compose/Client/i386/iso/image.iso", ["sha256"]
 | |
|         )
 | |
|         compose.image.add_checksum.assert_called_once_with(None, "sha256", "cafebabe")
 | |
| 
 | |
|     @mock.patch("os.path.exists")
 | |
|     @mock.patch("kobo.shortcuts.compute_file_checksums")
 | |
|     @mock.patch("pungi.phases.image_checksum.dump_checksums")
 | |
|     def test_checksum_save_individuals_custom_name(self, dump_checksums, cc, exists):
 | |
|         compose = DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "media_checksums": ["md5", "sha256"],
 | |
|                 "media_checksum_base_filename": "%(release_short)s-%(variant)s-%(version)s-%(date)s%(type_suffix)s.%(respin)s",  # noqa: E501
 | |
|             },
 | |
|         )
 | |
| 
 | |
|         phase = ImageChecksumPhase(compose)
 | |
| 
 | |
|         exists.return_value = True
 | |
|         cc.return_value = {"md5": "cafebabe", "sha256": "deadbeef"}
 | |
| 
 | |
|         phase.run()
 | |
| 
 | |
|         dump_checksums.assert_has_calls(
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/image.iso.MD5SUM",
 | |
|                     set([("image.iso", 123, "md5", "cafebabe")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/image.iso.SHA256SUM",
 | |
|                     set([("image.iso", 123, "sha256", "deadbeef")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir
 | |
|                     + "/compose/Client/i386/iso/test-Client-1.0-20151203.t.0-MD5SUM",
 | |
|                     set([("image.iso", 123, "md5", "cafebabe")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir
 | |
|                     + "/compose/Client/i386/iso/test-Client-1.0-20151203.t.0-SHA256SUM",
 | |
|                     set([("image.iso", 123, "sha256", "deadbeef")]),
 | |
|                 ),
 | |
|             ],
 | |
|             any_order=True,
 | |
|         )
 | |
|         cc.assert_called_once_with(
 | |
|             self.topdir + "/compose/Client/i386/iso/image.iso", ["md5", "sha256"]
 | |
|         )
 | |
|         compose.image.add_checksum.assert_has_calls(
 | |
|             [mock.call(None, "sha256", "deadbeef"), mock.call(None, "md5", "cafebabe")],
 | |
|             any_order=True,
 | |
|         )
 | |
| 
 | |
|     @mock.patch("os.path.exists")
 | |
|     @mock.patch("kobo.shortcuts.compute_file_checksums")
 | |
|     @mock.patch("pungi.phases.image_checksum.dump_checksums")
 | |
|     def test_checksum_save_individuals_custom_name_str_format(
 | |
|         self, dump_checksums, cc, exists
 | |
|     ):
 | |
|         compose = DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "media_checksums": ["md5", "sha256"],
 | |
|                 "media_checksum_base_filename": "{release_short}-{variant}-{version}-{date}{type_suffix}.{respin}",  # noqa: E501
 | |
|             },
 | |
|         )
 | |
| 
 | |
|         phase = ImageChecksumPhase(compose)
 | |
| 
 | |
|         exists.return_value = True
 | |
|         cc.return_value = {"md5": "cafebabe", "sha256": "deadbeef"}
 | |
| 
 | |
|         phase.run()
 | |
| 
 | |
|         dump_checksums.assert_has_calls(
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/image.iso.MD5SUM",
 | |
|                     set([("image.iso", 123, "md5", "cafebabe")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir + "/compose/Client/i386/iso/image.iso.SHA256SUM",
 | |
|                     set([("image.iso", 123, "sha256", "deadbeef")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir
 | |
|                     + "/compose/Client/i386/iso/test-Client-1.0-20151203.t.0-MD5SUM",
 | |
|                     set([("image.iso", 123, "md5", "cafebabe")]),
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir
 | |
|                     + "/compose/Client/i386/iso/test-Client-1.0-20151203.t.0-SHA256SUM",
 | |
|                     set([("image.iso", 123, "sha256", "deadbeef")]),
 | |
|                 ),
 | |
|             ],
 | |
|             any_order=True,
 | |
|         )
 | |
|         cc.assert_called_once_with(
 | |
|             self.topdir + "/compose/Client/i386/iso/image.iso", ["md5", "sha256"]
 | |
|         )
 | |
|         compose.image.add_checksum.assert_has_calls(
 | |
|             [mock.call(None, "sha256", "deadbeef"), mock.call(None, "md5", "cafebabe")],
 | |
|             any_order=True,
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestDumpChecksums(unittest.TestCase):
 | |
|     def setUp(self):
 | |
|         self.tmp_dir = tempfile.mkdtemp()
 | |
| 
 | |
|     def tearDown(self):
 | |
|         shutil.rmtree(self.tmp_dir)
 | |
| 
 | |
|     def test_dump_checksums(self):
 | |
|         dump_checksums(
 | |
|             os.path.join(self.tmp_dir, "CHECKSUM"),
 | |
|             [
 | |
|                 ("file2.iso", 456, "md5", "cafebabe"),
 | |
|                 ("file1.iso", 123, "md5", "abcdef"),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|         with open(os.path.join(self.tmp_dir, "CHECKSUM"), "r") as f:
 | |
|             data = f.read().rstrip().split("\n")
 | |
|             expected = [
 | |
|                 "# file1.iso: 123 bytes",
 | |
|                 "MD5 (file1.iso) = abcdef",
 | |
|                 "# file2.iso: 456 bytes",
 | |
|                 "MD5 (file2.iso) = cafebabe",
 | |
|             ]
 | |
|             self.assertEqual(expected, data)
 |