14 """The classes and predicates to assist validate test config for test cases."""
15 from dataclasses
import dataclass
19 from typing
import Callable, Optional
22 from packaging
import version
as pkg_version
24 from framework
import xds_flags
25 from framework
import xds_k8s_flags
27 logger = logging.getLogger(__name__)
39 return str(self.name).lower()
44 return cls[lang.upper()]
51 """Describes the config for the test suite."""
54 version: Optional[str]
57 """Returns a bool for whether the version is >= another one.
59 A version is greater than or equal to another version means its version
60 number is greater than or equal to another version's number. Version
61 "master" is always considered latest.
62 E.g., master >= v1.41.x >= v1.40.x >= v1.9.x.
64 Unspecified version is treated as 'master', but isn't explicitly set.
68 if another ==
'master':
73 return (f
"TestConfig(client_lang='{self.client_lang}', "
74 f
"server_lang='{self.server_lang}', version={self.version!r})")
80 return pkg_version.Version(s)
84 return Lang.from_string(
85 re.search(
r'/(\w+)-(client|server):', image_name).
group(1))
89 """Evaluates the test config check against Abseil flags."""
95 client_lang=
_get_lang(xds_k8s_flags.CLIENT_IMAGE.value),
96 server_lang=
_get_lang(xds_k8s_flags.SERVER_IMAGE.value),
97 version=xds_flags.TESTING_VERSION.value)
98 if not check(test_config):
99 logger.info(
'Skipping %s', test_config)
100 raise unittest.SkipTest(f
'Unsupported test config: {test_config}')
102 logger.info(
'Detected language and version: %s', test_config)