]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
test(crdb): add crdb_skip marker
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 7 Jun 2022 20:33:33 +0000 (22:33 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 12 Jul 2022 11:58:34 +0000 (12:58 +0100)
tests/fix_crdb.py
tests/fix_db.py

index 3209bd4e6f3b3c3845a54a4f63f2ef4ece3e3292..14df5f60b06ed1139e39402b4df084dfe320e11f 100644 (file)
@@ -13,33 +13,35 @@ def pytest_configure(config):
         "crdb(version_expr, reason=detail): run/skip the test with matching CockroachDB"
         " (e.g. '>= 21.2.10', '< 22.1', 'skip < 22')",
     )
+    config.addinivalue_line(
+        "markers",
+        "crdb_skip(reason): skip the test for known CockroachDB reasons",
+    )
 
 
 def check_crdb_version(got, mark):
-    """
-    Verify if the CockroachDB version is a version accepted.
-
-    This function is called on the tests marked with something like::
-
-        @pytest.mark.crdb("only")           # run on CRDB only, any version
-        @pytest.mark.crdb                   # same as above
-        @pytest.mark.crdb("only >= 21.1")   # run on CRDB only >= 21.1 (not on PG)
-        @pytest.mark.crdb(">= 21.1")        # same as above
-        @pytest.mark.crdb("skip")           # don't run on CRDB, any version
-        @pytest.mark.crdb("skip < 22")      # don't run on CRDB < 22 (run on PG)
-
-    and skips the test if the server version doesn't match what expected.
-    """
-    assert len(mark.args) <= 1
-    assert not (set(mark.kwargs) - {"reason"})
-    pred = VersionCheck.parse(mark.args[0] if mark.args else "only")
+    if mark.name == "crdb":
+        assert len(mark.args) <= 1
+        assert not (set(mark.kwargs) - {"reason"})
+        spec = mark.args[0] if mark.args else "only"
+        reason = mark.kwargs.get("reason")
+    elif mark.name == "crdb_skip":
+        assert len(mark.args) == 1
+        assert not mark.kwargs
+        reason = mark.args[0]
+        assert reason in _crdb_reasons, reason
+        spec = _crdb_reason_version.get(reason, "skip")
+    else:
+        assert False, mark.name
+
+    pred = VersionCheck.parse(spec)
     pred.whose = "CockroachDB"
 
     msg = pred.get_skip_message(got)
     if not msg:
         return None
 
-    reason = crdb_skip_message(mark.kwargs.get("reason"))
+    reason = crdb_skip_message(reason)
     if reason:
         msg = f"{msg}: {reason}"
 
@@ -55,7 +57,7 @@ def crdb_skip_message(reason: Optional[str]) -> str:
     msg = ""
     if reason:
         msg = reason
-        if reason in _crdb_reasons:
+        if _crdb_reasons.get(reason):
             url = (
                 "https://github.com/cockroachdb/cockroach/"
                 f"issues/{_crdb_reasons[reason]}"
@@ -116,3 +118,7 @@ _crdb_reasons = {
     "server-side cursor": 41412,
     "stored procedure": 1751,
 }
+
+_crdb_reason_version = {
+    "cancel": "skip < 22",
+}
index 49bd688d4fd399034346afcd3539838ee6f5e880..ded17f7106a2444df00b510abb122d7a04a1564c 100644 (file)
@@ -280,7 +280,7 @@ def check_connection_version(node):
             if msg:
                 pytest.skip(msg)
 
-        elif mark.name == "crdb":
+        elif mark.name in ("crdb", "crdb_skip"):
             from .fix_crdb import check_crdb_version
 
             msg = check_crdb_version(crdb_version, mark)