|
17 | 17 | import os |
18 | 18 | import sys |
19 | 19 | import unittest |
| 20 | +from unittest.mock import patch |
| 21 | + |
20 | 22 | # Conditional import for StringIO |
21 | 23 | try: |
22 | 24 | from StringIO import StringIO # Python 2 |
@@ -643,6 +645,12 @@ def test_package_manager_dnf5(self): |
643 | 645 | size = package_manager.get_package_size(out) |
644 | 646 | self.assertEqual(size, "135.09k") |
645 | 647 |
|
| 648 | + # test for get_package_size when size is not available |
| 649 | + cmd = package_manager.single_package_upgrade_cmd + "systemd" |
| 650 | + code, out = self.runtime.env_layer.run_command_output(cmd, False, False) |
| 651 | + size = package_manager.get_package_size(out) |
| 652 | + self.assertEqual(size, Constants.UNKNOWN_PACKAGE_SIZE) |
| 653 | + |
646 | 654 | # Test: get_all_available_versions_of_package (ONLY python3 since mock exists) |
647 | 655 | versions = package_manager.get_all_available_versions_of_package("python3") |
648 | 656 | self.assertTrue(versions is not None) |
@@ -801,9 +809,7 @@ def test_update_image_default_patch_mode_dnf5(self): |
801 | 809 |
|
802 | 810 | override_read = self.runtime.env_layer.file_system.read_with_retry(override_file) |
803 | 811 | self.assertTrue(override_read is not None) |
804 | | - self.assertTrue("--no-installupdates" in override_read) |
805 | 812 | self.assertTrue("--downloadupdates" in override_read) |
806 | | - self.assertTrue("--no-downloadupdates" not in override_read) |
807 | 813 | self.assertTrue("--installupdates" not in override_read) |
808 | 814 |
|
809 | 815 | # ----------------------------- |
@@ -837,9 +843,7 @@ def test_update_image_default_patch_mode_dnf5(self): |
837 | 843 |
|
838 | 844 | override_read = self.runtime.env_layer.file_system.read_with_retry(override_file) |
839 | 845 | self.assertTrue(override_read is not None) |
840 | | - self.assertTrue("--no-installupdates" in override_read) |
841 | 846 | self.assertTrue("--downloadupdates" in override_read) |
842 | | - self.assertTrue("--no-downloadupdates" not in override_read) |
843 | 847 | self.assertTrue("--installupdates" not in override_read) |
844 | 848 |
|
845 | 849 |
|
@@ -883,6 +887,77 @@ def test_install_security_updates_azgps_coordinated(self): |
883 | 887 | self.assertTrue(code == 0) |
884 | 888 | self.assertTrue("Complete!", out) |
885 | 889 |
|
| 890 | + def test_backup_image_default_patch_configuration_with_downloadupdates_only_execstart(self): |
| 891 | + """ |
| 892 | + DNF5: |
| 893 | + Validates backup creation when current ExecStart contains only --downloadupdates |
| 894 | + and no explicit apply flag. |
| 895 | +
|
| 896 | + Expected backup: |
| 897 | + - installation_state = True |
| 898 | + - enable_on_reboot = True |
| 899 | + - download_updates = "yes" |
| 900 | + - apply_updates = "" |
| 901 | + """ |
| 902 | + self.runtime.set_legacy_test_type('AnotherHappyPath') |
| 903 | + package_manager = self.container.get('package_manager') |
| 904 | + self.assertIsNotNone(package_manager) |
| 905 | + |
| 906 | + # Arrange |
| 907 | + package_manager._Dnf5PackageManager__init_auto_update_for_dnf5_automatic() |
| 908 | + |
| 909 | + # Make sure no stale backup exists from previous runs |
| 910 | + if os.path.exists(package_manager.image_default_patch_configuration_backup_path): |
| 911 | + os.remove(package_manager.image_default_patch_configuration_backup_path) |
| 912 | + |
| 913 | + # Make sure service override dir exists |
| 914 | + override_dir = os.path.dirname(package_manager.dnf5_automatic_override_file) |
| 915 | + os.makedirs(override_dir, exist_ok=True) |
| 916 | + |
| 917 | + # Write override with ONLY --downloadupdates |
| 918 | + override_text = "[Service]\nExecStart=\nExecStart=/usr/bin/dnf5 automatic --timer --downloadupdates\n" |
| 919 | + self.runtime.env_layer.file_system.write_with_retry( |
| 920 | + package_manager.dnf5_automatic_override_file, |
| 921 | + override_text, |
| 922 | + mode='w+' |
| 923 | + ) |
| 924 | + |
| 925 | + # Act |
| 926 | + package_manager.backup_image_default_patch_configuration_if_not_exists() |
| 927 | + |
| 928 | + # Assert |
| 929 | + self.assertTrue(os.path.exists(package_manager.image_default_patch_configuration_backup_path)) |
| 930 | + |
| 931 | + backup_text = self.runtime.env_layer.file_system.read_with_retry(package_manager.image_default_patch_configuration_backup_path) |
| 932 | + backup_json = json.loads(backup_text) |
| 933 | + |
| 934 | + self.assertIn(package_manager.current_auto_os_update_service, backup_json) |
| 935 | + |
| 936 | + service_backup = backup_json[package_manager.current_auto_os_update_service] |
| 937 | + |
| 938 | + self.assertEqual("yes", service_backup[package_manager.download_updates_identifier_text]) |
| 939 | + self.assertEqual("", service_backup[package_manager.apply_updates_identifier_text]) |
| 940 | + self.assertFalse(service_backup[package_manager.enable_on_reboot_identifier_text]) |
| 941 | + self.assertTrue(service_backup[package_manager.installation_state_identifier_text]) |
| 942 | + |
| 943 | + |
| 944 | + def test_set_dnf5_automatic_execstart_flags_exception_handling(self): |
| 945 | + """Test exception handling when override file write fails""" |
| 946 | + self.runtime.set_legacy_test_type('HappyPath') |
| 947 | + package_manager = self.container.get('package_manager') |
| 948 | + |
| 949 | + # Mock file_system.write_with_retry to raise exception |
| 950 | + with patch.object(package_manager.env_layer.file_system, 'write_with_retry') as mock_write: |
| 951 | + mock_write.side_effect = IOError("Permission denied") |
| 952 | + |
| 953 | + # Should raise exception caught by outer try-except |
| 954 | + self.assertRaises(Exception, package_manager._Dnf5PackageManager__set_dnf5_automatic_execstart_flags, |
| 955 | + download_updates=False, apply_updates=False) |
| 956 | + |
| 957 | + def test_get_package_install_expected_avg_time_in_seconds(self): |
| 958 | + self.runtime.set_legacy_test_type('HappyPath') |
| 959 | + package_manager = self.container.get('package_manager') |
| 960 | + self.assertTrue(package_manager.get_package_install_expected_avg_time_in_seconds(), 90) |
886 | 961 |
|
887 | 962 | if __name__ == '__main__': |
888 | 963 | unittest.main() |
|
0 commit comments