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 { t.Fatal(append([]interface{}{u.Cyan(fmt.Sprintln("#", testIndex)), title, u.BRed("Failed")}, info...)...) } } var _rdData = map[string][]byte{} var _rdIncr = map[string]int{} var _rdMData = map[string]map[string][]byte{} func StartRedis(port string) *redcon.Server { 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 "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) } 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 }