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 }