|
21 | 21 |
|
22 | 22 | Test definitions for plainbox.impl.secure.providers.v1 module |
23 | 23 | """ |
24 | | - |
25 | | -from unittest import TestCase |
| 24 | +import sys |
| 25 | +from unittest import TestCase, mock |
| 26 | +from unittest.mock import Mock, MagicMock |
| 27 | +from pathlib import Path |
26 | 28 |
|
27 | 29 | from plainbox.impl.job import JobDefinition |
28 | | -from plainbox.impl.secure.config import Unset |
29 | | -from plainbox.impl.secure.config import ValidationError |
30 | | -from plainbox.impl.secure.plugins import PlugIn |
31 | | -from plainbox.impl.secure.plugins import PlugInError |
32 | | -from plainbox.impl.secure.providers.v1 import AbsolutePathValidator |
33 | | -from plainbox.impl.secure.providers.v1 import ExistingDirectoryValidator |
34 | | -from plainbox.impl.secure.providers.v1 import IQNValidator |
35 | | -from plainbox.impl.secure.providers.v1 import Provider1 |
36 | | -from plainbox.impl.secure.providers.v1 import Provider1Definition |
37 | | -from plainbox.impl.secure.providers.v1 import Provider1PlugIn |
38 | | -from plainbox.impl.secure.providers.v1 import ProviderContentLoader |
39 | | -from plainbox.impl.secure.providers.v1 import UnitPlugIn |
40 | | -from plainbox.impl.secure.providers.v1 import VersionValidator |
41 | | -from plainbox.impl.secure.rfc822 import FileTextSource |
42 | | -from plainbox.impl.secure.rfc822 import Origin |
| 30 | +from plainbox.impl.secure.config import Unset, ValidationError |
| 31 | +from plainbox.impl.secure.plugins import PlugIn, PlugInError |
| 32 | +from plainbox.impl.secure.providers.v1 import ( |
| 33 | + AbsolutePathValidator, |
| 34 | + ExistingDirectoryValidator, |
| 35 | + IQNValidator, |
| 36 | + Provider1, |
| 37 | + Provider1Definition, |
| 38 | + Provider1PlugIn, |
| 39 | + ProviderContentLoader, |
| 40 | + UnitPlugIn, |
| 41 | + VersionValidator, |
| 42 | + get_secure_custom_frontend_PROVIDERPATH_list, |
| 43 | +) |
| 44 | +from plainbox.impl.secure.rfc822 import FileTextSource, Origin |
43 | 45 | from plainbox.impl.unit.file import FileUnit |
44 | | -from plainbox.vendor import mock |
45 | 46 |
|
46 | 47 |
|
47 | 48 | class IQNValidatorTests(TestCase): |
@@ -572,11 +573,11 @@ class UnitPlugInTests(TestCase): |
572 | 573 | LOAD_TIME = 42 |
573 | 574 |
|
574 | 575 | def setUp(self): |
575 | | - self.provider = mock.Mock(name="provider", spec=Provider1) |
| 576 | + self.provider = Mock(name="provider", spec=Provider1) |
576 | 577 | self.provider.classify.return_value = ( |
577 | | - mock.Mock("role"), |
578 | | - mock.Mock("base"), |
579 | | - mock.Mock("plugin_cls"), |
| 578 | + Mock("role"), |
| 579 | + Mock("base"), |
| 580 | + Mock("plugin_cls"), |
580 | 581 | ) |
581 | 582 | self.provider.namespace = "com.canonical.plainbox" |
582 | 583 | self.plugin = UnitPlugIn( |
@@ -774,6 +775,7 @@ def test_CHECKBOX_SHARE__without_base_dir(self): |
774 | 775 | self.provider._base_dir = None |
775 | 776 | self.assertEqual(self.provider.CHECKBOX_SHARE, None) |
776 | 777 |
|
| 778 | + @mock.patch("os.getenv", new=Mock(return_value=None)) |
777 | 779 | def test_extra_PYTHONPATH(self): |
778 | 780 | """ |
779 | 781 | Verify that Provider1.extra_PYTHONPATH is always None |
@@ -913,19 +915,190 @@ def test_init_bindtextdomain__not_called(self, mock_gettext): |
913 | 915 | ) |
914 | 916 | self.assertEqual(mock_gettext.bindtextdomain.call_args_list, []) |
915 | 917 |
|
| 918 | + @mock.patch("os.getenv", new=Mock(return_value=None)) |
| 919 | + def test_custom_frontend_provider_non_snap(self): |
| 920 | + self.assertFalse(self.provider.custom_frontend_provider) |
| 921 | + |
| 922 | + @mock.patch("os.getenv", new=Mock(return_value="/snap/checkbox24/x1")) |
| 923 | + def test_custom_frontend_provider_non_custom_frontend(self): |
| 924 | + provider = Provider1( |
| 925 | + self.NAME, |
| 926 | + self.NAMESPACE, |
| 927 | + self.VERSION, |
| 928 | + self.DESCRIPTION, |
| 929 | + self.SECURE, |
| 930 | + self.GETTEXT_DOMAIN, |
| 931 | + self.UNITS_DIR, |
| 932 | + self.JOBS_DIR, |
| 933 | + self.DATA_DIR, |
| 934 | + self.BIN_DIR, |
| 935 | + locale_dir=None, |
| 936 | + base_dir="/snap/checkbox24/current/providers/some-provider", |
| 937 | + ) |
| 938 | + self.assertFalse(provider.custom_frontend_provider) |
| 939 | + |
| 940 | + @mock.patch("os.getenv", new=Mock(return_value="/snap/checkbox24/x1")) |
| 941 | + def test_custom_frontend_provider_ok(self): |
| 942 | + provider = Provider1( |
| 943 | + self.NAME, |
| 944 | + self.NAMESPACE, |
| 945 | + self.VERSION, |
| 946 | + self.DESCRIPTION, |
| 947 | + self.SECURE, |
| 948 | + self.GETTEXT_DOMAIN, |
| 949 | + self.UNITS_DIR, |
| 950 | + self.JOBS_DIR, |
| 951 | + self.DATA_DIR, |
| 952 | + self.BIN_DIR, |
| 953 | + locale_dir=None, |
| 954 | + base_dir="/snap/checkbox24/x1/custom_frontends/custom_frontend2", |
| 955 | + ) |
| 956 | + self.assertTrue(provider.custom_frontend_provider) |
| 957 | + |
| 958 | + @mock.patch( |
| 959 | + "plainbox.impl.secure.providers.v1.Path", |
| 960 | + new=MagicMock(spec=Path, exists=Mock(return_value=True)), |
| 961 | + ) |
| 962 | + @mock.patch("os.getenv", new=Mock(return_value="/snap/checkbox24/x1")) |
| 963 | + def test_extra_PYTHONPATH_custom_frontend( |
| 964 | + self, |
| 965 | + ): |
| 966 | + provider = Provider1( |
| 967 | + self.NAME, |
| 968 | + self.NAMESPACE, |
| 969 | + self.VERSION, |
| 970 | + self.DESCRIPTION, |
| 971 | + self.SECURE, |
| 972 | + self.GETTEXT_DOMAIN, |
| 973 | + self.UNITS_DIR, |
| 974 | + self.JOBS_DIR, |
| 975 | + self.DATA_DIR, |
| 976 | + self.BIN_DIR, |
| 977 | + locale_dir=None, |
| 978 | + base_dir="/snap/checkbox24/x1/custom_frontends/custom_frontend2", |
| 979 | + ) |
| 980 | + self.assertGreater(len(provider.extra_PYTHONPATH), 0) |
| 981 | + |
| 982 | + @mock.patch( |
| 983 | + "plainbox.impl.secure.providers.v1.Path", |
| 984 | + new=MagicMock(spec=Path, exists=Mock(return_value=True)), |
| 985 | + ) |
| 986 | + @mock.patch("os.getenv", new=Mock(return_value="/snap/checkbox24/x1")) |
| 987 | + def test_extra_PATH_custom_frontend( |
| 988 | + self, |
| 989 | + ): |
| 990 | + provider = Provider1( |
| 991 | + self.NAME, |
| 992 | + self.NAMESPACE, |
| 993 | + self.VERSION, |
| 994 | + self.DESCRIPTION, |
| 995 | + self.SECURE, |
| 996 | + self.GETTEXT_DOMAIN, |
| 997 | + self.UNITS_DIR, |
| 998 | + self.JOBS_DIR, |
| 999 | + self.DATA_DIR, |
| 1000 | + self.BIN_DIR, |
| 1001 | + locale_dir=None, |
| 1002 | + base_dir="/snap/checkbox24/x1/custom_frontends/custom_frontend2", |
| 1003 | + ) |
| 1004 | + self.assertGreater(len(provider.extra_PATH), 0) |
| 1005 | + |
| 1006 | + @mock.patch("os.getenv", new=Mock(return_value=None)) |
| 1007 | + def test_extra_PATH_none(self): |
| 1008 | + self.assertFalse(self.provider.extra_PATH) |
| 1009 | + |
| 1010 | + @mock.patch( |
| 1011 | + "plainbox.impl.secure.providers.v1.Path", |
| 1012 | + new=MagicMock(spec=Path, exists=Mock(return_value=True)), |
| 1013 | + ) |
| 1014 | + @mock.patch("os.getenv", new=Mock(return_value="/snap/checkbox24/x1")) |
| 1015 | + def test_extra_LD_LIBRARY_PATH_custom_frontend( |
| 1016 | + self, |
| 1017 | + ): |
| 1018 | + provider = Provider1( |
| 1019 | + self.NAME, |
| 1020 | + self.NAMESPACE, |
| 1021 | + self.VERSION, |
| 1022 | + self.DESCRIPTION, |
| 1023 | + self.SECURE, |
| 1024 | + self.GETTEXT_DOMAIN, |
| 1025 | + self.UNITS_DIR, |
| 1026 | + self.JOBS_DIR, |
| 1027 | + self.DATA_DIR, |
| 1028 | + self.BIN_DIR, |
| 1029 | + locale_dir=None, |
| 1030 | + base_dir="/snap/checkbox24/x1/custom_frontends/custom_frontend2", |
| 1031 | + ) |
| 1032 | + self.assertGreater(len(provider.extra_LD_LIBRARY_PATH), 0) |
| 1033 | + |
| 1034 | + @mock.patch("os.getenv", new=Mock(return_value=None)) |
| 1035 | + def test_extra_LD_LIBRARY_PATH_none(self): |
| 1036 | + self.assertFalse(self.provider.extra_LD_LIBRARY_PATH) |
| 1037 | + |
| 1038 | + @mock.patch("os.getenv", new=Mock(return_value=None)) |
| 1039 | + def test_custom_frontend_root_value_error(self): |
| 1040 | + with self.assertRaises(ValueError): |
| 1041 | + self.provider.custom_frontend_root() |
| 1042 | + |
| 1043 | + |
| 1044 | +class CustomFrontendPROVIDERPATHTest(TestCase): |
| 1045 | + @mock.patch("os.getenv", new=Mock(return_value=None)) |
| 1046 | + def test_no_path_not_snap(self): |
| 1047 | + self.assertEqual(get_secure_custom_frontend_PROVIDERPATH_list(), []) |
| 1048 | + |
| 1049 | + @mock.patch( |
| 1050 | + "plainbox.impl.secure.providers.v1.Path", |
| 1051 | + new=MagicMock(spec=Path, exists=Mock(return_value=False)), |
| 1052 | + ) |
| 1053 | + @mock.patch( |
| 1054 | + "os.getenv", new=Mock(return_value="/snap/checkbox24/x1/current") |
| 1055 | + ) |
| 1056 | + def test_no_path_no_custom_frontend(self): |
| 1057 | + self.assertEqual(get_secure_custom_frontend_PROVIDERPATH_list(), []) |
| 1058 | + |
| 1059 | + @mock.patch("plainbox.impl.secure.providers.v1.Path") |
| 1060 | + @mock.patch( |
| 1061 | + "os.getenv", new=Mock(return_value="/snap/checkbox24/x1/current") |
| 1062 | + ) |
| 1063 | + def test_path_custom_frontend(self, mock_Path): |
| 1064 | + custom_frontends = mock_Path() / "custom_frontends" |
| 1065 | + custom_frontends.exists.return_value = True |
| 1066 | + |
| 1067 | + # valid, has a custom_frontend/providers |
| 1068 | + valid_custom_frontend = MagicMock() |
| 1069 | + valid_custom_frontend_providers = valid_custom_frontend / "providers" |
| 1070 | + valid_custom_frontend_providers.exists = Mock(return_value=True) |
| 1071 | + # frontend contains 2 providers |
| 1072 | + valid_custom_frontend_providers.iterdir.return_value = [ |
| 1073 | + Path("a"), |
| 1074 | + Path("b"), |
| 1075 | + ] |
| 1076 | + |
| 1077 | + # invalid, doesn't have custom_frontend/providers |
| 1078 | + invalid_custom_frontend = MagicMock() |
| 1079 | + (invalid_custom_frontend / "providers").exists.return_value = False |
| 1080 | + |
| 1081 | + custom_frontends.iterdir.return_value = [ |
| 1082 | + valid_custom_frontend, |
| 1083 | + invalid_custom_frontend, |
| 1084 | + ] |
| 1085 | + self.assertEqual( |
| 1086 | + get_secure_custom_frontend_PROVIDERPATH_list(), ["a", "b"] |
| 1087 | + ) |
| 1088 | + |
916 | 1089 |
|
917 | 1090 | @mock.patch("plainbox.impl.secure.providers.v1.logger") |
918 | 1091 | class ProviderContentLoaderTests(TestCase): |
919 | 1092 | def test__warn_ignored_file_warned(self, logger_mock): |
920 | | - self_mock = mock.MagicMock() |
| 1093 | + self_mock = MagicMock() |
921 | 1094 | self_mock.provider.units_dir = "/some/path" |
922 | 1095 | ProviderContentLoader._warn_ignored_file( |
923 | 1096 | self_mock, "/some/path/script.py" |
924 | 1097 | ) |
925 | 1098 | self.assertTrue(logger_mock.warning.called) |
926 | 1099 |
|
927 | 1100 | def test__warn_ignored_file_ignored(self, logger_mock): |
928 | | - self_mock = mock.MagicMock() |
| 1101 | + self_mock = MagicMock() |
929 | 1102 | self_mock.provider.units_dir = "/some/path" |
930 | 1103 | ProviderContentLoader._warn_ignored_file( |
931 | 1104 | self_mock, "/some/path/__pycache__/script.pyc" |
|
0 commit comments