redis_test.go 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849
  1. package redis
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "errors"
  6. "io"
  7. "strconv"
  8. "testing"
  9. "time"
  10. "github.com/alicebob/miniredis/v2"
  11. red "github.com/go-redis/redis/v8"
  12. "github.com/stretchr/testify/assert"
  13. "github.com/zeromicro/go-zero/core/logx"
  14. "github.com/zeromicro/go-zero/core/stringx"
  15. )
  16. func TestNewRedis(t *testing.T) {
  17. r1, err := miniredis.Run()
  18. assert.NoError(t, err)
  19. defer r1.Close()
  20. r2, err := miniredis.Run()
  21. assert.NoError(t, err)
  22. defer r2.Close()
  23. r2.SetError("mock")
  24. tests := []struct {
  25. name string
  26. RedisConf
  27. ok bool
  28. redisErr bool
  29. }{
  30. {
  31. name: "missing host",
  32. RedisConf: RedisConf{
  33. Host: "",
  34. Type: NodeType,
  35. Pass: "",
  36. },
  37. ok: false,
  38. },
  39. {
  40. name: "missing type",
  41. RedisConf: RedisConf{
  42. Host: "localhost:6379",
  43. Type: "",
  44. Pass: "",
  45. },
  46. ok: false,
  47. },
  48. {
  49. name: "ok",
  50. RedisConf: RedisConf{
  51. Host: r1.Addr(),
  52. Type: NodeType,
  53. Pass: "",
  54. },
  55. ok: true,
  56. },
  57. {
  58. name: "ok",
  59. RedisConf: RedisConf{
  60. Host: r1.Addr(),
  61. Type: ClusterType,
  62. Pass: "",
  63. },
  64. ok: true,
  65. },
  66. {
  67. name: "password",
  68. RedisConf: RedisConf{
  69. Host: r1.Addr(),
  70. Type: NodeType,
  71. Pass: "pw",
  72. },
  73. ok: true,
  74. },
  75. {
  76. name: "tls",
  77. RedisConf: RedisConf{
  78. Host: r1.Addr(),
  79. Type: NodeType,
  80. Tls: true,
  81. },
  82. ok: true,
  83. },
  84. {
  85. name: "node error",
  86. RedisConf: RedisConf{
  87. Host: r2.Addr(),
  88. Type: NodeType,
  89. Pass: "",
  90. },
  91. ok: true,
  92. redisErr: true,
  93. },
  94. {
  95. name: "cluster error",
  96. RedisConf: RedisConf{
  97. Host: r2.Addr(),
  98. Type: ClusterType,
  99. Pass: "",
  100. },
  101. ok: true,
  102. redisErr: true,
  103. },
  104. }
  105. for _, test := range tests {
  106. t.Run(stringx.RandId(), func(t *testing.T) {
  107. rds, err := NewRedis(test.RedisConf)
  108. if test.ok {
  109. if test.redisErr {
  110. assert.Error(t, err)
  111. assert.Nil(t, rds)
  112. } else {
  113. assert.NoError(t, err)
  114. assert.NotNil(t, rds)
  115. }
  116. } else {
  117. assert.Error(t, err)
  118. }
  119. })
  120. }
  121. }
  122. func TestRedis_Decr(t *testing.T) {
  123. runOnRedis(t, func(client *Redis) {
  124. _, err := New(client.Addr, badType()).Decr("a")
  125. assert.NotNil(t, err)
  126. val, err := client.Decr("a")
  127. assert.Nil(t, err)
  128. assert.Equal(t, int64(-1), val)
  129. val, err = client.Decr("a")
  130. assert.Nil(t, err)
  131. assert.Equal(t, int64(-2), val)
  132. })
  133. }
  134. func TestRedis_DecrBy(t *testing.T) {
  135. runOnRedis(t, func(client *Redis) {
  136. _, err := New(client.Addr, badType()).Decrby("a", 2)
  137. assert.NotNil(t, err)
  138. val, err := client.Decrby("a", 2)
  139. assert.Nil(t, err)
  140. assert.Equal(t, int64(-2), val)
  141. val, err = client.Decrby("a", 3)
  142. assert.Nil(t, err)
  143. assert.Equal(t, int64(-5), val)
  144. })
  145. }
  146. func TestRedis_Exists(t *testing.T) {
  147. runOnRedis(t, func(client *Redis) {
  148. _, err := New(client.Addr, badType()).Exists("a")
  149. assert.NotNil(t, err)
  150. ok, err := client.Exists("a")
  151. assert.Nil(t, err)
  152. assert.False(t, ok)
  153. assert.Nil(t, client.Set("a", "b"))
  154. ok, err = client.Exists("a")
  155. assert.Nil(t, err)
  156. assert.True(t, ok)
  157. })
  158. }
  159. func TestRedisTLS_Exists(t *testing.T) {
  160. runOnRedisTLS(t, func(client *Redis) {
  161. _, err := New(client.Addr, badType()).Exists("a")
  162. assert.NotNil(t, err)
  163. ok, err := client.Exists("a")
  164. assert.NotNil(t, err)
  165. assert.False(t, ok)
  166. assert.NotNil(t, client.Set("a", "b"))
  167. ok, err = client.Exists("a")
  168. assert.NotNil(t, err)
  169. assert.False(t, ok)
  170. })
  171. }
  172. func TestRedis_Eval(t *testing.T) {
  173. runOnRedis(t, func(client *Redis) {
  174. _, err := New(client.Addr, badType()).Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
  175. assert.NotNil(t, err)
  176. _, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
  177. assert.Equal(t, Nil, err)
  178. err = client.Set("key1", "value1")
  179. assert.Nil(t, err)
  180. _, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"key1"})
  181. assert.Equal(t, Nil, err)
  182. val, err := client.Eval(`return redis.call("EXISTS", KEYS[1])`, []string{"key1"})
  183. assert.Nil(t, err)
  184. assert.Equal(t, int64(1), val)
  185. })
  186. }
  187. func TestRedis_GeoHash(t *testing.T) {
  188. runOnRedis(t, func(client *Redis) {
  189. _, err := client.GeoHash("parent", "child1", "child2")
  190. assert.Error(t, err)
  191. _, err = New(client.Addr, badType()).GeoHash("parent", "child1", "child2")
  192. assert.Error(t, err)
  193. })
  194. }
  195. func TestRedis_Hgetall(t *testing.T) {
  196. runOnRedis(t, func(client *Redis) {
  197. assert.Nil(t, client.Hset("a", "aa", "aaa"))
  198. assert.Nil(t, client.Hset("a", "bb", "bbb"))
  199. _, err := New(client.Addr, badType()).Hgetall("a")
  200. assert.NotNil(t, err)
  201. vals, err := client.Hgetall("a")
  202. assert.Nil(t, err)
  203. assert.EqualValues(t, map[string]string{
  204. "aa": "aaa",
  205. "bb": "bbb",
  206. }, vals)
  207. })
  208. }
  209. func TestRedis_Hvals(t *testing.T) {
  210. runOnRedis(t, func(client *Redis) {
  211. assert.NotNil(t, New(client.Addr, badType()).Hset("a", "aa", "aaa"))
  212. assert.Nil(t, client.Hset("a", "aa", "aaa"))
  213. assert.Nil(t, client.Hset("a", "bb", "bbb"))
  214. _, err := New(client.Addr, badType()).Hvals("a")
  215. assert.NotNil(t, err)
  216. vals, err := client.Hvals("a")
  217. assert.Nil(t, err)
  218. assert.ElementsMatch(t, []string{"aaa", "bbb"}, vals)
  219. })
  220. }
  221. func TestRedis_Hsetnx(t *testing.T) {
  222. runOnRedis(t, func(client *Redis) {
  223. assert.Nil(t, client.Hset("a", "aa", "aaa"))
  224. assert.Nil(t, client.Hset("a", "bb", "bbb"))
  225. _, err := New(client.Addr, badType()).Hsetnx("a", "bb", "ccc")
  226. assert.NotNil(t, err)
  227. ok, err := client.Hsetnx("a", "bb", "ccc")
  228. assert.Nil(t, err)
  229. assert.False(t, ok)
  230. ok, err = client.Hsetnx("a", "dd", "ddd")
  231. assert.Nil(t, err)
  232. assert.True(t, ok)
  233. vals, err := client.Hvals("a")
  234. assert.Nil(t, err)
  235. assert.ElementsMatch(t, []string{"aaa", "bbb", "ddd"}, vals)
  236. })
  237. }
  238. func TestRedis_HdelHlen(t *testing.T) {
  239. runOnRedis(t, func(client *Redis) {
  240. assert.Nil(t, client.Hset("a", "aa", "aaa"))
  241. assert.Nil(t, client.Hset("a", "bb", "bbb"))
  242. _, err := New(client.Addr, badType()).Hlen("a")
  243. assert.NotNil(t, err)
  244. num, err := client.Hlen("a")
  245. assert.Nil(t, err)
  246. assert.Equal(t, 2, num)
  247. val, err := client.Hdel("a", "aa")
  248. assert.Nil(t, err)
  249. assert.True(t, val)
  250. vals, err := client.Hvals("a")
  251. assert.Nil(t, err)
  252. assert.ElementsMatch(t, []string{"bbb"}, vals)
  253. })
  254. }
  255. func TestRedis_HIncrBy(t *testing.T) {
  256. runOnRedis(t, func(client *Redis) {
  257. _, err := New(client.Addr, badType()).Hincrby("key", "field", 2)
  258. assert.NotNil(t, err)
  259. val, err := client.Hincrby("key", "field", 2)
  260. assert.Nil(t, err)
  261. assert.Equal(t, 2, val)
  262. val, err = client.Hincrby("key", "field", 3)
  263. assert.Nil(t, err)
  264. assert.Equal(t, 5, val)
  265. })
  266. }
  267. func TestRedis_Hkeys(t *testing.T) {
  268. runOnRedis(t, func(client *Redis) {
  269. assert.Nil(t, client.Hset("a", "aa", "aaa"))
  270. assert.Nil(t, client.Hset("a", "bb", "bbb"))
  271. _, err := New(client.Addr, badType()).Hkeys("a")
  272. assert.NotNil(t, err)
  273. vals, err := client.Hkeys("a")
  274. assert.Nil(t, err)
  275. assert.ElementsMatch(t, []string{"aa", "bb"}, vals)
  276. })
  277. }
  278. func TestRedis_Hmget(t *testing.T) {
  279. runOnRedis(t, func(client *Redis) {
  280. assert.Nil(t, client.Hset("a", "aa", "aaa"))
  281. assert.Nil(t, client.Hset("a", "bb", "bbb"))
  282. _, err := New(client.Addr, badType()).Hmget("a", "aa", "bb")
  283. assert.NotNil(t, err)
  284. vals, err := client.Hmget("a", "aa", "bb")
  285. assert.Nil(t, err)
  286. assert.EqualValues(t, []string{"aaa", "bbb"}, vals)
  287. vals, err = client.Hmget("a", "aa", "no", "bb")
  288. assert.Nil(t, err)
  289. assert.EqualValues(t, []string{"aaa", "", "bbb"}, vals)
  290. })
  291. }
  292. func TestRedis_Hmset(t *testing.T) {
  293. runOnRedis(t, func(client *Redis) {
  294. assert.NotNil(t, New(client.Addr, badType()).Hmset("a", nil))
  295. assert.Nil(t, client.Hmset("a", map[string]string{
  296. "aa": "aaa",
  297. "bb": "bbb",
  298. }))
  299. vals, err := client.Hmget("a", "aa", "bb")
  300. assert.Nil(t, err)
  301. assert.EqualValues(t, []string{"aaa", "bbb"}, vals)
  302. })
  303. }
  304. func TestRedis_Hscan(t *testing.T) {
  305. t.Run("scan", func(t *testing.T) {
  306. runOnRedis(t, func(client *Redis) {
  307. key := "hash:test"
  308. fieldsAndValues := make(map[string]string)
  309. for i := 0; i < 1550; i++ {
  310. fieldsAndValues["filed_"+strconv.Itoa(i)] = stringx.Randn(i)
  311. }
  312. err := client.Hmset(key, fieldsAndValues)
  313. assert.Nil(t, err)
  314. var cursor uint64 = 0
  315. sum := 0
  316. for {
  317. _, _, err := New(client.Addr, badType()).Hscan(key, cursor, "*", 100)
  318. assert.NotNil(t, err)
  319. reMap, next, err := client.Hscan(key, cursor, "*", 100)
  320. assert.Nil(t, err)
  321. sum += len(reMap)
  322. if next == 0 {
  323. break
  324. }
  325. cursor = next
  326. }
  327. assert.Equal(t, sum, 3100)
  328. _, err = New(client.Addr, badType()).Del(key)
  329. assert.Error(t, err)
  330. _, err = client.Del(key)
  331. assert.NoError(t, err)
  332. })
  333. })
  334. t.Run("scan with error", func(t *testing.T) {
  335. runOnRedisWithError(t, func(client *Redis) {
  336. _, err := client.Del("hash:test")
  337. assert.Error(t, err)
  338. })
  339. })
  340. }
  341. func TestRedis_Incr(t *testing.T) {
  342. runOnRedis(t, func(client *Redis) {
  343. _, err := New(client.Addr, badType()).Incr("a")
  344. assert.NotNil(t, err)
  345. val, err := client.Incr("a")
  346. assert.Nil(t, err)
  347. assert.Equal(t, int64(1), val)
  348. val, err = client.Incr("a")
  349. assert.Nil(t, err)
  350. assert.Equal(t, int64(2), val)
  351. })
  352. }
  353. func TestRedis_IncrBy(t *testing.T) {
  354. runOnRedis(t, func(client *Redis) {
  355. _, err := New(client.Addr, badType()).Incrby("a", 2)
  356. assert.NotNil(t, err)
  357. val, err := client.Incrby("a", 2)
  358. assert.Nil(t, err)
  359. assert.Equal(t, int64(2), val)
  360. val, err = client.Incrby("a", 3)
  361. assert.Nil(t, err)
  362. assert.Equal(t, int64(5), val)
  363. })
  364. }
  365. func TestRedis_Keys(t *testing.T) {
  366. runOnRedis(t, func(client *Redis) {
  367. err := client.Set("key1", "value1")
  368. assert.Nil(t, err)
  369. err = client.Set("key2", "value2")
  370. assert.Nil(t, err)
  371. _, err = New(client.Addr, badType()).Keys("*")
  372. assert.NotNil(t, err)
  373. keys, err := client.Keys("*")
  374. assert.Nil(t, err)
  375. assert.ElementsMatch(t, []string{"key1", "key2"}, keys)
  376. })
  377. }
  378. func TestRedis_HyperLogLog(t *testing.T) {
  379. t.Run("hyperloglog", func(t *testing.T) {
  380. runOnRedis(t, func(client *Redis) {
  381. client.Ping()
  382. r := New(client.Addr)
  383. _, err := New(client.Addr, badType()).Pfadd("key1", "val1")
  384. assert.Error(t, err)
  385. ok, err := r.Pfadd("key1", "val1")
  386. assert.Nil(t, err)
  387. assert.True(t, ok)
  388. _, err = New(client.Addr, badType()).Pfcount("key1")
  389. assert.Error(t, err)
  390. val, err := r.Pfcount("key1")
  391. assert.Nil(t, err)
  392. assert.Equal(t, int64(1), val)
  393. ok, err = r.Pfadd("key2", "val2")
  394. assert.Nil(t, err)
  395. assert.True(t, ok)
  396. val, err = r.Pfcount("key2")
  397. assert.Nil(t, err)
  398. assert.Equal(t, int64(1), val)
  399. err = New(client.Addr, badType()).Pfmerge("key3", "key1", "key2")
  400. assert.Error(t, err)
  401. err = r.Pfmerge("key1", "key2")
  402. assert.Nil(t, err)
  403. val, err = r.Pfcount("key1")
  404. assert.Nil(t, err)
  405. assert.Equal(t, int64(2), val)
  406. })
  407. })
  408. t.Run("hyperloglog with error", func(t *testing.T) {
  409. runOnRedisWithError(t, func(client *Redis) {
  410. _, err := client.Pfadd("key1", "val1")
  411. assert.Error(t, err)
  412. })
  413. })
  414. }
  415. func TestRedis_List(t *testing.T) {
  416. t.Run("list", func(t *testing.T) {
  417. runOnRedis(t, func(client *Redis) {
  418. _, err := New(client.Addr, badType()).Lpush("key", "value1", "value2")
  419. assert.NotNil(t, err)
  420. val, err := client.Lpush("key", "value1", "value2")
  421. assert.Nil(t, err)
  422. assert.Equal(t, 2, val)
  423. _, err = New(client.Addr, badType()).Rpush("key", "value3", "value4")
  424. assert.NotNil(t, err)
  425. val, err = client.Rpush("key", "value3", "value4")
  426. assert.Nil(t, err)
  427. assert.Equal(t, 4, val)
  428. _, err = New(client.Addr, badType()).Llen("key")
  429. assert.NotNil(t, err)
  430. val, err = client.Llen("key")
  431. assert.Nil(t, err)
  432. assert.Equal(t, 4, val)
  433. _, err = New(client.Addr, badType()).Lindex("key", 1)
  434. assert.NotNil(t, err)
  435. value, err := client.Lindex("key", 0)
  436. assert.Nil(t, err)
  437. assert.Equal(t, "value2", value)
  438. vals, err := client.Lrange("key", 0, 10)
  439. assert.Nil(t, err)
  440. assert.EqualValues(t, []string{"value2", "value1", "value3", "value4"}, vals)
  441. _, err = New(client.Addr, badType()).Lpop("key")
  442. assert.NotNil(t, err)
  443. v, err := client.Lpop("key")
  444. assert.Nil(t, err)
  445. assert.Equal(t, "value2", v)
  446. val, err = client.Lpush("key", "value1", "value2")
  447. assert.Nil(t, err)
  448. assert.Equal(t, 5, val)
  449. _, err = New(client.Addr, badType()).Rpop("key")
  450. assert.NotNil(t, err)
  451. v, err = client.Rpop("key")
  452. assert.Nil(t, err)
  453. assert.Equal(t, "value4", v)
  454. val, err = client.Rpush("key", "value4", "value3", "value3")
  455. assert.Nil(t, err)
  456. assert.Equal(t, 7, val)
  457. _, err = New(client.Addr, badType()).Lrem("key", 2, "value1")
  458. assert.NotNil(t, err)
  459. n, err := client.Lrem("key", 2, "value1")
  460. assert.Nil(t, err)
  461. assert.Equal(t, 2, n)
  462. _, err = New(client.Addr, badType()).Lrange("key", 0, 10)
  463. assert.NotNil(t, err)
  464. vals, err = client.Lrange("key", 0, 10)
  465. assert.Nil(t, err)
  466. assert.EqualValues(t, []string{"value2", "value3", "value4", "value3", "value3"}, vals)
  467. n, err = client.Lrem("key", -2, "value3")
  468. assert.Nil(t, err)
  469. assert.Equal(t, 2, n)
  470. vals, err = client.Lrange("key", 0, 10)
  471. assert.Nil(t, err)
  472. assert.EqualValues(t, []string{"value2", "value3", "value4"}, vals)
  473. err = New(client.Addr, badType()).Ltrim("key", 0, 1)
  474. assert.Error(t, err)
  475. err = client.Ltrim("key", 0, 1)
  476. assert.Nil(t, err)
  477. vals, err = client.Lrange("key", 0, 10)
  478. assert.Nil(t, err)
  479. assert.EqualValues(t, []string{"value2", "value3"}, vals)
  480. vals, err = client.LpopCount("key", 2)
  481. assert.Nil(t, err)
  482. assert.EqualValues(t, []string{"value2", "value3"}, vals)
  483. _, err = client.Lpush("key", "value1", "value2")
  484. assert.Nil(t, err)
  485. vals, err = client.RpopCount("key", 4)
  486. assert.Nil(t, err)
  487. assert.EqualValues(t, []string{"value1", "value2"}, vals)
  488. })
  489. })
  490. t.Run("list error", func(t *testing.T) {
  491. runOnRedisWithError(t, func(client *Redis) {
  492. _, err := client.Llen("key")
  493. assert.Error(t, err)
  494. _, err = client.Lpush("key", "value1", "value2")
  495. assert.Error(t, err)
  496. _, err = client.Lrem("key", 2, "value1")
  497. assert.Error(t, err)
  498. _, err = client.Rpush("key", "value3", "value4")
  499. assert.Error(t, err)
  500. _, err = client.LpopCount("key", 2)
  501. assert.Error(t, err)
  502. _, err = client.RpopCount("key", 2)
  503. assert.Error(t, err)
  504. })
  505. })
  506. t.Run("list redis type error", func(t *testing.T) {
  507. runOnRedisWithError(t, func(client *Redis) {
  508. client.Type = "nil"
  509. _, err := client.Llen("key")
  510. assert.Error(t, err)
  511. _, err = client.Lpush("key", "value1", "value2")
  512. assert.Error(t, err)
  513. _, err = client.Lrem("key", 2, "value1")
  514. assert.Error(t, err)
  515. _, err = client.Rpush("key", "value3", "value4")
  516. assert.Error(t, err)
  517. _, err = client.LpopCount("key", 2)
  518. assert.Error(t, err)
  519. _, err = client.RpopCount("key", 2)
  520. assert.Error(t, err)
  521. })
  522. })
  523. }
  524. func TestRedis_Mget(t *testing.T) {
  525. t.Run("mget", func(t *testing.T) {
  526. runOnRedis(t, func(client *Redis) {
  527. err := client.Set("key1", "value1")
  528. assert.Nil(t, err)
  529. err = client.Set("key2", "value2")
  530. assert.Nil(t, err)
  531. _, err = New(client.Addr, badType()).Mget("key1", "key0", "key2", "key3")
  532. assert.NotNil(t, err)
  533. vals, err := client.Mget("key1", "key0", "key2", "key3")
  534. assert.Nil(t, err)
  535. assert.EqualValues(t, []string{"value1", "", "value2", ""}, vals)
  536. })
  537. })
  538. t.Run("mget error", func(t *testing.T) {
  539. runOnRedisWithError(t, func(client *Redis) {
  540. _, err := client.Mget("key1", "key0")
  541. assert.Error(t, err)
  542. })
  543. })
  544. }
  545. func TestRedis_SetBit(t *testing.T) {
  546. t.Run("setbit", func(t *testing.T) {
  547. runOnRedis(t, func(client *Redis) {
  548. _, err := New(client.Addr, badType()).SetBit("key", 1, 1)
  549. assert.Error(t, err)
  550. val, err := client.SetBit("key", 1, 1)
  551. if assert.NoError(t, err) {
  552. assert.Equal(t, 0, val)
  553. }
  554. })
  555. })
  556. t.Run("setbit error", func(t *testing.T) {
  557. runOnRedisWithError(t, func(client *Redis) {
  558. _, err := client.SetBit("key", 1, 1)
  559. assert.Error(t, err)
  560. })
  561. })
  562. }
  563. func TestRedis_GetBit(t *testing.T) {
  564. t.Run("getbit", func(t *testing.T) {
  565. runOnRedis(t, func(client *Redis) {
  566. val, err := client.SetBit("key", 2, 1)
  567. assert.Nil(t, err)
  568. assert.Equal(t, 0, val)
  569. _, err = New(client.Addr, badType()).GetBit("key", 2)
  570. assert.NotNil(t, err)
  571. v, err := client.GetBit("key", 2)
  572. assert.Nil(t, err)
  573. assert.Equal(t, 1, v)
  574. })
  575. })
  576. t.Run("getbit error", func(t *testing.T) {
  577. runOnRedisWithError(t, func(client *Redis) {
  578. _, err := client.GetBit("key", 2)
  579. assert.Error(t, err)
  580. })
  581. })
  582. }
  583. func TestRedis_BitCount(t *testing.T) {
  584. runOnRedis(t, func(client *Redis) {
  585. for i := 0; i < 11; i++ {
  586. val, err := client.SetBit("key", int64(i), 1)
  587. assert.Nil(t, err)
  588. assert.Equal(t, 0, val)
  589. }
  590. _, err := New(client.Addr, badType()).BitCount("key", 0, -1)
  591. assert.NotNil(t, err)
  592. val, err := client.BitCount("key", 0, -1)
  593. assert.Nil(t, err)
  594. assert.Equal(t, int64(11), val)
  595. val, err = client.BitCount("key", 0, 0)
  596. assert.Nil(t, err)
  597. assert.Equal(t, int64(8), val)
  598. val, err = client.BitCount("key", 1, 1)
  599. assert.Nil(t, err)
  600. assert.Equal(t, int64(3), val)
  601. val, err = client.BitCount("key", 0, 1)
  602. assert.Nil(t, err)
  603. assert.Equal(t, int64(11), val)
  604. val, err = client.BitCount("key", 2, 2)
  605. assert.Nil(t, err)
  606. assert.Equal(t, int64(0), val)
  607. })
  608. }
  609. func TestRedis_BitOpAnd(t *testing.T) {
  610. runOnRedis(t, func(client *Redis) {
  611. err := client.Set("key1", "0")
  612. assert.Nil(t, err)
  613. err = client.Set("key2", "1")
  614. assert.Nil(t, err)
  615. _, err = New(client.Addr, badType()).BitOpAnd("destKey", "key1", "key2")
  616. assert.NotNil(t, err)
  617. val, err := client.BitOpAnd("destKey", "key1", "key2")
  618. assert.Nil(t, err)
  619. assert.Equal(t, int64(1), val)
  620. valStr, err := client.Get("destKey")
  621. assert.Nil(t, err)
  622. // destKey binary 110000 ascii 0
  623. assert.Equal(t, "0", valStr)
  624. })
  625. }
  626. func TestRedis_BitOpNot(t *testing.T) {
  627. runOnRedis(t, func(client *Redis) {
  628. err := client.Set("key1", "\u0000")
  629. assert.Nil(t, err)
  630. _, err = New(client.Addr, badType()).BitOpNot("destKey", "key1")
  631. assert.NotNil(t, err)
  632. val, err := client.BitOpNot("destKey", "key1")
  633. assert.Nil(t, err)
  634. assert.Equal(t, int64(1), val)
  635. valStr, err := client.Get("destKey")
  636. assert.Nil(t, err)
  637. assert.Equal(t, "\xff", valStr)
  638. })
  639. }
  640. func TestRedis_BitOpOr(t *testing.T) {
  641. runOnRedis(t, func(client *Redis) {
  642. err := client.Set("key1", "1")
  643. assert.Nil(t, err)
  644. err = client.Set("key2", "0")
  645. assert.Nil(t, err)
  646. _, err = New(client.Addr, badType()).BitOpOr("destKey", "key1", "key2")
  647. assert.NotNil(t, err)
  648. val, err := client.BitOpOr("destKey", "key1", "key2")
  649. assert.Nil(t, err)
  650. assert.Equal(t, int64(1), val)
  651. valStr, err := client.Get("destKey")
  652. assert.Nil(t, err)
  653. assert.Equal(t, "1", valStr)
  654. })
  655. }
  656. func TestRedis_BitOpXor(t *testing.T) {
  657. runOnRedis(t, func(client *Redis) {
  658. err := client.Set("key1", "\xff")
  659. assert.Nil(t, err)
  660. err = client.Set("key2", "\x0f")
  661. assert.Nil(t, err)
  662. _, err = New(client.Addr, badType()).BitOpXor("destKey", "key1", "key2")
  663. assert.NotNil(t, err)
  664. val, err := client.BitOpXor("destKey", "key1", "key2")
  665. assert.Nil(t, err)
  666. assert.Equal(t, int64(1), val)
  667. valStr, err := client.Get("destKey")
  668. assert.Nil(t, err)
  669. assert.Equal(t, "\xf0", valStr)
  670. })
  671. }
  672. func TestRedis_BitPos(t *testing.T) {
  673. runOnRedis(t, func(client *Redis) {
  674. // 11111111 11110000 00000000
  675. err := client.Set("key", "\xff\xf0\x00")
  676. assert.Nil(t, err)
  677. _, err = New(client.Addr, badType()).BitPos("key", 0, 0, -1)
  678. assert.NotNil(t, err)
  679. val, err := client.BitPos("key", 0, 0, 2)
  680. assert.Nil(t, err)
  681. assert.Equal(t, int64(12), val)
  682. val, err = client.BitPos("key", 1, 0, 2)
  683. assert.Nil(t, err)
  684. assert.Equal(t, int64(0), val)
  685. val, err = client.BitPos("key", 0, 1, 2)
  686. assert.Nil(t, err)
  687. assert.Equal(t, int64(12), val)
  688. val, err = client.BitPos("key", 1, 1, 2)
  689. assert.Nil(t, err)
  690. assert.Equal(t, int64(8), val)
  691. val, err = client.BitPos("key", 1, 2, 2)
  692. assert.Nil(t, err)
  693. assert.Equal(t, int64(-1), val)
  694. })
  695. }
  696. func TestRedis_Persist(t *testing.T) {
  697. runOnRedis(t, func(client *Redis) {
  698. _, err := New(client.Addr, badType()).Persist("key")
  699. assert.NotNil(t, err)
  700. ok, err := client.Persist("key")
  701. assert.Nil(t, err)
  702. assert.False(t, ok)
  703. err = client.Set("key", "value")
  704. assert.Nil(t, err)
  705. ok, err = client.Persist("key")
  706. assert.Nil(t, err)
  707. assert.False(t, ok)
  708. err = New(client.Addr, badType()).Expire("key", 5)
  709. assert.NotNil(t, err)
  710. err = client.Expire("key", 5)
  711. assert.Nil(t, err)
  712. ok, err = client.Persist("key")
  713. assert.Nil(t, err)
  714. assert.True(t, ok)
  715. err = New(client.Addr, badType()).Expireat("key", time.Now().Unix()+5)
  716. assert.NotNil(t, err)
  717. err = client.Expireat("key", time.Now().Unix()+5)
  718. assert.Nil(t, err)
  719. ok, err = client.Persist("key")
  720. assert.Nil(t, err)
  721. assert.True(t, ok)
  722. })
  723. }
  724. func TestRedis_Ping(t *testing.T) {
  725. runOnRedis(t, func(client *Redis) {
  726. ok := client.Ping()
  727. assert.True(t, ok)
  728. })
  729. }
  730. func TestRedis_Scan(t *testing.T) {
  731. runOnRedis(t, func(client *Redis) {
  732. err := client.Set("key1", "value1")
  733. assert.Nil(t, err)
  734. err = client.Set("key2", "value2")
  735. assert.Nil(t, err)
  736. _, _, err = New(client.Addr, badType()).Scan(0, "*", 100)
  737. assert.NotNil(t, err)
  738. keys, _, err := client.Scan(0, "*", 100)
  739. assert.Nil(t, err)
  740. assert.ElementsMatch(t, []string{"key1", "key2"}, keys)
  741. })
  742. }
  743. func TestRedis_Sscan(t *testing.T) {
  744. runOnRedis(t, func(client *Redis) {
  745. key := "list"
  746. var list []string
  747. for i := 0; i < 1550; i++ {
  748. list = append(list, stringx.Randn(i))
  749. }
  750. lens, err := client.Sadd(key, list)
  751. assert.Nil(t, err)
  752. assert.Equal(t, lens, 1550)
  753. var cursor uint64 = 0
  754. sum := 0
  755. for {
  756. _, _, err := New(client.Addr, badType()).Sscan(key, cursor, "", 100)
  757. assert.NotNil(t, err)
  758. keys, next, err := client.Sscan(key, cursor, "", 100)
  759. assert.Nil(t, err)
  760. sum += len(keys)
  761. if next == 0 {
  762. break
  763. }
  764. cursor = next
  765. }
  766. assert.Equal(t, sum, 1550)
  767. _, err = New(client.Addr, badType()).Del(key)
  768. assert.NotNil(t, err)
  769. _, err = client.Del(key)
  770. assert.Nil(t, err)
  771. })
  772. }
  773. func TestRedis_Set(t *testing.T) {
  774. t.Run("set", func(t *testing.T) {
  775. runOnRedis(t, func(client *Redis) {
  776. _, err := New(client.Addr, badType()).Sadd("key", 1, 2, 3, 4)
  777. assert.NotNil(t, err)
  778. num, err := client.Sadd("key", 1, 2, 3, 4)
  779. assert.Nil(t, err)
  780. assert.Equal(t, 4, num)
  781. _, err = New(client.Addr, badType()).Scard("key")
  782. assert.NotNil(t, err)
  783. val, err := client.Scard("key")
  784. assert.Nil(t, err)
  785. assert.Equal(t, int64(4), val)
  786. _, err = New(client.Addr, badType()).Sismember("key", 2)
  787. assert.NotNil(t, err)
  788. ok, err := client.Sismember("key", 2)
  789. assert.Nil(t, err)
  790. assert.True(t, ok)
  791. _, err = New(client.Addr, badType()).Srem("key", 3, 4)
  792. assert.NotNil(t, err)
  793. num, err = client.Srem("key", 3, 4)
  794. assert.Nil(t, err)
  795. assert.Equal(t, 2, num)
  796. _, err = New(client.Addr, badType()).Smembers("key")
  797. assert.NotNil(t, err)
  798. vals, err := client.Smembers("key")
  799. assert.Nil(t, err)
  800. assert.ElementsMatch(t, []string{"1", "2"}, vals)
  801. _, err = New(client.Addr, badType()).Srandmember("key", 1)
  802. assert.NotNil(t, err)
  803. members, err := client.Srandmember("key", 1)
  804. assert.Nil(t, err)
  805. assert.Len(t, members, 1)
  806. assert.Contains(t, []string{"1", "2"}, members[0])
  807. _, err = New(client.Addr, badType()).Spop("key")
  808. assert.NotNil(t, err)
  809. member, err := client.Spop("key")
  810. assert.Nil(t, err)
  811. assert.Contains(t, []string{"1", "2"}, member)
  812. _, err = New(client.Addr, badType()).Smembers("key")
  813. assert.NotNil(t, err)
  814. vals, err = client.Smembers("key")
  815. assert.Nil(t, err)
  816. assert.NotContains(t, vals, member)
  817. _, err = New(client.Addr, badType()).Sadd("key1", 1, 2, 3, 4)
  818. assert.NotNil(t, err)
  819. num, err = client.Sadd("key1", 1, 2, 3, 4)
  820. assert.Nil(t, err)
  821. assert.Equal(t, 4, num)
  822. num, err = client.Sadd("key2", 2, 3, 4, 5)
  823. assert.Nil(t, err)
  824. assert.Equal(t, 4, num)
  825. _, err = New(client.Addr, badType()).Sunion("key1", "key2")
  826. assert.NotNil(t, err)
  827. vals, err = client.Sunion("key1", "key2")
  828. assert.Nil(t, err)
  829. assert.ElementsMatch(t, []string{"1", "2", "3", "4", "5"}, vals)
  830. _, err = New(client.Addr, badType()).Sunionstore("key3", "key1", "key2")
  831. assert.NotNil(t, err)
  832. num, err = client.Sunionstore("key3", "key1", "key2")
  833. assert.Nil(t, err)
  834. assert.Equal(t, 5, num)
  835. _, err = New(client.Addr, badType()).Sdiff("key1", "key2")
  836. assert.NotNil(t, err)
  837. vals, err = client.Sdiff("key1", "key2")
  838. assert.Nil(t, err)
  839. assert.EqualValues(t, []string{"1"}, vals)
  840. _, err = New(client.Addr, badType()).Sdiffstore("key4", "key1", "key2")
  841. assert.NotNil(t, err)
  842. num, err = client.Sdiffstore("key4", "key1", "key2")
  843. assert.Nil(t, err)
  844. assert.Equal(t, 1, num)
  845. _, err = New(client.Addr, badType()).Sinter("key1", "key2")
  846. assert.NotNil(t, err)
  847. vals, err = client.Sinter("key1", "key2")
  848. assert.Nil(t, err)
  849. assert.ElementsMatch(t, []string{"2", "3", "4"}, vals)
  850. _, err = New(client.Addr, badType()).Sinterstore("key4", "key1", "key2")
  851. assert.NotNil(t, err)
  852. num, err = client.Sinterstore("key4", "key1", "key2")
  853. assert.Nil(t, err)
  854. assert.Equal(t, 3, num)
  855. })
  856. })
  857. t.Run("set with error", func(t *testing.T) {
  858. runOnRedisWithError(t, func(client *Redis) {
  859. _, err := client.Sadd("key", 1, 2, 3, 4)
  860. assert.Error(t, err)
  861. _, err = client.Srem("key", 3, 4)
  862. assert.Error(t, err)
  863. _, err = client.Sunionstore("key3", "key1", "key2")
  864. assert.Error(t, err)
  865. _, err = client.Sdiffstore("key4", "key1", "key2")
  866. assert.Error(t, err)
  867. _, err = client.Sinterstore("key4", "key1", "key2")
  868. assert.Error(t, err)
  869. })
  870. })
  871. }
  872. func TestRedis_GetSet(t *testing.T) {
  873. runOnRedis(t, func(client *Redis) {
  874. _, err := New(client.Addr, badType()).GetSet("hello", "world")
  875. assert.NotNil(t, err)
  876. val, err := client.GetSet("hello", "world")
  877. assert.Nil(t, err)
  878. assert.Equal(t, "", val)
  879. val, err = client.Get("hello")
  880. assert.Nil(t, err)
  881. assert.Equal(t, "world", val)
  882. val, err = client.GetSet("hello", "newworld")
  883. assert.Nil(t, err)
  884. assert.Equal(t, "world", val)
  885. val, err = client.Get("hello")
  886. assert.Nil(t, err)
  887. assert.Equal(t, "newworld", val)
  888. ret, err := client.Del("hello")
  889. assert.Nil(t, err)
  890. assert.Equal(t, 1, ret)
  891. })
  892. }
  893. func TestRedis_SetGetDel(t *testing.T) {
  894. runOnRedis(t, func(client *Redis) {
  895. err := New(client.Addr, badType()).Set("hello", "world")
  896. assert.NotNil(t, err)
  897. err = client.Set("hello", "world")
  898. assert.Nil(t, err)
  899. _, err = New(client.Addr, badType()).Get("hello")
  900. assert.NotNil(t, err)
  901. val, err := client.Get("hello")
  902. assert.Nil(t, err)
  903. assert.Equal(t, "world", val)
  904. ret, err := client.Del("hello")
  905. assert.Nil(t, err)
  906. assert.Equal(t, 1, ret)
  907. })
  908. }
  909. func TestRedis_SetExNx(t *testing.T) {
  910. runOnRedis(t, func(client *Redis) {
  911. err := New(client.Addr, badType()).Setex("hello", "world", 5)
  912. assert.NotNil(t, err)
  913. err = client.Setex("hello", "world", 5)
  914. assert.Nil(t, err)
  915. _, err = New(client.Addr, badType()).Setnx("hello", "newworld")
  916. assert.NotNil(t, err)
  917. ok, err := client.Setnx("hello", "newworld")
  918. assert.Nil(t, err)
  919. assert.False(t, ok)
  920. ok, err = client.Setnx("newhello", "newworld")
  921. assert.Nil(t, err)
  922. assert.True(t, ok)
  923. val, err := client.Get("hello")
  924. assert.Nil(t, err)
  925. assert.Equal(t, "world", val)
  926. val, err = client.Get("newhello")
  927. assert.Nil(t, err)
  928. assert.Equal(t, "newworld", val)
  929. ttl, err := client.Ttl("hello")
  930. assert.Nil(t, err)
  931. assert.True(t, ttl > 0)
  932. _, err = New(client.Addr, badType()).SetnxEx("newhello", "newworld", 5)
  933. assert.NotNil(t, err)
  934. ok, err = client.SetnxEx("newhello", "newworld", 5)
  935. assert.Nil(t, err)
  936. assert.False(t, ok)
  937. num, err := client.Del("newhello")
  938. assert.Nil(t, err)
  939. assert.Equal(t, 1, num)
  940. ok, err = client.SetnxEx("newhello", "newworld", 5)
  941. assert.Nil(t, err)
  942. assert.True(t, ok)
  943. val, err = client.Get("newhello")
  944. assert.Nil(t, err)
  945. assert.Equal(t, "newworld", val)
  946. })
  947. }
  948. func TestRedis_SetGetDelHashField(t *testing.T) {
  949. t.Run("hash", func(t *testing.T) {
  950. runOnRedis(t, func(client *Redis) {
  951. err := client.Hset("key", "field", "value")
  952. assert.Nil(t, err)
  953. _, err = New(client.Addr, badType()).Hget("key", "field")
  954. assert.NotNil(t, err)
  955. val, err := client.Hget("key", "field")
  956. assert.Nil(t, err)
  957. assert.Equal(t, "value", val)
  958. _, err = New(client.Addr, badType()).Hexists("key", "field")
  959. assert.NotNil(t, err)
  960. ok, err := client.Hexists("key", "field")
  961. assert.Nil(t, err)
  962. assert.True(t, ok)
  963. _, err = New(client.Addr, badType()).Hdel("key", "field")
  964. assert.NotNil(t, err)
  965. ret, err := client.Hdel("key", "field")
  966. assert.Nil(t, err)
  967. assert.True(t, ret)
  968. ok, err = client.Hexists("key", "field")
  969. assert.Nil(t, err)
  970. assert.False(t, ok)
  971. })
  972. })
  973. t.Run("hash error", func(t *testing.T) {
  974. runOnRedisWithError(t, func(client *Redis) {
  975. _, err := client.Hdel("key", "field")
  976. assert.Error(t, err)
  977. _, err = client.Hincrby("key", "field", 1)
  978. assert.Error(t, err)
  979. _, err = client.HincrbyFloat("key", "field", 1)
  980. assert.Error(t, err)
  981. _, err = client.Hlen("key")
  982. assert.Error(t, err)
  983. _, err = client.Hmget("key", "field")
  984. assert.Error(t, err)
  985. })
  986. })
  987. }
  988. func TestRedis_SortedSet(t *testing.T) {
  989. t.Run("sorted set", func(t *testing.T) {
  990. runOnRedis(t, func(client *Redis) {
  991. ok, err := client.ZaddFloat("key", 1, "value1")
  992. assert.Nil(t, err)
  993. assert.True(t, ok)
  994. ok, err = client.Zadd("key", 2, "value1")
  995. assert.Nil(t, err)
  996. assert.False(t, ok)
  997. val, err := client.Zscore("key", "value1")
  998. assert.Nil(t, err)
  999. assert.Equal(t, int64(2), val)
  1000. _, err = New(client.Addr, badType()).Zincrby("key", 3, "value1")
  1001. assert.NotNil(t, err)
  1002. val, err = client.Zincrby("key", 3, "value1")
  1003. assert.Nil(t, err)
  1004. assert.Equal(t, int64(5), val)
  1005. _, err = New(client.Addr, badType()).Zscore("key", "value1")
  1006. assert.NotNil(t, err)
  1007. val, err = client.Zscore("key", "value1")
  1008. assert.Nil(t, err)
  1009. assert.Equal(t, int64(5), val)
  1010. _, err = New(client.Addr, badType()).Zadds("key")
  1011. assert.NotNil(t, err)
  1012. val, err = client.Zadds("key", Pair{
  1013. Key: "value2",
  1014. Score: 6,
  1015. }, Pair{
  1016. Key: "value3",
  1017. Score: 7,
  1018. })
  1019. assert.Nil(t, err)
  1020. assert.Equal(t, int64(2), val)
  1021. _, err = New(client.Addr, badType()).ZRevRangeWithScores("key", 1, 3)
  1022. assert.NotNil(t, err)
  1023. _, err = client.ZRevRangeWithScores("key", 1, 3)
  1024. assert.Nil(t, err)
  1025. _, err = client.ZRevRangeWithScoresCtx(context.Background(), "key", 1, 3)
  1026. assert.Nil(t, err)
  1027. pairs, err := client.ZrevrangeWithScores("key", 1, 3)
  1028. assert.Nil(t, err)
  1029. assert.EqualValues(t, []Pair{
  1030. {
  1031. Key: "value2",
  1032. Score: 6,
  1033. },
  1034. {
  1035. Key: "value1",
  1036. Score: 5,
  1037. },
  1038. }, pairs)
  1039. rank, err := client.Zrank("key", "value2")
  1040. assert.Nil(t, err)
  1041. assert.Equal(t, int64(1), rank)
  1042. rank, err = client.Zrevrank("key", "value1")
  1043. assert.Nil(t, err)
  1044. assert.Equal(t, int64(2), rank)
  1045. _, err = New(client.Addr, badType()).Zrank("key", "value4")
  1046. assert.NotNil(t, err)
  1047. _, err = client.Zrank("key", "value4")
  1048. assert.Equal(t, Nil, err)
  1049. _, err = New(client.Addr, badType()).Zrem("key", "value2", "value3")
  1050. assert.NotNil(t, err)
  1051. num, err := client.Zrem("key", "value2", "value3")
  1052. assert.Nil(t, err)
  1053. assert.Equal(t, 2, num)
  1054. ok, err = client.Zadd("key", 6, "value2")
  1055. assert.Nil(t, err)
  1056. assert.True(t, ok)
  1057. ok, err = client.Zadd("key", 7, "value3")
  1058. assert.Nil(t, err)
  1059. assert.True(t, ok)
  1060. ok, err = client.Zadd("key", 8, "value4")
  1061. assert.Nil(t, err)
  1062. assert.True(t, ok)
  1063. _, err = New(client.Addr, badType()).Zremrangebyscore("key", 6, 7)
  1064. assert.NotNil(t, err)
  1065. num, err = client.Zremrangebyscore("key", 6, 7)
  1066. assert.Nil(t, err)
  1067. assert.Equal(t, 2, num)
  1068. ok, err = client.Zadd("key", 6, "value2")
  1069. assert.Nil(t, err)
  1070. assert.True(t, ok)
  1071. _, err = New(client.Addr, badType()).Zadd("key", 7, "value3")
  1072. assert.NotNil(t, err)
  1073. ok, err = client.Zadd("key", 7, "value3")
  1074. assert.Nil(t, err)
  1075. assert.True(t, ok)
  1076. _, err = New(client.Addr, badType()).Zcount("key", 6, 7)
  1077. assert.NotNil(t, err)
  1078. num, err = client.Zcount("key", 6, 7)
  1079. assert.Nil(t, err)
  1080. assert.Equal(t, 2, num)
  1081. _, err = New(client.Addr, badType()).Zremrangebyrank("key", 1, 2)
  1082. assert.NotNil(t, err)
  1083. num, err = client.Zremrangebyrank("key", 1, 2)
  1084. assert.Nil(t, err)
  1085. assert.Equal(t, 2, num)
  1086. _, err = New(client.Addr, badType()).Zcard("key")
  1087. assert.NotNil(t, err)
  1088. card, err := client.Zcard("key")
  1089. assert.Nil(t, err)
  1090. assert.Equal(t, 2, card)
  1091. _, err = New(client.Addr, badType()).Zrange("key", 0, -1)
  1092. assert.NotNil(t, err)
  1093. vals, err := client.Zrange("key", 0, -1)
  1094. assert.Nil(t, err)
  1095. assert.EqualValues(t, []string{"value1", "value4"}, vals)
  1096. _, err = New(client.Addr, badType()).Zrevrange("key", 0, -1)
  1097. assert.NotNil(t, err)
  1098. vals, err = client.Zrevrange("key", 0, -1)
  1099. assert.Nil(t, err)
  1100. assert.EqualValues(t, []string{"value4", "value1"}, vals)
  1101. _, err = New(client.Addr, badType()).ZrangeWithScores("key", 0, -1)
  1102. assert.NotNil(t, err)
  1103. pairs, err = client.ZrangeWithScores("key", 0, -1)
  1104. assert.Nil(t, err)
  1105. assert.EqualValues(t, []Pair{
  1106. {
  1107. Key: "value1",
  1108. Score: 5,
  1109. },
  1110. {
  1111. Key: "value4",
  1112. Score: 8,
  1113. },
  1114. }, pairs)
  1115. _, err = New(client.Addr, badType()).ZrangebyscoreWithScores("key", 5, 8)
  1116. assert.NotNil(t, err)
  1117. pairs, err = client.ZrangebyscoreWithScores("key", 5, 8)
  1118. assert.Nil(t, err)
  1119. assert.EqualValues(t, []Pair{
  1120. {
  1121. Key: "value1",
  1122. Score: 5,
  1123. },
  1124. {
  1125. Key: "value4",
  1126. Score: 8,
  1127. },
  1128. }, pairs)
  1129. _, err = New(client.Addr, badType()).ZrangebyscoreWithScoresAndLimit(
  1130. "key", 5, 8, 1, 1)
  1131. assert.NotNil(t, err)
  1132. pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
  1133. assert.Nil(t, err)
  1134. assert.EqualValues(t, []Pair{
  1135. {
  1136. Key: "value4",
  1137. Score: 8,
  1138. },
  1139. }, pairs)
  1140. pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
  1141. assert.Nil(t, err)
  1142. assert.Equal(t, 0, len(pairs))
  1143. _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScores("key", 5, 8)
  1144. assert.NotNil(t, err)
  1145. pairs, err = client.ZrevrangebyscoreWithScores("key", 5, 8)
  1146. assert.Nil(t, err)
  1147. assert.EqualValues(t, []Pair{
  1148. {
  1149. Key: "value4",
  1150. Score: 8,
  1151. },
  1152. {
  1153. Key: "value1",
  1154. Score: 5,
  1155. },
  1156. }, pairs)
  1157. _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresAndLimit(
  1158. "key", 5, 8, 1, 1)
  1159. assert.NotNil(t, err)
  1160. pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
  1161. assert.Nil(t, err)
  1162. assert.EqualValues(t, []Pair{
  1163. {
  1164. Key: "value1",
  1165. Score: 5,
  1166. },
  1167. }, pairs)
  1168. pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
  1169. assert.Nil(t, err)
  1170. assert.Equal(t, 0, len(pairs))
  1171. _, err = New(client.Addr, badType()).Zrevrank("key", "value")
  1172. assert.NotNil(t, err)
  1173. _, _ = client.Zadd("second", 2, "aa")
  1174. _, _ = client.Zadd("third", 3, "bbb")
  1175. val, err = client.Zunionstore("union", &ZStore{
  1176. Keys: []string{"second", "third"},
  1177. Weights: []float64{1, 2},
  1178. Aggregate: "SUM",
  1179. })
  1180. assert.Nil(t, err)
  1181. assert.Equal(t, int64(2), val)
  1182. _, err = New(client.Addr, badType()).Zunionstore("union", &ZStore{})
  1183. assert.NotNil(t, err)
  1184. vals, err = client.Zrange("union", 0, 10000)
  1185. assert.Nil(t, err)
  1186. assert.EqualValues(t, []string{"aa", "bbb"}, vals)
  1187. ival, err := client.Zcard("union")
  1188. assert.Nil(t, err)
  1189. assert.Equal(t, 2, ival)
  1190. })
  1191. })
  1192. t.Run("sorted set error", func(t *testing.T) {
  1193. runOnRedisWithError(t, func(client *Redis) {
  1194. _, err := client.ZaddFloat("key", 1, "value")
  1195. assert.Error(t, err)
  1196. })
  1197. runOnRedisWithError(t, func(client *Redis) {
  1198. _, err := client.Zadds("key")
  1199. assert.Error(t, err)
  1200. })
  1201. runOnRedisWithError(t, func(client *Redis) {
  1202. _, err := client.Zcard("key")
  1203. assert.Error(t, err)
  1204. })
  1205. runOnRedisWithError(t, func(client *Redis) {
  1206. _, err := client.Zcount("key", 1, 2)
  1207. assert.Error(t, err)
  1208. })
  1209. runOnRedisWithError(t, func(client *Redis) {
  1210. _, err := client.Zincrby("key", 1, "value")
  1211. assert.Error(t, err)
  1212. })
  1213. runOnRedisWithError(t, func(client *Redis) {
  1214. _, err := client.Zscore("key", "value")
  1215. assert.Error(t, err)
  1216. })
  1217. runOnRedisWithError(t, func(client *Redis) {
  1218. _, err := client.Zrem("key", "value")
  1219. assert.Error(t, err)
  1220. })
  1221. runOnRedisWithError(t, func(client *Redis) {
  1222. _, err := client.Zremrangebyscore("key", 1, 2)
  1223. assert.Error(t, err)
  1224. })
  1225. runOnRedisWithError(t, func(client *Redis) {
  1226. _, err := client.Zremrangebyrank("key", 1, 2)
  1227. assert.Error(t, err)
  1228. })
  1229. runOnRedisWithError(t, func(client *Redis) {
  1230. _, err := client.ZrangeWithScores("key", 1, 2)
  1231. assert.Error(t, err)
  1232. })
  1233. runOnRedisWithError(t, func(client *Redis) {
  1234. _, err := client.ZrangeWithScoresByFloat("key", 1, 2)
  1235. assert.Error(t, err)
  1236. })
  1237. runOnRedisWithError(t, func(client *Redis) {
  1238. _, err := client.ZRevRangeWithScores("key", 1, 2)
  1239. assert.Error(t, err)
  1240. })
  1241. runOnRedisWithError(t, func(client *Redis) {
  1242. _, err := client.ZRevRangeWithScoresByFloat("key", 1, 2)
  1243. assert.Error(t, err)
  1244. })
  1245. runOnRedisWithError(t, func(client *Redis) {
  1246. _, err := client.ZrangebyscoreWithScores("key", 1, 2)
  1247. assert.Error(t, err)
  1248. })
  1249. runOnRedisWithError(t, func(client *Redis) {
  1250. _, err := client.ZrangebyscoreWithScoresByFloat("key", 1, 2)
  1251. assert.Error(t, err)
  1252. })
  1253. runOnRedisWithError(t, func(client *Redis) {
  1254. _, err := client.ZrangebyscoreWithScoresAndLimit("key", 1, 2, 1, 1)
  1255. assert.Error(t, err)
  1256. })
  1257. runOnRedisWithError(t, func(client *Redis) {
  1258. _, err := client.ZrangebyscoreWithScoresByFloatAndLimit("key", 1, 2, 1, 1)
  1259. assert.Error(t, err)
  1260. })
  1261. runOnRedisWithError(t, func(client *Redis) {
  1262. _, err := client.ZrevrangebyscoreWithScores("key", 1, 2)
  1263. assert.Error(t, err)
  1264. })
  1265. runOnRedisWithError(t, func(client *Redis) {
  1266. _, err := client.ZrevrangebyscoreWithScoresByFloat("key", 1, 2)
  1267. assert.Error(t, err)
  1268. })
  1269. runOnRedisWithError(t, func(client *Redis) {
  1270. _, err := client.ZrevrangebyscoreWithScoresAndLimit("key", 1, 2, 1, 1)
  1271. assert.Error(t, err)
  1272. })
  1273. runOnRedisWithError(t, func(client *Redis) {
  1274. _, err := client.ZrevrangebyscoreWithScoresByFloatAndLimit("key", 1, 2, 1, 1)
  1275. assert.Error(t, err)
  1276. })
  1277. })
  1278. }
  1279. func TestRedis_SortedSetByFloat64(t *testing.T) {
  1280. runOnRedis(t, func(client *Redis) {
  1281. ok, err := client.ZaddFloat("key", 10.345, "value1")
  1282. assert.Nil(t, err)
  1283. assert.True(t, ok)
  1284. val, err := client.ZscoreByFloat("key", "value1")
  1285. assert.Nil(t, err)
  1286. assert.Equal(t, 10.345, val)
  1287. _, err = New(client.Addr, badType()).ZscoreByFloat("key", "value1")
  1288. assert.Error(t, err)
  1289. _, _ = client.ZaddFloat("key", 10.346, "value2")
  1290. _, err = New(client.Addr, badType()).ZRevRangeWithScoresByFloat("key", 0, -1)
  1291. assert.NotNil(t, err)
  1292. _, err = client.ZRevRangeWithScoresByFloat("key", 0, -1)
  1293. assert.Nil(t, err)
  1294. _, err = client.ZRevRangeWithScoresByFloatCtx(context.Background(), "key", 0, -1)
  1295. assert.Nil(t, err)
  1296. pairs, err := client.ZrevrangeWithScoresByFloat("key", 0, -1)
  1297. assert.Nil(t, err)
  1298. assert.EqualValues(t, []FloatPair{
  1299. {
  1300. Key: "value2",
  1301. Score: 10.346,
  1302. },
  1303. {
  1304. Key: "value1",
  1305. Score: 10.345,
  1306. },
  1307. }, pairs)
  1308. _, err = New(client.Addr, badType()).ZrangeWithScoresByFloat("key", 0, -1)
  1309. assert.Error(t, err)
  1310. pairs, err = client.ZrangeWithScoresByFloat("key", 0, -1)
  1311. if assert.NoError(t, err) {
  1312. assert.EqualValues(t, []FloatPair{
  1313. {
  1314. Key: "value1",
  1315. Score: 10.345,
  1316. },
  1317. {
  1318. Key: "value2",
  1319. Score: 10.346,
  1320. },
  1321. }, pairs)
  1322. }
  1323. _, err = New(client.Addr, badType()).ZrangebyscoreWithScoresByFloat("key", 0, 20)
  1324. assert.NotNil(t, err)
  1325. pairs, err = client.ZrangebyscoreWithScoresByFloat("key", 0, 20)
  1326. assert.Nil(t, err)
  1327. assert.EqualValues(t, []FloatPair{
  1328. {
  1329. Key: "value1",
  1330. Score: 10.345,
  1331. },
  1332. {
  1333. Key: "value2",
  1334. Score: 10.346,
  1335. },
  1336. }, pairs)
  1337. _, err = client.ZrangebyscoreWithScoresByFloatAndLimit("key", 10.1, 12.2, 1, 0)
  1338. assert.NoError(t, err)
  1339. _, err = New(client.Addr, badType()).ZrangebyscoreWithScoresByFloatAndLimit(
  1340. "key", 10.1, 12.2, 1, 1)
  1341. assert.NotNil(t, err)
  1342. pairs, err = client.ZrangebyscoreWithScoresByFloatAndLimit("key", 10.1, 12.2, 1, 1)
  1343. assert.Nil(t, err)
  1344. assert.EqualValues(t, []FloatPair{
  1345. {
  1346. Key: "value2",
  1347. Score: 10.346,
  1348. },
  1349. }, pairs)
  1350. _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresByFloat("key", 10, 12)
  1351. assert.NotNil(t, err)
  1352. pairs, err = client.ZrevrangebyscoreWithScoresByFloat("key", 10, 12)
  1353. assert.Nil(t, err)
  1354. assert.EqualValues(t, []FloatPair{
  1355. {
  1356. Key: "value2",
  1357. Score: 10.346,
  1358. },
  1359. {
  1360. Key: "value1",
  1361. Score: 10.345,
  1362. },
  1363. }, pairs)
  1364. _, err = client.ZrevrangebyscoreWithScoresByFloatAndLimit("key", 10, 12, 1, 0)
  1365. assert.NoError(t, err)
  1366. _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresByFloatAndLimit(
  1367. "key", 10, 12, 1, 1)
  1368. assert.NotNil(t, err)
  1369. pairs, err = client.ZrevrangebyscoreWithScoresByFloatAndLimit("key", 10, 12, 1, 1)
  1370. assert.Nil(t, err)
  1371. assert.EqualValues(t, []FloatPair{
  1372. {
  1373. Key: "value1",
  1374. Score: 10.345,
  1375. },
  1376. }, pairs)
  1377. })
  1378. }
  1379. func TestRedis_IncrbyFloat(t *testing.T) {
  1380. runOnRedis(t, func(client *Redis) {
  1381. incrVal, err := client.IncrbyFloat("key", 0.002)
  1382. assert.Nil(t, err)
  1383. assert.Equal(t, 0.002, incrVal)
  1384. _, err = New(client.Addr, badType()).IncrbyFloat("key", -0.001)
  1385. assert.Error(t, err)
  1386. incrVal2, err := client.IncrbyFloat("key", -0.001)
  1387. assert.Nil(t, err)
  1388. assert.Equal(t, 0.001, incrVal2)
  1389. _, err = New(client.Addr, badType()).HincrbyFloat("hkey", "i", 0.002)
  1390. assert.Error(t, err)
  1391. hincrVal, err := client.HincrbyFloat("hkey", "i", 0.002)
  1392. assert.Nil(t, err)
  1393. assert.Equal(t, 0.002, hincrVal)
  1394. hincrVal2, err := client.HincrbyFloat("hkey", "i", -0.001)
  1395. assert.Nil(t, err)
  1396. assert.Equal(t, 0.001, hincrVal2)
  1397. })
  1398. }
  1399. func TestRedis_Pipelined(t *testing.T) {
  1400. runOnRedis(t, func(client *Redis) {
  1401. assert.NotNil(t, New(client.Addr, badType()).Pipelined(func(pipeliner Pipeliner) error {
  1402. return nil
  1403. }))
  1404. err := client.Pipelined(
  1405. func(pipe Pipeliner) error {
  1406. pipe.Incr(context.Background(), "pipelined_counter")
  1407. pipe.Expire(context.Background(), "pipelined_counter", time.Hour)
  1408. pipe.ZAdd(context.Background(), "zadd", &Z{Score: 12, Member: "zadd"})
  1409. return nil
  1410. },
  1411. )
  1412. assert.Nil(t, err)
  1413. _, err = New(client.Addr, badType()).Ttl("pipelined_counter")
  1414. assert.NotNil(t, err)
  1415. ttl, err := client.Ttl("pipelined_counter")
  1416. assert.Nil(t, err)
  1417. assert.Equal(t, 3600, ttl)
  1418. value, err := client.Get("pipelined_counter")
  1419. assert.Nil(t, err)
  1420. assert.Equal(t, "1", value)
  1421. score, err := client.Zscore("zadd", "zadd")
  1422. assert.Nil(t, err)
  1423. assert.Equal(t, int64(12), score)
  1424. })
  1425. }
  1426. func TestRedisString(t *testing.T) {
  1427. runOnRedis(t, func(client *Redis) {
  1428. client.Ping()
  1429. _, err := getRedis(New(client.Addr, Cluster()))
  1430. assert.Nil(t, err)
  1431. assert.Equal(t, client.Addr, client.String())
  1432. assert.NotNil(t, New(client.Addr, badType()).Ping())
  1433. })
  1434. }
  1435. func TestRedisScriptLoad(t *testing.T) {
  1436. runOnRedis(t, func(client *Redis) {
  1437. client.Ping()
  1438. _, err := New(client.Addr, badType()).ScriptLoad("foo")
  1439. assert.NotNil(t, err)
  1440. _, err = client.ScriptLoad("foo")
  1441. assert.NotNil(t, err)
  1442. })
  1443. }
  1444. func TestRedisEvalSha(t *testing.T) {
  1445. runOnRedis(t, func(client *Redis) {
  1446. client.Ping()
  1447. scriptHash, err := client.ScriptLoad(`return redis.call("EXISTS", KEYS[1])`)
  1448. assert.Nil(t, err)
  1449. _, err = New(client.Addr, badType()).EvalSha(scriptHash, []string{"key1"})
  1450. assert.Error(t, err)
  1451. result, err := client.EvalSha(scriptHash, []string{"key1"})
  1452. assert.Nil(t, err)
  1453. assert.Equal(t, int64(0), result)
  1454. })
  1455. }
  1456. func TestRedis_Ttl(t *testing.T) {
  1457. t.Run("TTL", func(t *testing.T) {
  1458. runOnRedis(t, func(client *Redis) {
  1459. if assert.NoError(t, client.Set("key", "value")) {
  1460. _, err := client.Ttl("key")
  1461. assert.NoError(t, err)
  1462. }
  1463. })
  1464. })
  1465. t.Run("TTL error", func(t *testing.T) {
  1466. runOnRedisWithError(t, func(client *Redis) {
  1467. _, err := client.Ttl("key")
  1468. assert.Error(t, err)
  1469. })
  1470. })
  1471. }
  1472. func TestRedisToPairs(t *testing.T) {
  1473. pairs := toPairs([]red.Z{
  1474. {
  1475. Member: 1,
  1476. Score: 1,
  1477. },
  1478. {
  1479. Member: 2,
  1480. Score: 2,
  1481. },
  1482. })
  1483. assert.EqualValues(t, []Pair{
  1484. {
  1485. Key: "1",
  1486. Score: 1,
  1487. },
  1488. {
  1489. Key: "2",
  1490. Score: 2,
  1491. },
  1492. }, pairs)
  1493. }
  1494. func TestRedisToFloatPairs(t *testing.T) {
  1495. pairs := toFloatPairs([]red.Z{
  1496. {
  1497. Member: 1,
  1498. Score: 1,
  1499. },
  1500. {
  1501. Member: 2,
  1502. Score: 2,
  1503. },
  1504. })
  1505. assert.EqualValues(t, []FloatPair{
  1506. {
  1507. Key: "1",
  1508. Score: 1,
  1509. },
  1510. {
  1511. Key: "2",
  1512. Score: 2,
  1513. },
  1514. }, pairs)
  1515. }
  1516. func TestRedis_Zscan(t *testing.T) {
  1517. runOnRedis(t, func(client *Redis) {
  1518. key := "key"
  1519. for i := 0; i < 1550; i++ {
  1520. ok, err := client.Zadd(key, int64(i), "value_"+strconv.Itoa(i))
  1521. assert.Nil(t, err)
  1522. assert.True(t, ok)
  1523. }
  1524. var cursor uint64 = 0
  1525. sum := 0
  1526. for {
  1527. _, _, err := New(client.Addr, badType()).Zscan(key, cursor, "value_*", 100)
  1528. assert.NotNil(t, err)
  1529. keys, next, err := client.Zscan(key, cursor, "value_*", 100)
  1530. assert.Nil(t, err)
  1531. sum += len(keys)
  1532. if next == 0 {
  1533. break
  1534. }
  1535. cursor = next
  1536. }
  1537. assert.Equal(t, sum, 3100)
  1538. _, err := New(client.Addr, badType()).Del(key)
  1539. assert.NotNil(t, err)
  1540. _, err = client.Del(key)
  1541. assert.Nil(t, err)
  1542. })
  1543. }
  1544. func TestRedisToStrings(t *testing.T) {
  1545. vals := toStrings([]any{1, 2})
  1546. assert.EqualValues(t, []string{"1", "2"}, vals)
  1547. }
  1548. func TestRedisBlpop(t *testing.T) {
  1549. runOnRedis(t, func(client *Redis) {
  1550. client.Ping()
  1551. var node mockedNode
  1552. _, err := client.Blpop(nil, "foo")
  1553. assert.NotNil(t, err)
  1554. _, err = client.Blpop(node, "foo")
  1555. assert.NotNil(t, err)
  1556. })
  1557. }
  1558. func TestRedisBlpopEx(t *testing.T) {
  1559. t.Run("blpopex", func(t *testing.T) {
  1560. runOnRedis(t, func(client *Redis) {
  1561. client.Ping()
  1562. var node mockedNode
  1563. _, _, err := client.BlpopEx(nil, "foo")
  1564. assert.Error(t, err)
  1565. _, _, err = client.BlpopEx(node, "foo")
  1566. assert.Error(t, err)
  1567. })
  1568. })
  1569. }
  1570. func TestRedisBlpopWithTimeout(t *testing.T) {
  1571. runOnRedis(t, func(client *Redis) {
  1572. client.Ping()
  1573. var node mockedNode
  1574. _, err := client.BlpopWithTimeout(nil, 10*time.Second, "foo")
  1575. assert.NotNil(t, err)
  1576. _, err = client.BlpopWithTimeout(node, 10*time.Second, "foo")
  1577. assert.NotNil(t, err)
  1578. })
  1579. }
  1580. func TestRedisGeo(t *testing.T) {
  1581. t.Run("geo", func(t *testing.T) {
  1582. runOnRedis(t, func(client *Redis) {
  1583. client.Ping()
  1584. geoLocation := []*GeoLocation{{Longitude: 13.361389, Latitude: 38.115556, Name: "Palermo"},
  1585. {Longitude: 15.087269, Latitude: 37.502669, Name: "Catania"}}
  1586. v, err := client.GeoAdd("sicily", geoLocation...)
  1587. assert.Nil(t, err)
  1588. assert.Equal(t, int64(2), v)
  1589. _, err = New(client.Addr, badType()).GeoDist("sicily", "Palermo", "Catania", "m")
  1590. assert.Error(t, err)
  1591. v2, err := client.GeoDist("sicily", "Palermo", "Catania", "m")
  1592. assert.Nil(t, err)
  1593. assert.Equal(t, 166274, int(v2))
  1594. // GeoHash not support
  1595. _, err = New(client.Addr, badType()).GeoPos("sicily", "Palermo", "Catania")
  1596. assert.Error(t, err)
  1597. v3, err := client.GeoPos("sicily", "Palermo", "Catania")
  1598. assert.Nil(t, err)
  1599. assert.Equal(t, int64(v3[0].Longitude), int64(13))
  1600. assert.Equal(t, int64(v3[0].Latitude), int64(38))
  1601. assert.Equal(t, int64(v3[1].Longitude), int64(15))
  1602. assert.Equal(t, int64(v3[1].Latitude), int64(37))
  1603. _, err = New(client.Addr, badType()).GeoRadius("sicily", 15, 37,
  1604. &red.GeoRadiusQuery{WithDist: true, Unit: "km", Radius: 200})
  1605. assert.Error(t, err)
  1606. v4, err := client.GeoRadius("sicily", 15, 37, &red.GeoRadiusQuery{
  1607. WithDist: true,
  1608. Unit: "km", Radius: 200,
  1609. })
  1610. assert.Nil(t, err)
  1611. assert.Equal(t, int64(v4[0].Dist), int64(190))
  1612. assert.Equal(t, int64(v4[1].Dist), int64(56))
  1613. geoLocation2 := []*GeoLocation{{Longitude: 13.583333, Latitude: 37.316667, Name: "Agrigento"}}
  1614. _, err = New(client.Addr, badType()).GeoAdd("sicily", geoLocation2...)
  1615. assert.Error(t, err)
  1616. v5, err := client.GeoAdd("sicily", geoLocation2...)
  1617. assert.Nil(t, err)
  1618. assert.Equal(t, int64(1), v5)
  1619. _, err = New(client.Addr, badType()).GeoRadiusByMember("sicily", "Agrigento",
  1620. &red.GeoRadiusQuery{Unit: "km", Radius: 100})
  1621. assert.Error(t, err)
  1622. v6, err := client.GeoRadiusByMember("sicily", "Agrigento",
  1623. &red.GeoRadiusQuery{Unit: "km", Radius: 100})
  1624. assert.Nil(t, err)
  1625. assert.Equal(t, v6[0].Name, "Agrigento")
  1626. assert.Equal(t, v6[1].Name, "Palermo")
  1627. })
  1628. })
  1629. t.Run("geo error", func(t *testing.T) {
  1630. runOnRedisWithError(t, func(client *Redis) {
  1631. _, err := client.GeoAdd("sicily", &GeoLocation{
  1632. Longitude: 13.3,
  1633. Latitude: 38.1,
  1634. Name: "Palermo",
  1635. })
  1636. assert.Error(t, err)
  1637. _, err = client.GeoDist("sicily", "Palermo", "Catania", "m")
  1638. assert.Error(t, err)
  1639. _, err = client.GeoRadius("sicily", 15, 37, &red.GeoRadiusQuery{
  1640. WithDist: true,
  1641. })
  1642. assert.Error(t, err)
  1643. _, err = client.GeoRadiusByMember("sicily", "Agrigento", &red.GeoRadiusQuery{
  1644. Unit: "km",
  1645. })
  1646. assert.Error(t, err)
  1647. _, err = client.GeoPos("sicily", "Palermo", "Catania")
  1648. assert.Error(t, err)
  1649. })
  1650. })
  1651. }
  1652. func TestSetSlowThreshold(t *testing.T) {
  1653. assert.Equal(t, defaultSlowThreshold, slowThreshold.Load())
  1654. SetSlowThreshold(time.Second)
  1655. assert.Equal(t, time.Second, slowThreshold.Load())
  1656. }
  1657. func TestRedis_WithPass(t *testing.T) {
  1658. runOnRedis(t, func(client *Redis) {
  1659. err := New(client.Addr, WithPass("any")).Ping()
  1660. assert.NotNil(t, err)
  1661. })
  1662. }
  1663. func runOnRedis(t *testing.T, fn func(client *Redis)) {
  1664. logx.Disable()
  1665. s := miniredis.RunT(t)
  1666. fn(MustNewRedis(RedisConf{
  1667. Host: s.Addr(),
  1668. Type: NodeType,
  1669. }))
  1670. }
  1671. func runOnRedisWithError(t *testing.T, fn func(client *Redis)) {
  1672. logx.Disable()
  1673. s := miniredis.RunT(t)
  1674. s.SetError("mock error")
  1675. fn(New(s.Addr()))
  1676. }
  1677. func runOnRedisTLS(t *testing.T, fn func(client *Redis)) {
  1678. logx.Disable()
  1679. s, err := miniredis.RunTLS(&tls.Config{
  1680. Certificates: make([]tls.Certificate, 1),
  1681. InsecureSkipVerify: true,
  1682. })
  1683. assert.Nil(t, err)
  1684. defer func() {
  1685. client, err := clientManager.GetResource(s.Addr(), func() (io.Closer, error) {
  1686. return nil, errors.New("should already exist")
  1687. })
  1688. if err != nil {
  1689. t.Error(err)
  1690. }
  1691. if client != nil {
  1692. _ = client.Close()
  1693. }
  1694. }()
  1695. fn(New(s.Addr(), WithTLS()))
  1696. }
  1697. func badType() Option {
  1698. return func(r *Redis) {
  1699. r.Type = "bad"
  1700. }
  1701. }
  1702. type mockedNode struct {
  1703. RedisNode
  1704. }
  1705. func (n mockedNode) BLPop(_ context.Context, _ time.Duration, _ ...string) *red.StringSliceCmd {
  1706. return red.NewStringSliceCmd(context.Background(), "foo", "bar")
  1707. }