Skip to content

Commit 7854f7e

Browse files
authored
feat: Pika Quality (#3187)
* test: add test for SPOP response format compatibility
1 parent 7e12e9a commit 7854f7e

4 files changed

Lines changed: 146 additions & 5 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package pika_integration
2+
3+
import (
4+
"net"
5+
. "github.com/bsm/ginkgo/v2"
6+
. "github.com/bsm/gomega"
7+
)
8+
9+
var _ = Describe("Telnet", func() {
10+
Describe("core dump fix", func() {
11+
It("should handle empty commands without crashing (telnet core dump fix)", func() {
12+
conn, err := net.Dial("tcp", SINGLEADDR)
13+
Expect(err).NotTo(HaveOccurred())
14+
defer conn.Close()
15+
16+
_, err = conn.Write([]byte("\n"))
17+
Expect(err).NotTo(HaveOccurred())
18+
19+
_, err = conn.Write([]byte("*1\r\n$4\r\nPING\r\n"))
20+
Expect(err).NotTo(HaveOccurred())
21+
22+
buf := make([]byte, 1024)
23+
n, err := conn.Read(buf)
24+
Expect(err).NotTo(HaveOccurred())
25+
response := string(buf[:n])
26+
Expect(response).To(ContainSubstring("+PONG"))
27+
28+
_, err = conn.Write([]byte("*2\r\n$4\r\nECHO\r\n$4\r\nTEST\r\n"))
29+
Expect(err).NotTo(HaveOccurred())
30+
31+
n, err = conn.Read(buf)
32+
Expect(err).NotTo(HaveOccurred())
33+
response = string(buf[:n])
34+
Expect(response).To(ContainSubstring("$4\r\nTEST"))
35+
})
36+
37+
It("should handle multiple empty commands without crashing", func() {
38+
conn, err := net.Dial("tcp", SINGLEADDR)
39+
Expect(err).NotTo(HaveOccurred())
40+
defer conn.Close()
41+
42+
for i := 0; i < 5; i++ {
43+
_, err = conn.Write([]byte("\r\n"))
44+
Expect(err).NotTo(HaveOccurred())
45+
}
46+
47+
_, err = conn.Write([]byte("*1\r\n$4\r\nPING\r\n"))
48+
Expect(err).NotTo(HaveOccurred())
49+
50+
buf := make([]byte, 1024)
51+
n, err := conn.Read(buf)
52+
Expect(err).NotTo(HaveOccurred())
53+
response := string(buf[:n])
54+
Expect(response).To(ContainSubstring("+PONG"))
55+
})
56+
})
57+
})

tests/integration/server_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,31 @@ var _ = Describe("Server", func() {
418418
Expect(configRewrite.Err()).NotTo(HaveOccurred())
419419
Expect(configRewrite.Val()).To(Equal("OK"))
420420
})
421+
422+
// Test for cache-value-item-max-size & max-key-size-in-cache
423+
It("should handle cache size configurations correctly", func() {
424+
configGet := client.ConfigGet(ctx, "cache-value-item-max-size")
425+
Expect(configGet.Err()).NotTo(HaveOccurred())
426+
Expect(configGet.Val()).To(HaveKey("cache-value-item-max-size"))
427+
428+
configGet2 := client.ConfigGet(ctx, "max-key-size-in-cache")
429+
Expect(configGet2.Err()).NotTo(HaveOccurred())
430+
Expect(configGet2.Val()).To(HaveKey("max-key-size-in-cache"))
431+
432+
configSet1 := client.ConfigSet(ctx, "cache-value-item-max-size", "1024")
433+
Expect(configSet1.Err()).NotTo(HaveOccurred())
434+
Expect(configSet1.Val()).To(Equal("OK"))
435+
436+
configSet2 := client.ConfigSet(ctx, "max-key-size-in-cache", "1048576")
437+
Expect(configSet2.Err()).NotTo(HaveOccurred())
438+
Expect(configSet2.Val()).To(Equal("OK"))
439+
440+
configGet3 := client.ConfigGet(ctx, "cache-value-item-max-size")
441+
Expect(configGet3.Val()["cache-value-item-max-size"]).To(Equal("1024"))
442+
443+
configGet4 := client.ConfigGet(ctx, "max-key-size-in-cache")
444+
Expect(configGet4.Val()["max-key-size-in-cache"]).To(Equal("1048576"))
445+
})
421446
//It("should DBSize", func() {
422447
// Expect(client.Set(ctx, "key", "value", 0).Val()).To(Equal("OK"))
423448
// Expect(client.Do(ctx, "info", "keyspace", "1").Err()).NotTo(HaveOccurred())
@@ -739,5 +764,27 @@ var _ = Describe("Server", func() {
739764
Expect(client.Get(ctx, "foo").Err()).To(MatchError(redis.Nil))
740765
Expect(client.Get(ctx, "key1").Err()).To(MatchError(redis.Nil))
741766
})
767+
768+
//fix: added the correct loading of admin-cmd-list in the configuration file
769+
It("should load admin-cmd-list from config correctly", func() {
770+
configGet := client.ConfigGet(ctx, "admin-cmd-list")
771+
Expect(configGet.Err()).NotTo(HaveOccurred())
772+
Expect(configGet.Val()).To(HaveLen(1))
773+
774+
adminCmdList, ok := configGet.Val()["admin-cmd-list"]
775+
Expect(ok).To(BeTrue())
776+
777+
Expect(adminCmdList).To(ContainSubstring("auth"))
778+
Expect(adminCmdList).To(ContainSubstring("config"))
779+
Expect(adminCmdList).To(ContainSubstring("info"))
780+
Expect(adminCmdList).To(ContainSubstring("ping"))
781+
Expect(adminCmdList).To(ContainSubstring("monitor"))
782+
})
783+
784+
// fix add auth command to admin-thread-pool
785+
It("should process auth command in admin thread pool", func() {
786+
auth := client.Do(ctx, "auth", "wrongpassword")
787+
Expect(auth.Err()).To(HaveOccurred())
788+
})
742789
})
743790
})

tests/integration/set_test.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -270,14 +270,26 @@ var _ = Describe("Set Commands", func() {
270270
sAdd = client.SAdd(ctx, "set", "three")
271271
Expect(sAdd.Err()).NotTo(HaveOccurred())
272272

273-
// 报错:redis: can't parse reply="*1" reading string
274-
//sPop := client.SPop(ctx, "set")
275-
//Expect(sPop.Err()).NotTo(HaveOccurred())
276-
//Expect(sPop.Val()).NotTo(Equal(""))
273+
sPop := client.SPop(ctx, "set")
274+
Expect(sPop.Err()).NotTo(HaveOccurred())
275+
Expect(sPop.Val()).NotTo(Equal(""))
277276

278277
sMembers := client.SMembers(ctx, "set")
279278
Expect(sMembers.Err()).NotTo(HaveOccurred())
280-
Expect(sMembers.Val()).To(HaveLen(3))
279+
Expect(sMembers.Val()).To(HaveLen(2))
280+
281+
// 再添加一个元素进行批量弹出测试
282+
sAdd = client.SAdd(ctx, "set2", "one")
283+
Expect(sAdd.Err()).NotTo(HaveOccurred())
284+
sAdd = client.SAdd(ctx, "set2", "two")
285+
Expect(sAdd.Err()).NotTo(HaveOccurred())
286+
sAdd = client.SAdd(ctx, "set2", "three")
287+
Expect(sAdd.Err()).NotTo(HaveOccurred())
288+
289+
// 测试多个元素弹出,应该返回数组
290+
sPopN := client.SPopN(ctx, "set2", 2)
291+
Expect(sPopN.Err()).NotTo(HaveOccurred())
292+
Expect(sPopN.Val()).To(HaveLen(2))
281293

282294
err := client.Do(ctx, "SPOP", "set", 1, 2).Err()
283295
Expect(err).To(MatchError(ContainSubstring("ERR wrong number of arguments for 'spop' command")))

tests/unit/type/set.tcl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,31 @@ start_server {
310310
}
311311
}
312312

313+
test {SPOP response format for PHP Redis client compatibility} {
314+
r del myset
315+
r sadd myset "element1" "element2" "element3"
316+
set single_pop [r spop myset]
317+
assert {[lsearch {"element1" "element2" "element3"} $single_pop] >= 0}
318+
319+
r del myset
320+
r sadd myset "element1" "element2" "element3"
321+
set single_array_pop [r spop myset 1]
322+
assert_equal 1 [llength $single_array_pop]
323+
assert {[lsearch {"element1" "element2" "element3"} [lindex $single_array_pop 0]] >= 0}
324+
325+
r del myset
326+
r sadd myset "element1" "element2" "element3"
327+
set multi_pop [r spop myset 2]
328+
assert_equal 2 [llength $multi_pop]
329+
330+
r del emptyset
331+
set empty_pop [r spop emptyset]
332+
assert_equal {} $empty_pop
333+
334+
set empty_array_pop [r spop emptyset 1]
335+
assert_equal 0 [llength $empty_array_pop]
336+
}
337+
313338
test "SRANDMEMBER with <count> against non existing key" {
314339
r srandmember nonexisting_key 100
315340
} {}

0 commit comments

Comments
 (0)