123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- package cache
- import (
- "errors"
- "strings"
- "sync"
- "testing"
- "time"
- "github.com/redis/go-redis/v9"
- )
- const (
- TEST_PREFIX = "test"
- )
- func getRedisConnection() error {
- return InitRedisClient("0.0.0.0:6379", "difyai123456", false)
- }
- func TestRedisConnection(t *testing.T) {
- // get redis connection
- if err := getRedisConnection(); err != nil {
- t.Errorf("get redis connection failed: %v", err)
- return
- }
- // close
- if err := Close(); err != nil {
- t.Errorf("close redis client failed: %v", err)
- return
- }
- }
- func TestRedisTransaction(t *testing.T) {
- // get redis connection
- if err := getRedisConnection(); err != nil {
- t.Errorf("get redis connection failed: %v", err)
- return
- }
- defer Close()
- // test transaction
- err := Transaction(func(p redis.Pipeliner) error {
- // set key
- if err := Store(
- strings.Join([]string{TEST_PREFIX, "key"}, ":"),
- "value",
- time.Second,
- p,
- ); err != nil {
- t.Errorf("store key failed: %v", err)
- return err
- }
- return errors.New("test transaction error")
- })
- if err == nil {
- t.Errorf("transaction should return error")
- return
- }
- // get key
- value, err := GetString(
- strings.Join([]string{TEST_PREFIX, "key"}, ":"),
- )
- if err != ErrNotFound {
- t.Errorf("key should not exist")
- return
- }
- if value != "" {
- t.Errorf("value should be empty")
- return
- }
- // test success transaction
- err = Transaction(func(p redis.Pipeliner) error {
- // set key
- if err := Store(
- strings.Join([]string{TEST_PREFIX, "key"}, ":"),
- "value",
- time.Second,
- p,
- ); err != nil {
- t.Errorf("store key failed: %v", err)
- return err
- }
- return nil
- })
- if err != nil {
- t.Errorf("transaction should not return error")
- return
- }
- defer Del(strings.Join([]string{TEST_PREFIX, "key"}, ":"))
- // get key
- value, err = GetString(
- strings.Join([]string{TEST_PREFIX, "key"}, ":"),
- )
- if err != nil {
- t.Errorf("get key failed: %v", err)
- return
- }
- if value != "value" {
- t.Errorf("value should be value")
- return
- }
- }
- func TestRedisScanMap(t *testing.T) {
- // get redis connection
- if err := getRedisConnection(); err != nil {
- t.Errorf("get redis connection failed: %v", err)
- return
- }
- defer Close()
- type s struct {
- Field string `json:"field"`
- }
- err := SetMapOneField(strings.Join([]string{TEST_PREFIX, "map"}, ":"), "key1", s{Field: "value1"})
- if err != nil {
- t.Errorf("set map failed: %v", err)
- return
- }
- defer Del(strings.Join([]string{TEST_PREFIX, "map"}, ":"))
- err = SetMapOneField(strings.Join([]string{TEST_PREFIX, "map"}, ":"), "key2", s{Field: "value2"})
- if err != nil {
- t.Errorf("set map failed: %v", err)
- return
- }
- err = SetMapOneField(strings.Join([]string{TEST_PREFIX, "map"}, ":"), "key3", s{Field: "value3"})
- if err != nil {
- t.Errorf("set map failed: %v", err)
- return
- }
- err = SetMapOneField(strings.Join([]string{TEST_PREFIX, "map"}, ":"), "4", s{Field: "value4"})
- if err != nil {
- t.Errorf("set map failed: %v", err)
- return
- }
- data, err := ScanMap[s](strings.Join([]string{TEST_PREFIX, "map"}, ":"), "key*")
- if err != nil {
- t.Errorf("scan map failed: %v", err)
- return
- }
- if len(data) != 3 {
- t.Errorf("scan map should return 3")
- return
- }
- if data["key1"].Field != "value1" {
- t.Errorf("scan map should return value1")
- return
- }
- if data["key2"].Field != "value2" {
- t.Errorf("scan map should return value2")
- return
- }
- if data["key3"].Field != "value3" {
- t.Errorf("scan map should return value3")
- return
- }
- err = ScanMapAsync[s](strings.Join([]string{TEST_PREFIX, "map"}, ":"), "4", func(m map[string]s) error {
- if len(m) != 1 {
- t.Errorf("scan map async should return 1")
- return errors.New("scan map async should return 1")
- }
- if m["4"].Field != "value4" {
- t.Errorf("scan map async should return value4")
- return errors.New("scan map async should return value4")
- }
- return nil
- })
- if err != nil {
- t.Errorf("scan map async failed: %v", err)
- return
- }
- }
- func TestRedisP2PPubsub(t *testing.T) {
- // get redis connection
- if err := getRedisConnection(); err != nil {
- t.Errorf("get redis connection failed: %v", err)
- return
- }
- defer Close()
- ch := "test-channel"
- type s struct{}
- sub, cancel := Subscribe[s](ch)
- defer cancel()
- wg := sync.WaitGroup{}
- wg.Add(1)
- go func() {
- <-sub
- wg.Done()
- }()
- // test pubsub
- err := Publish(ch, s{})
- if err != nil {
- t.Errorf("publish failed: %v", err)
- return
- }
- wg.Wait()
- }
- func TestRedisP2ARedis(t *testing.T) {
- // get redis connection
- if err := getRedisConnection(); err != nil {
- t.Errorf("get redis connection failed: %v", err)
- return
- }
- defer Close()
- ch := "test-channel-p2a"
- type s struct{}
- wg := sync.WaitGroup{}
- wg.Add(3)
- swg := sync.WaitGroup{}
- swg.Add(3)
- for i := 0; i < 3; i++ {
- go func() {
- sub, cancel := Subscribe[s](ch)
- swg.Done()
- defer cancel()
- <-sub
- wg.Done()
- }()
- }
- swg.Wait()
- // test pubsub
- err := Publish(ch, s{})
- if err != nil {
- t.Errorf("publish failed: %v", err)
- return
- }
- wg.Wait()
- }
- func TestGetRedisOptions(t *testing.T) {
- opts := getRedisOptions("dummy:6379", "password", false)
- if opts.TLSConfig != nil {
- t.Errorf("TLSConfig should not be set")
- return
- }
- opts = getRedisOptions("dummy:6379", "password", true)
- if opts.TLSConfig == nil {
- t.Errorf("TLSConfig should be set")
- return
- }
- }
|