You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kvrocks.apache.org by tw...@apache.org on 2024/07/02 13:28:54 UTC

(kvrocks) branch 2.9 updated (db89273f -> e23548d2)

This is an automated email from the ASF dual-hosted git repository.

twice pushed a change to branch 2.9
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


 discard db89273f chore: disable search and stream group commands
     new c8826e70 chore: disable search and stream group commands
     new e23548d2 chore: downgrade rocksdb to v8.11.4

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (db89273f)
            \
             N -- N -- N   refs/heads/2.9 (e23548d2)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 cmake/rocksdb.cmake        | 4 ++--
 src/commands/cmd_stream.cc | 8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)


(kvrocks) 02/02: chore: downgrade rocksdb to v8.11.4

Posted by tw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

twice pushed a commit to branch 2.9
in repository https://gitbox.apache.org/repos/asf/kvrocks.git

commit e23548d29fc43bec3ff794ef85015c7fdcf1f294
Author: PragmaTwice <tw...@apache.org>
AuthorDate: Mon Jul 1 13:45:05 2024 +0900

    chore: downgrade rocksdb to v8.11.4
---
 cmake/rocksdb.cmake | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cmake/rocksdb.cmake b/cmake/rocksdb.cmake
index 8b2ff67c..102bda3b 100644
--- a/cmake/rocksdb.cmake
+++ b/cmake/rocksdb.cmake
@@ -26,8 +26,8 @@ endif()
 include(cmake/utils.cmake)
 
 FetchContent_DeclareGitHubWithMirror(rocksdb
-  facebook/rocksdb v9.2.1
-  MD5=b03db4c602754a2c50aa2967fd07a2a7
+  facebook/rocksdb v8.11.4
+  MD5=8190ea7769705aabc928311762d5aafe
 )
 
 FetchContent_GetProperties(jemalloc)


(kvrocks) 01/02: chore: disable search and stream group commands

Posted by tw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

twice pushed a commit to branch 2.9
in repository https://gitbox.apache.org/repos/asf/kvrocks.git

commit c8826e7024af19bac12677b630dba1a1027a997f
Author: PragmaTwice <tw...@apache.org>
AuthorDate: Mon Jul 1 13:16:44 2024 +0900

    chore: disable search and stream group commands
---
 src/commands/cmd_search.cc                   |   17 +-
 src/commands/cmd_stream.cc                   |   37 +-
 tests/gocase/unit/search/search_test.go      |    2 +
 tests/gocase/unit/type/stream/stream_test.go | 2074 +++++++++++++-------------
 4 files changed, 1067 insertions(+), 1063 deletions(-)

diff --git a/src/commands/cmd_search.cc b/src/commands/cmd_search.cc
index 1928672c..ea42f269 100644
--- a/src/commands/cmd_search.cc
+++ b/src/commands/cmd_search.cc
@@ -358,13 +358,14 @@ class CommandFTDrop : public Commander {
   };
 };
 
-REDIS_REGISTER_COMMANDS(MakeCmdAttr<CommandFTCreate>("ft.create", -2, "write exclusive no-multi no-script", 0, 0, 0),
-                        MakeCmdAttr<CommandFTSearchSQL>("ft.searchsql", 2, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandFTSearch>("ft.search", -3, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandFTExplainSQL>("ft.explainsql", -2, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandFTExplain>("ft.explain", -3, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandFTInfo>("ft.info", 2, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandFTList>("ft._list", 1, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandFTDrop>("ft.dropindex", 2, "write exclusive no-multi no-script", 0, 0, 0));
+// REDIS_REGISTER_COMMANDS(MakeCmdAttr<CommandFTCreate>("ft.create", -2, "write exclusive no-multi no-script", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTSearchSQL>("ft.searchsql", 2, "read-only", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTSearch>("ft.search", -3, "read-only", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTExplainSQL>("ft.explainsql", -2, "read-only", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTExplain>("ft.explain", -3, "read-only", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTInfo>("ft.info", 2, "read-only", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTList>("ft._list", 1, "read-only", 0, 0, 0),
+//                         MakeCmdAttr<CommandFTDrop>("ft.dropindex", 2, "write exclusive no-multi no-script", 0, 0,
+//                         0));
 
 }  // namespace redis
diff --git a/src/commands/cmd_stream.cc b/src/commands/cmd_stream.cc
index 7faeb9c4..ee608be2 100644
--- a/src/commands/cmd_stream.cc
+++ b/src/commands/cmd_stream.cc
@@ -655,10 +655,10 @@ class CommandXInfo : public Commander {
 
         count_ = *parse_result;
       }
-    } else if (val == "groups" && args.size() == 3) {
-      subcommand_ = "groups";
-    } else if (val == "consumers" && args.size() == 4) {
-      subcommand_ = "consumers";
+      // } else if (val == "groups" && args.size() == 3) {
+      //   subcommand_ = "groups";
+      // } else if (val == "consumers" && args.size() == 4) {
+      //   subcommand_ = "consumers";
     } else {
       return {Status::RedisParseErr, errUnknownSubcommandOrWrongArguments};
     }
@@ -1736,19 +1736,20 @@ class CommandXSetId : public Commander {
   std::optional<uint64_t> entries_added_;
 };
 
-REDIS_REGISTER_COMMANDS(MakeCmdAttr<CommandXAck>("xack", -4, "write no-dbsize-check", 1, 1, 1),
-                        MakeCmdAttr<CommandXAdd>("xadd", -5, "write", 1, 1, 1),
-                        MakeCmdAttr<CommandXDel>("xdel", -3, "write no-dbsize-check", 1, 1, 1),
-                        MakeCmdAttr<CommandXClaim>("xclaim", -6, "write", 1, 1, 1),
-                        MakeCmdAttr<CommandAutoClaim>("xautoclaim", -6, "write", 1, 1, 1),
-                        MakeCmdAttr<CommandXGroup>("xgroup", -4, "write", 2, 2, 1),
-                        MakeCmdAttr<CommandXLen>("xlen", -2, "read-only", 1, 1, 1),
-                        MakeCmdAttr<CommandXInfo>("xinfo", -2, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandXRange>("xrange", -4, "read-only", 1, 1, 1),
-                        MakeCmdAttr<CommandXRevRange>("xrevrange", -2, "read-only", 1, 1, 1),
-                        MakeCmdAttr<CommandXRead>("xread", -4, "read-only", 0, 0, 0),
-                        MakeCmdAttr<CommandXReadGroup>("xreadgroup", -7, "write", 0, 0, 0),
-                        MakeCmdAttr<CommandXTrim>("xtrim", -4, "write no-dbsize-check", 1, 1, 1),
-                        MakeCmdAttr<CommandXSetId>("xsetid", -3, "write", 1, 1, 1))
+REDIS_REGISTER_COMMANDS(
+    // MakeCmdAttr<CommandXAck>("xack", -4, "write no-dbsize-check", 1, 1, 1),
+    MakeCmdAttr<CommandXAdd>("xadd", -5, "write", 1, 1, 1),
+    MakeCmdAttr<CommandXDel>("xdel", -3, "write no-dbsize-check", 1, 1, 1),
+    // MakeCmdAttr<CommandXClaim>("xclaim", -6, "write", 1, 1, 1),
+    // MakeCmdAttr<CommandAutoClaim>("xautoclaim", -6, "write", 1, 1, 1),
+    // MakeCmdAttr<CommandXGroup>("xgroup", -4, "write", 2, 2, 1),
+    MakeCmdAttr<CommandXLen>("xlen", -2, "read-only", 1, 1, 1),
+    MakeCmdAttr<CommandXInfo>("xinfo", -2, "read-only", 0, 0, 0),
+    MakeCmdAttr<CommandXRange>("xrange", -4, "read-only", 1, 1, 1),
+    MakeCmdAttr<CommandXRevRange>("xrevrange", -2, "read-only", 1, 1, 1),
+    MakeCmdAttr<CommandXRead>("xread", -4, "read-only", 0, 0, 0),
+    // MakeCmdAttr<CommandXReadGroup>("xreadgroup", -7, "write", 0, 0, 0),
+    MakeCmdAttr<CommandXTrim>("xtrim", -4, "write no-dbsize-check", 1, 1, 1),
+    MakeCmdAttr<CommandXSetId>("xsetid", -3, "write", 1, 1, 1))
 
 }  // namespace redis
diff --git a/tests/gocase/unit/search/search_test.go b/tests/gocase/unit/search/search_test.go
index bb87c19f..651323c1 100644
--- a/tests/gocase/unit/search/search_test.go
+++ b/tests/gocase/unit/search/search_test.go
@@ -29,6 +29,8 @@ import (
 )
 
 func TestSearch(t *testing.T) {
+	t.Skip("search commands is disabled")
+
 	srv := util.StartServer(t, map[string]string{})
 	defer srv.Close()
 
diff --git a/tests/gocase/unit/type/stream/stream_test.go b/tests/gocase/unit/type/stream/stream_test.go
index b8958e70..4ba461ff 100644
--- a/tests/gocase/unit/type/stream/stream_test.go
+++ b/tests/gocase/unit/type/stream/stream_test.go
@@ -867,1043 +867,1043 @@ func TestStreamOffset(t *testing.T) {
 		require.EqualValues(t, providedSeqNum, seqNum)
 	})
 
-	t.Run("XGROUP CREATE with different kinds of commands and XGROUP DESTROY", func(t *testing.T) {
-		streamName := "test-stream-a"
-		groupName := "test-group-a"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		// No such stream (No such key)
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$").Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIESREAD", "10").Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIESREAD").Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "MKSTREAM", "ENTRIESREAD").Err())
-		require.NoError(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "MKSTREAM").Err())
-		require.NoError(t, rdb.XInfoStream(ctx, streamName).Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$").Err())
-		// Invalid syntax
-		groupName = "test-group-b"
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREAT", streamName, groupName, "$").Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIEREAD", "10").Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIESREAD", "-10").Err())
-		require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, "1test-group-c", "$").Err())
-
-		require.NoError(t, rdb.Del(ctx, "myStream").Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{Stream: "myStream", Values: []string{"iTeM", "1", "vAluE", "a"}}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, "myStream", "myGroup", "$").Err())
-		result, err := rdb.XGroupDestroy(ctx, "myStream", "myGroup").Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(1), result)
-		result, err = rdb.XGroupDestroy(ctx, "myStream", "myGroup").Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(0), result)
-	})
-
-	t.Run("XGROUP CREATECONSUMER with different kinds of commands", func(t *testing.T) {
-		streamName := "test-stream"
-		groupName := "test-group"
-		consumerName := "test-consumer"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		//No such stream
-		require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"data", "a"},
-		}).Err())
-		//no such group
-		require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "$").Err())
-
-		r := rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Val()
-		require.Equal(t, int64(1), r)
-		r = rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Val()
-		require.Equal(t, int64(0), r)
-	})
-
-	t.Run("XGROUP DELCONSUMER with different kinds of commands", func(t *testing.T) {
-		streamName := "test-stream"
-		groupName := "test-group"
-		consumerName := "test-consumer"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		//No such stream
-		require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"data", "a"},
-		}).Err())
-		//no such group
-		require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "$").Err())
-		require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "*",
-			Values: []string{"data1", "a1"},
-		}).Err())
-		require.NoError(t, rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Err())
-		ri, erri := rdb.XInfoGroups(ctx, streamName).Result()
-		require.NoError(t, erri)
-		require.Equal(t, int64(1), ri[0].Consumers)
-		require.Equal(t, int64(1), ri[0].Pending)
-
-		r, err := rdb.XGroupDelConsumer(ctx, streamName, groupName, consumerName).Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(1), r)
-		ri, erri = rdb.XInfoGroups(ctx, streamName).Result()
-		require.NoError(t, erri)
-		require.Equal(t, int64(0), ri[0].Consumers)
-		require.Equal(t, int64(0), ri[0].Pending)
-
-		require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "*",
-			Values: []string{"data2", "a2"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "*",
-			Values: []string{"data3", "a3"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "*",
-			Values: []string{"data4", "a4"},
-		}).Err())
-		require.NoError(t, rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    3,
-			NoAck:    false,
-		}).Err())
-		ri, erri = rdb.XInfoGroups(ctx, streamName).Result()
-		require.NoError(t, erri)
-		require.Equal(t, int64(1), ri[0].Consumers)
-		require.Equal(t, int64(3), ri[0].Pending)
-		r, err = rdb.XGroupDelConsumer(ctx, streamName, groupName, consumerName).Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(3), r)
-		ri, erri = rdb.XInfoGroups(ctx, streamName).Result()
-		require.NoError(t, erri)
-		require.Equal(t, int64(0), ri[0].Consumers)
-		require.Equal(t, int64(0), ri[0].Pending)
-	})
-
-	t.Run("XGROUP SETID with different kinds of commands", func(t *testing.T) {
-		streamName := "test-stream"
-		groupName := "test-group"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		//No such stream
-		require.Error(t, rdb.XGroupSetID(ctx, streamName, groupName, "$").Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"data", "a"},
-		}).Err())
-		//No such group
-		require.Error(t, rdb.XGroupSetID(ctx, streamName, groupName, "$").Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "$").Err())
-
-		require.NoError(t, rdb.XGroupSetID(ctx, streamName, groupName, "0-0").Err())
-		require.Error(t, rdb.Do(ctx, "xgroup", "setid", streamName, groupName, "$", "entries", "100").Err())
-		require.Error(t, rdb.Do(ctx, "xgroup", "setid", streamName, groupName, "$", "entriesread", "-100").Err())
-		require.NoError(t, rdb.Do(ctx, "xgroup", "setid", streamName, groupName, "$", "entriesread", "100").Err())
-	})
-
-	t.Run("XINFO GROUPS and XINFO CONSUMERS", func(t *testing.T) {
-		streamName := "test-stream"
-		group1 := "t1"
-		group2 := "t2"
-		consumer1 := "c1"
-		consumer2 := "c2"
-		consumer3 := "c3"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"data", "a"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, group1, "$").Err())
-		r := rdb.XInfoGroups(ctx, streamName).Val()
-		require.Equal(t, group1, r[0].Name)
-		require.Equal(t, int64(0), r[0].Consumers)
-		require.Equal(t, int64(0), r[0].Pending)
-		require.Equal(t, "1-0", r[0].LastDeliveredID)
-		require.Equal(t, int64(0), r[0].EntriesRead)
-		require.Equal(t, int64(0), r[0].Lag)
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "2-0",
-			Values: []string{"data1", "b"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, group2, "$").Err())
-		r = rdb.XInfoGroups(ctx, streamName).Val()
-		require.Equal(t, group2, r[1].Name)
-		require.Equal(t, "2-0", r[1].LastDeliveredID)
-
-		require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group1, consumer1).Err())
-		require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group1, consumer2).Err())
-		require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group2, consumer3).Err())
-		r = rdb.XInfoGroups(ctx, streamName).Val()
-		require.Equal(t, int64(2), r[0].Consumers)
-		require.Equal(t, int64(1), r[1].Consumers)
-
-		r1 := rdb.XInfoConsumers(ctx, streamName, group1).Val()
-		require.Equal(t, consumer1, r1[0].Name)
-		require.Equal(t, consumer2, r1[1].Name)
-		r1 = rdb.XInfoConsumers(ctx, streamName, group2).Val()
-		require.Equal(t, consumer3, r1[0].Name)
-	})
-
-	t.Run("XINFO after delete pending message and related consumer, for issue #2350", func(t *testing.T) {
-		streamName := "test-stream-2350"
-		groupName := "test-group-2350"
-		consumerName := "test-consumer-2350"
-		require.NoError(t, rdb.XGroupCreateMkStream(ctx, streamName, groupName, "$").Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "*",
-			Values: []string{"testing", "overflow"},
-		}).Err())
-		readRsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		})
-		require.NoError(t, readRsp.Err())
-		require.Len(t, readRsp.Val(), 1)
-		streamRsp := readRsp.Val()[0]
-		require.Len(t, streamRsp.Messages, 1)
-		msgID := streamRsp.Messages[0]
-		require.NoError(t, rdb.XAck(ctx, streamName, groupName, msgID.ID).Err())
-		require.NoError(t, rdb.XGroupDelConsumer(ctx, streamName, groupName, consumerName).Err())
-		infoRsp := rdb.XInfoGroups(ctx, streamName)
-		require.NoError(t, infoRsp.Err())
-		infoGroups := infoRsp.Val()
-		require.Len(t, infoGroups, 1)
-		infoGroup := infoGroups[0]
-		require.Equal(t, groupName, infoGroup.Name)
-		require.Equal(t, int64(0), infoGroup.Consumers)
-		require.Equal(t, int64(0), infoGroup.Pending)
-		require.Equal(t, msgID.ID, infoGroup.LastDeliveredID)
-	})
-
-	t.Run("XREAD After XGroupCreate and XGroupCreateConsumer, for issue #2109", func(t *testing.T) {
-		streamName := "test-stream"
-		group := "group"
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "*",
-			Values: []string{"data1", "b"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, group, "0").Err())
-		require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group, "consumer").Err())
-		require.NoError(t, rdb.XRead(ctx, &redis.XReadArgs{
-			Streams: []string{streamName, "0"},
-		}).Err())
-	})
-
-	t.Run("XREADGROUP with different kinds of commands", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		consumerName := "myconsumer"
-		r, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}}},
-		}}, r)
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "2-0",
-			Values: []string{"field2", "data2"},
-		}).Err())
-		r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "2-0", Values: map[string]interface{}{"field2": "data2"}}},
-		}}, r)
-
-		r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, "0"},
-			Count:    2,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream: streamName,
-			Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}},
-				{ID: "2-0", Values: map[string]interface{}{"field2": "data2"}}},
-		}}, r)
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "3-0",
-			Values: []string{"field3", "data3"},
-		}).Err())
-		r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    true,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "3-0", Values: map[string]interface{}{"field3": "data3"}}},
-		}}, r)
-		r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, "0"},
-			Count:    2,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream: streamName,
-			Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}},
-				{ID: "2-0", Values: map[string]interface{}{"field2": "data2"}}},
-		}}, r)
-
-		c := srv.NewClient()
-		defer func() { require.NoError(t, c.Close()) }()
-		ch := make(chan []redis.XStream)
-		go func() {
-			ch <- c.XReadGroup(ctx, &redis.XReadGroupArgs{
-				Group:    groupName,
-				Consumer: consumerName,
-				Streams:  []string{streamName, ">"},
-				Count:    2,
-				Block:    10 * time.Second,
-				NoAck:    false,
-			}).Val()
-		}()
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "4-0",
-			Values: []string{"field4", "data4"},
-		}).Err())
-		r = <-ch
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "4-0", Values: map[string]interface{}{"field4": "data4"}}},
-		}}, r)
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "5-0",
-			Values: []string{"field5", "data5"},
-		}).Err())
-		require.NoError(t, rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Err())
-		require.NoError(t, rdb.XDel(ctx, streamName, "5-0").Err())
-		r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, "5"},
-			Count:    1,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "5-0", Values: map[string]interface{}(nil)}},
-		}}, r)
-	})
-
-	t.Run("Check xreadgroup fetches the newest data after create consumer in the command", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		consumerName := "myconsumer"
-		err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Err()
-		require.NoError(t, err)
-		ri, erri := rdb.XInfoGroups(ctx, streamName).Result()
-		require.NoError(t, erri)
-		require.Equal(t, int64(1), ri[0].Consumers)
-	})
-
-	t.Run("XACK with different kinds of commands", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		r, err := rdb.XAck(ctx, streamName, groupName, "0-0").Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(0), r)
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		consumerName := "myconsumer"
-		err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Err()
-		require.NoError(t, err)
-		r, err = rdb.XAck(ctx, streamName, groupName, "1-0").Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(1), r)
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "2-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "3-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "4-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    3,
-			NoAck:    false,
-		}).Err()
-		require.NoError(t, err)
-		r, err = rdb.XAck(ctx, streamName, groupName, "2-0", "3-0", "4-0").Result()
-		require.NoError(t, err)
-		require.Equal(t, int64(3), r)
-	})
-
-	t.Run("Simple XCLAIM command tests", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		consumerName := "myconsumer"
-		consumer1Name := "myconsumer1"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		r, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}}},
-		}}, r)
-
-		claimedMessages, err := rdb.XClaim(ctx, &redis.XClaimArgs{
-			Stream:   streamName,
-			Group:    groupName,
-			Consumer: consumer1Name,
-			MinIdle:  0,
-			Messages: []string{"1-0"},
-		}).Result()
-		require.NoError(t, err)
-		require.Len(t, claimedMessages, 1, "Expected to claim 1 message")
-		require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
-
-		time.Sleep(2000 * time.Millisecond)
-		minIdleTime := 1000 * time.Millisecond
-		claimedMessages, err = rdb.XClaim(ctx, &redis.XClaimArgs{
-			Stream:   streamName,
-			Group:    groupName,
-			Consumer: consumerName,
-			MinIdle:  minIdleTime,
-			Messages: []string{"1-0"},
-		}).Result()
-		require.NoError(t, err)
-		require.Len(t, claimedMessages, 1, "Expected to claim 1 message if idle time is large enough")
-		require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
-
-		minIdleTime = 60000 * time.Millisecond
-		claimedMessages, err = rdb.XClaim(ctx, &redis.XClaimArgs{
-			Stream:   streamName,
-			Group:    groupName,
-			Consumer: consumer1Name,
-			MinIdle:  minIdleTime,
-			Messages: []string{"1-0"},
-		}).Result()
-
-		require.NoError(t, err)
-		require.Empty(t, claimedMessages, "Expected no messages to be claimed due to insufficient idle time")
-	})
-
-	t.Run("XCLAIM with different timing situations and options", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		consumerName := "myconsumer"
-		consumer1Name := "myconsumer1"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		r, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-			Group:    groupName,
-			Consumer: consumerName,
-			Streams:  []string{streamName, ">"},
-			Count:    1,
-			NoAck:    false,
-		}).Result()
-		require.NoError(t, err)
-		require.Equal(t, []redis.XStream{{
-			Stream:   streamName,
-			Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}}},
-		}}, r)
-
-		rawClaimedMessages, err := rdb.Do(ctx, "XCLAIM", streamName, groupName, consumer1Name, "0", "1-0", "IDLE", "5000").Result()
-		require.NoError(t, err)
-		messages, ok := rawClaimedMessages.([]interface{})
-		require.True(t, ok, "Expected the result to be a slice of interface{}")
-		firstMsg, ok := messages[0].([]interface{})
-		require.True(t, ok, "Expected message details to be a slice of interface{}")
-		msgID, ok := firstMsg[0].(string)
-		require.True(t, ok, "Expected message ID to be a string")
-		require.Equal(t, "1-0", msgID, "Expected claimed message ID to match")
-
-		claimedMessages, err := rdb.XClaim(ctx, &redis.XClaimArgs{
-			Stream:   streamName,
-			Group:    groupName,
-			Consumer: consumerName,
-			MinIdle:  2000 * time.Millisecond,
-			Messages: []string{"1-0"},
-		}).Result()
-		require.NoError(t, err)
-		require.Len(t, claimedMessages, 1, "Expected to claim 1 message if idle time is large enough")
-		require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
-
-		tenSecondsAgo := time.Now().Add(-10 * time.Second).UnixMilli()
-		rawClaimedMessages, err = rdb.Do(ctx, "XCLAIM", streamName, groupName, consumer1Name, "0", "1-0", "TIME", tenSecondsAgo).Result()
-		require.NoError(t, err)
-		messages, ok = rawClaimedMessages.([]interface{})
-		require.True(t, ok, "Expected the result to be a slice of interface{}")
-		firstMsg, ok = messages[0].([]interface{})
-		require.True(t, ok, "Expected message details to be a slice of interface{}")
-		msgID, ok = firstMsg[0].(string)
-		require.True(t, ok, "Expected message ID to be a string")
-		require.Equal(t, "1-0", msgID, "Expected claimed message ID to match")
-
-		claimedMessages, err = rdb.XClaim(ctx, &redis.XClaimArgs{
-			Stream:   streamName,
-			Group:    groupName,
-			Consumer: consumerName,
-			MinIdle:  5000 * time.Millisecond,
-			Messages: []string{"1-0"},
-		}).Result()
-		require.NoError(t, err)
-		require.Len(t, claimedMessages, 1, "Expected to claim 1 message if idle time is large enough")
-		require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
-	})
-
-	t.Run("XCLAIM command with different options", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		consumerName := "myconsumer"
-		consumer1Name := "myconsumer1"
-
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: []string{"field1", "data1"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-
-		rawClaimedMessages, err := rdb.Do(ctx, "XCLAIM", streamName, groupName, consumerName, "0", "1-0", "FORCE").Result()
-		require.NoError(t, err)
-		messages, ok := rawClaimedMessages.([]interface{})
-		require.True(t, ok, "Expected the result to be a slice of interface{}")
-		firstMsg, ok := messages[0].([]interface{})
-		require.True(t, ok, "Expected message details to be a slice of interface{}")
-		msgID, ok := firstMsg[0].(string)
-		require.True(t, ok, "Expected message ID to be a string")
-		require.Equal(t, "1-0", msgID, "Expected claimed message ID to match")
-
-		cmd := rdb.XClaimJustID(ctx, &redis.XClaimArgs{
-			Stream:   streamName,
-			Group:    groupName,
-			Consumer: consumer1Name,
-			MinIdle:  0,
-			Messages: []string{"1-0"},
-		})
-
-		claimedIDs, err := cmd.Result()
-		require.NoError(t, err)
-		require.Len(t, claimedIDs, 1, "Expected to claim exactly one message ID")
-		require.Equal(t, "1-0", claimedIDs[0], "Expected claimed message ID to match")
-	})
-
-	t.Run("XAUTOCLAIM can claim PEL items from another consume", func(t *testing.T) {
-
-		streamName := "mystream"
-		groupName := "mygroup"
-		var id1 string
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"a", "1"},
-			})
-			require.NoError(t, rsp.Err())
-			id1 = rsp.Val()
-		}
-		var id2 string
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"b", "2"},
-			})
-			require.NoError(t, rsp.Err())
-			id2 = rsp.Val()
-		}
-		var id3 string
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"c", "3"},
-			})
-			require.NoError(t, rsp.Err())
-			id3 = rsp.Val()
-		}
-		var id4 string
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"d", "4"},
-			})
-			require.NoError(t, rsp.Err())
-			id4 = rsp.Val()
-		}
-
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-
-		consumer1 := "consumer1"
-		consumer2 := "consumer2"
-		{
-			rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-				Group:    groupName,
-				Consumer: consumer1,
-				Streams:  []string{streamName, ">"},
-				Count:    1,
-			})
-			require.NoError(t, rsp.Err())
-			require.Len(t, rsp.Val(), 1)
-			require.Len(t, rsp.Val()[0].Messages, 1)
-			require.Equal(t, id1, rsp.Val()[0].Messages[0].ID)
-			require.Len(t, rsp.Val()[0].Messages[0].Values, 1)
-			require.Equal(t, "1", rsp.Val()[0].Messages[0].Values["a"])
-		}
-
-		{
-			time.Sleep(200 * time.Millisecond)
-			rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
-				Stream:   streamName,
-				Group:    groupName,
-				Consumer: consumer2,
-				MinIdle:  10 * time.Millisecond,
-				Count:    1,
-				Start:    "-",
-			})
-			require.NoError(t, rsp.Err())
-			msgs, start := rsp.Val()
-			require.Equal(t, "0-0", start)
-			require.Len(t, msgs, 1)
-			require.Len(t, msgs[0].Values, 1)
-			require.Equal(t, "1", msgs[0].Values["a"])
-		}
-
-		{
-			rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-				Group:    groupName,
-				Consumer: consumer1,
-				Streams:  []string{streamName, ">"},
-				Count:    3,
-			})
-			require.NoError(t, rsp.Err())
-
-			time.Sleep(time.Millisecond * 200)
-			require.NoError(t, rdb.XDel(ctx, streamName, id2).Err())
-		}
-
-		{
-			cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, consumer2, 10, "-", "COUNT", 3)
-			require.NoError(t, cmd.Err())
-			require.Equal(t, []interface{}{
-				id4,
-				[]interface{}{
-					[]interface{}{
-						id1,
-						[]interface{}{"a", "1"},
-					},
-					[]interface{}{
-						id3,
-						[]interface{}{"c", "3"},
-					},
-				},
-				[]interface{}{
-					id2,
-				},
-			}, cmd.Val())
-		}
-
-		{
-			time.Sleep(time.Millisecond * 200)
-			require.NoError(t, rdb.XDel(ctx, streamName, id4).Err())
-			rsp := rdb.XAutoClaimJustID(ctx, &redis.XAutoClaimArgs{
-				Stream:   streamName,
-				Group:    groupName,
-				Consumer: consumer2,
-				MinIdle:  10 * time.Millisecond,
-				Start:    "-",
-			})
-			require.NoError(t, rsp.Err())
-			msgs, start := rsp.Val()
-			require.Equal(t, "0-0", start)
-			require.Len(t, msgs, 2)
-			require.Equal(t, id1, msgs[0])
-			require.Equal(t, id3, msgs[1])
-		}
-	})
-
-	t.Run("XAUTOCLAIM as an iterator", func(t *testing.T) {
-		streamName := "mystream"
-		groupName := "mygroup"
-		var id3, id5 string
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"a", "1"},
-			})
-			require.NoError(t, rsp.Err())
-		}
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"b", "2"},
-			})
-			require.NoError(t, rsp.Err())
-		}
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"c", "3"},
-			})
-			require.NoError(t, rsp.Err())
-			id3 = rsp.Val()
-		}
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"d", "4"},
-			})
-			require.NoError(t, rsp.Err())
-		}
-		{
-			rsp := rdb.XAdd(ctx, &redis.XAddArgs{
-				Stream: streamName,
-				ID:     "*",
-				Values: []string{"e", "5"},
-			})
-			require.NoError(t, rsp.Err())
-			id5 = rsp.Val()
-		}
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-
-		consumer1, consumer2 := "consumer1", "consumer2"
-		{
-			rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-				Group:    groupName,
-				Consumer: consumer1,
-				Streams:  []string{streamName, ">"},
-				Count:    90,
-			})
-			require.NoError(t, rsp.Err())
-			time.Sleep(200 * time.Millisecond)
-		}
-		{
-			rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
-				Stream:   streamName,
-				Group:    groupName,
-				Consumer: consumer2,
-				MinIdle:  10 * time.Millisecond,
-				Count:    2,
-				Start:    "-",
-			})
-			require.NoError(t, rsp.Err())
-			msgs, start := rsp.Val()
-			require.Equal(t, id3, start)
-			require.Len(t, msgs, 2)
-			require.Len(t, msgs[0].Values, 1)
-			require.Equal(t, "1", msgs[0].Values["a"])
-		}
-
-		{
-			rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
-				Stream:   streamName,
-				Group:    groupName,
-				Consumer: consumer2,
-				MinIdle:  10 * time.Millisecond,
-				Start:    id3,
-				Count:    2,
-			})
-			require.NoError(t, rsp.Err())
-			msgs, start := rsp.Val()
-			require.Equal(t, id5, start)
-			require.Len(t, msgs, 2)
-			require.Len(t, msgs[0].Values, 1)
-			require.Equal(t, "3", msgs[0].Values["c"])
-		}
-
-		{
-			rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
-				Stream:   streamName,
-				Group:    groupName,
-				Consumer: consumer2,
-				MinIdle:  10 * time.Millisecond,
-				Start:    id5,
-				Count:    1,
-			})
-			require.NoError(t, rsp.Err())
-			msgs, start := rsp.Val()
-			require.Equal(t, "0-0", start)
-			require.Len(t, msgs, 1)
-			require.Len(t, msgs[0].Values, 1)
-			require.Equal(t, "5", msgs[0].Values["e"])
-		}
-	})
-
-	t.Run("XAUTOCLAIM with XDEL", func(t *testing.T) {
-		streamName := "x"
-		groupName := "grp"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: map[string]interface{}{"f": "v"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "2-0",
-			Values: map[string]interface{}{"f": "v"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "3-0",
-			Values: map[string]interface{}{"f": "v"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		{
-			rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-				Group:    groupName,
-				Consumer: "Alice",
-				Streams:  []string{streamName, ">"},
-			})
-			require.NoError(t, rsp.Err())
-			require.Len(t, rsp.Val(), 1)
-			require.Len(t, rsp.Val()[0].Messages, 3)
-			require.Equal(t, "1-0", rsp.Val()[0].Messages[0].ID)
-			require.Equal(t, "v", rsp.Val()[0].Messages[0].Values["f"])
-			require.Equal(t, "2-0", rsp.Val()[0].Messages[1].ID)
-			require.Equal(t, "v", rsp.Val()[0].Messages[1].Values["f"])
-			require.Equal(t, "3-0", rsp.Val()[0].Messages[2].ID)
-			require.Equal(t, "v", rsp.Val()[0].Messages[2].Values["f"])
-		}
-		{
-			require.NoError(t, rdb.XDel(ctx, streamName, "2-0").Err())
-			cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "0-0")
-			require.NoError(t, cmd.Err())
-			require.Equal(t, []interface{}{
-				"0-0",
-				[]interface{}{
-					[]interface{}{
-						"1-0",
-						[]interface{}{"f", "v"},
-					},
-					[]interface{}{
-						"3-0",
-						[]interface{}{"f", "v"},
-					},
-				},
-				[]interface{}{
-					"2-0",
-				},
-			}, cmd.Val())
-		}
-	})
-
-	t.Run("XAUTOCLAIM with XDEL and count", func(t *testing.T) {
-		streamName := "x"
-		groupName := "grp"
-		require.NoError(t, rdb.Del(ctx, streamName).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "1-0",
-			Values: map[string]interface{}{"f": "v"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "2-0",
-			Values: map[string]interface{}{"f": "v"},
-		}).Err())
-		require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
-			Stream: streamName,
-			ID:     "3-0",
-			Values: map[string]interface{}{"f": "v"},
-		}).Err())
-		require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
-		{
-			rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
-				Group:    groupName,
-				Consumer: "Alice",
-				Streams:  []string{streamName, ">"},
-			})
-			require.NoError(t, rsp.Err())
-			require.Len(t, rsp.Val(), 1)
-			require.Len(t, rsp.Val()[0].Messages, 3)
-			require.Equal(t, "1-0", rsp.Val()[0].Messages[0].ID)
-			require.Equal(t, "v", rsp.Val()[0].Messages[0].Values["f"])
-			require.Equal(t, "2-0", rsp.Val()[0].Messages[1].ID)
-			require.Equal(t, "v", rsp.Val()[0].Messages[1].Values["f"])
-			require.Equal(t, "3-0", rsp.Val()[0].Messages[2].ID)
-			require.Equal(t, "v", rsp.Val()[0].Messages[2].Values["f"])
-		}
-		{
-			require.NoError(t, rdb.XDel(ctx, streamName, "1-0").Err())
-			require.NoError(t, rdb.XDel(ctx, streamName, "2-0").Err())
-			cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "0-0", "COUNT", 1)
-			require.NoError(t, cmd.Err())
-			require.Equal(t, []interface{}{
-				"2-0",
-				[]interface{}{},
-				[]interface{}{
-					"1-0",
-				},
-			}, cmd.Val())
-		}
-		{
-			cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "2-0", "COUNT", 1)
-			require.NoError(t, cmd.Err())
-			require.Equal(t, []interface{}{
-				"3-0",
-				[]interface{}{},
-				[]interface{}{
-					"2-0",
-				},
-			}, cmd.Val())
-		}
-		{
-			cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "3-0", "COUNT", 1)
-			require.NoError(t, cmd.Err())
-			require.Equal(t, []interface{}{
-				"0-0",
-				[]interface{}{
-					[]interface{}{
-						"3-0",
-						[]interface{}{"f", "v"},
-					},
-				},
-				[]interface{}{},
-			}, cmd.Val())
-		}
-		// assert_equal [XPENDING x grp - + 10 Alice] {}
-		// add xpending to this test case when it is supported
-	})
-
-	t.Run("XAUTOCLAIM with out of range count", func(t *testing.T) {
-		err := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
-			Stream:   "x",
-			Group:    "grp",
-			Consumer: "Bob",
-			MinIdle:  0,
-			Start:    "3-0",
-			Count:    8070450532247928833,
-		}).Err()
-		require.Error(t, err)
-		require.True(t, strings.HasPrefix(err.Error(), "ERR COUNT"))
-	})
-
-	t.Run("XAUTOCLAIM COUNT must be > 0", func(t *testing.T) {
-		cmd := rdb.Do(ctx, "XAUTOCLAIM", "key", "group", "consumer", 1, 1, "COUNT", 0)
-		require.Error(t, cmd.Err())
-		require.Equal(t, "ERR COUNT must be > 0", cmd.Err().Error())
-	})
+	// t.Run("XGROUP CREATE with different kinds of commands and XGROUP DESTROY", func(t *testing.T) {
+	// 	streamName := "test-stream-a"
+	// 	groupName := "test-group-a"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	// No such stream (No such key)
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$").Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIESREAD", "10").Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIESREAD").Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "MKSTREAM", "ENTRIESREAD").Err())
+	// 	require.NoError(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "MKSTREAM").Err())
+	// 	require.NoError(t, rdb.XInfoStream(ctx, streamName).Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$").Err())
+	// 	// Invalid syntax
+	// 	groupName = "test-group-b"
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREAT", streamName, groupName, "$").Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIEREAD", "10").Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, groupName, "$", "ENTRIESREAD", "-10").Err())
+	// 	require.Error(t, rdb.Do(ctx, "XGROUP", "CREATE", streamName, "1test-group-c", "$").Err())
+
+	// 	require.NoError(t, rdb.Del(ctx, "myStream").Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{Stream: "myStream", Values: []string{"iTeM", "1", "vAluE", "a"}}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, "myStream", "myGroup", "$").Err())
+	// 	result, err := rdb.XGroupDestroy(ctx, "myStream", "myGroup").Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(1), result)
+	// 	result, err = rdb.XGroupDestroy(ctx, "myStream", "myGroup").Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(0), result)
+	// })
+
+	// t.Run("XGROUP CREATECONSUMER with different kinds of commands", func(t *testing.T) {
+	// 	streamName := "test-stream"
+	// 	groupName := "test-group"
+	// 	consumerName := "test-consumer"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	//No such stream
+	// 	require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"data", "a"},
+	// 	}).Err())
+	// 	//no such group
+	// 	require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "$").Err())
+
+	// 	r := rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Val()
+	// 	require.Equal(t, int64(1), r)
+	// 	r = rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Val()
+	// 	require.Equal(t, int64(0), r)
+	// })
+
+	// t.Run("XGROUP DELCONSUMER with different kinds of commands", func(t *testing.T) {
+	// 	streamName := "test-stream"
+	// 	groupName := "test-group"
+	// 	consumerName := "test-consumer"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	//No such stream
+	// 	require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"data", "a"},
+	// 	}).Err())
+	// 	//no such group
+	// 	require.Error(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "$").Err())
+	// 	require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "*",
+	// 		Values: []string{"data1", "a1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Err())
+	// 	ri, erri := rdb.XInfoGroups(ctx, streamName).Result()
+	// 	require.NoError(t, erri)
+	// 	require.Equal(t, int64(1), ri[0].Consumers)
+	// 	require.Equal(t, int64(1), ri[0].Pending)
+
+	// 	r, err := rdb.XGroupDelConsumer(ctx, streamName, groupName, consumerName).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(1), r)
+	// 	ri, erri = rdb.XInfoGroups(ctx, streamName).Result()
+	// 	require.NoError(t, erri)
+	// 	require.Equal(t, int64(0), ri[0].Consumers)
+	// 	require.Equal(t, int64(0), ri[0].Pending)
+
+	// 	require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, groupName, consumerName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "*",
+	// 		Values: []string{"data2", "a2"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "*",
+	// 		Values: []string{"data3", "a3"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "*",
+	// 		Values: []string{"data4", "a4"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    3,
+	// 		NoAck:    false,
+	// 	}).Err())
+	// 	ri, erri = rdb.XInfoGroups(ctx, streamName).Result()
+	// 	require.NoError(t, erri)
+	// 	require.Equal(t, int64(1), ri[0].Consumers)
+	// 	require.Equal(t, int64(3), ri[0].Pending)
+	// 	r, err = rdb.XGroupDelConsumer(ctx, streamName, groupName, consumerName).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(3), r)
+	// 	ri, erri = rdb.XInfoGroups(ctx, streamName).Result()
+	// 	require.NoError(t, erri)
+	// 	require.Equal(t, int64(0), ri[0].Consumers)
+	// 	require.Equal(t, int64(0), ri[0].Pending)
+	// })
+
+	// t.Run("XGROUP SETID with different kinds of commands", func(t *testing.T) {
+	// 	streamName := "test-stream"
+	// 	groupName := "test-group"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	//No such stream
+	// 	require.Error(t, rdb.XGroupSetID(ctx, streamName, groupName, "$").Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"data", "a"},
+	// 	}).Err())
+	// 	//No such group
+	// 	require.Error(t, rdb.XGroupSetID(ctx, streamName, groupName, "$").Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "$").Err())
+
+	// 	require.NoError(t, rdb.XGroupSetID(ctx, streamName, groupName, "0-0").Err())
+	// 	require.Error(t, rdb.Do(ctx, "xgroup", "setid", streamName, groupName, "$", "entries", "100").Err())
+	// 	require.Error(t, rdb.Do(ctx, "xgroup", "setid", streamName, groupName, "$", "entriesread", "-100").Err())
+	// 	require.NoError(t, rdb.Do(ctx, "xgroup", "setid", streamName, groupName, "$", "entriesread", "100").Err())
+	// })
+
+	// t.Run("XINFO GROUPS and XINFO CONSUMERS", func(t *testing.T) {
+	// 	streamName := "test-stream"
+	// 	group1 := "t1"
+	// 	group2 := "t2"
+	// 	consumer1 := "c1"
+	// 	consumer2 := "c2"
+	// 	consumer3 := "c3"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"data", "a"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, group1, "$").Err())
+	// 	r := rdb.XInfoGroups(ctx, streamName).Val()
+	// 	require.Equal(t, group1, r[0].Name)
+	// 	require.Equal(t, int64(0), r[0].Consumers)
+	// 	require.Equal(t, int64(0), r[0].Pending)
+	// 	require.Equal(t, "1-0", r[0].LastDeliveredID)
+	// 	require.Equal(t, int64(0), r[0].EntriesRead)
+	// 	require.Equal(t, int64(0), r[0].Lag)
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "2-0",
+	// 		Values: []string{"data1", "b"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, group2, "$").Err())
+	// 	r = rdb.XInfoGroups(ctx, streamName).Val()
+	// 	require.Equal(t, group2, r[1].Name)
+	// 	require.Equal(t, "2-0", r[1].LastDeliveredID)
+
+	// 	require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group1, consumer1).Err())
+	// 	require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group1, consumer2).Err())
+	// 	require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group2, consumer3).Err())
+	// 	r = rdb.XInfoGroups(ctx, streamName).Val()
+	// 	require.Equal(t, int64(2), r[0].Consumers)
+	// 	require.Equal(t, int64(1), r[1].Consumers)
+
+	// 	r1 := rdb.XInfoConsumers(ctx, streamName, group1).Val()
+	// 	require.Equal(t, consumer1, r1[0].Name)
+	// 	require.Equal(t, consumer2, r1[1].Name)
+	// 	r1 = rdb.XInfoConsumers(ctx, streamName, group2).Val()
+	// 	require.Equal(t, consumer3, r1[0].Name)
+	// })
+
+	// t.Run("XINFO after delete pending message and related consumer, for issue #2350", func(t *testing.T) {
+	// 	streamName := "test-stream-2350"
+	// 	groupName := "test-group-2350"
+	// 	consumerName := "test-consumer-2350"
+	// 	require.NoError(t, rdb.XGroupCreateMkStream(ctx, streamName, groupName, "$").Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "*",
+	// 		Values: []string{"testing", "overflow"},
+	// 	}).Err())
+	// 	readRsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	})
+	// 	require.NoError(t, readRsp.Err())
+	// 	require.Len(t, readRsp.Val(), 1)
+	// 	streamRsp := readRsp.Val()[0]
+	// 	require.Len(t, streamRsp.Messages, 1)
+	// 	msgID := streamRsp.Messages[0]
+	// 	require.NoError(t, rdb.XAck(ctx, streamName, groupName, msgID.ID).Err())
+	// 	require.NoError(t, rdb.XGroupDelConsumer(ctx, streamName, groupName, consumerName).Err())
+	// 	infoRsp := rdb.XInfoGroups(ctx, streamName)
+	// 	require.NoError(t, infoRsp.Err())
+	// 	infoGroups := infoRsp.Val()
+	// 	require.Len(t, infoGroups, 1)
+	// 	infoGroup := infoGroups[0]
+	// 	require.Equal(t, groupName, infoGroup.Name)
+	// 	require.Equal(t, int64(0), infoGroup.Consumers)
+	// 	require.Equal(t, int64(0), infoGroup.Pending)
+	// 	require.Equal(t, msgID.ID, infoGroup.LastDeliveredID)
+	// })
+
+	// t.Run("XREAD After XGroupCreate and XGroupCreateConsumer, for issue #2109", func(t *testing.T) {
+	// 	streamName := "test-stream"
+	// 	group := "group"
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "*",
+	// 		Values: []string{"data1", "b"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, group, "0").Err())
+	// 	require.NoError(t, rdb.XGroupCreateConsumer(ctx, streamName, group, "consumer").Err())
+	// 	require.NoError(t, rdb.XRead(ctx, &redis.XReadArgs{
+	// 		Streams: []string{streamName, "0"},
+	// 	}).Err())
+	// })
+
+	// t.Run("XREADGROUP with different kinds of commands", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	consumerName := "myconsumer"
+	// 	r, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}}},
+	// 	}}, r)
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "2-0",
+	// 		Values: []string{"field2", "data2"},
+	// 	}).Err())
+	// 	r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "2-0", Values: map[string]interface{}{"field2": "data2"}}},
+	// 	}}, r)
+
+	// 	r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, "0"},
+	// 		Count:    2,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream: streamName,
+	// 		Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}},
+	// 			{ID: "2-0", Values: map[string]interface{}{"field2": "data2"}}},
+	// 	}}, r)
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "3-0",
+	// 		Values: []string{"field3", "data3"},
+	// 	}).Err())
+	// 	r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    true,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "3-0", Values: map[string]interface{}{"field3": "data3"}}},
+	// 	}}, r)
+	// 	r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, "0"},
+	// 		Count:    2,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream: streamName,
+	// 		Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}},
+	// 			{ID: "2-0", Values: map[string]interface{}{"field2": "data2"}}},
+	// 	}}, r)
+
+	// 	c := srv.NewClient()
+	// 	defer func() { require.NoError(t, c.Close()) }()
+	// 	ch := make(chan []redis.XStream)
+	// 	go func() {
+	// 		ch <- c.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 			Group:    groupName,
+	// 			Consumer: consumerName,
+	// 			Streams:  []string{streamName, ">"},
+	// 			Count:    2,
+	// 			Block:    10 * time.Second,
+	// 			NoAck:    false,
+	// 		}).Val()
+	// 	}()
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "4-0",
+	// 		Values: []string{"field4", "data4"},
+	// 	}).Err())
+	// 	r = <-ch
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "4-0", Values: map[string]interface{}{"field4": "data4"}}},
+	// 	}}, r)
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "5-0",
+	// 		Values: []string{"field5", "data5"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XDel(ctx, streamName, "5-0").Err())
+	// 	r, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, "5"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "5-0", Values: map[string]interface{}(nil)}},
+	// 	}}, r)
+	// })
+
+	// t.Run("Check xreadgroup fetches the newest data after create consumer in the command", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	consumerName := "myconsumer"
+	// 	err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Err()
+	// 	require.NoError(t, err)
+	// 	ri, erri := rdb.XInfoGroups(ctx, streamName).Result()
+	// 	require.NoError(t, erri)
+	// 	require.Equal(t, int64(1), ri[0].Consumers)
+	// })
+
+	// t.Run("XACK with different kinds of commands", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	r, err := rdb.XAck(ctx, streamName, groupName, "0-0").Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(0), r)
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	consumerName := "myconsumer"
+	// 	err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Err()
+	// 	require.NoError(t, err)
+	// 	r, err = rdb.XAck(ctx, streamName, groupName, "1-0").Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(1), r)
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "2-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "3-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "4-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    3,
+	// 		NoAck:    false,
+	// 	}).Err()
+	// 	require.NoError(t, err)
+	// 	r, err = rdb.XAck(ctx, streamName, groupName, "2-0", "3-0", "4-0").Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, int64(3), r)
+	// })
+
+	// t.Run("Simple XCLAIM command tests", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	consumerName := "myconsumer"
+	// 	consumer1Name := "myconsumer1"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	r, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}}},
+	// 	}}, r)
+
+	// 	claimedMessages, err := rdb.XClaim(ctx, &redis.XClaimArgs{
+	// 		Stream:   streamName,
+	// 		Group:    groupName,
+	// 		Consumer: consumer1Name,
+	// 		MinIdle:  0,
+	// 		Messages: []string{"1-0"},
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Len(t, claimedMessages, 1, "Expected to claim 1 message")
+	// 	require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
+
+	// 	time.Sleep(2000 * time.Millisecond)
+	// 	minIdleTime := 1000 * time.Millisecond
+	// 	claimedMessages, err = rdb.XClaim(ctx, &redis.XClaimArgs{
+	// 		Stream:   streamName,
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		MinIdle:  minIdleTime,
+	// 		Messages: []string{"1-0"},
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Len(t, claimedMessages, 1, "Expected to claim 1 message if idle time is large enough")
+	// 	require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
+
+	// 	minIdleTime = 60000 * time.Millisecond
+	// 	claimedMessages, err = rdb.XClaim(ctx, &redis.XClaimArgs{
+	// 		Stream:   streamName,
+	// 		Group:    groupName,
+	// 		Consumer: consumer1Name,
+	// 		MinIdle:  minIdleTime,
+	// 		Messages: []string{"1-0"},
+	// 	}).Result()
+
+	// 	require.NoError(t, err)
+	// 	require.Empty(t, claimedMessages, "Expected no messages to be claimed due to insufficient idle time")
+	// })
+
+	// t.Run("XCLAIM with different timing situations and options", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	consumerName := "myconsumer"
+	// 	consumer1Name := "myconsumer1"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	r, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		Streams:  []string{streamName, ">"},
+	// 		Count:    1,
+	// 		NoAck:    false,
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Equal(t, []redis.XStream{{
+	// 		Stream:   streamName,
+	// 		Messages: []redis.XMessage{{ID: "1-0", Values: map[string]interface{}{"field1": "data1"}}},
+	// 	}}, r)
+
+	// 	rawClaimedMessages, err := rdb.Do(ctx, "XCLAIM", streamName, groupName, consumer1Name, "0", "1-0", "IDLE", "5000").Result()
+	// 	require.NoError(t, err)
+	// 	messages, ok := rawClaimedMessages.([]interface{})
+	// 	require.True(t, ok, "Expected the result to be a slice of interface{}")
+	// 	firstMsg, ok := messages[0].([]interface{})
+	// 	require.True(t, ok, "Expected message details to be a slice of interface{}")
+	// 	msgID, ok := firstMsg[0].(string)
+	// 	require.True(t, ok, "Expected message ID to be a string")
+	// 	require.Equal(t, "1-0", msgID, "Expected claimed message ID to match")
+
+	// 	claimedMessages, err := rdb.XClaim(ctx, &redis.XClaimArgs{
+	// 		Stream:   streamName,
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		MinIdle:  2000 * time.Millisecond,
+	// 		Messages: []string{"1-0"},
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Len(t, claimedMessages, 1, "Expected to claim 1 message if idle time is large enough")
+	// 	require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
+
+	// 	tenSecondsAgo := time.Now().Add(-10 * time.Second).UnixMilli()
+	// 	rawClaimedMessages, err = rdb.Do(ctx, "XCLAIM", streamName, groupName, consumer1Name, "0", "1-0", "TIME", tenSecondsAgo).Result()
+	// 	require.NoError(t, err)
+	// 	messages, ok = rawClaimedMessages.([]interface{})
+	// 	require.True(t, ok, "Expected the result to be a slice of interface{}")
+	// 	firstMsg, ok = messages[0].([]interface{})
+	// 	require.True(t, ok, "Expected message details to be a slice of interface{}")
+	// 	msgID, ok = firstMsg[0].(string)
+	// 	require.True(t, ok, "Expected message ID to be a string")
+	// 	require.Equal(t, "1-0", msgID, "Expected claimed message ID to match")
+
+	// 	claimedMessages, err = rdb.XClaim(ctx, &redis.XClaimArgs{
+	// 		Stream:   streamName,
+	// 		Group:    groupName,
+	// 		Consumer: consumerName,
+	// 		MinIdle:  5000 * time.Millisecond,
+	// 		Messages: []string{"1-0"},
+	// 	}).Result()
+	// 	require.NoError(t, err)
+	// 	require.Len(t, claimedMessages, 1, "Expected to claim 1 message if idle time is large enough")
+	// 	require.Equal(t, "1-0", claimedMessages[0].ID, "Expected claimed message ID to match")
+	// })
+
+	// t.Run("XCLAIM command with different options", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	consumerName := "myconsumer"
+	// 	consumer1Name := "myconsumer1"
+
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: []string{"field1", "data1"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+
+	// 	rawClaimedMessages, err := rdb.Do(ctx, "XCLAIM", streamName, groupName, consumerName, "0", "1-0", "FORCE").Result()
+	// 	require.NoError(t, err)
+	// 	messages, ok := rawClaimedMessages.([]interface{})
+	// 	require.True(t, ok, "Expected the result to be a slice of interface{}")
+	// 	firstMsg, ok := messages[0].([]interface{})
+	// 	require.True(t, ok, "Expected message details to be a slice of interface{}")
+	// 	msgID, ok := firstMsg[0].(string)
+	// 	require.True(t, ok, "Expected message ID to be a string")
+	// 	require.Equal(t, "1-0", msgID, "Expected claimed message ID to match")
+
+	// 	cmd := rdb.XClaimJustID(ctx, &redis.XClaimArgs{
+	// 		Stream:   streamName,
+	// 		Group:    groupName,
+	// 		Consumer: consumer1Name,
+	// 		MinIdle:  0,
+	// 		Messages: []string{"1-0"},
+	// 	})
+
+	// 	claimedIDs, err := cmd.Result()
+	// 	require.NoError(t, err)
+	// 	require.Len(t, claimedIDs, 1, "Expected to claim exactly one message ID")
+	// 	require.Equal(t, "1-0", claimedIDs[0], "Expected claimed message ID to match")
+	// })
+
+	// t.Run("XAUTOCLAIM can claim PEL items from another consume", func(t *testing.T) {
+
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	var id1 string
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"a", "1"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		id1 = rsp.Val()
+	// 	}
+	// 	var id2 string
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"b", "2"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		id2 = rsp.Val()
+	// 	}
+	// 	var id3 string
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"c", "3"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		id3 = rsp.Val()
+	// 	}
+	// 	var id4 string
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"d", "4"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		id4 = rsp.Val()
+	// 	}
+
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+
+	// 	consumer1 := "consumer1"
+	// 	consumer2 := "consumer2"
+	// 	{
+	// 		rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 			Group:    groupName,
+	// 			Consumer: consumer1,
+	// 			Streams:  []string{streamName, ">"},
+	// 			Count:    1,
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		require.Len(t, rsp.Val(), 1)
+	// 		require.Len(t, rsp.Val()[0].Messages, 1)
+	// 		require.Equal(t, id1, rsp.Val()[0].Messages[0].ID)
+	// 		require.Len(t, rsp.Val()[0].Messages[0].Values, 1)
+	// 		require.Equal(t, "1", rsp.Val()[0].Messages[0].Values["a"])
+	// 	}
+
+	// 	{
+	// 		time.Sleep(200 * time.Millisecond)
+	// 		rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
+	// 			Stream:   streamName,
+	// 			Group:    groupName,
+	// 			Consumer: consumer2,
+	// 			MinIdle:  10 * time.Millisecond,
+	// 			Count:    1,
+	// 			Start:    "-",
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		msgs, start := rsp.Val()
+	// 		require.Equal(t, "0-0", start)
+	// 		require.Len(t, msgs, 1)
+	// 		require.Len(t, msgs[0].Values, 1)
+	// 		require.Equal(t, "1", msgs[0].Values["a"])
+	// 	}
+
+	// 	{
+	// 		rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 			Group:    groupName,
+	// 			Consumer: consumer1,
+	// 			Streams:  []string{streamName, ">"},
+	// 			Count:    3,
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+
+	// 		time.Sleep(time.Millisecond * 200)
+	// 		require.NoError(t, rdb.XDel(ctx, streamName, id2).Err())
+	// 	}
+
+	// 	{
+	// 		cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, consumer2, 10, "-", "COUNT", 3)
+	// 		require.NoError(t, cmd.Err())
+	// 		require.Equal(t, []interface{}{
+	// 			id4,
+	// 			[]interface{}{
+	// 				[]interface{}{
+	// 					id1,
+	// 					[]interface{}{"a", "1"},
+	// 				},
+	// 				[]interface{}{
+	// 					id3,
+	// 					[]interface{}{"c", "3"},
+	// 				},
+	// 			},
+	// 			[]interface{}{
+	// 				id2,
+	// 			},
+	// 		}, cmd.Val())
+	// 	}
+
+	// 	{
+	// 		time.Sleep(time.Millisecond * 200)
+	// 		require.NoError(t, rdb.XDel(ctx, streamName, id4).Err())
+	// 		rsp := rdb.XAutoClaimJustID(ctx, &redis.XAutoClaimArgs{
+	// 			Stream:   streamName,
+	// 			Group:    groupName,
+	// 			Consumer: consumer2,
+	// 			MinIdle:  10 * time.Millisecond,
+	// 			Start:    "-",
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		msgs, start := rsp.Val()
+	// 		require.Equal(t, "0-0", start)
+	// 		require.Len(t, msgs, 2)
+	// 		require.Equal(t, id1, msgs[0])
+	// 		require.Equal(t, id3, msgs[1])
+	// 	}
+	// })
+
+	// t.Run("XAUTOCLAIM as an iterator", func(t *testing.T) {
+	// 	streamName := "mystream"
+	// 	groupName := "mygroup"
+	// 	var id3, id5 string
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"a", "1"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 	}
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"b", "2"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 	}
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"c", "3"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		id3 = rsp.Val()
+	// 	}
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"d", "4"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 	}
+	// 	{
+	// 		rsp := rdb.XAdd(ctx, &redis.XAddArgs{
+	// 			Stream: streamName,
+	// 			ID:     "*",
+	// 			Values: []string{"e", "5"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		id5 = rsp.Val()
+	// 	}
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+
+	// 	consumer1, consumer2 := "consumer1", "consumer2"
+	// 	{
+	// 		rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 			Group:    groupName,
+	// 			Consumer: consumer1,
+	// 			Streams:  []string{streamName, ">"},
+	// 			Count:    90,
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		time.Sleep(200 * time.Millisecond)
+	// 	}
+	// 	{
+	// 		rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
+	// 			Stream:   streamName,
+	// 			Group:    groupName,
+	// 			Consumer: consumer2,
+	// 			MinIdle:  10 * time.Millisecond,
+	// 			Count:    2,
+	// 			Start:    "-",
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		msgs, start := rsp.Val()
+	// 		require.Equal(t, id3, start)
+	// 		require.Len(t, msgs, 2)
+	// 		require.Len(t, msgs[0].Values, 1)
+	// 		require.Equal(t, "1", msgs[0].Values["a"])
+	// 	}
+
+	// 	{
+	// 		rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
+	// 			Stream:   streamName,
+	// 			Group:    groupName,
+	// 			Consumer: consumer2,
+	// 			MinIdle:  10 * time.Millisecond,
+	// 			Start:    id3,
+	// 			Count:    2,
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		msgs, start := rsp.Val()
+	// 		require.Equal(t, id5, start)
+	// 		require.Len(t, msgs, 2)
+	// 		require.Len(t, msgs[0].Values, 1)
+	// 		require.Equal(t, "3", msgs[0].Values["c"])
+	// 	}
+
+	// 	{
+	// 		rsp := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
+	// 			Stream:   streamName,
+	// 			Group:    groupName,
+	// 			Consumer: consumer2,
+	// 			MinIdle:  10 * time.Millisecond,
+	// 			Start:    id5,
+	// 			Count:    1,
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		msgs, start := rsp.Val()
+	// 		require.Equal(t, "0-0", start)
+	// 		require.Len(t, msgs, 1)
+	// 		require.Len(t, msgs[0].Values, 1)
+	// 		require.Equal(t, "5", msgs[0].Values["e"])
+	// 	}
+	// })
+
+	// t.Run("XAUTOCLAIM with XDEL", func(t *testing.T) {
+	// 	streamName := "x"
+	// 	groupName := "grp"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: map[string]interface{}{"f": "v"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "2-0",
+	// 		Values: map[string]interface{}{"f": "v"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "3-0",
+	// 		Values: map[string]interface{}{"f": "v"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	{
+	// 		rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 			Group:    groupName,
+	// 			Consumer: "Alice",
+	// 			Streams:  []string{streamName, ">"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		require.Len(t, rsp.Val(), 1)
+	// 		require.Len(t, rsp.Val()[0].Messages, 3)
+	// 		require.Equal(t, "1-0", rsp.Val()[0].Messages[0].ID)
+	// 		require.Equal(t, "v", rsp.Val()[0].Messages[0].Values["f"])
+	// 		require.Equal(t, "2-0", rsp.Val()[0].Messages[1].ID)
+	// 		require.Equal(t, "v", rsp.Val()[0].Messages[1].Values["f"])
+	// 		require.Equal(t, "3-0", rsp.Val()[0].Messages[2].ID)
+	// 		require.Equal(t, "v", rsp.Val()[0].Messages[2].Values["f"])
+	// 	}
+	// 	{
+	// 		require.NoError(t, rdb.XDel(ctx, streamName, "2-0").Err())
+	// 		cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "0-0")
+	// 		require.NoError(t, cmd.Err())
+	// 		require.Equal(t, []interface{}{
+	// 			"0-0",
+	// 			[]interface{}{
+	// 				[]interface{}{
+	// 					"1-0",
+	// 					[]interface{}{"f", "v"},
+	// 				},
+	// 				[]interface{}{
+	// 					"3-0",
+	// 					[]interface{}{"f", "v"},
+	// 				},
+	// 			},
+	// 			[]interface{}{
+	// 				"2-0",
+	// 			},
+	// 		}, cmd.Val())
+	// 	}
+	// })
+
+	// t.Run("XAUTOCLAIM with XDEL and count", func(t *testing.T) {
+	// 	streamName := "x"
+	// 	groupName := "grp"
+	// 	require.NoError(t, rdb.Del(ctx, streamName).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "1-0",
+	// 		Values: map[string]interface{}{"f": "v"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "2-0",
+	// 		Values: map[string]interface{}{"f": "v"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XAdd(ctx, &redis.XAddArgs{
+	// 		Stream: streamName,
+	// 		ID:     "3-0",
+	// 		Values: map[string]interface{}{"f": "v"},
+	// 	}).Err())
+	// 	require.NoError(t, rdb.XGroupCreate(ctx, streamName, groupName, "0").Err())
+	// 	{
+	// 		rsp := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{
+	// 			Group:    groupName,
+	// 			Consumer: "Alice",
+	// 			Streams:  []string{streamName, ">"},
+	// 		})
+	// 		require.NoError(t, rsp.Err())
+	// 		require.Len(t, rsp.Val(), 1)
+	// 		require.Len(t, rsp.Val()[0].Messages, 3)
+	// 		require.Equal(t, "1-0", rsp.Val()[0].Messages[0].ID)
+	// 		require.Equal(t, "v", rsp.Val()[0].Messages[0].Values["f"])
+	// 		require.Equal(t, "2-0", rsp.Val()[0].Messages[1].ID)
+	// 		require.Equal(t, "v", rsp.Val()[0].Messages[1].Values["f"])
+	// 		require.Equal(t, "3-0", rsp.Val()[0].Messages[2].ID)
+	// 		require.Equal(t, "v", rsp.Val()[0].Messages[2].Values["f"])
+	// 	}
+	// 	{
+	// 		require.NoError(t, rdb.XDel(ctx, streamName, "1-0").Err())
+	// 		require.NoError(t, rdb.XDel(ctx, streamName, "2-0").Err())
+	// 		cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "0-0", "COUNT", 1)
+	// 		require.NoError(t, cmd.Err())
+	// 		require.Equal(t, []interface{}{
+	// 			"2-0",
+	// 			[]interface{}{},
+	// 			[]interface{}{
+	// 				"1-0",
+	// 			},
+	// 		}, cmd.Val())
+	// 	}
+	// 	{
+	// 		cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "2-0", "COUNT", 1)
+	// 		require.NoError(t, cmd.Err())
+	// 		require.Equal(t, []interface{}{
+	// 			"3-0",
+	// 			[]interface{}{},
+	// 			[]interface{}{
+	// 				"2-0",
+	// 			},
+	// 		}, cmd.Val())
+	// 	}
+	// 	{
+	// 		cmd := rdb.Do(ctx, "XAUTOCLAIM", streamName, groupName, "Bob", 0, "3-0", "COUNT", 1)
+	// 		require.NoError(t, cmd.Err())
+	// 		require.Equal(t, []interface{}{
+	// 			"0-0",
+	// 			[]interface{}{
+	// 				[]interface{}{
+	// 					"3-0",
+	// 					[]interface{}{"f", "v"},
+	// 				},
+	// 			},
+	// 			[]interface{}{},
+	// 		}, cmd.Val())
+	// 	}
+	// 	// assert_equal [XPENDING x grp - + 10 Alice] {}
+	// 	// add xpending to this test case when it is supported
+	// })
+
+	// t.Run("XAUTOCLAIM with out of range count", func(t *testing.T) {
+	// 	err := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{
+	// 		Stream:   "x",
+	// 		Group:    "grp",
+	// 		Consumer: "Bob",
+	// 		MinIdle:  0,
+	// 		Start:    "3-0",
+	// 		Count:    8070450532247928833,
+	// 	}).Err()
+	// 	require.Error(t, err)
+	// 	require.True(t, strings.HasPrefix(err.Error(), "ERR COUNT"))
+	// })
+
+	// t.Run("XAUTOCLAIM COUNT must be > 0", func(t *testing.T) {
+	// 	cmd := rdb.Do(ctx, "XAUTOCLAIM", "key", "group", "consumer", 1, 1, "COUNT", 0)
+	// 	require.Error(t, cmd.Err())
+	// 	require.Equal(t, "ERR COUNT must be > 0", cmd.Err().Error())
+	// })
 }
 
 func parseStreamEntryID(id string) (ts int64, seqNum int64) {