github.com/gogf/gf@v1.16.9/database/gredis/gredis_z_unit_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gredis_test
     8  
     9  import (
    10  	"github.com/gogf/gf/container/gvar"
    11  	"github.com/gogf/gf/frame/g"
    12  	"github.com/gogf/gf/util/guid"
    13  	"github.com/gogf/gf/util/gutil"
    14  	"testing"
    15  	"time"
    16  
    17  	"github.com/gogf/gf/os/gtime"
    18  	"github.com/gogf/gf/util/gconv"
    19  
    20  	"github.com/gogf/gf/database/gredis"
    21  	"github.com/gogf/gf/test/gtest"
    22  )
    23  
    24  var (
    25  	config = &gredis.Config{
    26  		Host: "127.0.0.1",
    27  		Port: 6379,
    28  		Db:   1,
    29  	}
    30  )
    31  
    32  func Test_NewClose(t *testing.T) {
    33  	gtest.C(t, func(t *gtest.T) {
    34  		redis := gredis.New(config)
    35  		t.AssertNE(redis, nil)
    36  		err := redis.Close()
    37  		t.Assert(err, nil)
    38  	})
    39  }
    40  
    41  func Test_Do(t *testing.T) {
    42  	gtest.C(t, func(t *gtest.T) {
    43  		redis := gredis.New(config)
    44  		defer redis.Close()
    45  		_, err := redis.Do("SET", "k", "v")
    46  		t.Assert(err, nil)
    47  
    48  		r, err := redis.Do("GET", "k")
    49  		t.Assert(err, nil)
    50  		t.Assert(r, []byte("v"))
    51  
    52  		_, err = redis.Do("DEL", "k")
    53  		t.Assert(err, nil)
    54  		r, err = redis.Do("GET", "k")
    55  		t.Assert(err, nil)
    56  		t.Assert(r, nil)
    57  	})
    58  }
    59  
    60  func Test_Stats(t *testing.T) {
    61  	gtest.C(t, func(t *gtest.T) {
    62  		redis := gredis.New(config)
    63  		defer redis.Close()
    64  		redis.SetMaxIdle(2)
    65  		redis.SetMaxActive(100)
    66  		redis.SetIdleTimeout(500 * time.Millisecond)
    67  		redis.SetMaxConnLifetime(500 * time.Millisecond)
    68  
    69  		array := make([]*gredis.Conn, 0)
    70  		for i := 0; i < 10; i++ {
    71  			array = append(array, redis.Conn())
    72  		}
    73  		stats := redis.Stats()
    74  		t.Assert(stats.ActiveCount, 10)
    75  		t.Assert(stats.IdleCount, 0)
    76  		for i := 0; i < 10; i++ {
    77  			array[i].Close()
    78  		}
    79  		stats = redis.Stats()
    80  		t.Assert(stats.ActiveCount, 2)
    81  		t.Assert(stats.IdleCount, 2)
    82  		//time.Sleep(3000*time.Millisecond)
    83  		//stats  = redis.Stats()
    84  		//fmt.Println(stats)
    85  		//t.Assert(stats.ActiveCount,  0)
    86  		//t.Assert(stats.IdleCount,    0)
    87  	})
    88  }
    89  
    90  func Test_Conn(t *testing.T) {
    91  	gtest.C(t, func(t *gtest.T) {
    92  		redis := gredis.New(config)
    93  		defer redis.Close()
    94  		conn := redis.Conn()
    95  		defer conn.Close()
    96  
    97  		key := gconv.String(gtime.TimestampNano())
    98  		value := []byte("v")
    99  		r, err := conn.Do("SET", key, value)
   100  		t.Assert(err, nil)
   101  
   102  		r, err = conn.Do("GET", key)
   103  		t.Assert(err, nil)
   104  		t.Assert(r, value)
   105  
   106  		_, err = conn.Do("DEL", key)
   107  		t.Assert(err, nil)
   108  		r, err = conn.Do("GET", key)
   109  		t.Assert(err, nil)
   110  		t.Assert(r, nil)
   111  	})
   112  }
   113  
   114  func Test_Instance(t *testing.T) {
   115  	gtest.C(t, func(t *gtest.T) {
   116  		group := "my-test"
   117  		gredis.SetConfig(config, group)
   118  		defer gredis.RemoveConfig(group)
   119  		redis := gredis.Instance(group)
   120  		defer redis.Close()
   121  
   122  		conn := redis.Conn()
   123  		defer conn.Close()
   124  
   125  		_, err := conn.Do("SET", "k", "v")
   126  		t.Assert(err, nil)
   127  
   128  		r, err := conn.Do("GET", "k")
   129  		t.Assert(err, nil)
   130  		t.Assert(r, []byte("v"))
   131  
   132  		_, err = conn.Do("DEL", "k")
   133  		t.Assert(err, nil)
   134  		r, err = conn.Do("GET", "k")
   135  		t.Assert(err, nil)
   136  		t.Assert(r, nil)
   137  	})
   138  }
   139  
   140  func Test_Error(t *testing.T) {
   141  	gtest.C(t, func(t *gtest.T) {
   142  		config1 := &gredis.Config{
   143  			Host:           "192.111.0.2",
   144  			Port:           6379,
   145  			Db:             1,
   146  			ConnectTimeout: time.Second,
   147  		}
   148  		redis := gredis.New(config1)
   149  		_, err := redis.Do("info")
   150  		t.AssertNE(err, nil)
   151  
   152  		config1 = &gredis.Config{
   153  			Host: "127.0.0.1",
   154  			Port: 6379,
   155  			Db:   100,
   156  		}
   157  		redis = gredis.New(config1)
   158  		_, err = redis.Do("info")
   159  		t.AssertNE(err, nil)
   160  
   161  		redis = gredis.Instance("gf")
   162  		t.Assert(redis == nil, true)
   163  		gredis.ClearConfig()
   164  
   165  		redis = gredis.New(config)
   166  		defer redis.Close()
   167  		_, err = redis.DoVar("SET", "k", "v")
   168  		t.Assert(err, nil)
   169  
   170  		v, err := redis.DoVar("GET", "k")
   171  		t.Assert(err, nil)
   172  		t.Assert(v.String(), "v")
   173  
   174  		conn := redis.Conn()
   175  		defer conn.Close()
   176  		_, err = conn.DoVar("SET", "k", "v")
   177  		t.Assert(err, nil)
   178  
   179  		_, err = conn.DoVar("Subscribe", "gf")
   180  		t.Assert(err, nil)
   181  
   182  		_, err = redis.DoVar("PUBLISH", "gf", "test")
   183  		t.Assert(err, nil)
   184  
   185  		v, _ = conn.ReceiveVar()
   186  		t.Assert(len(v.Strings()), 3)
   187  		t.Assert(v.Strings()[2], "test")
   188  
   189  		time.Sleep(time.Second)
   190  	})
   191  }
   192  
   193  func Test_Bool(t *testing.T) {
   194  	gtest.C(t, func(t *gtest.T) {
   195  		redis := gredis.New(config)
   196  		defer func() {
   197  			redis.Do("DEL", "key-true")
   198  			redis.Do("DEL", "key-false")
   199  		}()
   200  
   201  		_, err := redis.Do("SET", "key-true", true)
   202  		t.Assert(err, nil)
   203  
   204  		_, err = redis.Do("SET", "key-false", false)
   205  		t.Assert(err, nil)
   206  
   207  		r, err := redis.DoVar("GET", "key-true")
   208  		t.Assert(err, nil)
   209  		t.Assert(r.Bool(), true)
   210  
   211  		r, err = redis.DoVar("GET", "key-false")
   212  		t.Assert(err, nil)
   213  		t.Assert(r.Bool(), false)
   214  	})
   215  }
   216  
   217  func Test_Int(t *testing.T) {
   218  	gtest.C(t, func(t *gtest.T) {
   219  		redis := gredis.New(config)
   220  		key := guid.S()
   221  		defer redis.Do("DEL", key)
   222  
   223  		_, err := redis.Do("SET", key, 1)
   224  		t.Assert(err, nil)
   225  
   226  		r, err := redis.DoVar("GET", key)
   227  		t.Assert(err, nil)
   228  		t.Assert(r.Int(), 1)
   229  	})
   230  }
   231  
   232  func Test_HSet(t *testing.T) {
   233  	gtest.C(t, func(t *gtest.T) {
   234  		redis := gredis.New(config)
   235  		key := guid.S()
   236  		defer redis.Do("DEL", key)
   237  
   238  		_, err := redis.Do("HSET", key, "name", "john")
   239  		t.Assert(err, nil)
   240  
   241  		r, err := redis.DoVar("HGETALL", key)
   242  		t.Assert(err, nil)
   243  		t.Assert(r.Strings(), g.ArrayStr{"name", "john"})
   244  	})
   245  }
   246  
   247  func Test_HGetAll1(t *testing.T) {
   248  	gtest.C(t, func(t *gtest.T) {
   249  		var (
   250  			err   error
   251  			key   = guid.S()
   252  			redis = gredis.New(config)
   253  		)
   254  		defer redis.Do("DEL", key)
   255  
   256  		_, err = redis.Do("HSET", key, "id", 100)
   257  		t.Assert(err, nil)
   258  		_, err = redis.Do("HSET", key, "name", "john")
   259  		t.Assert(err, nil)
   260  
   261  		r, err := redis.DoVar("HGETALL", key)
   262  		t.Assert(err, nil)
   263  		t.Assert(r.Map(), g.MapStrAny{
   264  			"id":   100,
   265  			"name": "john",
   266  		})
   267  	})
   268  }
   269  
   270  func Test_HGetAll2(t *testing.T) {
   271  	gtest.C(t, func(t *gtest.T) {
   272  		var (
   273  			err   error
   274  			key   = guid.S()
   275  			redis = gredis.New(config)
   276  		)
   277  		defer redis.Do("DEL", key)
   278  
   279  		_, err = redis.Do("HSET", key, "id", 100)
   280  		t.Assert(err, nil)
   281  		_, err = redis.Do("HSET", key, "name", "john")
   282  		t.Assert(err, nil)
   283  
   284  		result, err := redis.DoVar("HGETALL", key)
   285  		t.Assert(err, nil)
   286  
   287  		t.Assert(gconv.Uint(result.MapStrVar()["id"]), 100)
   288  		t.Assert(result.MapStrVar()["id"].Uint(), 100)
   289  	})
   290  }
   291  
   292  func Test_HMSet(t *testing.T) {
   293  	// map
   294  	gtest.C(t, func(t *gtest.T) {
   295  		var (
   296  			err   error
   297  			key   = guid.S()
   298  			redis = gredis.New(config)
   299  			data  = g.Map{
   300  				"name":  "gf",
   301  				"sex":   0,
   302  				"score": 100,
   303  			}
   304  		)
   305  		defer redis.Do("DEL", key)
   306  
   307  		_, err = redis.Do("HMSET", append(g.Slice{key}, gutil.MapToSlice(data)...)...)
   308  		t.Assert(err, nil)
   309  		v, err := redis.DoVar("HMGET", key, "name")
   310  		t.Assert(err, nil)
   311  		t.Assert(v.Slice(), g.Slice{data["name"]})
   312  	})
   313  	// struct
   314  	gtest.C(t, func(t *gtest.T) {
   315  		type User struct {
   316  			Name  string `json:"name"`
   317  			Sex   int    `json:"sex"`
   318  			Score int    `json:"score"`
   319  		}
   320  		var (
   321  			err   error
   322  			key   = guid.S()
   323  			redis = gredis.New(config)
   324  			data  = &User{
   325  				Name:  "gf",
   326  				Sex:   0,
   327  				Score: 100,
   328  			}
   329  		)
   330  		defer redis.Do("DEL", key)
   331  
   332  		_, err = redis.Do("HMSET", append(g.Slice{key}, gutil.StructToSlice(data)...)...)
   333  		t.Assert(err, nil)
   334  		v, err := redis.DoVar("HMGET", key, "name")
   335  		t.Assert(err, nil)
   336  		t.Assert(v.Slice(), g.Slice{data.Name})
   337  	})
   338  }
   339  
   340  func Test_Auto_Marshal(t *testing.T) {
   341  	var (
   342  		err   error
   343  		redis = gredis.New(config)
   344  		key   = guid.S()
   345  	)
   346  	defer redis.Do("DEL", key)
   347  
   348  	type User struct {
   349  		Id   int
   350  		Name string
   351  	}
   352  
   353  	gtest.C(t, func(t *gtest.T) {
   354  		user := &User{
   355  			Id:   10000,
   356  			Name: "john",
   357  		}
   358  
   359  		_, err = redis.Do("SET", key, user)
   360  		t.Assert(err, nil)
   361  
   362  		r, err := redis.DoVar("GET", key)
   363  		t.Assert(err, nil)
   364  		t.Assert(r.Map(), g.MapStrAny{
   365  			"Id":   user.Id,
   366  			"Name": user.Name,
   367  		})
   368  
   369  		var user2 *User
   370  		t.Assert(r.Struct(&user2), nil)
   371  		t.Assert(user2.Id, user.Id)
   372  		t.Assert(user2.Name, user.Name)
   373  	})
   374  }
   375  
   376  func Test_Auto_MarshalSlice(t *testing.T) {
   377  	var (
   378  		err   error
   379  		redis = gredis.New(config)
   380  		key   = guid.S()
   381  	)
   382  	defer redis.Do("DEL", key)
   383  
   384  	type User struct {
   385  		Id   int
   386  		Name string
   387  	}
   388  
   389  	gtest.C(t, func(t *gtest.T) {
   390  		var (
   391  			result *gvar.Var
   392  			key    = "user-slice"
   393  			users1 = []User{
   394  				{
   395  					Id:   1,
   396  					Name: "john1",
   397  				},
   398  				{
   399  					Id:   2,
   400  					Name: "john2",
   401  				},
   402  			}
   403  		)
   404  
   405  		_, err = redis.Do("SET", key, users1)
   406  		t.Assert(err, nil)
   407  
   408  		result, err = redis.DoVar("GET", key)
   409  		t.Assert(err, nil)
   410  
   411  		var users2 []User
   412  		err = result.Structs(&users2)
   413  		t.Assert(err, nil)
   414  		t.Assert(users2, users1)
   415  	})
   416  }