redis_test.go 40 KB

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