You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@kvrocks.apache.org by GitBox <gi...@apache.org> on 2022/09/12 09:35:07 UTC

[GitHub] [incubator-kvrocks] suica commented on a diff in pull request #866: Move TCL test unit/type/list to Go case

suica commented on code in PR #866:
URL: https://github.com/apache/incubator-kvrocks/pull/866#discussion_r968195825


##########
tests/gocase/unit/type/list/list_test.go:
##########
@@ -39,6 +39,118 @@ var largeValue = map[string]string{
 	"linkedList": strings.Repeat("hello", 4),
 }
 
+func TestList(t *testing.T) {
+	srv := util.StartServer(t, map[string]string{})
+	defer srv.Close()
+	ctx := context.Background()
+	rdb := srv.NewClient()
+	defer func() { require.NoError(t, rdb.Close()) }()
+
+	rand.Seed(0)
+
+	t.Run("LPUSH, RPUSH, LLENGTH, LINDEX, LPOP - ziplist", func(t *testing.T) {
+		myZipList1 := "myziplist1"
+		myZipList2 := "myziplist2"
+
+		// first lpush then rpush
+		require.EqualValues(t, 1, rdb.LPush(ctx, myZipList1, "aa").Val())
+		require.EqualValues(t, 2, rdb.RPush(ctx, myZipList1, "bb").Val())
+		require.EqualValues(t, 3, rdb.RPush(ctx, myZipList1, "cc").Val())
+		require.EqualValues(t, 3, rdb.LLen(ctx, myZipList1).Val())
+		require.EqualValues(t, "aa", rdb.LIndex(ctx, myZipList1, 0).Val())
+		require.EqualValues(t, "bb", rdb.LIndex(ctx, myZipList1, 1).Val())
+		require.EqualValues(t, "cc", rdb.LIndex(ctx, myZipList1, 2).Val())
+		require.EqualValues(t, "", rdb.LIndex(ctx, myZipList2, 3).Val())
+
+		require.EqualValues(t, "cc", rdb.RPop(ctx, myZipList1).Val())
+		require.EqualValues(t, "aa", rdb.LPop(ctx, myZipList1).Val())
+
+		// first rpush then lpush
+		require.EqualValues(t, 1, rdb.RPush(ctx, myZipList2, "a").Val())
+		require.EqualValues(t, 2, rdb.LPush(ctx, myZipList2, "b").Val())
+		require.EqualValues(t, 3, rdb.LPush(ctx, myZipList2, "c").Val())
+		require.EqualValues(t, 3, rdb.LLen(ctx, myZipList2).Val())
+
+		require.EqualValues(t, "c", rdb.LIndex(ctx, myZipList2, 0).Val())
+		require.EqualValues(t, "b", rdb.LIndex(ctx, myZipList2, 1).Val())
+		require.EqualValues(t, "a", rdb.LIndex(ctx, myZipList2, 2).Val())
+		require.EqualValues(t, "", rdb.LIndex(ctx, myZipList2, 3).Val())
+
+		require.EqualValues(t, "a", rdb.RPop(ctx, myZipList2).Val())
+		require.EqualValues(t, "c", rdb.LPop(ctx, myZipList2).Val())
+	})
+
+	t.Run("LPUSH, RPUSH, LLENGTH, LINDEX, LPOP - regular list", func(t *testing.T) {
+		myList1 := "mylist1"
+		myList2 := "mylist2"
+
+		linkedListValue := largeValue["linkedList"]
+
+		// first lpush then rpush
+		require.EqualValues(t, 1, rdb.LPush(ctx, myList1, linkedListValue).Val())
+		require.EqualValues(t, 2, rdb.RPush(ctx, myList1, "b").Val())
+		require.EqualValues(t, 3, rdb.RPush(ctx, myList1, "c").Val())
+		require.EqualValues(t, 3, rdb.LLen(ctx, myList1).Val())
+		require.EqualValues(t, linkedListValue, rdb.LIndex(ctx, myList1, 0).Val())
+		require.EqualValues(t, "b", rdb.LIndex(ctx, myList1, 1).Val())
+		require.EqualValues(t, "c", rdb.LIndex(ctx, myList1, 2).Val())
+		require.EqualValues(t, "", rdb.LIndex(ctx, myList1, 3).Val())
+		require.EqualValues(t, "c", rdb.RPop(ctx, myList1).Val())
+		require.EqualValues(t, linkedListValue, rdb.LPop(ctx, myList1).Val())
+
+		// first rpush then lpush
+		require.EqualValues(t, 1, rdb.RPush(ctx, myList2, linkedListValue).Val())
+		require.EqualValues(t, 2, rdb.LPush(ctx, myList2, "b").Val())
+		require.EqualValues(t, 3, rdb.LPush(ctx, myList2, "c").Val())
+		require.EqualValues(t, 3, rdb.LLen(ctx, myList2).Val())
+
+		require.EqualValues(t, "c", rdb.LIndex(ctx, myList2, 0).Val())
+		require.EqualValues(t, "b", rdb.LIndex(ctx, myList2, 1).Val())
+		require.EqualValues(t, linkedListValue, rdb.LIndex(ctx, myList2, 2).Val())
+		require.EqualValues(t, "", rdb.LIndex(ctx, myList2, 3).Val())
+		require.EqualValues(t, linkedListValue, rdb.RPop(ctx, myList2).Val())
+		require.EqualValues(t, "c", rdb.LPop(ctx, myList2).Val())
+	})
+
+	t.Run("R&LPOP against empty list", func(t *testing.T) {
+		require.Error(t, rdb.LPop(ctx, "non-existing-list").Err())
+	})
+
+	t.Run("Variadic RPUSH&LPUSH", func(t *testing.T) {
+		myList := "mylist"
+		require.NoError(t, rdb.Del(ctx, myList).Err())
+		require.EqualValues(t, 4, rdb.LPush(ctx, myList, "a", "b", "c", "d").Val())
+		require.EqualValues(t, 8, rdb.RPush(ctx, myList, "0", "1", "2", "3").Val())
+		require.Equal(t, []string{"d", "c", "b", "a", "0", "1", "2", "3"}, rdb.LRange(ctx, myList, 0, -1).Val())
+	})
+
+	t.Run("DEL a list", func(t *testing.T) {
+		myList2 := "mylist2"
+		require.EqualValues(t, 1, rdb.Del(ctx, myList2).Val())
+		require.EqualValues(t, 0, rdb.Exists(ctx, myList2).Val())
+		require.EqualValues(t, 0, rdb.LLen(ctx, myList2).Val())
+	})
+
+	createList := func(key string, entries []string) {
+		require.NoError(t, rdb.Del(ctx, key).Err())
+		for _, v := range entries {
+			require.NoError(t, rdb.RPush(ctx, key, v).Err())
+		}
+	}
+
+	for typ, value := range largeValue {
+		t.Run(fmt.Sprintf("BLPOP, BRPOP: single existing list - %s", typ), func(t *testing.T) {
+			c := srv.NewTCPClient()
+			defer func() { require.NoError(t, c.Close()) }()
+			createList("blist", []string{"a", "b", value, "c", "d"})
+			res := rdb.LRange(ctx, "blist", 0, -1).Val()
+			fmt.Println(res)
+			require.NoError(t, c.Write("*3\r\n$5\r\nBLPOP\r\n$5\r\nblist\r\n$1\r\n1\r\n"))

Review Comment:
   I used raw protocol here.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@kvrocks.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org