plugins/tests/test.go
Star b6bb3098bc update dao
many other updates
2024-03-24 12:28:02 +08:00

108 lines
2.7 KiB
Go

package tests
import (
"fmt"
"github.com/ssgo/u"
"github.com/tidwall/redcon"
"strings"
"testing"
)
var testIndex = 0
func Test(t *testing.T, title string, ok bool, info ...interface{}) {
testIndex++
if ok {
fmt.Println(u.Cyan(fmt.Sprint("#", testIndex)), title, u.BGreen("【Succeed】"))
} else {
a := make([]interface{}, len(info))
for i := 0; i < len(info); i++ {
a[i] = u.StringP(info[i])
}
t.Fatal(append([]interface{}{u.Cyan(fmt.Sprintln("#", testIndex)), title, u.BRed("【Failed】")}, a...)...)
}
}
var _rdData = map[string][]byte{}
var _rdIncr = map[string]int{}
var _rdMData = map[string]map[string][]byte{}
func StartRedis(port string) *redcon.Server {
_rdData = map[string][]byte{}
_rdIncr = map[string]int{}
_rdMData = map[string]map[string][]byte{}
rdServer := redcon.NewServer(":"+port, func(conn redcon.Conn, cmd redcon.Command) {
//fmt.Println(u.BCyan("redis command " + string(cmd.Raw)))
switch strings.ToUpper(string(cmd.Args[0])) {
case "SET":
_rdData[string(cmd.Args[1])] = cmd.Args[2]
conn.WriteString("OK")
case "SETEX":
_rdData[string(cmd.Args[1])] = cmd.Args[3]
conn.WriteString("OK")
case "MSET":
for i := 1; i < len(cmd.Args); i += 2 {
_rdData[string(cmd.Args[i])] = cmd.Args[i+1]
}
conn.WriteString("OK")
case "GET":
conn.WriteBulk(_rdData[string(cmd.Args[1])])
case "DEL":
delete(_rdData, string(cmd.Args[1]))
conn.WriteInt(1)
case "EXISTS":
if _rdData[string(cmd.Args[1])] == nil {
conn.WriteInt(0)
} else {
conn.WriteInt(1)
}
case "INCR":
_rdIncr[string(cmd.Args[1])]++
conn.WriteInt(_rdIncr[string(cmd.Args[1])])
case "HSET":
data := _rdMData[string(cmd.Args[1])]
if data == nil {
data = map[string][]byte{}
_rdMData[string(cmd.Args[1])] = data
}
data[string(cmd.Args[2])] = cmd.Args[3]
conn.WriteString("OK")
case "HDEL":
data := _rdMData[string(cmd.Args[1])]
if data != nil {
delete(data, string(cmd.Args[2]))
}
conn.WriteString("OK")
case "HGETALL":
data := _rdMData[string(cmd.Args[1])]
if data != nil {
conn.WriteArray(len(data) * 2)
for k, v := range data {
conn.WriteBulkString(k)
conn.WriteBulk(v)
}
} else {
conn.WriteArray(0)
}
case "ECHO":
conn.WriteBulk(cmd.Args[1])
case "SELECT", "SUBSCRIBE", "UNSUBSCRIBE", "PUNSUBSCRIBE":
conn.WriteString("OK")
default:
fmt.Println(u.BYellow("unknown redis command " + string(cmd.Raw)))
conn.WriteString("OK")
}
}, func(conn redcon.Conn) bool {
return true
}, func(conn redcon.Conn, err error) {
})
go func() {
err := rdServer.ListenAndServe()
if err != nil {
fmt.Println(err.Error())
}
}()
return rdServer
}