Skip to content

Commit cc8ba9d

Browse files
committed
Increased v1 test coverage
Minor: added type hints and fixed typo
1 parent e9a0de4 commit cc8ba9d

File tree

2 files changed

+199
-26
lines changed

2 files changed

+199
-26
lines changed

checkbox-ng/plainbox/impl/secure/providers/test_v1.py

Lines changed: 197 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,28 @@
2121
2222
Test definitions for plainbox.impl.secure.providers.v1 module
2323
"""
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
2628

2729
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
4345
from plainbox.impl.unit.file import FileUnit
44-
from plainbox.vendor import mock
4546

4647

4748
class IQNValidatorTests(TestCase):
@@ -572,11 +573,11 @@ class UnitPlugInTests(TestCase):
572573
LOAD_TIME = 42
573574

574575
def setUp(self):
575-
self.provider = mock.Mock(name="provider", spec=Provider1)
576+
self.provider = Mock(name="provider", spec=Provider1)
576577
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"),
580581
)
581582
self.provider.namespace = "com.canonical.plainbox"
582583
self.plugin = UnitPlugIn(
@@ -774,6 +775,7 @@ def test_CHECKBOX_SHARE__without_base_dir(self):
774775
self.provider._base_dir = None
775776
self.assertEqual(self.provider.CHECKBOX_SHARE, None)
776777

778+
@mock.patch("os.getenv", new=Mock(return_value=None))
777779
def test_extra_PYTHONPATH(self):
778780
"""
779781
Verify that Provider1.extra_PYTHONPATH is always None
@@ -913,19 +915,190 @@ def test_init_bindtextdomain__not_called(self, mock_gettext):
913915
)
914916
self.assertEqual(mock_gettext.bindtextdomain.call_args_list, [])
915917

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+
9161089

9171090
@mock.patch("plainbox.impl.secure.providers.v1.logger")
9181091
class ProviderContentLoaderTests(TestCase):
9191092
def test__warn_ignored_file_warned(self, logger_mock):
920-
self_mock = mock.MagicMock()
1093+
self_mock = MagicMock()
9211094
self_mock.provider.units_dir = "/some/path"
9221095
ProviderContentLoader._warn_ignored_file(
9231096
self_mock, "/some/path/script.py"
9241097
)
9251098
self.assertTrue(logger_mock.warning.called)
9261099

9271100
def test__warn_ignored_file_ignored(self, logger_mock):
928-
self_mock = mock.MagicMock()
1101+
self_mock = MagicMock()
9291102
self_mock.provider.units_dir = "/some/path"
9301103
ProviderContentLoader._warn_ignored_file(
9311104
self_mock, "/some/path/__pycache__/script.pyc"

checkbox-ng/plainbox/impl/secure/providers/v1.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ def paths_to_custom_frontend_path(self, paths) -> list:
10981098
return [str(path) for path in frontend_paths if path.exists()]
10991099

11001100
@property
1101-
def extra_PYTHONPATH(self):
1101+
def extra_PYTHONPATH(self) -> list:
11021102
"""
11031103
additional entry for PYTHONPATH, if needed.
11041104
@@ -1801,7 +1801,7 @@ def __repr__(self):
18011801

18021802
def get_secure_custom_frontend_PROVIDERPATH_list():
18031803
"""
1804-
Additional PROVIDERPATH for cu interfaces
1804+
Additional PROVIDERPATH for custom-frontend interface
18051805
18061806
Custom frontend that adopted the custom-frontend interface provide their
18071807
root as content. From this root the installed providers are always at

0 commit comments

Comments
 (0)