From 1918558b2333f34285cbff33895a582bb1a3562b Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Fri, 3 Oct 2025 10:24:38 +0300 Subject: [PATCH 1/5] Updating cicd tests to run against client tests image 8.2.2-pre --- .github/workflows/integration.yaml | 2 +- tests/test_asyncio/test_commands.py | 23 +++++++++++++ tests/test_asyncio/test_vsets.py | 4 +-- tests/test_commands.py | 51 +++++++++++++++++++++++++++++ tests/test_vsets.py | 4 +-- 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index cca7fbb793..ca8504ac62 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -74,7 +74,7 @@ jobs: max-parallel: 15 fail-fast: false matrix: - redis-version: ['8.2.1-pre', '${{ needs.redis_version.outputs.CURRENT }}', '8.0.2' ,'7.4.4', '7.2.9'] + redis-version: ['8.2.2-pre', '${{ needs.redis_version.outputs.CURRENT }}', '8.0.2' ,'7.4.4', '7.2.9'] python-version: ['3.9', '3.13'] parser-backend: ['plain'] event-loop: ['asyncio'] diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index 9db7d200e6..a15b4180c7 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -3158,6 +3158,7 @@ async def test_xgroup_destroy(self, r: redis.Redis): assert await r.xgroup_destroy(stream, group) @skip_if_server_version_lt("7.0.0") + @skip_if_server_version_gte("8.2.1") async def test_xgroup_setid(self, r: redis.Redis): stream = "stream" group = "group" @@ -3178,6 +3179,28 @@ async def test_xgroup_setid(self, r: redis.Redis): ] assert await r.xinfo_groups(stream) == expected + @skip_if_server_version_lt("8.2.1") + async def test_xgroup_setid_fixed_max_entries_read(self, r): + stream = "stream" + group = "group" + message_id = await r.xadd(stream, {"foo": "bar"}) + await r.xadd(stream, {"foo1": "bar1"}) + + await r.xgroup_create(stream, group, 0) + # advance the last_delivered_id to the message_id + await r.xgroup_setid(stream, group, message_id, entries_read=2) + expected = [ + { + "name": group.encode(), + "consumers": 0, + "pending": 0, + "last-delivered-id": message_id, + "entries-read": 2, + "lag": 0, + } + ] + assert await r.xinfo_groups(stream) == expected + @skip_if_server_version_lt("7.2.0") async def test_xinfo_consumers(self, r: redis.Redis): stream = "stream" diff --git a/tests/test_asyncio/test_vsets.py b/tests/test_asyncio/test_vsets.py index e2b2bc1d4f..896d98b192 100644 --- a/tests/test_asyncio/test_vsets.py +++ b/tests/test_asyncio/test_vsets.py @@ -502,8 +502,8 @@ async def test_vsim_epsilon(d_client): await d_client.vset().vadd("myset", [2, 1, 1], "a") await d_client.vset().vadd("myset", [2, 0, 1], "b") await d_client.vset().vadd("myset", [2, 0, 0], "c") - await d_client.vset().vadd("myset", [2, 0, -1], "d") - await d_client.vset().vadd("myset", [2, -1, -1], "e") + await d_client.vset().vadd("myset", [2, 0, 2], "d") + await d_client.vset().vadd("myset", [-2, -1, -1], "e") res1 = await d_client.vset().vsim("myset", [2, 1, 1]) assert 5 == len(res1) diff --git a/tests/test_commands.py b/tests/test_commands.py index 42530a47d2..55f667a4eb 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4607,6 +4607,7 @@ def test_xgroup_create_mkstream(self, r): assert r.xinfo_groups(stream) == expected @skip_if_server_version_lt("7.0.0") + @skip_if_server_version_gte("8.2.1") def test_xgroup_create_entriesread(self, r: redis.Redis): stream = "stream" group = "group" @@ -4628,6 +4629,33 @@ def test_xgroup_create_entriesread(self, r: redis.Redis): ] assert r.xinfo_groups(stream) == expected + @skip_if_server_version_lt("8.2.1") + def test_xgroup_create_entriesread_fixed_max_entries_read(self, r: redis.Redis): + stream = "stream" + group = "group" + r.xadd(stream, {"foo": "bar"}) + r.xadd(stream, {"foo1": "bar1"}) + r.xadd(stream, {"foo2": "bar2"}) + + # no group is setup yet, no info to obtain + assert r.xinfo_groups(stream) == [] + + assert r.xgroup_create(stream, group, 0, entries_read=7) + # validate the entries-read is max the number of entries + # in the stream and lag shows the entries between + # last_delivered_id and entries_added + expected = [ + { + "name": group.encode(), + "consumers": 0, + "pending": 0, + "last-delivered-id": b"0-0", + "entries-read": 3, + "lag": 3, + } + ] + assert r.xinfo_groups(stream) == expected + @skip_if_server_version_lt("5.0.0") def test_xgroup_delconsumer(self, r): stream = "stream" @@ -4675,6 +4703,7 @@ def test_xgroup_destroy(self, r): assert r.xgroup_destroy(stream, group) @skip_if_server_version_lt("7.0.0") + @skip_if_server_version_gte("8.2.1") def test_xgroup_setid(self, r): stream = "stream" group = "group" @@ -4695,6 +4724,28 @@ def test_xgroup_setid(self, r): ] assert r.xinfo_groups(stream) == expected + @skip_if_server_version_lt("8.2.1") + def test_xgroup_setid_fixed_max_entries_read(self, r): + stream = "stream" + group = "group" + message_id = r.xadd(stream, {"foo": "bar"}) + r.xadd(stream, {"foo1": "bar1"}) + + r.xgroup_create(stream, group, 0) + # advance the last_delivered_id to the message_id + r.xgroup_setid(stream, group, message_id, entries_read=2) + expected = [ + { + "name": group.encode(), + "consumers": 0, + "pending": 0, + "last-delivered-id": message_id, + "entries-read": 2, + "lag": 0, + } + ] + assert r.xinfo_groups(stream) == expected + @skip_if_server_version_lt("7.2.0") def test_xinfo_consumers(self, r): stream = "stream" diff --git a/tests/test_vsets.py b/tests/test_vsets.py index cba7115bf1..36295201e7 100644 --- a/tests/test_vsets.py +++ b/tests/test_vsets.py @@ -504,8 +504,8 @@ def test_vsim_epsilon(d_client): d_client.vset().vadd("myset", [2, 1, 1], "a") d_client.vset().vadd("myset", [2, 0, 1], "b") d_client.vset().vadd("myset", [2, 0, 0], "c") - d_client.vset().vadd("myset", [2, 0, -1], "d") - d_client.vset().vadd("myset", [2, -1, -1], "e") + d_client.vset().vadd("myset", [2, 0, 2], "d") + d_client.vset().vadd("myset", [-2, -1, -1], "e") res1 = d_client.vset().vsim("myset", [2, 1, 1]) assert 5 == len(res1) From 2830b2a1e969f91e897e2a1860c4e40ab3f7800b Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Fri, 3 Oct 2025 11:03:36 +0300 Subject: [PATCH 2/5] Print version validation details - tmp debug info to investigate why pipeline is not skipping a test --- tests/conftest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 7eaccb1acb..798a2a1127 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -260,6 +260,9 @@ def wait_for_cluster_creation(redis_url, cluster_nodes, timeout=60): def skip_if_server_version_lt(min_version: str) -> _TestDecorator: + print( + f"Current version {REDIS_INFO.get('version', '0')}, skip_if_server_version_lt: {min_version}" + ) redis_version = REDIS_INFO.get("version", "0") check = Version(redis_version) < Version(min_version) return pytest.mark.skipif(check, reason=f"Redis version required >= {min_version}") From 67fb388bb11f075359e3357b9a20adc1c50e4ea0 Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Fri, 3 Oct 2025 13:10:55 +0300 Subject: [PATCH 3/5] Skipping tests based on 8.2.2 version comparison. --- tests/conftest.py | 3 --- tests/test_asyncio/test_commands.py | 4 ++-- tests/test_commands.py | 10 +++++----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 798a2a1127..7eaccb1acb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -260,9 +260,6 @@ def wait_for_cluster_creation(redis_url, cluster_nodes, timeout=60): def skip_if_server_version_lt(min_version: str) -> _TestDecorator: - print( - f"Current version {REDIS_INFO.get('version', '0')}, skip_if_server_version_lt: {min_version}" - ) redis_version = REDIS_INFO.get("version", "0") check = Version(redis_version) < Version(min_version) return pytest.mark.skipif(check, reason=f"Redis version required >= {min_version}") diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index a15b4180c7..dda4dc2a1c 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -3158,7 +3158,7 @@ async def test_xgroup_destroy(self, r: redis.Redis): assert await r.xgroup_destroy(stream, group) @skip_if_server_version_lt("7.0.0") - @skip_if_server_version_gte("8.2.1") + @skip_if_server_version_gte("8.2.2") async def test_xgroup_setid(self, r: redis.Redis): stream = "stream" group = "group" @@ -3179,7 +3179,7 @@ async def test_xgroup_setid(self, r: redis.Redis): ] assert await r.xinfo_groups(stream) == expected - @skip_if_server_version_lt("8.2.1") + @skip_if_server_version_lt("8.2.2") async def test_xgroup_setid_fixed_max_entries_read(self, r): stream = "stream" group = "group" diff --git a/tests/test_commands.py b/tests/test_commands.py index 55f667a4eb..757905cefc 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4607,7 +4607,7 @@ def test_xgroup_create_mkstream(self, r): assert r.xinfo_groups(stream) == expected @skip_if_server_version_lt("7.0.0") - @skip_if_server_version_gte("8.2.1") + @skip_if_server_version_gte("8.2.2") def test_xgroup_create_entriesread(self, r: redis.Redis): stream = "stream" group = "group" @@ -4629,7 +4629,7 @@ def test_xgroup_create_entriesread(self, r: redis.Redis): ] assert r.xinfo_groups(stream) == expected - @skip_if_server_version_lt("8.2.1") + @skip_if_server_version_lt("8.2.2") def test_xgroup_create_entriesread_fixed_max_entries_read(self, r: redis.Redis): stream = "stream" group = "group" @@ -4703,7 +4703,7 @@ def test_xgroup_destroy(self, r): assert r.xgroup_destroy(stream, group) @skip_if_server_version_lt("7.0.0") - @skip_if_server_version_gte("8.2.1") + @skip_if_server_version_gte("8.2.2") def test_xgroup_setid(self, r): stream = "stream" group = "group" @@ -4724,7 +4724,7 @@ def test_xgroup_setid(self, r): ] assert r.xinfo_groups(stream) == expected - @skip_if_server_version_lt("8.2.1") + @skip_if_server_version_lt("2") def test_xgroup_setid_fixed_max_entries_read(self, r): stream = "stream" group = "group" @@ -4733,7 +4733,7 @@ def test_xgroup_setid_fixed_max_entries_read(self, r): r.xgroup_create(stream, group, 0) # advance the last_delivered_id to the message_id - r.xgroup_setid(stream, group, message_id, entries_read=2) + r.xgroup_setid(stream, group, message_id, entries_read=5) expected = [ { "name": group.encode(), From af209210d3121652f65450119e8332d36ae52313 Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Fri, 3 Oct 2025 17:04:30 +0300 Subject: [PATCH 4/5] Adding 8.4-M01-pre --- .github/workflows/integration.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index ca8504ac62..cbd210c14a 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -27,6 +27,8 @@ env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} # this speeds up coverage with Python 3.12: https://github.com/nedbat/coveragepy/issues/1665 COVERAGE_CORE: sysmon + # patch releases get included in the base version image when they are published + # for example after 8.2.1 is published, 8.2 image contains 8.2.1 content CURRENT_CLIENT_LIBS_TEST_STACK_IMAGE_TAG: '8.2' CURRENT_REDIS_VERSION: '8.2' @@ -74,7 +76,7 @@ jobs: max-parallel: 15 fail-fast: false matrix: - redis-version: ['8.2.2-pre', '${{ needs.redis_version.outputs.CURRENT }}', '8.0.2' ,'7.4.4', '7.2.9'] + redis-version: ['8.4-M01-pre', '${{ needs.redis_version.outputs.CURRENT }}', '8.0.2' ,'7.4.4', '7.2.9'] python-version: ['3.9', '3.13'] parser-backend: ['plain'] event-loop: ['asyncio'] From ebd48127ad3ed2c265292503f7e62af07352b2e9 Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Mon, 6 Oct 2025 16:37:56 +0300 Subject: [PATCH 5/5] Fix skip test condition --- tests/test_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_commands.py b/tests/test_commands.py index 757905cefc..2871dc45bf 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4724,7 +4724,7 @@ def test_xgroup_setid(self, r): ] assert r.xinfo_groups(stream) == expected - @skip_if_server_version_lt("2") + @skip_if_server_version_lt("8.2.2") def test_xgroup_setid_fixed_max_entries_read(self, r): stream = "stream" group = "group"