1313# limitations under the License.
1414
1515import os
16+ from distutils .log import fatal
17+
1618from cassandra .cluster import Cluster
1719
1820from tests import connection_class , EVENT_LOOP_MANAGER
@@ -299,6 +301,8 @@ def get_unsupported_lower_protocol():
299301 This is used to determine the lowest protocol version that is NOT
300302 supported by the version of C* running
301303 """
304+ if SCYLLA_VERSION is not None :
305+ return 2
302306 if CASSANDRA_VERSION >= Version ('3.0' ):
303307 return 2
304308 else :
@@ -310,7 +314,8 @@ def get_unsupported_upper_protocol():
310314 This is used to determine the highest protocol version that is NOT
311315 supported by the version of C* running
312316 """
313-
317+ if SCYLLA_VERSION is not None :
318+ return 5
314319 if CASSANDRA_VERSION >= Version ('4.0-a' ):
315320 if DSE_VERSION :
316321 return None
@@ -389,6 +394,43 @@ def _id_and_mark(f):
389394requires_custom_payload = pytest .mark .skipif (SCYLLA_VERSION is not None or PROTOCOL_VERSION < 4 ,
390395 reason = 'Scylla does not support custom payloads. Cassandra requires native protocol v4.0+' )
391396xfail_scylla = lambda reason , * args , ** kwargs : pytest .mark .xfail (SCYLLA_VERSION is not None , reason = reason , * args , ** kwargs )
397+
398+ def is_scylla_enterprise (version : Version ) -> bool :
399+ return version > Version ('2000.1.1' )
400+
401+ def xfail_scylla_version_lt (reason , oss_scylla_version , ent_scylla_version , * args , ** kwargs ):
402+ """
403+ It is used to mark tests that are going to fail on certain scylla versions.
404+
405+ :param reason: message to fail test with
406+ :param oss_scylla_version: str, oss version from which test supposed to succeed
407+ :param ent_scylla_version: str|list<str>|tuple<str>, enterprise versions from which test supposed to succeed.
408+ Should contain at least first major: `x.1.1` or `x.1` or `x`.
409+ If current version is lower than `first major` it expects it to fail
410+ For rest versions it looks for a version with same `major` and `minor` if records exists and `micro` is less,
411+ it expects it to fail, otherwise expects it to succeed.
412+ """
413+ if not reason .startswith ("scylladb/scylladb#" ):
414+ raise ValueError ('reason should start with scylladb/scylladb#<issue-id> to reference issue in scylla repo' )
415+
416+ if not isinstance (ent_scylla_version , str ):
417+ raise ValueError ('ent_scylla_version should be a str' )
418+
419+ if not ent_scylla_version .endswith ("1.1" ):
420+ raise ValueError ('ent_scylla_version should end with "1.1"' )
421+
422+ if SCYLLA_VERSION is None :
423+ return pytest .mark .skipif (False , reason = "It is just a NoOP Decor, should not skip anything" )
424+
425+ current_version = Version (get_scylla_version (SCYLLA_VERSION ))
426+
427+ if is_scylla_enterprise (current_version ):
428+ return pytest .mark .xfail (current_version < Version (ent_scylla_version ),
429+ reason = reason , * args , ** kwargs )
430+
431+ return pytest .mark .xfail (current_version < Version (oss_scylla_version ), reason = reason , * args , ** kwargs )
432+
433+
392434incorrect_test = lambda reason = 'This test seems to be incorrect and should be fixed' , * args , ** kwargs : pytest .mark .xfail (reason = reason , * args , ** kwargs )
393435
394436pypy = unittest .skipUnless (platform .python_implementation () == "PyPy" , "Test is skipped unless it's on PyPy" )
0 commit comments