commands_test.go 116 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042
  1. package redis_test
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "time"
  7. . "github.com/onsi/ginkgo"
  8. . "github.com/onsi/gomega"
  9. "github.com/go-redis/redis/v7"
  10. "github.com/go-redis/redis/v7/internal/proto"
  11. )
  12. var _ = Describe("Commands", func() {
  13. var client *redis.Client
  14. BeforeEach(func() {
  15. client = redis.NewClient(redisOptions())
  16. Expect(client.FlushDB().Err()).NotTo(HaveOccurred())
  17. })
  18. AfterEach(func() {
  19. Expect(client.Close()).NotTo(HaveOccurred())
  20. })
  21. Describe("server", func() {
  22. It("should Auth", func() {
  23. cmds, err := client.Pipelined(func(pipe redis.Pipeliner) error {
  24. pipe.Auth("password")
  25. pipe.Auth("")
  26. return nil
  27. })
  28. Expect(err).To(MatchError("ERR Client sent AUTH, but no password is set"))
  29. Expect(cmds[0].Err()).To(MatchError("ERR Client sent AUTH, but no password is set"))
  30. Expect(cmds[1].Err()).To(MatchError("ERR Client sent AUTH, but no password is set"))
  31. stats := client.PoolStats()
  32. Expect(stats.Hits).To(Equal(uint32(1)))
  33. Expect(stats.Misses).To(Equal(uint32(1)))
  34. Expect(stats.Timeouts).To(Equal(uint32(0)))
  35. Expect(stats.TotalConns).To(Equal(uint32(1)))
  36. Expect(stats.IdleConns).To(Equal(uint32(1)))
  37. })
  38. It("should Echo", func() {
  39. pipe := client.Pipeline()
  40. echo := pipe.Echo("hello")
  41. _, err := pipe.Exec()
  42. Expect(err).NotTo(HaveOccurred())
  43. Expect(echo.Err()).NotTo(HaveOccurred())
  44. Expect(echo.Val()).To(Equal("hello"))
  45. })
  46. It("should Ping", func() {
  47. ping := client.Ping()
  48. Expect(ping.Err()).NotTo(HaveOccurred())
  49. Expect(ping.Val()).To(Equal("PONG"))
  50. })
  51. It("should Wait", func() {
  52. const wait = 3 * time.Second
  53. // assume testing on single redis instance
  54. start := time.Now()
  55. val, err := client.Wait(1, wait).Result()
  56. Expect(err).NotTo(HaveOccurred())
  57. Expect(val).To(Equal(int64(0)))
  58. Expect(time.Now()).To(BeTemporally("~", start.Add(wait), 3*time.Second))
  59. })
  60. It("should Select", func() {
  61. pipe := client.Pipeline()
  62. sel := pipe.Select(1)
  63. _, err := pipe.Exec()
  64. Expect(err).NotTo(HaveOccurred())
  65. Expect(sel.Err()).NotTo(HaveOccurred())
  66. Expect(sel.Val()).To(Equal("OK"))
  67. })
  68. It("should SwapDB", func() {
  69. pipe := client.Pipeline()
  70. sel := pipe.SwapDB(1, 2)
  71. _, err := pipe.Exec()
  72. Expect(err).NotTo(HaveOccurred())
  73. Expect(sel.Err()).NotTo(HaveOccurred())
  74. Expect(sel.Val()).To(Equal("OK"))
  75. })
  76. It("should BgRewriteAOF", func() {
  77. Skip("flaky test")
  78. val, err := client.BgRewriteAOF().Result()
  79. Expect(err).NotTo(HaveOccurred())
  80. Expect(val).To(ContainSubstring("Background append only file rewriting"))
  81. })
  82. It("should BgSave", func() {
  83. Skip("flaky test")
  84. // workaround for "ERR Can't BGSAVE while AOF log rewriting is in progress"
  85. Eventually(func() string {
  86. return client.BgSave().Val()
  87. }, "30s").Should(Equal("Background saving started"))
  88. })
  89. It("should ClientKill", func() {
  90. r := client.ClientKill("1.1.1.1:1111")
  91. Expect(r.Err()).To(MatchError("ERR No such client"))
  92. Expect(r.Val()).To(Equal(""))
  93. })
  94. It("should ClientKillByFilter", func() {
  95. r := client.ClientKillByFilter("TYPE", "test")
  96. Expect(r.Err()).To(MatchError("ERR Unknown client type 'test'"))
  97. Expect(r.Val()).To(Equal(int64(0)))
  98. })
  99. It("should ClientID", func() {
  100. err := client.ClientID().Err()
  101. Expect(err).NotTo(HaveOccurred())
  102. Expect(client.ClientID().Val()).To(BeNumerically(">=", 0))
  103. })
  104. It("should ClientUnblock", func() {
  105. id := client.ClientID().Val()
  106. r, err := client.ClientUnblock(id).Result()
  107. Expect(err).NotTo(HaveOccurred())
  108. Expect(r).To(Equal(int64(0)))
  109. })
  110. It("should ClientUnblockWithError", func() {
  111. id := client.ClientID().Val()
  112. r, err := client.ClientUnblockWithError(id).Result()
  113. Expect(err).NotTo(HaveOccurred())
  114. Expect(r).To(Equal(int64(0)))
  115. })
  116. It("should ClientPause", func() {
  117. err := client.ClientPause(time.Second).Err()
  118. Expect(err).NotTo(HaveOccurred())
  119. start := time.Now()
  120. err = client.Ping().Err()
  121. Expect(err).NotTo(HaveOccurred())
  122. Expect(time.Now()).To(BeTemporally("~", start.Add(time.Second), 800*time.Millisecond))
  123. })
  124. It("should ClientSetName and ClientGetName", func() {
  125. pipe := client.Pipeline()
  126. set := pipe.ClientSetName("theclientname")
  127. get := pipe.ClientGetName()
  128. _, err := pipe.Exec()
  129. Expect(err).NotTo(HaveOccurred())
  130. Expect(set.Err()).NotTo(HaveOccurred())
  131. Expect(set.Val()).To(BeTrue())
  132. Expect(get.Err()).NotTo(HaveOccurred())
  133. Expect(get.Val()).To(Equal("theclientname"))
  134. })
  135. It("should ConfigGet", func() {
  136. val, err := client.ConfigGet("*").Result()
  137. Expect(err).NotTo(HaveOccurred())
  138. Expect(val).NotTo(BeEmpty())
  139. })
  140. It("should ConfigResetStat", func() {
  141. r := client.ConfigResetStat()
  142. Expect(r.Err()).NotTo(HaveOccurred())
  143. Expect(r.Val()).To(Equal("OK"))
  144. })
  145. It("should ConfigSet", func() {
  146. configGet := client.ConfigGet("maxmemory")
  147. Expect(configGet.Err()).NotTo(HaveOccurred())
  148. Expect(configGet.Val()).To(HaveLen(2))
  149. Expect(configGet.Val()[0]).To(Equal("maxmemory"))
  150. configSet := client.ConfigSet("maxmemory", configGet.Val()[1].(string))
  151. Expect(configSet.Err()).NotTo(HaveOccurred())
  152. Expect(configSet.Val()).To(Equal("OK"))
  153. })
  154. It("should ConfigRewrite", func() {
  155. configRewrite := client.ConfigRewrite()
  156. Expect(configRewrite.Err()).NotTo(HaveOccurred())
  157. Expect(configRewrite.Val()).To(Equal("OK"))
  158. })
  159. It("should DBSize", func() {
  160. size, err := client.DBSize().Result()
  161. Expect(err).NotTo(HaveOccurred())
  162. Expect(size).To(Equal(int64(0)))
  163. })
  164. It("should Info", func() {
  165. info := client.Info()
  166. Expect(info.Err()).NotTo(HaveOccurred())
  167. Expect(info.Val()).NotTo(Equal(""))
  168. })
  169. It("should Info cpu", func() {
  170. info := client.Info("cpu")
  171. Expect(info.Err()).NotTo(HaveOccurred())
  172. Expect(info.Val()).NotTo(Equal(""))
  173. Expect(info.Val()).To(ContainSubstring(`used_cpu_sys`))
  174. })
  175. It("should LastSave", func() {
  176. lastSave := client.LastSave()
  177. Expect(lastSave.Err()).NotTo(HaveOccurred())
  178. Expect(lastSave.Val()).NotTo(Equal(0))
  179. })
  180. It("should Save", func() {
  181. // workaround for "ERR Background save already in progress"
  182. Eventually(func() string {
  183. return client.Save().Val()
  184. }, "10s").Should(Equal("OK"))
  185. })
  186. It("should SlaveOf", func() {
  187. slaveOf := client.SlaveOf("localhost", "8888")
  188. Expect(slaveOf.Err()).NotTo(HaveOccurred())
  189. Expect(slaveOf.Val()).To(Equal("OK"))
  190. slaveOf = client.SlaveOf("NO", "ONE")
  191. Expect(slaveOf.Err()).NotTo(HaveOccurred())
  192. Expect(slaveOf.Val()).To(Equal("OK"))
  193. })
  194. It("should Time", func() {
  195. tm, err := client.Time().Result()
  196. Expect(err).NotTo(HaveOccurred())
  197. Expect(tm).To(BeTemporally("~", time.Now(), 3*time.Second))
  198. })
  199. It("should Command", func() {
  200. cmds, err := client.Command().Result()
  201. Expect(err).NotTo(HaveOccurred())
  202. Expect(len(cmds)).To(BeNumerically("~", 200, 20))
  203. cmd := cmds["mget"]
  204. Expect(cmd.Name).To(Equal("mget"))
  205. Expect(cmd.Arity).To(Equal(int8(-2)))
  206. Expect(cmd.Flags).To(ContainElement("readonly"))
  207. Expect(cmd.FirstKeyPos).To(Equal(int8(1)))
  208. Expect(cmd.LastKeyPos).To(Equal(int8(-1)))
  209. Expect(cmd.StepCount).To(Equal(int8(1)))
  210. cmd = cmds["ping"]
  211. Expect(cmd.Name).To(Equal("ping"))
  212. Expect(cmd.Arity).To(Equal(int8(-1)))
  213. Expect(cmd.Flags).To(ContainElement("stale"))
  214. Expect(cmd.Flags).To(ContainElement("fast"))
  215. Expect(cmd.FirstKeyPos).To(Equal(int8(0)))
  216. Expect(cmd.LastKeyPos).To(Equal(int8(0)))
  217. Expect(cmd.StepCount).To(Equal(int8(0)))
  218. })
  219. })
  220. Describe("debugging", func() {
  221. It("should DebugObject", func() {
  222. err := client.DebugObject("foo").Err()
  223. Expect(err).To(MatchError("ERR no such key"))
  224. err = client.Set("foo", "bar", 0).Err()
  225. Expect(err).NotTo(HaveOccurred())
  226. s, err := client.DebugObject("foo").Result()
  227. Expect(err).NotTo(HaveOccurred())
  228. Expect(s).To(ContainSubstring("serializedlength:4"))
  229. })
  230. It("should MemoryUsage", func() {
  231. err := client.MemoryUsage("foo").Err()
  232. Expect(err).To(Equal(redis.Nil))
  233. err = client.Set("foo", "bar", 0).Err()
  234. Expect(err).NotTo(HaveOccurred())
  235. n, err := client.MemoryUsage("foo").Result()
  236. Expect(err).NotTo(HaveOccurred())
  237. Expect(n).To(Equal(int64(50)))
  238. n, err = client.MemoryUsage("foo", 0).Result()
  239. Expect(err).NotTo(HaveOccurred())
  240. Expect(n).To(Equal(int64(50)))
  241. })
  242. })
  243. Describe("keys", func() {
  244. It("should Del", func() {
  245. err := client.Set("key1", "Hello", 0).Err()
  246. Expect(err).NotTo(HaveOccurred())
  247. err = client.Set("key2", "World", 0).Err()
  248. Expect(err).NotTo(HaveOccurred())
  249. n, err := client.Del("key1", "key2", "key3").Result()
  250. Expect(err).NotTo(HaveOccurred())
  251. Expect(n).To(Equal(int64(2)))
  252. })
  253. It("should Unlink", func() {
  254. err := client.Set("key1", "Hello", 0).Err()
  255. Expect(err).NotTo(HaveOccurred())
  256. err = client.Set("key2", "World", 0).Err()
  257. Expect(err).NotTo(HaveOccurred())
  258. n, err := client.Unlink("key1", "key2", "key3").Result()
  259. Expect(err).NotTo(HaveOccurred())
  260. Expect(n).To(Equal(int64(2)))
  261. })
  262. It("should Dump", func() {
  263. set := client.Set("key", "hello", 0)
  264. Expect(set.Err()).NotTo(HaveOccurred())
  265. Expect(set.Val()).To(Equal("OK"))
  266. dump := client.Dump("key")
  267. Expect(dump.Err()).NotTo(HaveOccurred())
  268. Expect(dump.Val()).NotTo(BeEmpty())
  269. })
  270. It("should Exists", func() {
  271. set := client.Set("key1", "Hello", 0)
  272. Expect(set.Err()).NotTo(HaveOccurred())
  273. Expect(set.Val()).To(Equal("OK"))
  274. n, err := client.Exists("key1").Result()
  275. Expect(err).NotTo(HaveOccurred())
  276. Expect(n).To(Equal(int64(1)))
  277. n, err = client.Exists("key2").Result()
  278. Expect(err).NotTo(HaveOccurred())
  279. Expect(n).To(Equal(int64(0)))
  280. n, err = client.Exists("key1", "key2").Result()
  281. Expect(err).NotTo(HaveOccurred())
  282. Expect(n).To(Equal(int64(1)))
  283. n, err = client.Exists("key1", "key1").Result()
  284. Expect(err).NotTo(HaveOccurred())
  285. Expect(n).To(Equal(int64(2)))
  286. })
  287. It("should Expire", func() {
  288. set := client.Set("key", "Hello", 0)
  289. Expect(set.Err()).NotTo(HaveOccurred())
  290. Expect(set.Val()).To(Equal("OK"))
  291. expire := client.Expire("key", 10*time.Second)
  292. Expect(expire.Err()).NotTo(HaveOccurred())
  293. Expect(expire.Val()).To(Equal(true))
  294. ttl := client.TTL("key")
  295. Expect(ttl.Err()).NotTo(HaveOccurred())
  296. Expect(ttl.Val()).To(Equal(10 * time.Second))
  297. set = client.Set("key", "Hello World", 0)
  298. Expect(set.Err()).NotTo(HaveOccurred())
  299. Expect(set.Val()).To(Equal("OK"))
  300. ttl = client.TTL("key")
  301. Expect(ttl.Err()).NotTo(HaveOccurred())
  302. Expect(ttl.Val()).To(Equal(time.Duration(-1)))
  303. ttl = client.TTL("nonexistent_key")
  304. Expect(ttl.Err()).NotTo(HaveOccurred())
  305. Expect(ttl.Val()).To(Equal(time.Duration(-2)))
  306. })
  307. It("should ExpireAt", func() {
  308. set := client.Set("key", "Hello", 0)
  309. Expect(set.Err()).NotTo(HaveOccurred())
  310. Expect(set.Val()).To(Equal("OK"))
  311. n, err := client.Exists("key").Result()
  312. Expect(err).NotTo(HaveOccurred())
  313. Expect(n).To(Equal(int64(1)))
  314. expireAt := client.ExpireAt("key", time.Now().Add(-time.Hour))
  315. Expect(expireAt.Err()).NotTo(HaveOccurred())
  316. Expect(expireAt.Val()).To(Equal(true))
  317. n, err = client.Exists("key").Result()
  318. Expect(err).NotTo(HaveOccurred())
  319. Expect(n).To(Equal(int64(0)))
  320. })
  321. It("should Keys", func() {
  322. mset := client.MSet("one", "1", "two", "2", "three", "3", "four", "4")
  323. Expect(mset.Err()).NotTo(HaveOccurred())
  324. Expect(mset.Val()).To(Equal("OK"))
  325. keys := client.Keys("*o*")
  326. Expect(keys.Err()).NotTo(HaveOccurred())
  327. Expect(keys.Val()).To(ConsistOf([]string{"four", "one", "two"}))
  328. keys = client.Keys("t??")
  329. Expect(keys.Err()).NotTo(HaveOccurred())
  330. Expect(keys.Val()).To(Equal([]string{"two"}))
  331. keys = client.Keys("*")
  332. Expect(keys.Err()).NotTo(HaveOccurred())
  333. Expect(keys.Val()).To(ConsistOf([]string{"four", "one", "three", "two"}))
  334. })
  335. It("should Migrate", func() {
  336. migrate := client.Migrate("localhost", redisSecondaryPort, "key", 0, 0)
  337. Expect(migrate.Err()).NotTo(HaveOccurred())
  338. Expect(migrate.Val()).To(Equal("NOKEY"))
  339. set := client.Set("key", "hello", 0)
  340. Expect(set.Err()).NotTo(HaveOccurred())
  341. Expect(set.Val()).To(Equal("OK"))
  342. migrate = client.Migrate("localhost", redisSecondaryPort, "key", 0, 0)
  343. Expect(migrate.Err()).To(MatchError("IOERR error or timeout writing to target instance"))
  344. Expect(migrate.Val()).To(Equal(""))
  345. })
  346. It("should Move", func() {
  347. move := client.Move("key", 2)
  348. Expect(move.Err()).NotTo(HaveOccurred())
  349. Expect(move.Val()).To(Equal(false))
  350. set := client.Set("key", "hello", 0)
  351. Expect(set.Err()).NotTo(HaveOccurred())
  352. Expect(set.Val()).To(Equal("OK"))
  353. move = client.Move("key", 2)
  354. Expect(move.Err()).NotTo(HaveOccurred())
  355. Expect(move.Val()).To(Equal(true))
  356. get := client.Get("key")
  357. Expect(get.Err()).To(Equal(redis.Nil))
  358. Expect(get.Val()).To(Equal(""))
  359. pipe := client.Pipeline()
  360. pipe.Select(2)
  361. get = pipe.Get("key")
  362. pipe.FlushDB()
  363. _, err := pipe.Exec()
  364. Expect(err).NotTo(HaveOccurred())
  365. Expect(get.Val()).To(Equal("hello"))
  366. })
  367. It("should Object", func() {
  368. set := client.Set("key", "hello", 0)
  369. Expect(set.Err()).NotTo(HaveOccurred())
  370. Expect(set.Val()).To(Equal("OK"))
  371. refCount := client.ObjectRefCount("key")
  372. Expect(refCount.Err()).NotTo(HaveOccurred())
  373. Expect(refCount.Val()).To(Equal(int64(1)))
  374. err := client.ObjectEncoding("key").Err()
  375. Expect(err).NotTo(HaveOccurred())
  376. idleTime := client.ObjectIdleTime("key")
  377. Expect(idleTime.Err()).NotTo(HaveOccurred())
  378. Expect(idleTime.Val()).To(Equal(time.Duration(0)))
  379. })
  380. It("should Persist", func() {
  381. set := client.Set("key", "Hello", 0)
  382. Expect(set.Err()).NotTo(HaveOccurred())
  383. Expect(set.Val()).To(Equal("OK"))
  384. expire := client.Expire("key", 10*time.Second)
  385. Expect(expire.Err()).NotTo(HaveOccurred())
  386. Expect(expire.Val()).To(Equal(true))
  387. ttl := client.TTL("key")
  388. Expect(ttl.Err()).NotTo(HaveOccurred())
  389. Expect(ttl.Val()).To(Equal(10 * time.Second))
  390. persist := client.Persist("key")
  391. Expect(persist.Err()).NotTo(HaveOccurred())
  392. Expect(persist.Val()).To(Equal(true))
  393. ttl = client.TTL("key")
  394. Expect(ttl.Err()).NotTo(HaveOccurred())
  395. Expect(ttl.Val() < 0).To(Equal(true))
  396. })
  397. It("should PExpire", func() {
  398. set := client.Set("key", "Hello", 0)
  399. Expect(set.Err()).NotTo(HaveOccurred())
  400. Expect(set.Val()).To(Equal("OK"))
  401. expiration := 900 * time.Millisecond
  402. pexpire := client.PExpire("key", expiration)
  403. Expect(pexpire.Err()).NotTo(HaveOccurred())
  404. Expect(pexpire.Val()).To(Equal(true))
  405. ttl := client.TTL("key")
  406. Expect(ttl.Err()).NotTo(HaveOccurred())
  407. Expect(ttl.Val()).To(Equal(time.Second))
  408. pttl := client.PTTL("key")
  409. Expect(pttl.Err()).NotTo(HaveOccurred())
  410. Expect(pttl.Val()).To(BeNumerically("~", expiration, 100*time.Millisecond))
  411. })
  412. It("should PExpireAt", func() {
  413. set := client.Set("key", "Hello", 0)
  414. Expect(set.Err()).NotTo(HaveOccurred())
  415. Expect(set.Val()).To(Equal("OK"))
  416. expiration := 900 * time.Millisecond
  417. pexpireat := client.PExpireAt("key", time.Now().Add(expiration))
  418. Expect(pexpireat.Err()).NotTo(HaveOccurred())
  419. Expect(pexpireat.Val()).To(Equal(true))
  420. ttl := client.TTL("key")
  421. Expect(ttl.Err()).NotTo(HaveOccurred())
  422. Expect(ttl.Val()).To(Equal(time.Second))
  423. pttl := client.PTTL("key")
  424. Expect(pttl.Err()).NotTo(HaveOccurred())
  425. Expect(pttl.Val()).To(BeNumerically("~", expiration, 100*time.Millisecond))
  426. })
  427. It("should PTTL", func() {
  428. set := client.Set("key", "Hello", 0)
  429. Expect(set.Err()).NotTo(HaveOccurred())
  430. Expect(set.Val()).To(Equal("OK"))
  431. expiration := time.Second
  432. expire := client.Expire("key", expiration)
  433. Expect(expire.Err()).NotTo(HaveOccurred())
  434. Expect(set.Val()).To(Equal("OK"))
  435. pttl := client.PTTL("key")
  436. Expect(pttl.Err()).NotTo(HaveOccurred())
  437. Expect(pttl.Val()).To(BeNumerically("~", expiration, 100*time.Millisecond))
  438. })
  439. It("should RandomKey", func() {
  440. randomKey := client.RandomKey()
  441. Expect(randomKey.Err()).To(Equal(redis.Nil))
  442. Expect(randomKey.Val()).To(Equal(""))
  443. set := client.Set("key", "hello", 0)
  444. Expect(set.Err()).NotTo(HaveOccurred())
  445. Expect(set.Val()).To(Equal("OK"))
  446. randomKey = client.RandomKey()
  447. Expect(randomKey.Err()).NotTo(HaveOccurred())
  448. Expect(randomKey.Val()).To(Equal("key"))
  449. })
  450. It("should Rename", func() {
  451. set := client.Set("key", "hello", 0)
  452. Expect(set.Err()).NotTo(HaveOccurred())
  453. Expect(set.Val()).To(Equal("OK"))
  454. status := client.Rename("key", "key1")
  455. Expect(status.Err()).NotTo(HaveOccurred())
  456. Expect(status.Val()).To(Equal("OK"))
  457. get := client.Get("key1")
  458. Expect(get.Err()).NotTo(HaveOccurred())
  459. Expect(get.Val()).To(Equal("hello"))
  460. })
  461. It("should RenameNX", func() {
  462. set := client.Set("key", "hello", 0)
  463. Expect(set.Err()).NotTo(HaveOccurred())
  464. Expect(set.Val()).To(Equal("OK"))
  465. renameNX := client.RenameNX("key", "key1")
  466. Expect(renameNX.Err()).NotTo(HaveOccurred())
  467. Expect(renameNX.Val()).To(Equal(true))
  468. get := client.Get("key1")
  469. Expect(get.Err()).NotTo(HaveOccurred())
  470. Expect(get.Val()).To(Equal("hello"))
  471. })
  472. It("should Restore", func() {
  473. err := client.Set("key", "hello", 0).Err()
  474. Expect(err).NotTo(HaveOccurred())
  475. dump := client.Dump("key")
  476. Expect(dump.Err()).NotTo(HaveOccurred())
  477. err = client.Del("key").Err()
  478. Expect(err).NotTo(HaveOccurred())
  479. restore, err := client.Restore("key", 0, dump.Val()).Result()
  480. Expect(err).NotTo(HaveOccurred())
  481. Expect(restore).To(Equal("OK"))
  482. type_, err := client.Type("key").Result()
  483. Expect(err).NotTo(HaveOccurred())
  484. Expect(type_).To(Equal("string"))
  485. val, err := client.Get("key").Result()
  486. Expect(err).NotTo(HaveOccurred())
  487. Expect(val).To(Equal("hello"))
  488. })
  489. It("should RestoreReplace", func() {
  490. err := client.Set("key", "hello", 0).Err()
  491. Expect(err).NotTo(HaveOccurred())
  492. dump := client.Dump("key")
  493. Expect(dump.Err()).NotTo(HaveOccurred())
  494. restore, err := client.RestoreReplace("key", 0, dump.Val()).Result()
  495. Expect(err).NotTo(HaveOccurred())
  496. Expect(restore).To(Equal("OK"))
  497. type_, err := client.Type("key").Result()
  498. Expect(err).NotTo(HaveOccurred())
  499. Expect(type_).To(Equal("string"))
  500. val, err := client.Get("key").Result()
  501. Expect(err).NotTo(HaveOccurred())
  502. Expect(val).To(Equal("hello"))
  503. })
  504. It("should Sort", func() {
  505. size, err := client.LPush("list", "1").Result()
  506. Expect(err).NotTo(HaveOccurred())
  507. Expect(size).To(Equal(int64(1)))
  508. size, err = client.LPush("list", "3").Result()
  509. Expect(err).NotTo(HaveOccurred())
  510. Expect(size).To(Equal(int64(2)))
  511. size, err = client.LPush("list", "2").Result()
  512. Expect(err).NotTo(HaveOccurred())
  513. Expect(size).To(Equal(int64(3)))
  514. els, err := client.Sort("list", &redis.Sort{
  515. Offset: 0,
  516. Count: 2,
  517. Order: "ASC",
  518. }).Result()
  519. Expect(err).NotTo(HaveOccurred())
  520. Expect(els).To(Equal([]string{"1", "2"}))
  521. })
  522. It("should Sort and Get", func() {
  523. size, err := client.LPush("list", "1").Result()
  524. Expect(err).NotTo(HaveOccurred())
  525. Expect(size).To(Equal(int64(1)))
  526. size, err = client.LPush("list", "3").Result()
  527. Expect(err).NotTo(HaveOccurred())
  528. Expect(size).To(Equal(int64(2)))
  529. size, err = client.LPush("list", "2").Result()
  530. Expect(err).NotTo(HaveOccurred())
  531. Expect(size).To(Equal(int64(3)))
  532. err = client.Set("object_2", "value2", 0).Err()
  533. Expect(err).NotTo(HaveOccurred())
  534. {
  535. els, err := client.Sort("list", &redis.Sort{
  536. Get: []string{"object_*"},
  537. }).Result()
  538. Expect(err).NotTo(HaveOccurred())
  539. Expect(els).To(Equal([]string{"", "value2", ""}))
  540. }
  541. {
  542. els, err := client.SortInterfaces("list", &redis.Sort{
  543. Get: []string{"object_*"},
  544. }).Result()
  545. Expect(err).NotTo(HaveOccurred())
  546. Expect(els).To(Equal([]interface{}{nil, "value2", nil}))
  547. }
  548. })
  549. It("should Sort and Store", func() {
  550. size, err := client.LPush("list", "1").Result()
  551. Expect(err).NotTo(HaveOccurred())
  552. Expect(size).To(Equal(int64(1)))
  553. size, err = client.LPush("list", "3").Result()
  554. Expect(err).NotTo(HaveOccurred())
  555. Expect(size).To(Equal(int64(2)))
  556. size, err = client.LPush("list", "2").Result()
  557. Expect(err).NotTo(HaveOccurred())
  558. Expect(size).To(Equal(int64(3)))
  559. n, err := client.SortStore("list", "list2", &redis.Sort{
  560. Offset: 0,
  561. Count: 2,
  562. Order: "ASC",
  563. }).Result()
  564. Expect(err).NotTo(HaveOccurred())
  565. Expect(n).To(Equal(int64(2)))
  566. els, err := client.LRange("list2", 0, -1).Result()
  567. Expect(err).NotTo(HaveOccurred())
  568. Expect(els).To(Equal([]string{"1", "2"}))
  569. })
  570. It("should Touch", func() {
  571. set1 := client.Set("touch1", "hello", 0)
  572. Expect(set1.Err()).NotTo(HaveOccurred())
  573. Expect(set1.Val()).To(Equal("OK"))
  574. set2 := client.Set("touch2", "hello", 0)
  575. Expect(set2.Err()).NotTo(HaveOccurred())
  576. Expect(set2.Val()).To(Equal("OK"))
  577. touch := client.Touch("touch1", "touch2", "touch3")
  578. Expect(touch.Err()).NotTo(HaveOccurred())
  579. Expect(touch.Val()).To(Equal(int64(2)))
  580. })
  581. It("should TTL", func() {
  582. ttl := client.TTL("key")
  583. Expect(ttl.Err()).NotTo(HaveOccurred())
  584. Expect(ttl.Val() < 0).To(Equal(true))
  585. set := client.Set("key", "hello", 0)
  586. Expect(set.Err()).NotTo(HaveOccurred())
  587. Expect(set.Val()).To(Equal("OK"))
  588. expire := client.Expire("key", 60*time.Second)
  589. Expect(expire.Err()).NotTo(HaveOccurred())
  590. Expect(expire.Val()).To(Equal(true))
  591. ttl = client.TTL("key")
  592. Expect(ttl.Err()).NotTo(HaveOccurred())
  593. Expect(ttl.Val()).To(Equal(60 * time.Second))
  594. })
  595. It("should Type", func() {
  596. set := client.Set("key", "hello", 0)
  597. Expect(set.Err()).NotTo(HaveOccurred())
  598. Expect(set.Val()).To(Equal("OK"))
  599. type_ := client.Type("key")
  600. Expect(type_.Err()).NotTo(HaveOccurred())
  601. Expect(type_.Val()).To(Equal("string"))
  602. })
  603. })
  604. Describe("scanning", func() {
  605. It("should Scan", func() {
  606. for i := 0; i < 1000; i++ {
  607. set := client.Set(fmt.Sprintf("key%d", i), "hello", 0)
  608. Expect(set.Err()).NotTo(HaveOccurred())
  609. }
  610. keys, cursor, err := client.Scan(0, "", 0).Result()
  611. Expect(err).NotTo(HaveOccurred())
  612. Expect(keys).NotTo(BeEmpty())
  613. Expect(cursor).NotTo(BeZero())
  614. })
  615. It("should SScan", func() {
  616. for i := 0; i < 1000; i++ {
  617. sadd := client.SAdd("myset", fmt.Sprintf("member%d", i))
  618. Expect(sadd.Err()).NotTo(HaveOccurred())
  619. }
  620. keys, cursor, err := client.SScan("myset", 0, "", 0).Result()
  621. Expect(err).NotTo(HaveOccurred())
  622. Expect(keys).NotTo(BeEmpty())
  623. Expect(cursor).NotTo(BeZero())
  624. })
  625. It("should HScan", func() {
  626. for i := 0; i < 1000; i++ {
  627. sadd := client.HSet("myhash", fmt.Sprintf("key%d", i), "hello")
  628. Expect(sadd.Err()).NotTo(HaveOccurred())
  629. }
  630. keys, cursor, err := client.HScan("myhash", 0, "", 0).Result()
  631. Expect(err).NotTo(HaveOccurred())
  632. Expect(keys).NotTo(BeEmpty())
  633. Expect(cursor).NotTo(BeZero())
  634. })
  635. It("should ZScan", func() {
  636. for i := 0; i < 1000; i++ {
  637. err := client.ZAdd("myset", &redis.Z{
  638. Score: float64(i),
  639. Member: fmt.Sprintf("member%d", i),
  640. }).Err()
  641. Expect(err).NotTo(HaveOccurred())
  642. }
  643. keys, cursor, err := client.ZScan("myset", 0, "", 0).Result()
  644. Expect(err).NotTo(HaveOccurred())
  645. Expect(keys).NotTo(BeEmpty())
  646. Expect(cursor).NotTo(BeZero())
  647. })
  648. })
  649. Describe("strings", func() {
  650. It("should Append", func() {
  651. n, err := client.Exists("key").Result()
  652. Expect(err).NotTo(HaveOccurred())
  653. Expect(n).To(Equal(int64(0)))
  654. append := client.Append("key", "Hello")
  655. Expect(append.Err()).NotTo(HaveOccurred())
  656. Expect(append.Val()).To(Equal(int64(5)))
  657. append = client.Append("key", " World")
  658. Expect(append.Err()).NotTo(HaveOccurred())
  659. Expect(append.Val()).To(Equal(int64(11)))
  660. get := client.Get("key")
  661. Expect(get.Err()).NotTo(HaveOccurred())
  662. Expect(get.Val()).To(Equal("Hello World"))
  663. })
  664. It("should BitCount", func() {
  665. set := client.Set("key", "foobar", 0)
  666. Expect(set.Err()).NotTo(HaveOccurred())
  667. Expect(set.Val()).To(Equal("OK"))
  668. bitCount := client.BitCount("key", nil)
  669. Expect(bitCount.Err()).NotTo(HaveOccurred())
  670. Expect(bitCount.Val()).To(Equal(int64(26)))
  671. bitCount = client.BitCount("key", &redis.BitCount{
  672. Start: 0,
  673. End: 0,
  674. })
  675. Expect(bitCount.Err()).NotTo(HaveOccurred())
  676. Expect(bitCount.Val()).To(Equal(int64(4)))
  677. bitCount = client.BitCount("key", &redis.BitCount{
  678. Start: 1,
  679. End: 1,
  680. })
  681. Expect(bitCount.Err()).NotTo(HaveOccurred())
  682. Expect(bitCount.Val()).To(Equal(int64(6)))
  683. })
  684. It("should BitOpAnd", func() {
  685. set := client.Set("key1", "1", 0)
  686. Expect(set.Err()).NotTo(HaveOccurred())
  687. Expect(set.Val()).To(Equal("OK"))
  688. set = client.Set("key2", "0", 0)
  689. Expect(set.Err()).NotTo(HaveOccurred())
  690. Expect(set.Val()).To(Equal("OK"))
  691. bitOpAnd := client.BitOpAnd("dest", "key1", "key2")
  692. Expect(bitOpAnd.Err()).NotTo(HaveOccurred())
  693. Expect(bitOpAnd.Val()).To(Equal(int64(1)))
  694. get := client.Get("dest")
  695. Expect(get.Err()).NotTo(HaveOccurred())
  696. Expect(get.Val()).To(Equal("0"))
  697. })
  698. It("should BitOpOr", func() {
  699. set := client.Set("key1", "1", 0)
  700. Expect(set.Err()).NotTo(HaveOccurred())
  701. Expect(set.Val()).To(Equal("OK"))
  702. set = client.Set("key2", "0", 0)
  703. Expect(set.Err()).NotTo(HaveOccurred())
  704. Expect(set.Val()).To(Equal("OK"))
  705. bitOpOr := client.BitOpOr("dest", "key1", "key2")
  706. Expect(bitOpOr.Err()).NotTo(HaveOccurred())
  707. Expect(bitOpOr.Val()).To(Equal(int64(1)))
  708. get := client.Get("dest")
  709. Expect(get.Err()).NotTo(HaveOccurred())
  710. Expect(get.Val()).To(Equal("1"))
  711. })
  712. It("should BitOpXor", func() {
  713. set := client.Set("key1", "\xff", 0)
  714. Expect(set.Err()).NotTo(HaveOccurred())
  715. Expect(set.Val()).To(Equal("OK"))
  716. set = client.Set("key2", "\x0f", 0)
  717. Expect(set.Err()).NotTo(HaveOccurred())
  718. Expect(set.Val()).To(Equal("OK"))
  719. bitOpXor := client.BitOpXor("dest", "key1", "key2")
  720. Expect(bitOpXor.Err()).NotTo(HaveOccurred())
  721. Expect(bitOpXor.Val()).To(Equal(int64(1)))
  722. get := client.Get("dest")
  723. Expect(get.Err()).NotTo(HaveOccurred())
  724. Expect(get.Val()).To(Equal("\xf0"))
  725. })
  726. It("should BitOpNot", func() {
  727. set := client.Set("key1", "\x00", 0)
  728. Expect(set.Err()).NotTo(HaveOccurred())
  729. Expect(set.Val()).To(Equal("OK"))
  730. bitOpNot := client.BitOpNot("dest", "key1")
  731. Expect(bitOpNot.Err()).NotTo(HaveOccurred())
  732. Expect(bitOpNot.Val()).To(Equal(int64(1)))
  733. get := client.Get("dest")
  734. Expect(get.Err()).NotTo(HaveOccurred())
  735. Expect(get.Val()).To(Equal("\xff"))
  736. })
  737. It("should BitPos", func() {
  738. err := client.Set("mykey", "\xff\xf0\x00", 0).Err()
  739. Expect(err).NotTo(HaveOccurred())
  740. pos, err := client.BitPos("mykey", 0).Result()
  741. Expect(err).NotTo(HaveOccurred())
  742. Expect(pos).To(Equal(int64(12)))
  743. pos, err = client.BitPos("mykey", 1).Result()
  744. Expect(err).NotTo(HaveOccurred())
  745. Expect(pos).To(Equal(int64(0)))
  746. pos, err = client.BitPos("mykey", 0, 2).Result()
  747. Expect(err).NotTo(HaveOccurred())
  748. Expect(pos).To(Equal(int64(16)))
  749. pos, err = client.BitPos("mykey", 1, 2).Result()
  750. Expect(err).NotTo(HaveOccurred())
  751. Expect(pos).To(Equal(int64(-1)))
  752. pos, err = client.BitPos("mykey", 0, -1).Result()
  753. Expect(err).NotTo(HaveOccurred())
  754. Expect(pos).To(Equal(int64(16)))
  755. pos, err = client.BitPos("mykey", 1, -1).Result()
  756. Expect(err).NotTo(HaveOccurred())
  757. Expect(pos).To(Equal(int64(-1)))
  758. pos, err = client.BitPos("mykey", 0, 2, 1).Result()
  759. Expect(err).NotTo(HaveOccurred())
  760. Expect(pos).To(Equal(int64(-1)))
  761. pos, err = client.BitPos("mykey", 0, 0, -3).Result()
  762. Expect(err).NotTo(HaveOccurred())
  763. Expect(pos).To(Equal(int64(-1)))
  764. pos, err = client.BitPos("mykey", 0, 0, 0).Result()
  765. Expect(err).NotTo(HaveOccurred())
  766. Expect(pos).To(Equal(int64(-1)))
  767. })
  768. It("should BitField", func() {
  769. nn, err := client.BitField("mykey", "INCRBY", "i5", 100, 1, "GET", "u4", 0).Result()
  770. Expect(err).NotTo(HaveOccurred())
  771. Expect(nn).To(Equal([]int64{1, 0}))
  772. })
  773. It("should Decr", func() {
  774. set := client.Set("key", "10", 0)
  775. Expect(set.Err()).NotTo(HaveOccurred())
  776. Expect(set.Val()).To(Equal("OK"))
  777. decr := client.Decr("key")
  778. Expect(decr.Err()).NotTo(HaveOccurred())
  779. Expect(decr.Val()).To(Equal(int64(9)))
  780. set = client.Set("key", "234293482390480948029348230948", 0)
  781. Expect(set.Err()).NotTo(HaveOccurred())
  782. Expect(set.Val()).To(Equal("OK"))
  783. decr = client.Decr("key")
  784. Expect(decr.Err()).To(MatchError("ERR value is not an integer or out of range"))
  785. Expect(decr.Val()).To(Equal(int64(0)))
  786. })
  787. It("should DecrBy", func() {
  788. set := client.Set("key", "10", 0)
  789. Expect(set.Err()).NotTo(HaveOccurred())
  790. Expect(set.Val()).To(Equal("OK"))
  791. decrBy := client.DecrBy("key", 5)
  792. Expect(decrBy.Err()).NotTo(HaveOccurred())
  793. Expect(decrBy.Val()).To(Equal(int64(5)))
  794. })
  795. It("should Get", func() {
  796. get := client.Get("_")
  797. Expect(get.Err()).To(Equal(redis.Nil))
  798. Expect(get.Val()).To(Equal(""))
  799. set := client.Set("key", "hello", 0)
  800. Expect(set.Err()).NotTo(HaveOccurred())
  801. Expect(set.Val()).To(Equal("OK"))
  802. get = client.Get("key")
  803. Expect(get.Err()).NotTo(HaveOccurred())
  804. Expect(get.Val()).To(Equal("hello"))
  805. })
  806. It("should GetBit", func() {
  807. setBit := client.SetBit("key", 7, 1)
  808. Expect(setBit.Err()).NotTo(HaveOccurred())
  809. Expect(setBit.Val()).To(Equal(int64(0)))
  810. getBit := client.GetBit("key", 0)
  811. Expect(getBit.Err()).NotTo(HaveOccurred())
  812. Expect(getBit.Val()).To(Equal(int64(0)))
  813. getBit = client.GetBit("key", 7)
  814. Expect(getBit.Err()).NotTo(HaveOccurred())
  815. Expect(getBit.Val()).To(Equal(int64(1)))
  816. getBit = client.GetBit("key", 100)
  817. Expect(getBit.Err()).NotTo(HaveOccurred())
  818. Expect(getBit.Val()).To(Equal(int64(0)))
  819. })
  820. It("should GetRange", func() {
  821. set := client.Set("key", "This is a string", 0)
  822. Expect(set.Err()).NotTo(HaveOccurred())
  823. Expect(set.Val()).To(Equal("OK"))
  824. getRange := client.GetRange("key", 0, 3)
  825. Expect(getRange.Err()).NotTo(HaveOccurred())
  826. Expect(getRange.Val()).To(Equal("This"))
  827. getRange = client.GetRange("key", -3, -1)
  828. Expect(getRange.Err()).NotTo(HaveOccurred())
  829. Expect(getRange.Val()).To(Equal("ing"))
  830. getRange = client.GetRange("key", 0, -1)
  831. Expect(getRange.Err()).NotTo(HaveOccurred())
  832. Expect(getRange.Val()).To(Equal("This is a string"))
  833. getRange = client.GetRange("key", 10, 100)
  834. Expect(getRange.Err()).NotTo(HaveOccurred())
  835. Expect(getRange.Val()).To(Equal("string"))
  836. })
  837. It("should GetSet", func() {
  838. incr := client.Incr("key")
  839. Expect(incr.Err()).NotTo(HaveOccurred())
  840. Expect(incr.Val()).To(Equal(int64(1)))
  841. getSet := client.GetSet("key", "0")
  842. Expect(getSet.Err()).NotTo(HaveOccurred())
  843. Expect(getSet.Val()).To(Equal("1"))
  844. get := client.Get("key")
  845. Expect(get.Err()).NotTo(HaveOccurred())
  846. Expect(get.Val()).To(Equal("0"))
  847. })
  848. It("should Incr", func() {
  849. set := client.Set("key", "10", 0)
  850. Expect(set.Err()).NotTo(HaveOccurred())
  851. Expect(set.Val()).To(Equal("OK"))
  852. incr := client.Incr("key")
  853. Expect(incr.Err()).NotTo(HaveOccurred())
  854. Expect(incr.Val()).To(Equal(int64(11)))
  855. get := client.Get("key")
  856. Expect(get.Err()).NotTo(HaveOccurred())
  857. Expect(get.Val()).To(Equal("11"))
  858. })
  859. It("should IncrBy", func() {
  860. set := client.Set("key", "10", 0)
  861. Expect(set.Err()).NotTo(HaveOccurred())
  862. Expect(set.Val()).To(Equal("OK"))
  863. incrBy := client.IncrBy("key", 5)
  864. Expect(incrBy.Err()).NotTo(HaveOccurred())
  865. Expect(incrBy.Val()).To(Equal(int64(15)))
  866. })
  867. It("should IncrByFloat", func() {
  868. set := client.Set("key", "10.50", 0)
  869. Expect(set.Err()).NotTo(HaveOccurred())
  870. Expect(set.Val()).To(Equal("OK"))
  871. incrByFloat := client.IncrByFloat("key", 0.1)
  872. Expect(incrByFloat.Err()).NotTo(HaveOccurred())
  873. Expect(incrByFloat.Val()).To(Equal(10.6))
  874. set = client.Set("key", "5.0e3", 0)
  875. Expect(set.Err()).NotTo(HaveOccurred())
  876. Expect(set.Val()).To(Equal("OK"))
  877. incrByFloat = client.IncrByFloat("key", 2.0e2)
  878. Expect(incrByFloat.Err()).NotTo(HaveOccurred())
  879. Expect(incrByFloat.Val()).To(Equal(float64(5200)))
  880. })
  881. It("should IncrByFloatOverflow", func() {
  882. incrByFloat := client.IncrByFloat("key", 996945661)
  883. Expect(incrByFloat.Err()).NotTo(HaveOccurred())
  884. Expect(incrByFloat.Val()).To(Equal(float64(996945661)))
  885. })
  886. It("should MSetMGet", func() {
  887. mSet := client.MSet("key1", "hello1", "key2", "hello2")
  888. Expect(mSet.Err()).NotTo(HaveOccurred())
  889. Expect(mSet.Val()).To(Equal("OK"))
  890. mGet := client.MGet("key1", "key2", "_")
  891. Expect(mGet.Err()).NotTo(HaveOccurred())
  892. Expect(mGet.Val()).To(Equal([]interface{}{"hello1", "hello2", nil}))
  893. })
  894. It("should MSetNX", func() {
  895. mSetNX := client.MSetNX("key1", "hello1", "key2", "hello2")
  896. Expect(mSetNX.Err()).NotTo(HaveOccurred())
  897. Expect(mSetNX.Val()).To(Equal(true))
  898. mSetNX = client.MSetNX("key2", "hello1", "key3", "hello2")
  899. Expect(mSetNX.Err()).NotTo(HaveOccurred())
  900. Expect(mSetNX.Val()).To(Equal(false))
  901. })
  902. It("should Set with expiration", func() {
  903. err := client.Set("key", "hello", 100*time.Millisecond).Err()
  904. Expect(err).NotTo(HaveOccurred())
  905. val, err := client.Get("key").Result()
  906. Expect(err).NotTo(HaveOccurred())
  907. Expect(val).To(Equal("hello"))
  908. Eventually(func() error {
  909. return client.Get("foo").Err()
  910. }, "1s", "100ms").Should(Equal(redis.Nil))
  911. })
  912. It("should SetGet", func() {
  913. set := client.Set("key", "hello", 0)
  914. Expect(set.Err()).NotTo(HaveOccurred())
  915. Expect(set.Val()).To(Equal("OK"))
  916. get := client.Get("key")
  917. Expect(get.Err()).NotTo(HaveOccurred())
  918. Expect(get.Val()).To(Equal("hello"))
  919. })
  920. It("should SetNX", func() {
  921. setNX := client.SetNX("key", "hello", 0)
  922. Expect(setNX.Err()).NotTo(HaveOccurred())
  923. Expect(setNX.Val()).To(Equal(true))
  924. setNX = client.SetNX("key", "hello2", 0)
  925. Expect(setNX.Err()).NotTo(HaveOccurred())
  926. Expect(setNX.Val()).To(Equal(false))
  927. get := client.Get("key")
  928. Expect(get.Err()).NotTo(HaveOccurred())
  929. Expect(get.Val()).To(Equal("hello"))
  930. })
  931. It("should SetNX with expiration", func() {
  932. isSet, err := client.SetNX("key", "hello", time.Second).Result()
  933. Expect(err).NotTo(HaveOccurred())
  934. Expect(isSet).To(Equal(true))
  935. isSet, err = client.SetNX("key", "hello2", time.Second).Result()
  936. Expect(err).NotTo(HaveOccurred())
  937. Expect(isSet).To(Equal(false))
  938. val, err := client.Get("key").Result()
  939. Expect(err).NotTo(HaveOccurred())
  940. Expect(val).To(Equal("hello"))
  941. })
  942. It("should SetXX", func() {
  943. isSet, err := client.SetXX("key", "hello2", 0).Result()
  944. Expect(err).NotTo(HaveOccurred())
  945. Expect(isSet).To(Equal(false))
  946. err = client.Set("key", "hello", 0).Err()
  947. Expect(err).NotTo(HaveOccurred())
  948. isSet, err = client.SetXX("key", "hello2", 0).Result()
  949. Expect(err).NotTo(HaveOccurred())
  950. Expect(isSet).To(Equal(true))
  951. val, err := client.Get("key").Result()
  952. Expect(err).NotTo(HaveOccurred())
  953. Expect(val).To(Equal("hello2"))
  954. })
  955. It("should SetXX with expiration", func() {
  956. isSet, err := client.SetXX("key", "hello2", time.Second).Result()
  957. Expect(err).NotTo(HaveOccurred())
  958. Expect(isSet).To(Equal(false))
  959. err = client.Set("key", "hello", time.Second).Err()
  960. Expect(err).NotTo(HaveOccurred())
  961. isSet, err = client.SetXX("key", "hello2", time.Second).Result()
  962. Expect(err).NotTo(HaveOccurred())
  963. Expect(isSet).To(Equal(true))
  964. val, err := client.Get("key").Result()
  965. Expect(err).NotTo(HaveOccurred())
  966. Expect(val).To(Equal("hello2"))
  967. })
  968. It("should SetRange", func() {
  969. set := client.Set("key", "Hello World", 0)
  970. Expect(set.Err()).NotTo(HaveOccurred())
  971. Expect(set.Val()).To(Equal("OK"))
  972. range_ := client.SetRange("key", 6, "Redis")
  973. Expect(range_.Err()).NotTo(HaveOccurred())
  974. Expect(range_.Val()).To(Equal(int64(11)))
  975. get := client.Get("key")
  976. Expect(get.Err()).NotTo(HaveOccurred())
  977. Expect(get.Val()).To(Equal("Hello Redis"))
  978. })
  979. It("should StrLen", func() {
  980. set := client.Set("key", "hello", 0)
  981. Expect(set.Err()).NotTo(HaveOccurred())
  982. Expect(set.Val()).To(Equal("OK"))
  983. strLen := client.StrLen("key")
  984. Expect(strLen.Err()).NotTo(HaveOccurred())
  985. Expect(strLen.Val()).To(Equal(int64(5)))
  986. strLen = client.StrLen("_")
  987. Expect(strLen.Err()).NotTo(HaveOccurred())
  988. Expect(strLen.Val()).To(Equal(int64(0)))
  989. })
  990. })
  991. Describe("hashes", func() {
  992. It("should HDel", func() {
  993. hSet := client.HSet("hash", "key", "hello")
  994. Expect(hSet.Err()).NotTo(HaveOccurred())
  995. hDel := client.HDel("hash", "key")
  996. Expect(hDel.Err()).NotTo(HaveOccurred())
  997. Expect(hDel.Val()).To(Equal(int64(1)))
  998. hDel = client.HDel("hash", "key")
  999. Expect(hDel.Err()).NotTo(HaveOccurred())
  1000. Expect(hDel.Val()).To(Equal(int64(0)))
  1001. })
  1002. It("should HExists", func() {
  1003. hSet := client.HSet("hash", "key", "hello")
  1004. Expect(hSet.Err()).NotTo(HaveOccurred())
  1005. hExists := client.HExists("hash", "key")
  1006. Expect(hExists.Err()).NotTo(HaveOccurred())
  1007. Expect(hExists.Val()).To(Equal(true))
  1008. hExists = client.HExists("hash", "key1")
  1009. Expect(hExists.Err()).NotTo(HaveOccurred())
  1010. Expect(hExists.Val()).To(Equal(false))
  1011. })
  1012. It("should HGet", func() {
  1013. hSet := client.HSet("hash", "key", "hello")
  1014. Expect(hSet.Err()).NotTo(HaveOccurred())
  1015. hGet := client.HGet("hash", "key")
  1016. Expect(hGet.Err()).NotTo(HaveOccurred())
  1017. Expect(hGet.Val()).To(Equal("hello"))
  1018. hGet = client.HGet("hash", "key1")
  1019. Expect(hGet.Err()).To(Equal(redis.Nil))
  1020. Expect(hGet.Val()).To(Equal(""))
  1021. })
  1022. It("should HGetAll", func() {
  1023. err := client.HSet("hash", "key1", "hello1").Err()
  1024. Expect(err).NotTo(HaveOccurred())
  1025. err = client.HSet("hash", "key2", "hello2").Err()
  1026. Expect(err).NotTo(HaveOccurred())
  1027. m, err := client.HGetAll("hash").Result()
  1028. Expect(err).NotTo(HaveOccurred())
  1029. Expect(m).To(Equal(map[string]string{"key1": "hello1", "key2": "hello2"}))
  1030. })
  1031. It("should HIncrBy", func() {
  1032. hSet := client.HSet("hash", "key", "5")
  1033. Expect(hSet.Err()).NotTo(HaveOccurred())
  1034. hIncrBy := client.HIncrBy("hash", "key", 1)
  1035. Expect(hIncrBy.Err()).NotTo(HaveOccurred())
  1036. Expect(hIncrBy.Val()).To(Equal(int64(6)))
  1037. hIncrBy = client.HIncrBy("hash", "key", -1)
  1038. Expect(hIncrBy.Err()).NotTo(HaveOccurred())
  1039. Expect(hIncrBy.Val()).To(Equal(int64(5)))
  1040. hIncrBy = client.HIncrBy("hash", "key", -10)
  1041. Expect(hIncrBy.Err()).NotTo(HaveOccurred())
  1042. Expect(hIncrBy.Val()).To(Equal(int64(-5)))
  1043. })
  1044. It("should HIncrByFloat", func() {
  1045. hSet := client.HSet("hash", "field", "10.50")
  1046. Expect(hSet.Err()).NotTo(HaveOccurred())
  1047. Expect(hSet.Val()).To(Equal(true))
  1048. hIncrByFloat := client.HIncrByFloat("hash", "field", 0.1)
  1049. Expect(hIncrByFloat.Err()).NotTo(HaveOccurred())
  1050. Expect(hIncrByFloat.Val()).To(Equal(10.6))
  1051. hSet = client.HSet("hash", "field", "5.0e3")
  1052. Expect(hSet.Err()).NotTo(HaveOccurred())
  1053. Expect(hSet.Val()).To(Equal(false))
  1054. hIncrByFloat = client.HIncrByFloat("hash", "field", 2.0e2)
  1055. Expect(hIncrByFloat.Err()).NotTo(HaveOccurred())
  1056. Expect(hIncrByFloat.Val()).To(Equal(float64(5200)))
  1057. })
  1058. It("should HKeys", func() {
  1059. hkeys := client.HKeys("hash")
  1060. Expect(hkeys.Err()).NotTo(HaveOccurred())
  1061. Expect(hkeys.Val()).To(Equal([]string{}))
  1062. hset := client.HSet("hash", "key1", "hello1")
  1063. Expect(hset.Err()).NotTo(HaveOccurred())
  1064. hset = client.HSet("hash", "key2", "hello2")
  1065. Expect(hset.Err()).NotTo(HaveOccurred())
  1066. hkeys = client.HKeys("hash")
  1067. Expect(hkeys.Err()).NotTo(HaveOccurred())
  1068. Expect(hkeys.Val()).To(Equal([]string{"key1", "key2"}))
  1069. })
  1070. It("should HLen", func() {
  1071. hSet := client.HSet("hash", "key1", "hello1")
  1072. Expect(hSet.Err()).NotTo(HaveOccurred())
  1073. hSet = client.HSet("hash", "key2", "hello2")
  1074. Expect(hSet.Err()).NotTo(HaveOccurred())
  1075. hLen := client.HLen("hash")
  1076. Expect(hLen.Err()).NotTo(HaveOccurred())
  1077. Expect(hLen.Val()).To(Equal(int64(2)))
  1078. })
  1079. It("should HMGet", func() {
  1080. err := client.HMSet("hash", "key1", "hello1", "key2", "hello2").Err()
  1081. Expect(err).NotTo(HaveOccurred())
  1082. vals, err := client.HMGet("hash", "key1", "key2", "_").Result()
  1083. Expect(err).NotTo(HaveOccurred())
  1084. Expect(vals).To(Equal([]interface{}{"hello1", "hello2", nil}))
  1085. })
  1086. It("should HMSet", func() {
  1087. ok, err := client.HMSet("hash", map[string]interface{}{
  1088. "key1": "hello1",
  1089. "key2": "hello2",
  1090. }).Result()
  1091. Expect(err).NotTo(HaveOccurred())
  1092. Expect(ok).To(Equal(int64(2)))
  1093. v, err := client.HGet("hash", "key1").Result()
  1094. Expect(err).NotTo(HaveOccurred())
  1095. Expect(v).To(Equal("hello1"))
  1096. v, err = client.HGet("hash", "key2").Result()
  1097. Expect(err).NotTo(HaveOccurred())
  1098. Expect(v).To(Equal("hello2"))
  1099. keys, err := client.HKeys("hash").Result()
  1100. Expect(err).NotTo(HaveOccurred())
  1101. Expect(keys).To(ConsistOf([]string{"key1", "key2"}))
  1102. })
  1103. It("should HSet", func() {
  1104. hSet := client.HSet("hash", "key", "hello")
  1105. Expect(hSet.Err()).NotTo(HaveOccurred())
  1106. Expect(hSet.Val()).To(Equal(true))
  1107. hGet := client.HGet("hash", "key")
  1108. Expect(hGet.Err()).NotTo(HaveOccurred())
  1109. Expect(hGet.Val()).To(Equal("hello"))
  1110. })
  1111. It("should HSetNX", func() {
  1112. hSetNX := client.HSetNX("hash", "key", "hello")
  1113. Expect(hSetNX.Err()).NotTo(HaveOccurred())
  1114. Expect(hSetNX.Val()).To(Equal(true))
  1115. hSetNX = client.HSetNX("hash", "key", "hello")
  1116. Expect(hSetNX.Err()).NotTo(HaveOccurred())
  1117. Expect(hSetNX.Val()).To(Equal(false))
  1118. hGet := client.HGet("hash", "key")
  1119. Expect(hGet.Err()).NotTo(HaveOccurred())
  1120. Expect(hGet.Val()).To(Equal("hello"))
  1121. })
  1122. It("should HVals", func() {
  1123. err := client.HSet("hash", "key1", "hello1").Err()
  1124. Expect(err).NotTo(HaveOccurred())
  1125. err = client.HSet("hash", "key2", "hello2").Err()
  1126. Expect(err).NotTo(HaveOccurred())
  1127. v, err := client.HVals("hash").Result()
  1128. Expect(err).NotTo(HaveOccurred())
  1129. Expect(v).To(Equal([]string{"hello1", "hello2"}))
  1130. var slice []string
  1131. err = client.HVals("hash").ScanSlice(&slice)
  1132. Expect(err).NotTo(HaveOccurred())
  1133. Expect(slice).To(Equal([]string{"hello1", "hello2"}))
  1134. })
  1135. })
  1136. Describe("hyperloglog", func() {
  1137. It("should PFMerge", func() {
  1138. pfAdd := client.PFAdd("hll1", "1", "2", "3", "4", "5")
  1139. Expect(pfAdd.Err()).NotTo(HaveOccurred())
  1140. pfCount := client.PFCount("hll1")
  1141. Expect(pfCount.Err()).NotTo(HaveOccurred())
  1142. Expect(pfCount.Val()).To(Equal(int64(5)))
  1143. pfAdd = client.PFAdd("hll2", "a", "b", "c", "d", "e")
  1144. Expect(pfAdd.Err()).NotTo(HaveOccurred())
  1145. pfMerge := client.PFMerge("hllMerged", "hll1", "hll2")
  1146. Expect(pfMerge.Err()).NotTo(HaveOccurred())
  1147. pfCount = client.PFCount("hllMerged")
  1148. Expect(pfCount.Err()).NotTo(HaveOccurred())
  1149. Expect(pfCount.Val()).To(Equal(int64(10)))
  1150. pfCount = client.PFCount("hll1", "hll2")
  1151. Expect(pfCount.Err()).NotTo(HaveOccurred())
  1152. Expect(pfCount.Val()).To(Equal(int64(10)))
  1153. })
  1154. })
  1155. Describe("lists", func() {
  1156. It("should BLPop", func() {
  1157. rPush := client.RPush("list1", "a", "b", "c")
  1158. Expect(rPush.Err()).NotTo(HaveOccurred())
  1159. bLPop := client.BLPop(0, "list1", "list2")
  1160. Expect(bLPop.Err()).NotTo(HaveOccurred())
  1161. Expect(bLPop.Val()).To(Equal([]string{"list1", "a"}))
  1162. })
  1163. It("should BLPopBlocks", func() {
  1164. started := make(chan bool)
  1165. done := make(chan bool)
  1166. go func() {
  1167. defer GinkgoRecover()
  1168. started <- true
  1169. bLPop := client.BLPop(0, "list")
  1170. Expect(bLPop.Err()).NotTo(HaveOccurred())
  1171. Expect(bLPop.Val()).To(Equal([]string{"list", "a"}))
  1172. done <- true
  1173. }()
  1174. <-started
  1175. select {
  1176. case <-done:
  1177. Fail("BLPop is not blocked")
  1178. case <-time.After(time.Second):
  1179. // ok
  1180. }
  1181. rPush := client.RPush("list", "a")
  1182. Expect(rPush.Err()).NotTo(HaveOccurred())
  1183. select {
  1184. case <-done:
  1185. // ok
  1186. case <-time.After(time.Second):
  1187. Fail("BLPop is still blocked")
  1188. }
  1189. })
  1190. It("should BLPop timeout", func() {
  1191. val, err := client.BLPop(time.Second, "list1").Result()
  1192. Expect(err).To(Equal(redis.Nil))
  1193. Expect(val).To(BeNil())
  1194. Expect(client.Ping().Err()).NotTo(HaveOccurred())
  1195. stats := client.PoolStats()
  1196. Expect(stats.Hits).To(Equal(uint32(2)))
  1197. Expect(stats.Misses).To(Equal(uint32(1)))
  1198. Expect(stats.Timeouts).To(Equal(uint32(0)))
  1199. })
  1200. It("should BRPop", func() {
  1201. rPush := client.RPush("list1", "a", "b", "c")
  1202. Expect(rPush.Err()).NotTo(HaveOccurred())
  1203. bRPop := client.BRPop(0, "list1", "list2")
  1204. Expect(bRPop.Err()).NotTo(HaveOccurred())
  1205. Expect(bRPop.Val()).To(Equal([]string{"list1", "c"}))
  1206. })
  1207. It("should BRPop blocks", func() {
  1208. started := make(chan bool)
  1209. done := make(chan bool)
  1210. go func() {
  1211. defer GinkgoRecover()
  1212. started <- true
  1213. brpop := client.BRPop(0, "list")
  1214. Expect(brpop.Err()).NotTo(HaveOccurred())
  1215. Expect(brpop.Val()).To(Equal([]string{"list", "a"}))
  1216. done <- true
  1217. }()
  1218. <-started
  1219. select {
  1220. case <-done:
  1221. Fail("BRPop is not blocked")
  1222. case <-time.After(time.Second):
  1223. // ok
  1224. }
  1225. rPush := client.RPush("list", "a")
  1226. Expect(rPush.Err()).NotTo(HaveOccurred())
  1227. select {
  1228. case <-done:
  1229. // ok
  1230. case <-time.After(time.Second):
  1231. Fail("BRPop is still blocked")
  1232. // ok
  1233. }
  1234. })
  1235. It("should BRPopLPush", func() {
  1236. _, err := client.BRPopLPush("list1", "list2", time.Second).Result()
  1237. Expect(err).To(Equal(redis.Nil))
  1238. err = client.RPush("list1", "a", "b", "c").Err()
  1239. Expect(err).NotTo(HaveOccurred())
  1240. v, err := client.BRPopLPush("list1", "list2", 0).Result()
  1241. Expect(err).NotTo(HaveOccurred())
  1242. Expect(v).To(Equal("c"))
  1243. })
  1244. It("should LIndex", func() {
  1245. lPush := client.LPush("list", "World")
  1246. Expect(lPush.Err()).NotTo(HaveOccurred())
  1247. lPush = client.LPush("list", "Hello")
  1248. Expect(lPush.Err()).NotTo(HaveOccurred())
  1249. lIndex := client.LIndex("list", 0)
  1250. Expect(lIndex.Err()).NotTo(HaveOccurred())
  1251. Expect(lIndex.Val()).To(Equal("Hello"))
  1252. lIndex = client.LIndex("list", -1)
  1253. Expect(lIndex.Err()).NotTo(HaveOccurred())
  1254. Expect(lIndex.Val()).To(Equal("World"))
  1255. lIndex = client.LIndex("list", 3)
  1256. Expect(lIndex.Err()).To(Equal(redis.Nil))
  1257. Expect(lIndex.Val()).To(Equal(""))
  1258. })
  1259. It("should LInsert", func() {
  1260. rPush := client.RPush("list", "Hello")
  1261. Expect(rPush.Err()).NotTo(HaveOccurred())
  1262. rPush = client.RPush("list", "World")
  1263. Expect(rPush.Err()).NotTo(HaveOccurred())
  1264. lInsert := client.LInsert("list", "BEFORE", "World", "There")
  1265. Expect(lInsert.Err()).NotTo(HaveOccurred())
  1266. Expect(lInsert.Val()).To(Equal(int64(3)))
  1267. lRange := client.LRange("list", 0, -1)
  1268. Expect(lRange.Err()).NotTo(HaveOccurred())
  1269. Expect(lRange.Val()).To(Equal([]string{"Hello", "There", "World"}))
  1270. })
  1271. It("should LLen", func() {
  1272. lPush := client.LPush("list", "World")
  1273. Expect(lPush.Err()).NotTo(HaveOccurred())
  1274. lPush = client.LPush("list", "Hello")
  1275. Expect(lPush.Err()).NotTo(HaveOccurred())
  1276. lLen := client.LLen("list")
  1277. Expect(lLen.Err()).NotTo(HaveOccurred())
  1278. Expect(lLen.Val()).To(Equal(int64(2)))
  1279. })
  1280. It("should LPop", func() {
  1281. rPush := client.RPush("list", "one")
  1282. Expect(rPush.Err()).NotTo(HaveOccurred())
  1283. rPush = client.RPush("list", "two")
  1284. Expect(rPush.Err()).NotTo(HaveOccurred())
  1285. rPush = client.RPush("list", "three")
  1286. Expect(rPush.Err()).NotTo(HaveOccurred())
  1287. lPop := client.LPop("list")
  1288. Expect(lPop.Err()).NotTo(HaveOccurred())
  1289. Expect(lPop.Val()).To(Equal("one"))
  1290. lRange := client.LRange("list", 0, -1)
  1291. Expect(lRange.Err()).NotTo(HaveOccurred())
  1292. Expect(lRange.Val()).To(Equal([]string{"two", "three"}))
  1293. })
  1294. It("should LPush", func() {
  1295. lPush := client.LPush("list", "World")
  1296. Expect(lPush.Err()).NotTo(HaveOccurred())
  1297. lPush = client.LPush("list", "Hello")
  1298. Expect(lPush.Err()).NotTo(HaveOccurred())
  1299. lRange := client.LRange("list", 0, -1)
  1300. Expect(lRange.Err()).NotTo(HaveOccurred())
  1301. Expect(lRange.Val()).To(Equal([]string{"Hello", "World"}))
  1302. })
  1303. It("should LPushX", func() {
  1304. lPush := client.LPush("list", "World")
  1305. Expect(lPush.Err()).NotTo(HaveOccurred())
  1306. lPushX := client.LPushX("list", "Hello")
  1307. Expect(lPushX.Err()).NotTo(HaveOccurred())
  1308. Expect(lPushX.Val()).To(Equal(int64(2)))
  1309. lPush = client.LPush("list1", "three")
  1310. Expect(lPush.Err()).NotTo(HaveOccurred())
  1311. Expect(lPush.Val()).To(Equal(int64(1)))
  1312. lPushX = client.LPushX("list1", "two", "one")
  1313. Expect(lPushX.Err()).NotTo(HaveOccurred())
  1314. Expect(lPushX.Val()).To(Equal(int64(3)))
  1315. lPushX = client.LPushX("list2", "Hello")
  1316. Expect(lPushX.Err()).NotTo(HaveOccurred())
  1317. Expect(lPushX.Val()).To(Equal(int64(0)))
  1318. lRange := client.LRange("list", 0, -1)
  1319. Expect(lRange.Err()).NotTo(HaveOccurred())
  1320. Expect(lRange.Val()).To(Equal([]string{"Hello", "World"}))
  1321. lRange = client.LRange("list1", 0, -1)
  1322. Expect(lRange.Err()).NotTo(HaveOccurred())
  1323. Expect(lRange.Val()).To(Equal([]string{"one", "two", "three"}))
  1324. lRange = client.LRange("list2", 0, -1)
  1325. Expect(lRange.Err()).NotTo(HaveOccurred())
  1326. Expect(lRange.Val()).To(Equal([]string{}))
  1327. })
  1328. It("should LRange", func() {
  1329. rPush := client.RPush("list", "one")
  1330. Expect(rPush.Err()).NotTo(HaveOccurred())
  1331. rPush = client.RPush("list", "two")
  1332. Expect(rPush.Err()).NotTo(HaveOccurred())
  1333. rPush = client.RPush("list", "three")
  1334. Expect(rPush.Err()).NotTo(HaveOccurred())
  1335. lRange := client.LRange("list", 0, 0)
  1336. Expect(lRange.Err()).NotTo(HaveOccurred())
  1337. Expect(lRange.Val()).To(Equal([]string{"one"}))
  1338. lRange = client.LRange("list", -3, 2)
  1339. Expect(lRange.Err()).NotTo(HaveOccurred())
  1340. Expect(lRange.Val()).To(Equal([]string{"one", "two", "three"}))
  1341. lRange = client.LRange("list", -100, 100)
  1342. Expect(lRange.Err()).NotTo(HaveOccurred())
  1343. Expect(lRange.Val()).To(Equal([]string{"one", "two", "three"}))
  1344. lRange = client.LRange("list", 5, 10)
  1345. Expect(lRange.Err()).NotTo(HaveOccurred())
  1346. Expect(lRange.Val()).To(Equal([]string{}))
  1347. })
  1348. It("should LRem", func() {
  1349. rPush := client.RPush("list", "hello")
  1350. Expect(rPush.Err()).NotTo(HaveOccurred())
  1351. rPush = client.RPush("list", "hello")
  1352. Expect(rPush.Err()).NotTo(HaveOccurred())
  1353. rPush = client.RPush("list", "key")
  1354. Expect(rPush.Err()).NotTo(HaveOccurred())
  1355. rPush = client.RPush("list", "hello")
  1356. Expect(rPush.Err()).NotTo(HaveOccurred())
  1357. lRem := client.LRem("list", -2, "hello")
  1358. Expect(lRem.Err()).NotTo(HaveOccurred())
  1359. Expect(lRem.Val()).To(Equal(int64(2)))
  1360. lRange := client.LRange("list", 0, -1)
  1361. Expect(lRange.Err()).NotTo(HaveOccurred())
  1362. Expect(lRange.Val()).To(Equal([]string{"hello", "key"}))
  1363. })
  1364. It("should LSet", func() {
  1365. rPush := client.RPush("list", "one")
  1366. Expect(rPush.Err()).NotTo(HaveOccurred())
  1367. rPush = client.RPush("list", "two")
  1368. Expect(rPush.Err()).NotTo(HaveOccurred())
  1369. rPush = client.RPush("list", "three")
  1370. Expect(rPush.Err()).NotTo(HaveOccurred())
  1371. lSet := client.LSet("list", 0, "four")
  1372. Expect(lSet.Err()).NotTo(HaveOccurred())
  1373. Expect(lSet.Val()).To(Equal("OK"))
  1374. lSet = client.LSet("list", -2, "five")
  1375. Expect(lSet.Err()).NotTo(HaveOccurred())
  1376. Expect(lSet.Val()).To(Equal("OK"))
  1377. lRange := client.LRange("list", 0, -1)
  1378. Expect(lRange.Err()).NotTo(HaveOccurred())
  1379. Expect(lRange.Val()).To(Equal([]string{"four", "five", "three"}))
  1380. })
  1381. It("should LTrim", func() {
  1382. rPush := client.RPush("list", "one")
  1383. Expect(rPush.Err()).NotTo(HaveOccurred())
  1384. rPush = client.RPush("list", "two")
  1385. Expect(rPush.Err()).NotTo(HaveOccurred())
  1386. rPush = client.RPush("list", "three")
  1387. Expect(rPush.Err()).NotTo(HaveOccurred())
  1388. lTrim := client.LTrim("list", 1, -1)
  1389. Expect(lTrim.Err()).NotTo(HaveOccurred())
  1390. Expect(lTrim.Val()).To(Equal("OK"))
  1391. lRange := client.LRange("list", 0, -1)
  1392. Expect(lRange.Err()).NotTo(HaveOccurred())
  1393. Expect(lRange.Val()).To(Equal([]string{"two", "three"}))
  1394. })
  1395. It("should RPop", func() {
  1396. rPush := client.RPush("list", "one")
  1397. Expect(rPush.Err()).NotTo(HaveOccurred())
  1398. rPush = client.RPush("list", "two")
  1399. Expect(rPush.Err()).NotTo(HaveOccurred())
  1400. rPush = client.RPush("list", "three")
  1401. Expect(rPush.Err()).NotTo(HaveOccurred())
  1402. rPop := client.RPop("list")
  1403. Expect(rPop.Err()).NotTo(HaveOccurred())
  1404. Expect(rPop.Val()).To(Equal("three"))
  1405. lRange := client.LRange("list", 0, -1)
  1406. Expect(lRange.Err()).NotTo(HaveOccurred())
  1407. Expect(lRange.Val()).To(Equal([]string{"one", "two"}))
  1408. })
  1409. It("should RPopLPush", func() {
  1410. rPush := client.RPush("list", "one")
  1411. Expect(rPush.Err()).NotTo(HaveOccurred())
  1412. rPush = client.RPush("list", "two")
  1413. Expect(rPush.Err()).NotTo(HaveOccurred())
  1414. rPush = client.RPush("list", "three")
  1415. Expect(rPush.Err()).NotTo(HaveOccurred())
  1416. rPopLPush := client.RPopLPush("list", "list2")
  1417. Expect(rPopLPush.Err()).NotTo(HaveOccurred())
  1418. Expect(rPopLPush.Val()).To(Equal("three"))
  1419. lRange := client.LRange("list", 0, -1)
  1420. Expect(lRange.Err()).NotTo(HaveOccurred())
  1421. Expect(lRange.Val()).To(Equal([]string{"one", "two"}))
  1422. lRange = client.LRange("list2", 0, -1)
  1423. Expect(lRange.Err()).NotTo(HaveOccurred())
  1424. Expect(lRange.Val()).To(Equal([]string{"three"}))
  1425. })
  1426. It("should RPush", func() {
  1427. rPush := client.RPush("list", "Hello")
  1428. Expect(rPush.Err()).NotTo(HaveOccurred())
  1429. Expect(rPush.Val()).To(Equal(int64(1)))
  1430. rPush = client.RPush("list", "World")
  1431. Expect(rPush.Err()).NotTo(HaveOccurred())
  1432. Expect(rPush.Val()).To(Equal(int64(2)))
  1433. lRange := client.LRange("list", 0, -1)
  1434. Expect(lRange.Err()).NotTo(HaveOccurred())
  1435. Expect(lRange.Val()).To(Equal([]string{"Hello", "World"}))
  1436. })
  1437. It("should RPushX", func() {
  1438. rPush := client.RPush("list", "Hello")
  1439. Expect(rPush.Err()).NotTo(HaveOccurred())
  1440. Expect(rPush.Val()).To(Equal(int64(1)))
  1441. rPushX := client.RPushX("list", "World")
  1442. Expect(rPushX.Err()).NotTo(HaveOccurred())
  1443. Expect(rPushX.Val()).To(Equal(int64(2)))
  1444. rPush = client.RPush("list1", "one")
  1445. Expect(rPush.Err()).NotTo(HaveOccurred())
  1446. Expect(rPush.Val()).To(Equal(int64(1)))
  1447. rPushX = client.RPushX("list1", "two", "three")
  1448. Expect(rPushX.Err()).NotTo(HaveOccurred())
  1449. Expect(rPushX.Val()).To(Equal(int64(3)))
  1450. rPushX = client.RPushX("list2", "World")
  1451. Expect(rPushX.Err()).NotTo(HaveOccurred())
  1452. Expect(rPushX.Val()).To(Equal(int64(0)))
  1453. lRange := client.LRange("list", 0, -1)
  1454. Expect(lRange.Err()).NotTo(HaveOccurred())
  1455. Expect(lRange.Val()).To(Equal([]string{"Hello", "World"}))
  1456. lRange = client.LRange("list1", 0, -1)
  1457. Expect(lRange.Err()).NotTo(HaveOccurred())
  1458. Expect(lRange.Val()).To(Equal([]string{"one", "two", "three"}))
  1459. lRange = client.LRange("list2", 0, -1)
  1460. Expect(lRange.Err()).NotTo(HaveOccurred())
  1461. Expect(lRange.Val()).To(Equal([]string{}))
  1462. })
  1463. })
  1464. Describe("sets", func() {
  1465. It("should SAdd", func() {
  1466. sAdd := client.SAdd("set", "Hello")
  1467. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1468. Expect(sAdd.Val()).To(Equal(int64(1)))
  1469. sAdd = client.SAdd("set", "World")
  1470. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1471. Expect(sAdd.Val()).To(Equal(int64(1)))
  1472. sAdd = client.SAdd("set", "World")
  1473. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1474. Expect(sAdd.Val()).To(Equal(int64(0)))
  1475. sMembers := client.SMembers("set")
  1476. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1477. Expect(sMembers.Val()).To(ConsistOf([]string{"Hello", "World"}))
  1478. })
  1479. It("should SAdd strings", func() {
  1480. set := []string{"Hello", "World", "World"}
  1481. sAdd := client.SAdd("set", set)
  1482. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1483. Expect(sAdd.Val()).To(Equal(int64(2)))
  1484. sMembers := client.SMembers("set")
  1485. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1486. Expect(sMembers.Val()).To(ConsistOf([]string{"Hello", "World"}))
  1487. })
  1488. It("should SCard", func() {
  1489. sAdd := client.SAdd("set", "Hello")
  1490. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1491. Expect(sAdd.Val()).To(Equal(int64(1)))
  1492. sAdd = client.SAdd("set", "World")
  1493. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1494. Expect(sAdd.Val()).To(Equal(int64(1)))
  1495. sCard := client.SCard("set")
  1496. Expect(sCard.Err()).NotTo(HaveOccurred())
  1497. Expect(sCard.Val()).To(Equal(int64(2)))
  1498. })
  1499. It("should SDiff", func() {
  1500. sAdd := client.SAdd("set1", "a")
  1501. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1502. sAdd = client.SAdd("set1", "b")
  1503. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1504. sAdd = client.SAdd("set1", "c")
  1505. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1506. sAdd = client.SAdd("set2", "c")
  1507. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1508. sAdd = client.SAdd("set2", "d")
  1509. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1510. sAdd = client.SAdd("set2", "e")
  1511. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1512. sDiff := client.SDiff("set1", "set2")
  1513. Expect(sDiff.Err()).NotTo(HaveOccurred())
  1514. Expect(sDiff.Val()).To(ConsistOf([]string{"a", "b"}))
  1515. })
  1516. It("should SDiffStore", func() {
  1517. sAdd := client.SAdd("set1", "a")
  1518. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1519. sAdd = client.SAdd("set1", "b")
  1520. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1521. sAdd = client.SAdd("set1", "c")
  1522. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1523. sAdd = client.SAdd("set2", "c")
  1524. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1525. sAdd = client.SAdd("set2", "d")
  1526. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1527. sAdd = client.SAdd("set2", "e")
  1528. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1529. sDiffStore := client.SDiffStore("set", "set1", "set2")
  1530. Expect(sDiffStore.Err()).NotTo(HaveOccurred())
  1531. Expect(sDiffStore.Val()).To(Equal(int64(2)))
  1532. sMembers := client.SMembers("set")
  1533. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1534. Expect(sMembers.Val()).To(ConsistOf([]string{"a", "b"}))
  1535. })
  1536. It("should SInter", func() {
  1537. sAdd := client.SAdd("set1", "a")
  1538. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1539. sAdd = client.SAdd("set1", "b")
  1540. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1541. sAdd = client.SAdd("set1", "c")
  1542. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1543. sAdd = client.SAdd("set2", "c")
  1544. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1545. sAdd = client.SAdd("set2", "d")
  1546. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1547. sAdd = client.SAdd("set2", "e")
  1548. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1549. sInter := client.SInter("set1", "set2")
  1550. Expect(sInter.Err()).NotTo(HaveOccurred())
  1551. Expect(sInter.Val()).To(Equal([]string{"c"}))
  1552. })
  1553. It("should SInterStore", func() {
  1554. sAdd := client.SAdd("set1", "a")
  1555. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1556. sAdd = client.SAdd("set1", "b")
  1557. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1558. sAdd = client.SAdd("set1", "c")
  1559. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1560. sAdd = client.SAdd("set2", "c")
  1561. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1562. sAdd = client.SAdd("set2", "d")
  1563. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1564. sAdd = client.SAdd("set2", "e")
  1565. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1566. sInterStore := client.SInterStore("set", "set1", "set2")
  1567. Expect(sInterStore.Err()).NotTo(HaveOccurred())
  1568. Expect(sInterStore.Val()).To(Equal(int64(1)))
  1569. sMembers := client.SMembers("set")
  1570. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1571. Expect(sMembers.Val()).To(Equal([]string{"c"}))
  1572. })
  1573. It("should IsMember", func() {
  1574. sAdd := client.SAdd("set", "one")
  1575. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1576. sIsMember := client.SIsMember("set", "one")
  1577. Expect(sIsMember.Err()).NotTo(HaveOccurred())
  1578. Expect(sIsMember.Val()).To(Equal(true))
  1579. sIsMember = client.SIsMember("set", "two")
  1580. Expect(sIsMember.Err()).NotTo(HaveOccurred())
  1581. Expect(sIsMember.Val()).To(Equal(false))
  1582. })
  1583. It("should SMembers", func() {
  1584. sAdd := client.SAdd("set", "Hello")
  1585. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1586. sAdd = client.SAdd("set", "World")
  1587. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1588. sMembers := client.SMembers("set")
  1589. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1590. Expect(sMembers.Val()).To(ConsistOf([]string{"Hello", "World"}))
  1591. })
  1592. It("should SMembersMap", func() {
  1593. sAdd := client.SAdd("set", "Hello")
  1594. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1595. sAdd = client.SAdd("set", "World")
  1596. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1597. sMembersMap := client.SMembersMap("set")
  1598. Expect(sMembersMap.Err()).NotTo(HaveOccurred())
  1599. Expect(sMembersMap.Val()).To(Equal(map[string]struct{}{"Hello": {}, "World": {}}))
  1600. })
  1601. It("should SMove", func() {
  1602. sAdd := client.SAdd("set1", "one")
  1603. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1604. sAdd = client.SAdd("set1", "two")
  1605. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1606. sAdd = client.SAdd("set2", "three")
  1607. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1608. sMove := client.SMove("set1", "set2", "two")
  1609. Expect(sMove.Err()).NotTo(HaveOccurred())
  1610. Expect(sMove.Val()).To(Equal(true))
  1611. sMembers := client.SMembers("set1")
  1612. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1613. Expect(sMembers.Val()).To(Equal([]string{"one"}))
  1614. sMembers = client.SMembers("set2")
  1615. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1616. Expect(sMembers.Val()).To(ConsistOf([]string{"three", "two"}))
  1617. })
  1618. It("should SPop", func() {
  1619. sAdd := client.SAdd("set", "one")
  1620. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1621. sAdd = client.SAdd("set", "two")
  1622. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1623. sAdd = client.SAdd("set", "three")
  1624. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1625. sPop := client.SPop("set")
  1626. Expect(sPop.Err()).NotTo(HaveOccurred())
  1627. Expect(sPop.Val()).NotTo(Equal(""))
  1628. sMembers := client.SMembers("set")
  1629. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1630. Expect(sMembers.Val()).To(HaveLen(2))
  1631. })
  1632. It("should SPopN", func() {
  1633. sAdd := client.SAdd("set", "one")
  1634. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1635. sAdd = client.SAdd("set", "two")
  1636. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1637. sAdd = client.SAdd("set", "three")
  1638. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1639. sAdd = client.SAdd("set", "four")
  1640. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1641. sPopN := client.SPopN("set", 1)
  1642. Expect(sPopN.Err()).NotTo(HaveOccurred())
  1643. Expect(sPopN.Val()).NotTo(Equal([]string{""}))
  1644. sMembers := client.SMembers("set")
  1645. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1646. Expect(sMembers.Val()).To(HaveLen(3))
  1647. sPopN = client.SPopN("set", 4)
  1648. Expect(sPopN.Err()).NotTo(HaveOccurred())
  1649. Expect(sPopN.Val()).To(HaveLen(3))
  1650. sMembers = client.SMembers("set")
  1651. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1652. Expect(sMembers.Val()).To(HaveLen(0))
  1653. })
  1654. It("should SRandMember and SRandMemberN", func() {
  1655. err := client.SAdd("set", "one").Err()
  1656. Expect(err).NotTo(HaveOccurred())
  1657. err = client.SAdd("set", "two").Err()
  1658. Expect(err).NotTo(HaveOccurred())
  1659. err = client.SAdd("set", "three").Err()
  1660. Expect(err).NotTo(HaveOccurred())
  1661. members, err := client.SMembers("set").Result()
  1662. Expect(err).NotTo(HaveOccurred())
  1663. Expect(members).To(HaveLen(3))
  1664. member, err := client.SRandMember("set").Result()
  1665. Expect(err).NotTo(HaveOccurred())
  1666. Expect(member).NotTo(Equal(""))
  1667. members, err = client.SRandMemberN("set", 2).Result()
  1668. Expect(err).NotTo(HaveOccurred())
  1669. Expect(members).To(HaveLen(2))
  1670. })
  1671. It("should SRem", func() {
  1672. sAdd := client.SAdd("set", "one")
  1673. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1674. sAdd = client.SAdd("set", "two")
  1675. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1676. sAdd = client.SAdd("set", "three")
  1677. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1678. sRem := client.SRem("set", "one")
  1679. Expect(sRem.Err()).NotTo(HaveOccurred())
  1680. Expect(sRem.Val()).To(Equal(int64(1)))
  1681. sRem = client.SRem("set", "four")
  1682. Expect(sRem.Err()).NotTo(HaveOccurred())
  1683. Expect(sRem.Val()).To(Equal(int64(0)))
  1684. sMembers := client.SMembers("set")
  1685. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1686. Expect(sMembers.Val()).To(ConsistOf([]string{"three", "two"}))
  1687. })
  1688. It("should SUnion", func() {
  1689. sAdd := client.SAdd("set1", "a")
  1690. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1691. sAdd = client.SAdd("set1", "b")
  1692. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1693. sAdd = client.SAdd("set1", "c")
  1694. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1695. sAdd = client.SAdd("set2", "c")
  1696. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1697. sAdd = client.SAdd("set2", "d")
  1698. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1699. sAdd = client.SAdd("set2", "e")
  1700. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1701. sUnion := client.SUnion("set1", "set2")
  1702. Expect(sUnion.Err()).NotTo(HaveOccurred())
  1703. Expect(sUnion.Val()).To(HaveLen(5))
  1704. })
  1705. It("should SUnionStore", func() {
  1706. sAdd := client.SAdd("set1", "a")
  1707. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1708. sAdd = client.SAdd("set1", "b")
  1709. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1710. sAdd = client.SAdd("set1", "c")
  1711. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1712. sAdd = client.SAdd("set2", "c")
  1713. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1714. sAdd = client.SAdd("set2", "d")
  1715. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1716. sAdd = client.SAdd("set2", "e")
  1717. Expect(sAdd.Err()).NotTo(HaveOccurred())
  1718. sUnionStore := client.SUnionStore("set", "set1", "set2")
  1719. Expect(sUnionStore.Err()).NotTo(HaveOccurred())
  1720. Expect(sUnionStore.Val()).To(Equal(int64(5)))
  1721. sMembers := client.SMembers("set")
  1722. Expect(sMembers.Err()).NotTo(HaveOccurred())
  1723. Expect(sMembers.Val()).To(HaveLen(5))
  1724. })
  1725. })
  1726. Describe("sorted sets", func() {
  1727. It("should BZPopMax", func() {
  1728. err := client.ZAdd("zset1", &redis.Z{
  1729. Score: 1,
  1730. Member: "one",
  1731. }).Err()
  1732. Expect(err).NotTo(HaveOccurred())
  1733. err = client.ZAdd("zset1", &redis.Z{
  1734. Score: 2,
  1735. Member: "two",
  1736. }).Err()
  1737. Expect(err).NotTo(HaveOccurred())
  1738. err = client.ZAdd("zset1", &redis.Z{
  1739. Score: 3,
  1740. Member: "three",
  1741. }).Err()
  1742. Expect(err).NotTo(HaveOccurred())
  1743. member, err := client.BZPopMax(0, "zset1", "zset2").Result()
  1744. Expect(err).NotTo(HaveOccurred())
  1745. Expect(member).To(Equal(&redis.ZWithKey{
  1746. Z: redis.Z{
  1747. Score: 3,
  1748. Member: "three",
  1749. },
  1750. Key: "zset1",
  1751. }))
  1752. })
  1753. It("should BZPopMax blocks", func() {
  1754. started := make(chan bool)
  1755. done := make(chan bool)
  1756. go func() {
  1757. defer GinkgoRecover()
  1758. started <- true
  1759. bZPopMax := client.BZPopMax(0, "zset")
  1760. Expect(bZPopMax.Err()).NotTo(HaveOccurred())
  1761. Expect(bZPopMax.Val()).To(Equal(&redis.ZWithKey{
  1762. Z: redis.Z{
  1763. Member: "a",
  1764. Score: 1,
  1765. },
  1766. Key: "zset",
  1767. }))
  1768. done <- true
  1769. }()
  1770. <-started
  1771. select {
  1772. case <-done:
  1773. Fail("BZPopMax is not blocked")
  1774. case <-time.After(time.Second):
  1775. // ok
  1776. }
  1777. zAdd := client.ZAdd("zset", &redis.Z{
  1778. Member: "a",
  1779. Score: 1,
  1780. })
  1781. Expect(zAdd.Err()).NotTo(HaveOccurred())
  1782. select {
  1783. case <-done:
  1784. // ok
  1785. case <-time.After(time.Second):
  1786. Fail("BZPopMax is still blocked")
  1787. }
  1788. })
  1789. It("should BZPopMax timeout", func() {
  1790. val, err := client.BZPopMax(time.Second, "zset1").Result()
  1791. Expect(err).To(Equal(redis.Nil))
  1792. Expect(val).To(BeNil())
  1793. Expect(client.Ping().Err()).NotTo(HaveOccurred())
  1794. stats := client.PoolStats()
  1795. Expect(stats.Hits).To(Equal(uint32(2)))
  1796. Expect(stats.Misses).To(Equal(uint32(1)))
  1797. Expect(stats.Timeouts).To(Equal(uint32(0)))
  1798. })
  1799. It("should BZPopMin", func() {
  1800. err := client.ZAdd("zset1", &redis.Z{
  1801. Score: 1,
  1802. Member: "one",
  1803. }).Err()
  1804. Expect(err).NotTo(HaveOccurred())
  1805. err = client.ZAdd("zset1", &redis.Z{
  1806. Score: 2,
  1807. Member: "two",
  1808. }).Err()
  1809. Expect(err).NotTo(HaveOccurred())
  1810. err = client.ZAdd("zset1", &redis.Z{
  1811. Score: 3,
  1812. Member: "three",
  1813. }).Err()
  1814. Expect(err).NotTo(HaveOccurred())
  1815. member, err := client.BZPopMin(0, "zset1", "zset2").Result()
  1816. Expect(err).NotTo(HaveOccurred())
  1817. Expect(member).To(Equal(&redis.ZWithKey{
  1818. Z: redis.Z{
  1819. Score: 1,
  1820. Member: "one",
  1821. },
  1822. Key: "zset1",
  1823. }))
  1824. })
  1825. It("should BZPopMin blocks", func() {
  1826. started := make(chan bool)
  1827. done := make(chan bool)
  1828. go func() {
  1829. defer GinkgoRecover()
  1830. started <- true
  1831. bZPopMin := client.BZPopMin(0, "zset")
  1832. Expect(bZPopMin.Err()).NotTo(HaveOccurred())
  1833. Expect(bZPopMin.Val()).To(Equal(&redis.ZWithKey{
  1834. Z: redis.Z{
  1835. Member: "a",
  1836. Score: 1,
  1837. },
  1838. Key: "zset",
  1839. }))
  1840. done <- true
  1841. }()
  1842. <-started
  1843. select {
  1844. case <-done:
  1845. Fail("BZPopMin is not blocked")
  1846. case <-time.After(time.Second):
  1847. // ok
  1848. }
  1849. zAdd := client.ZAdd("zset", &redis.Z{
  1850. Member: "a",
  1851. Score: 1,
  1852. })
  1853. Expect(zAdd.Err()).NotTo(HaveOccurred())
  1854. select {
  1855. case <-done:
  1856. // ok
  1857. case <-time.After(time.Second):
  1858. Fail("BZPopMin is still blocked")
  1859. }
  1860. })
  1861. It("should BZPopMin timeout", func() {
  1862. val, err := client.BZPopMin(time.Second, "zset1").Result()
  1863. Expect(err).To(Equal(redis.Nil))
  1864. Expect(val).To(BeNil())
  1865. Expect(client.Ping().Err()).NotTo(HaveOccurred())
  1866. stats := client.PoolStats()
  1867. Expect(stats.Hits).To(Equal(uint32(2)))
  1868. Expect(stats.Misses).To(Equal(uint32(1)))
  1869. Expect(stats.Timeouts).To(Equal(uint32(0)))
  1870. })
  1871. It("should ZAdd", func() {
  1872. added, err := client.ZAdd("zset", &redis.Z{
  1873. Score: 1,
  1874. Member: "one",
  1875. }).Result()
  1876. Expect(err).NotTo(HaveOccurred())
  1877. Expect(added).To(Equal(int64(1)))
  1878. added, err = client.ZAdd("zset", &redis.Z{
  1879. Score: 1,
  1880. Member: "uno",
  1881. }).Result()
  1882. Expect(err).NotTo(HaveOccurred())
  1883. Expect(added).To(Equal(int64(1)))
  1884. added, err = client.ZAdd("zset", &redis.Z{
  1885. Score: 2,
  1886. Member: "two",
  1887. }).Result()
  1888. Expect(err).NotTo(HaveOccurred())
  1889. Expect(added).To(Equal(int64(1)))
  1890. added, err = client.ZAdd("zset", &redis.Z{
  1891. Score: 3,
  1892. Member: "two",
  1893. }).Result()
  1894. Expect(err).NotTo(HaveOccurred())
  1895. Expect(added).To(Equal(int64(0)))
  1896. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  1897. Expect(err).NotTo(HaveOccurred())
  1898. Expect(vals).To(Equal([]redis.Z{{
  1899. Score: 1,
  1900. Member: "one",
  1901. }, {
  1902. Score: 1,
  1903. Member: "uno",
  1904. }, {
  1905. Score: 3,
  1906. Member: "two",
  1907. }}))
  1908. })
  1909. It("should ZAdd bytes", func() {
  1910. added, err := client.ZAdd("zset", &redis.Z{
  1911. Score: 1,
  1912. Member: []byte("one"),
  1913. }).Result()
  1914. Expect(err).NotTo(HaveOccurred())
  1915. Expect(added).To(Equal(int64(1)))
  1916. added, err = client.ZAdd("zset", &redis.Z{
  1917. Score: 1,
  1918. Member: []byte("uno"),
  1919. }).Result()
  1920. Expect(err).NotTo(HaveOccurred())
  1921. Expect(added).To(Equal(int64(1)))
  1922. added, err = client.ZAdd("zset", &redis.Z{
  1923. Score: 2,
  1924. Member: []byte("two"),
  1925. }).Result()
  1926. Expect(err).NotTo(HaveOccurred())
  1927. Expect(added).To(Equal(int64(1)))
  1928. added, err = client.ZAdd("zset", &redis.Z{
  1929. Score: 3,
  1930. Member: []byte("two"),
  1931. }).Result()
  1932. Expect(err).NotTo(HaveOccurred())
  1933. Expect(added).To(Equal(int64(0)))
  1934. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  1935. Expect(err).NotTo(HaveOccurred())
  1936. Expect(vals).To(Equal([]redis.Z{{
  1937. Score: 1,
  1938. Member: "one",
  1939. }, {
  1940. Score: 1,
  1941. Member: "uno",
  1942. }, {
  1943. Score: 3,
  1944. Member: "two",
  1945. }}))
  1946. })
  1947. It("should ZAddNX", func() {
  1948. added, err := client.ZAddNX("zset", &redis.Z{
  1949. Score: 1,
  1950. Member: "one",
  1951. }).Result()
  1952. Expect(err).NotTo(HaveOccurred())
  1953. Expect(added).To(Equal(int64(1)))
  1954. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  1955. Expect(err).NotTo(HaveOccurred())
  1956. Expect(vals).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  1957. added, err = client.ZAddNX("zset", &redis.Z{
  1958. Score: 2,
  1959. Member: "one",
  1960. }).Result()
  1961. Expect(err).NotTo(HaveOccurred())
  1962. Expect(added).To(Equal(int64(0)))
  1963. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  1964. Expect(err).NotTo(HaveOccurred())
  1965. Expect(vals).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  1966. })
  1967. It("should ZAddXX", func() {
  1968. added, err := client.ZAddXX("zset", &redis.Z{
  1969. Score: 1,
  1970. Member: "one",
  1971. }).Result()
  1972. Expect(err).NotTo(HaveOccurred())
  1973. Expect(added).To(Equal(int64(0)))
  1974. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  1975. Expect(err).NotTo(HaveOccurred())
  1976. Expect(vals).To(BeEmpty())
  1977. added, err = client.ZAdd("zset", &redis.Z{
  1978. Score: 1,
  1979. Member: "one",
  1980. }).Result()
  1981. Expect(err).NotTo(HaveOccurred())
  1982. Expect(added).To(Equal(int64(1)))
  1983. added, err = client.ZAddXX("zset", &redis.Z{
  1984. Score: 2,
  1985. Member: "one",
  1986. }).Result()
  1987. Expect(err).NotTo(HaveOccurred())
  1988. Expect(added).To(Equal(int64(0)))
  1989. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  1990. Expect(err).NotTo(HaveOccurred())
  1991. Expect(vals).To(Equal([]redis.Z{{Score: 2, Member: "one"}}))
  1992. })
  1993. It("should ZAddCh", func() {
  1994. changed, err := client.ZAddCh("zset", &redis.Z{
  1995. Score: 1,
  1996. Member: "one",
  1997. }).Result()
  1998. Expect(err).NotTo(HaveOccurred())
  1999. Expect(changed).To(Equal(int64(1)))
  2000. changed, err = client.ZAddCh("zset", &redis.Z{
  2001. Score: 1,
  2002. Member: "one",
  2003. }).Result()
  2004. Expect(err).NotTo(HaveOccurred())
  2005. Expect(changed).To(Equal(int64(0)))
  2006. })
  2007. It("should ZAddNXCh", func() {
  2008. changed, err := client.ZAddNXCh("zset", &redis.Z{
  2009. Score: 1,
  2010. Member: "one",
  2011. }).Result()
  2012. Expect(err).NotTo(HaveOccurred())
  2013. Expect(changed).To(Equal(int64(1)))
  2014. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2015. Expect(err).NotTo(HaveOccurred())
  2016. Expect(vals).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  2017. changed, err = client.ZAddNXCh("zset", &redis.Z{
  2018. Score: 2,
  2019. Member: "one",
  2020. }).Result()
  2021. Expect(err).NotTo(HaveOccurred())
  2022. Expect(changed).To(Equal(int64(0)))
  2023. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  2024. Expect(err).NotTo(HaveOccurred())
  2025. Expect(vals).To(Equal([]redis.Z{{
  2026. Score: 1,
  2027. Member: "one",
  2028. }}))
  2029. })
  2030. It("should ZAddXXCh", func() {
  2031. changed, err := client.ZAddXXCh("zset", &redis.Z{
  2032. Score: 1,
  2033. Member: "one",
  2034. }).Result()
  2035. Expect(err).NotTo(HaveOccurred())
  2036. Expect(changed).To(Equal(int64(0)))
  2037. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2038. Expect(err).NotTo(HaveOccurred())
  2039. Expect(vals).To(BeEmpty())
  2040. added, err := client.ZAdd("zset", &redis.Z{
  2041. Score: 1,
  2042. Member: "one",
  2043. }).Result()
  2044. Expect(err).NotTo(HaveOccurred())
  2045. Expect(added).To(Equal(int64(1)))
  2046. changed, err = client.ZAddXXCh("zset", &redis.Z{
  2047. Score: 2,
  2048. Member: "one",
  2049. }).Result()
  2050. Expect(err).NotTo(HaveOccurred())
  2051. Expect(changed).To(Equal(int64(1)))
  2052. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  2053. Expect(err).NotTo(HaveOccurred())
  2054. Expect(vals).To(Equal([]redis.Z{{Score: 2, Member: "one"}}))
  2055. })
  2056. It("should ZIncr", func() {
  2057. score, err := client.ZIncr("zset", &redis.Z{
  2058. Score: 1,
  2059. Member: "one",
  2060. }).Result()
  2061. Expect(err).NotTo(HaveOccurred())
  2062. Expect(score).To(Equal(float64(1)))
  2063. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2064. Expect(err).NotTo(HaveOccurred())
  2065. Expect(vals).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  2066. score, err = client.ZIncr("zset", &redis.Z{Score: 1, Member: "one"}).Result()
  2067. Expect(err).NotTo(HaveOccurred())
  2068. Expect(score).To(Equal(float64(2)))
  2069. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  2070. Expect(err).NotTo(HaveOccurred())
  2071. Expect(vals).To(Equal([]redis.Z{{Score: 2, Member: "one"}}))
  2072. })
  2073. It("should ZIncrNX", func() {
  2074. score, err := client.ZIncrNX("zset", &redis.Z{
  2075. Score: 1,
  2076. Member: "one",
  2077. }).Result()
  2078. Expect(err).NotTo(HaveOccurred())
  2079. Expect(score).To(Equal(float64(1)))
  2080. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2081. Expect(err).NotTo(HaveOccurred())
  2082. Expect(vals).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  2083. score, err = client.ZIncrNX("zset", &redis.Z{
  2084. Score: 1,
  2085. Member: "one",
  2086. }).Result()
  2087. Expect(err).To(Equal(redis.Nil))
  2088. Expect(score).To(Equal(float64(0)))
  2089. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  2090. Expect(err).NotTo(HaveOccurred())
  2091. Expect(vals).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  2092. })
  2093. It("should ZIncrXX", func() {
  2094. score, err := client.ZIncrXX("zset", &redis.Z{
  2095. Score: 1,
  2096. Member: "one",
  2097. }).Result()
  2098. Expect(err).To(Equal(redis.Nil))
  2099. Expect(score).To(Equal(float64(0)))
  2100. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2101. Expect(err).NotTo(HaveOccurred())
  2102. Expect(vals).To(BeEmpty())
  2103. added, err := client.ZAdd("zset", &redis.Z{
  2104. Score: 1,
  2105. Member: "one",
  2106. }).Result()
  2107. Expect(err).NotTo(HaveOccurred())
  2108. Expect(added).To(Equal(int64(1)))
  2109. score, err = client.ZIncrXX("zset", &redis.Z{
  2110. Score: 1,
  2111. Member: "one",
  2112. }).Result()
  2113. Expect(err).NotTo(HaveOccurred())
  2114. Expect(score).To(Equal(float64(2)))
  2115. vals, err = client.ZRangeWithScores("zset", 0, -1).Result()
  2116. Expect(err).NotTo(HaveOccurred())
  2117. Expect(vals).To(Equal([]redis.Z{{Score: 2, Member: "one"}}))
  2118. })
  2119. It("should ZCard", func() {
  2120. err := client.ZAdd("zset", &redis.Z{
  2121. Score: 1,
  2122. Member: "one",
  2123. }).Err()
  2124. Expect(err).NotTo(HaveOccurred())
  2125. err = client.ZAdd("zset", &redis.Z{
  2126. Score: 2,
  2127. Member: "two",
  2128. }).Err()
  2129. Expect(err).NotTo(HaveOccurred())
  2130. card, err := client.ZCard("zset").Result()
  2131. Expect(err).NotTo(HaveOccurred())
  2132. Expect(card).To(Equal(int64(2)))
  2133. })
  2134. It("should ZCount", func() {
  2135. err := client.ZAdd("zset", &redis.Z{
  2136. Score: 1,
  2137. Member: "one",
  2138. }).Err()
  2139. Expect(err).NotTo(HaveOccurred())
  2140. err = client.ZAdd("zset", &redis.Z{
  2141. Score: 2,
  2142. Member: "two",
  2143. }).Err()
  2144. Expect(err).NotTo(HaveOccurred())
  2145. err = client.ZAdd("zset", &redis.Z{
  2146. Score: 3,
  2147. Member: "three",
  2148. }).Err()
  2149. Expect(err).NotTo(HaveOccurred())
  2150. count, err := client.ZCount("zset", "-inf", "+inf").Result()
  2151. Expect(err).NotTo(HaveOccurred())
  2152. Expect(count).To(Equal(int64(3)))
  2153. count, err = client.ZCount("zset", "(1", "3").Result()
  2154. Expect(err).NotTo(HaveOccurred())
  2155. Expect(count).To(Equal(int64(2)))
  2156. count, err = client.ZLexCount("zset", "-", "+").Result()
  2157. Expect(err).NotTo(HaveOccurred())
  2158. Expect(count).To(Equal(int64(3)))
  2159. })
  2160. It("should ZIncrBy", func() {
  2161. err := client.ZAdd("zset", &redis.Z{
  2162. Score: 1,
  2163. Member: "one",
  2164. }).Err()
  2165. Expect(err).NotTo(HaveOccurred())
  2166. err = client.ZAdd("zset", &redis.Z{
  2167. Score: 2,
  2168. Member: "two",
  2169. }).Err()
  2170. Expect(err).NotTo(HaveOccurred())
  2171. n, err := client.ZIncrBy("zset", 2, "one").Result()
  2172. Expect(err).NotTo(HaveOccurred())
  2173. Expect(n).To(Equal(float64(3)))
  2174. val, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2175. Expect(err).NotTo(HaveOccurred())
  2176. Expect(val).To(Equal([]redis.Z{{
  2177. Score: 2,
  2178. Member: "two",
  2179. }, {
  2180. Score: 3,
  2181. Member: "one",
  2182. }}))
  2183. })
  2184. It("should ZInterStore", func() {
  2185. err := client.ZAdd("zset1", &redis.Z{
  2186. Score: 1,
  2187. Member: "one",
  2188. }).Err()
  2189. Expect(err).NotTo(HaveOccurred())
  2190. err = client.ZAdd("zset1", &redis.Z{
  2191. Score: 2,
  2192. Member: "two",
  2193. }).Err()
  2194. Expect(err).NotTo(HaveOccurred())
  2195. err = client.ZAdd("zset2", &redis.Z{Score: 1, Member: "one"}).Err()
  2196. Expect(err).NotTo(HaveOccurred())
  2197. err = client.ZAdd("zset2", &redis.Z{Score: 2, Member: "two"}).Err()
  2198. Expect(err).NotTo(HaveOccurred())
  2199. err = client.ZAdd("zset3", &redis.Z{Score: 3, Member: "two"}).Err()
  2200. Expect(err).NotTo(HaveOccurred())
  2201. n, err := client.ZInterStore("out", &redis.ZStore{
  2202. Keys: []string{"zset1", "zset2"},
  2203. Weights: []float64{2, 3},
  2204. }).Result()
  2205. Expect(err).NotTo(HaveOccurred())
  2206. Expect(n).To(Equal(int64(2)))
  2207. vals, err := client.ZRangeWithScores("out", 0, -1).Result()
  2208. Expect(err).NotTo(HaveOccurred())
  2209. Expect(vals).To(Equal([]redis.Z{{
  2210. Score: 5,
  2211. Member: "one",
  2212. }, {
  2213. Score: 10,
  2214. Member: "two",
  2215. }}))
  2216. })
  2217. It("should ZPopMax", func() {
  2218. err := client.ZAdd("zset", &redis.Z{
  2219. Score: 1,
  2220. Member: "one",
  2221. }).Err()
  2222. Expect(err).NotTo(HaveOccurred())
  2223. err = client.ZAdd("zset", &redis.Z{
  2224. Score: 2,
  2225. Member: "two",
  2226. }).Err()
  2227. Expect(err).NotTo(HaveOccurred())
  2228. err = client.ZAdd("zset", &redis.Z{
  2229. Score: 3,
  2230. Member: "three",
  2231. }).Err()
  2232. Expect(err).NotTo(HaveOccurred())
  2233. members, err := client.ZPopMax("zset").Result()
  2234. Expect(err).NotTo(HaveOccurred())
  2235. Expect(members).To(Equal([]redis.Z{{
  2236. Score: 3,
  2237. Member: "three",
  2238. }}))
  2239. // adding back 3
  2240. err = client.ZAdd("zset", &redis.Z{
  2241. Score: 3,
  2242. Member: "three",
  2243. }).Err()
  2244. Expect(err).NotTo(HaveOccurred())
  2245. members, err = client.ZPopMax("zset", 2).Result()
  2246. Expect(err).NotTo(HaveOccurred())
  2247. Expect(members).To(Equal([]redis.Z{{
  2248. Score: 3,
  2249. Member: "three",
  2250. }, {
  2251. Score: 2,
  2252. Member: "two",
  2253. }}))
  2254. // adding back 2 & 3
  2255. err = client.ZAdd("zset", &redis.Z{
  2256. Score: 3,
  2257. Member: "three",
  2258. }).Err()
  2259. Expect(err).NotTo(HaveOccurred())
  2260. err = client.ZAdd("zset", &redis.Z{
  2261. Score: 2,
  2262. Member: "two",
  2263. }).Err()
  2264. Expect(err).NotTo(HaveOccurred())
  2265. members, err = client.ZPopMax("zset", 10).Result()
  2266. Expect(err).NotTo(HaveOccurred())
  2267. Expect(members).To(Equal([]redis.Z{{
  2268. Score: 3,
  2269. Member: "three",
  2270. }, {
  2271. Score: 2,
  2272. Member: "two",
  2273. }, {
  2274. Score: 1,
  2275. Member: "one",
  2276. }}))
  2277. })
  2278. It("should ZPopMin", func() {
  2279. err := client.ZAdd("zset", &redis.Z{
  2280. Score: 1,
  2281. Member: "one",
  2282. }).Err()
  2283. Expect(err).NotTo(HaveOccurred())
  2284. err = client.ZAdd("zset", &redis.Z{
  2285. Score: 2,
  2286. Member: "two",
  2287. }).Err()
  2288. Expect(err).NotTo(HaveOccurred())
  2289. err = client.ZAdd("zset", &redis.Z{
  2290. Score: 3,
  2291. Member: "three",
  2292. }).Err()
  2293. Expect(err).NotTo(HaveOccurred())
  2294. members, err := client.ZPopMin("zset").Result()
  2295. Expect(err).NotTo(HaveOccurred())
  2296. Expect(members).To(Equal([]redis.Z{{
  2297. Score: 1,
  2298. Member: "one",
  2299. }}))
  2300. // adding back 1
  2301. err = client.ZAdd("zset", &redis.Z{
  2302. Score: 1,
  2303. Member: "one",
  2304. }).Err()
  2305. Expect(err).NotTo(HaveOccurred())
  2306. members, err = client.ZPopMin("zset", 2).Result()
  2307. Expect(err).NotTo(HaveOccurred())
  2308. Expect(members).To(Equal([]redis.Z{{
  2309. Score: 1,
  2310. Member: "one",
  2311. }, {
  2312. Score: 2,
  2313. Member: "two",
  2314. }}))
  2315. // adding back 1 & 2
  2316. err = client.ZAdd("zset", &redis.Z{
  2317. Score: 1,
  2318. Member: "one",
  2319. }).Err()
  2320. Expect(err).NotTo(HaveOccurred())
  2321. err = client.ZAdd("zset", &redis.Z{
  2322. Score: 2,
  2323. Member: "two",
  2324. }).Err()
  2325. Expect(err).NotTo(HaveOccurred())
  2326. members, err = client.ZPopMin("zset", 10).Result()
  2327. Expect(err).NotTo(HaveOccurred())
  2328. Expect(members).To(Equal([]redis.Z{{
  2329. Score: 1,
  2330. Member: "one",
  2331. }, {
  2332. Score: 2,
  2333. Member: "two",
  2334. }, {
  2335. Score: 3,
  2336. Member: "three",
  2337. }}))
  2338. })
  2339. It("should ZRange", func() {
  2340. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2341. Expect(err).NotTo(HaveOccurred())
  2342. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2343. Expect(err).NotTo(HaveOccurred())
  2344. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2345. Expect(err).NotTo(HaveOccurred())
  2346. zRange := client.ZRange("zset", 0, -1)
  2347. Expect(zRange.Err()).NotTo(HaveOccurred())
  2348. Expect(zRange.Val()).To(Equal([]string{"one", "two", "three"}))
  2349. zRange = client.ZRange("zset", 2, 3)
  2350. Expect(zRange.Err()).NotTo(HaveOccurred())
  2351. Expect(zRange.Val()).To(Equal([]string{"three"}))
  2352. zRange = client.ZRange("zset", -2, -1)
  2353. Expect(zRange.Err()).NotTo(HaveOccurred())
  2354. Expect(zRange.Val()).To(Equal([]string{"two", "three"}))
  2355. })
  2356. It("should ZRangeWithScores", func() {
  2357. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2358. Expect(err).NotTo(HaveOccurred())
  2359. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2360. Expect(err).NotTo(HaveOccurred())
  2361. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2362. Expect(err).NotTo(HaveOccurred())
  2363. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2364. Expect(err).NotTo(HaveOccurred())
  2365. Expect(vals).To(Equal([]redis.Z{{
  2366. Score: 1,
  2367. Member: "one",
  2368. }, {
  2369. Score: 2,
  2370. Member: "two",
  2371. }, {
  2372. Score: 3,
  2373. Member: "three",
  2374. }}))
  2375. vals, err = client.ZRangeWithScores("zset", 2, 3).Result()
  2376. Expect(err).NotTo(HaveOccurred())
  2377. Expect(vals).To(Equal([]redis.Z{{Score: 3, Member: "three"}}))
  2378. vals, err = client.ZRangeWithScores("zset", -2, -1).Result()
  2379. Expect(err).NotTo(HaveOccurred())
  2380. Expect(vals).To(Equal([]redis.Z{{
  2381. Score: 2,
  2382. Member: "two",
  2383. }, {
  2384. Score: 3,
  2385. Member: "three",
  2386. }}))
  2387. })
  2388. It("should ZRangeByScore", func() {
  2389. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2390. Expect(err).NotTo(HaveOccurred())
  2391. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2392. Expect(err).NotTo(HaveOccurred())
  2393. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2394. Expect(err).NotTo(HaveOccurred())
  2395. zRangeByScore := client.ZRangeByScore("zset", &redis.ZRangeBy{
  2396. Min: "-inf",
  2397. Max: "+inf",
  2398. })
  2399. Expect(zRangeByScore.Err()).NotTo(HaveOccurred())
  2400. Expect(zRangeByScore.Val()).To(Equal([]string{"one", "two", "three"}))
  2401. zRangeByScore = client.ZRangeByScore("zset", &redis.ZRangeBy{
  2402. Min: "1",
  2403. Max: "2",
  2404. })
  2405. Expect(zRangeByScore.Err()).NotTo(HaveOccurred())
  2406. Expect(zRangeByScore.Val()).To(Equal([]string{"one", "two"}))
  2407. zRangeByScore = client.ZRangeByScore("zset", &redis.ZRangeBy{
  2408. Min: "(1",
  2409. Max: "2",
  2410. })
  2411. Expect(zRangeByScore.Err()).NotTo(HaveOccurred())
  2412. Expect(zRangeByScore.Val()).To(Equal([]string{"two"}))
  2413. zRangeByScore = client.ZRangeByScore("zset", &redis.ZRangeBy{
  2414. Min: "(1",
  2415. Max: "(2",
  2416. })
  2417. Expect(zRangeByScore.Err()).NotTo(HaveOccurred())
  2418. Expect(zRangeByScore.Val()).To(Equal([]string{}))
  2419. })
  2420. It("should ZRangeByLex", func() {
  2421. err := client.ZAdd("zset", &redis.Z{
  2422. Score: 0,
  2423. Member: "a",
  2424. }).Err()
  2425. Expect(err).NotTo(HaveOccurred())
  2426. err = client.ZAdd("zset", &redis.Z{
  2427. Score: 0,
  2428. Member: "b",
  2429. }).Err()
  2430. Expect(err).NotTo(HaveOccurred())
  2431. err = client.ZAdd("zset", &redis.Z{
  2432. Score: 0,
  2433. Member: "c",
  2434. }).Err()
  2435. Expect(err).NotTo(HaveOccurred())
  2436. zRangeByLex := client.ZRangeByLex("zset", &redis.ZRangeBy{
  2437. Min: "-",
  2438. Max: "+",
  2439. })
  2440. Expect(zRangeByLex.Err()).NotTo(HaveOccurred())
  2441. Expect(zRangeByLex.Val()).To(Equal([]string{"a", "b", "c"}))
  2442. zRangeByLex = client.ZRangeByLex("zset", &redis.ZRangeBy{
  2443. Min: "[a",
  2444. Max: "[b",
  2445. })
  2446. Expect(zRangeByLex.Err()).NotTo(HaveOccurred())
  2447. Expect(zRangeByLex.Val()).To(Equal([]string{"a", "b"}))
  2448. zRangeByLex = client.ZRangeByLex("zset", &redis.ZRangeBy{
  2449. Min: "(a",
  2450. Max: "[b",
  2451. })
  2452. Expect(zRangeByLex.Err()).NotTo(HaveOccurred())
  2453. Expect(zRangeByLex.Val()).To(Equal([]string{"b"}))
  2454. zRangeByLex = client.ZRangeByLex("zset", &redis.ZRangeBy{
  2455. Min: "(a",
  2456. Max: "(b",
  2457. })
  2458. Expect(zRangeByLex.Err()).NotTo(HaveOccurred())
  2459. Expect(zRangeByLex.Val()).To(Equal([]string{}))
  2460. })
  2461. It("should ZRangeByScoreWithScoresMap", func() {
  2462. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2463. Expect(err).NotTo(HaveOccurred())
  2464. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2465. Expect(err).NotTo(HaveOccurred())
  2466. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2467. Expect(err).NotTo(HaveOccurred())
  2468. vals, err := client.ZRangeByScoreWithScores("zset", &redis.ZRangeBy{
  2469. Min: "-inf",
  2470. Max: "+inf",
  2471. }).Result()
  2472. Expect(err).NotTo(HaveOccurred())
  2473. Expect(vals).To(Equal([]redis.Z{{
  2474. Score: 1,
  2475. Member: "one",
  2476. }, {
  2477. Score: 2,
  2478. Member: "two",
  2479. }, {
  2480. Score: 3,
  2481. Member: "three",
  2482. }}))
  2483. vals, err = client.ZRangeByScoreWithScores("zset", &redis.ZRangeBy{
  2484. Min: "1",
  2485. Max: "2",
  2486. }).Result()
  2487. Expect(err).NotTo(HaveOccurred())
  2488. Expect(vals).To(Equal([]redis.Z{{
  2489. Score: 1,
  2490. Member: "one",
  2491. }, {
  2492. Score: 2,
  2493. Member: "two",
  2494. }}))
  2495. vals, err = client.ZRangeByScoreWithScores("zset", &redis.ZRangeBy{
  2496. Min: "(1",
  2497. Max: "2",
  2498. }).Result()
  2499. Expect(err).NotTo(HaveOccurred())
  2500. Expect(vals).To(Equal([]redis.Z{{Score: 2, Member: "two"}}))
  2501. vals, err = client.ZRangeByScoreWithScores("zset", &redis.ZRangeBy{
  2502. Min: "(1",
  2503. Max: "(2",
  2504. }).Result()
  2505. Expect(err).NotTo(HaveOccurred())
  2506. Expect(vals).To(Equal([]redis.Z{}))
  2507. })
  2508. It("should ZRank", func() {
  2509. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2510. Expect(err).NotTo(HaveOccurred())
  2511. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2512. Expect(err).NotTo(HaveOccurred())
  2513. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2514. Expect(err).NotTo(HaveOccurred())
  2515. zRank := client.ZRank("zset", "three")
  2516. Expect(zRank.Err()).NotTo(HaveOccurred())
  2517. Expect(zRank.Val()).To(Equal(int64(2)))
  2518. zRank = client.ZRank("zset", "four")
  2519. Expect(zRank.Err()).To(Equal(redis.Nil))
  2520. Expect(zRank.Val()).To(Equal(int64(0)))
  2521. })
  2522. It("should ZRem", func() {
  2523. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2524. Expect(err).NotTo(HaveOccurred())
  2525. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2526. Expect(err).NotTo(HaveOccurred())
  2527. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2528. Expect(err).NotTo(HaveOccurred())
  2529. zRem := client.ZRem("zset", "two")
  2530. Expect(zRem.Err()).NotTo(HaveOccurred())
  2531. Expect(zRem.Val()).To(Equal(int64(1)))
  2532. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2533. Expect(err).NotTo(HaveOccurred())
  2534. Expect(vals).To(Equal([]redis.Z{{
  2535. Score: 1,
  2536. Member: "one",
  2537. }, {
  2538. Score: 3,
  2539. Member: "three",
  2540. }}))
  2541. })
  2542. It("should ZRemRangeByRank", func() {
  2543. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2544. Expect(err).NotTo(HaveOccurred())
  2545. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2546. Expect(err).NotTo(HaveOccurred())
  2547. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2548. Expect(err).NotTo(HaveOccurred())
  2549. zRemRangeByRank := client.ZRemRangeByRank("zset", 0, 1)
  2550. Expect(zRemRangeByRank.Err()).NotTo(HaveOccurred())
  2551. Expect(zRemRangeByRank.Val()).To(Equal(int64(2)))
  2552. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2553. Expect(err).NotTo(HaveOccurred())
  2554. Expect(vals).To(Equal([]redis.Z{{
  2555. Score: 3,
  2556. Member: "three",
  2557. }}))
  2558. })
  2559. It("should ZRemRangeByScore", func() {
  2560. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2561. Expect(err).NotTo(HaveOccurred())
  2562. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2563. Expect(err).NotTo(HaveOccurred())
  2564. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2565. Expect(err).NotTo(HaveOccurred())
  2566. zRemRangeByScore := client.ZRemRangeByScore("zset", "-inf", "(2")
  2567. Expect(zRemRangeByScore.Err()).NotTo(HaveOccurred())
  2568. Expect(zRemRangeByScore.Val()).To(Equal(int64(1)))
  2569. vals, err := client.ZRangeWithScores("zset", 0, -1).Result()
  2570. Expect(err).NotTo(HaveOccurred())
  2571. Expect(vals).To(Equal([]redis.Z{{
  2572. Score: 2,
  2573. Member: "two",
  2574. }, {
  2575. Score: 3,
  2576. Member: "three",
  2577. }}))
  2578. })
  2579. It("should ZRemRangeByLex", func() {
  2580. zz := []*redis.Z{
  2581. {Score: 0, Member: "aaaa"},
  2582. {Score: 0, Member: "b"},
  2583. {Score: 0, Member: "c"},
  2584. {Score: 0, Member: "d"},
  2585. {Score: 0, Member: "e"},
  2586. {Score: 0, Member: "foo"},
  2587. {Score: 0, Member: "zap"},
  2588. {Score: 0, Member: "zip"},
  2589. {Score: 0, Member: "ALPHA"},
  2590. {Score: 0, Member: "alpha"},
  2591. }
  2592. for _, z := range zz {
  2593. err := client.ZAdd("zset", z).Err()
  2594. Expect(err).NotTo(HaveOccurred())
  2595. }
  2596. n, err := client.ZRemRangeByLex("zset", "[alpha", "[omega").Result()
  2597. Expect(err).NotTo(HaveOccurred())
  2598. Expect(n).To(Equal(int64(6)))
  2599. vals, err := client.ZRange("zset", 0, -1).Result()
  2600. Expect(err).NotTo(HaveOccurred())
  2601. Expect(vals).To(Equal([]string{"ALPHA", "aaaa", "zap", "zip"}))
  2602. })
  2603. It("should ZRevRange", func() {
  2604. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2605. Expect(err).NotTo(HaveOccurred())
  2606. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2607. Expect(err).NotTo(HaveOccurred())
  2608. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2609. Expect(err).NotTo(HaveOccurred())
  2610. zRevRange := client.ZRevRange("zset", 0, -1)
  2611. Expect(zRevRange.Err()).NotTo(HaveOccurred())
  2612. Expect(zRevRange.Val()).To(Equal([]string{"three", "two", "one"}))
  2613. zRevRange = client.ZRevRange("zset", 2, 3)
  2614. Expect(zRevRange.Err()).NotTo(HaveOccurred())
  2615. Expect(zRevRange.Val()).To(Equal([]string{"one"}))
  2616. zRevRange = client.ZRevRange("zset", -2, -1)
  2617. Expect(zRevRange.Err()).NotTo(HaveOccurred())
  2618. Expect(zRevRange.Val()).To(Equal([]string{"two", "one"}))
  2619. })
  2620. It("should ZRevRangeWithScoresMap", func() {
  2621. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2622. Expect(err).NotTo(HaveOccurred())
  2623. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2624. Expect(err).NotTo(HaveOccurred())
  2625. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2626. Expect(err).NotTo(HaveOccurred())
  2627. val, err := client.ZRevRangeWithScores("zset", 0, -1).Result()
  2628. Expect(err).NotTo(HaveOccurred())
  2629. Expect(val).To(Equal([]redis.Z{{
  2630. Score: 3,
  2631. Member: "three",
  2632. }, {
  2633. Score: 2,
  2634. Member: "two",
  2635. }, {
  2636. Score: 1,
  2637. Member: "one",
  2638. }}))
  2639. val, err = client.ZRevRangeWithScores("zset", 2, 3).Result()
  2640. Expect(err).NotTo(HaveOccurred())
  2641. Expect(val).To(Equal([]redis.Z{{Score: 1, Member: "one"}}))
  2642. val, err = client.ZRevRangeWithScores("zset", -2, -1).Result()
  2643. Expect(err).NotTo(HaveOccurred())
  2644. Expect(val).To(Equal([]redis.Z{{
  2645. Score: 2,
  2646. Member: "two",
  2647. }, {
  2648. Score: 1,
  2649. Member: "one",
  2650. }}))
  2651. })
  2652. It("should ZRevRangeByScore", func() {
  2653. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2654. Expect(err).NotTo(HaveOccurred())
  2655. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2656. Expect(err).NotTo(HaveOccurred())
  2657. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2658. Expect(err).NotTo(HaveOccurred())
  2659. vals, err := client.ZRevRangeByScore(
  2660. "zset", &redis.ZRangeBy{Max: "+inf", Min: "-inf"}).Result()
  2661. Expect(err).NotTo(HaveOccurred())
  2662. Expect(vals).To(Equal([]string{"three", "two", "one"}))
  2663. vals, err = client.ZRevRangeByScore(
  2664. "zset", &redis.ZRangeBy{Max: "2", Min: "(1"}).Result()
  2665. Expect(err).NotTo(HaveOccurred())
  2666. Expect(vals).To(Equal([]string{"two"}))
  2667. vals, err = client.ZRevRangeByScore(
  2668. "zset", &redis.ZRangeBy{Max: "(2", Min: "(1"}).Result()
  2669. Expect(err).NotTo(HaveOccurred())
  2670. Expect(vals).To(Equal([]string{}))
  2671. })
  2672. It("should ZRevRangeByLex", func() {
  2673. err := client.ZAdd("zset", &redis.Z{Score: 0, Member: "a"}).Err()
  2674. Expect(err).NotTo(HaveOccurred())
  2675. err = client.ZAdd("zset", &redis.Z{Score: 0, Member: "b"}).Err()
  2676. Expect(err).NotTo(HaveOccurred())
  2677. err = client.ZAdd("zset", &redis.Z{Score: 0, Member: "c"}).Err()
  2678. Expect(err).NotTo(HaveOccurred())
  2679. vals, err := client.ZRevRangeByLex(
  2680. "zset", &redis.ZRangeBy{Max: "+", Min: "-"}).Result()
  2681. Expect(err).NotTo(HaveOccurred())
  2682. Expect(vals).To(Equal([]string{"c", "b", "a"}))
  2683. vals, err = client.ZRevRangeByLex(
  2684. "zset", &redis.ZRangeBy{Max: "[b", Min: "(a"}).Result()
  2685. Expect(err).NotTo(HaveOccurred())
  2686. Expect(vals).To(Equal([]string{"b"}))
  2687. vals, err = client.ZRevRangeByLex(
  2688. "zset", &redis.ZRangeBy{Max: "(b", Min: "(a"}).Result()
  2689. Expect(err).NotTo(HaveOccurred())
  2690. Expect(vals).To(Equal([]string{}))
  2691. })
  2692. It("should ZRevRangeByScoreWithScores", func() {
  2693. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2694. Expect(err).NotTo(HaveOccurred())
  2695. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2696. Expect(err).NotTo(HaveOccurred())
  2697. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2698. Expect(err).NotTo(HaveOccurred())
  2699. vals, err := client.ZRevRangeByScoreWithScores(
  2700. "zset", &redis.ZRangeBy{Max: "+inf", Min: "-inf"}).Result()
  2701. Expect(err).NotTo(HaveOccurred())
  2702. Expect(vals).To(Equal([]redis.Z{{
  2703. Score: 3,
  2704. Member: "three",
  2705. }, {
  2706. Score: 2,
  2707. Member: "two",
  2708. }, {
  2709. Score: 1,
  2710. Member: "one",
  2711. }}))
  2712. })
  2713. It("should ZRevRangeByScoreWithScoresMap", func() {
  2714. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2715. Expect(err).NotTo(HaveOccurred())
  2716. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2717. Expect(err).NotTo(HaveOccurred())
  2718. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2719. Expect(err).NotTo(HaveOccurred())
  2720. vals, err := client.ZRevRangeByScoreWithScores(
  2721. "zset", &redis.ZRangeBy{Max: "+inf", Min: "-inf"}).Result()
  2722. Expect(err).NotTo(HaveOccurred())
  2723. Expect(vals).To(Equal([]redis.Z{{
  2724. Score: 3,
  2725. Member: "three",
  2726. }, {
  2727. Score: 2,
  2728. Member: "two",
  2729. }, {
  2730. Score: 1,
  2731. Member: "one",
  2732. }}))
  2733. vals, err = client.ZRevRangeByScoreWithScores(
  2734. "zset", &redis.ZRangeBy{Max: "2", Min: "(1"}).Result()
  2735. Expect(err).NotTo(HaveOccurred())
  2736. Expect(vals).To(Equal([]redis.Z{{Score: 2, Member: "two"}}))
  2737. vals, err = client.ZRevRangeByScoreWithScores(
  2738. "zset", &redis.ZRangeBy{Max: "(2", Min: "(1"}).Result()
  2739. Expect(err).NotTo(HaveOccurred())
  2740. Expect(vals).To(Equal([]redis.Z{}))
  2741. })
  2742. It("should ZRevRank", func() {
  2743. err := client.ZAdd("zset", &redis.Z{Score: 1, Member: "one"}).Err()
  2744. Expect(err).NotTo(HaveOccurred())
  2745. err = client.ZAdd("zset", &redis.Z{Score: 2, Member: "two"}).Err()
  2746. Expect(err).NotTo(HaveOccurred())
  2747. err = client.ZAdd("zset", &redis.Z{Score: 3, Member: "three"}).Err()
  2748. Expect(err).NotTo(HaveOccurred())
  2749. zRevRank := client.ZRevRank("zset", "one")
  2750. Expect(zRevRank.Err()).NotTo(HaveOccurred())
  2751. Expect(zRevRank.Val()).To(Equal(int64(2)))
  2752. zRevRank = client.ZRevRank("zset", "four")
  2753. Expect(zRevRank.Err()).To(Equal(redis.Nil))
  2754. Expect(zRevRank.Val()).To(Equal(int64(0)))
  2755. })
  2756. It("should ZScore", func() {
  2757. zAdd := client.ZAdd("zset", &redis.Z{Score: 1.001, Member: "one"})
  2758. Expect(zAdd.Err()).NotTo(HaveOccurred())
  2759. zScore := client.ZScore("zset", "one")
  2760. Expect(zScore.Err()).NotTo(HaveOccurred())
  2761. Expect(zScore.Val()).To(Equal(float64(1.001)))
  2762. })
  2763. It("should ZUnionStore", func() {
  2764. err := client.ZAdd("zset1", &redis.Z{Score: 1, Member: "one"}).Err()
  2765. Expect(err).NotTo(HaveOccurred())
  2766. err = client.ZAdd("zset1", &redis.Z{Score: 2, Member: "two"}).Err()
  2767. Expect(err).NotTo(HaveOccurred())
  2768. err = client.ZAdd("zset2", &redis.Z{Score: 1, Member: "one"}).Err()
  2769. Expect(err).NotTo(HaveOccurred())
  2770. err = client.ZAdd("zset2", &redis.Z{Score: 2, Member: "two"}).Err()
  2771. Expect(err).NotTo(HaveOccurred())
  2772. err = client.ZAdd("zset2", &redis.Z{Score: 3, Member: "three"}).Err()
  2773. Expect(err).NotTo(HaveOccurred())
  2774. n, err := client.ZUnionStore("out", &redis.ZStore{
  2775. Keys: []string{"zset1", "zset2"},
  2776. Weights: []float64{2, 3},
  2777. }).Result()
  2778. Expect(err).NotTo(HaveOccurred())
  2779. Expect(n).To(Equal(int64(3)))
  2780. val, err := client.ZRangeWithScores("out", 0, -1).Result()
  2781. Expect(err).NotTo(HaveOccurred())
  2782. Expect(val).To(Equal([]redis.Z{{
  2783. Score: 5,
  2784. Member: "one",
  2785. }, {
  2786. Score: 9,
  2787. Member: "three",
  2788. }, {
  2789. Score: 10,
  2790. Member: "two",
  2791. }}))
  2792. })
  2793. })
  2794. Describe("streams", func() {
  2795. BeforeEach(func() {
  2796. id, err := client.XAdd(&redis.XAddArgs{
  2797. Stream: "stream",
  2798. ID: "1-0",
  2799. Values: map[string]interface{}{"uno": "un"},
  2800. }).Result()
  2801. Expect(err).NotTo(HaveOccurred())
  2802. Expect(id).To(Equal("1-0"))
  2803. id, err = client.XAdd(&redis.XAddArgs{
  2804. Stream: "stream",
  2805. ID: "2-0",
  2806. Values: map[string]interface{}{"dos": "deux"},
  2807. }).Result()
  2808. Expect(err).NotTo(HaveOccurred())
  2809. Expect(id).To(Equal("2-0"))
  2810. id, err = client.XAdd(&redis.XAddArgs{
  2811. Stream: "stream",
  2812. ID: "3-0",
  2813. Values: map[string]interface{}{"tres": "troix"},
  2814. }).Result()
  2815. Expect(err).NotTo(HaveOccurred())
  2816. Expect(id).To(Equal("3-0"))
  2817. })
  2818. It("should XTrim", func() {
  2819. n, err := client.XTrim("stream", 0).Result()
  2820. Expect(err).NotTo(HaveOccurred())
  2821. Expect(n).To(Equal(int64(3)))
  2822. })
  2823. It("should XTrimApprox", func() {
  2824. n, err := client.XTrimApprox("stream", 0).Result()
  2825. Expect(err).NotTo(HaveOccurred())
  2826. Expect(n).To(Equal(int64(3)))
  2827. })
  2828. It("should XAdd", func() {
  2829. id, err := client.XAdd(&redis.XAddArgs{
  2830. Stream: "stream",
  2831. Values: map[string]interface{}{"quatro": "quatre"},
  2832. }).Result()
  2833. Expect(err).NotTo(HaveOccurred())
  2834. vals, err := client.XRange("stream", "-", "+").Result()
  2835. Expect(err).NotTo(HaveOccurred())
  2836. Expect(vals).To(Equal([]redis.XMessage{
  2837. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2838. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2839. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2840. {ID: id, Values: map[string]interface{}{"quatro": "quatre"}},
  2841. }))
  2842. })
  2843. It("should XAdd with MaxLen", func() {
  2844. id, err := client.XAdd(&redis.XAddArgs{
  2845. Stream: "stream",
  2846. MaxLen: 1,
  2847. Values: map[string]interface{}{"quatro": "quatre"},
  2848. }).Result()
  2849. Expect(err).NotTo(HaveOccurred())
  2850. vals, err := client.XRange("stream", "-", "+").Result()
  2851. Expect(err).NotTo(HaveOccurred())
  2852. Expect(vals).To(Equal([]redis.XMessage{
  2853. {ID: id, Values: map[string]interface{}{"quatro": "quatre"}},
  2854. }))
  2855. })
  2856. It("should XDel", func() {
  2857. n, err := client.XDel("stream", "1-0", "2-0", "3-0").Result()
  2858. Expect(err).NotTo(HaveOccurred())
  2859. Expect(n).To(Equal(int64(3)))
  2860. })
  2861. It("should XLen", func() {
  2862. n, err := client.XLen("stream").Result()
  2863. Expect(err).NotTo(HaveOccurred())
  2864. Expect(n).To(Equal(int64(3)))
  2865. })
  2866. It("should XRange", func() {
  2867. msgs, err := client.XRange("stream", "-", "+").Result()
  2868. Expect(err).NotTo(HaveOccurred())
  2869. Expect(msgs).To(Equal([]redis.XMessage{
  2870. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2871. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2872. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2873. }))
  2874. msgs, err = client.XRange("stream", "2", "+").Result()
  2875. Expect(err).NotTo(HaveOccurred())
  2876. Expect(msgs).To(Equal([]redis.XMessage{
  2877. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2878. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2879. }))
  2880. msgs, err = client.XRange("stream", "-", "2").Result()
  2881. Expect(err).NotTo(HaveOccurred())
  2882. Expect(msgs).To(Equal([]redis.XMessage{
  2883. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2884. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2885. }))
  2886. })
  2887. It("should XRangeN", func() {
  2888. msgs, err := client.XRangeN("stream", "-", "+", 2).Result()
  2889. Expect(err).NotTo(HaveOccurred())
  2890. Expect(msgs).To(Equal([]redis.XMessage{
  2891. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2892. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2893. }))
  2894. msgs, err = client.XRangeN("stream", "2", "+", 1).Result()
  2895. Expect(err).NotTo(HaveOccurred())
  2896. Expect(msgs).To(Equal([]redis.XMessage{
  2897. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2898. }))
  2899. msgs, err = client.XRangeN("stream", "-", "2", 1).Result()
  2900. Expect(err).NotTo(HaveOccurred())
  2901. Expect(msgs).To(Equal([]redis.XMessage{
  2902. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2903. }))
  2904. })
  2905. It("should XRevRange", func() {
  2906. msgs, err := client.XRevRange("stream", "+", "-").Result()
  2907. Expect(err).NotTo(HaveOccurred())
  2908. Expect(msgs).To(Equal([]redis.XMessage{
  2909. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2910. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2911. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2912. }))
  2913. msgs, err = client.XRevRange("stream", "+", "2").Result()
  2914. Expect(err).NotTo(HaveOccurred())
  2915. Expect(msgs).To(Equal([]redis.XMessage{
  2916. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2917. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2918. }))
  2919. })
  2920. It("should XRevRangeN", func() {
  2921. msgs, err := client.XRevRangeN("stream", "+", "-", 2).Result()
  2922. Expect(err).NotTo(HaveOccurred())
  2923. Expect(msgs).To(Equal([]redis.XMessage{
  2924. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2925. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2926. }))
  2927. msgs, err = client.XRevRangeN("stream", "+", "2", 1).Result()
  2928. Expect(err).NotTo(HaveOccurred())
  2929. Expect(msgs).To(Equal([]redis.XMessage{
  2930. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2931. }))
  2932. })
  2933. It("should XRead", func() {
  2934. res, err := client.XReadStreams("stream", "0").Result()
  2935. Expect(err).NotTo(HaveOccurred())
  2936. Expect(res).To(Equal([]redis.XStream{{
  2937. Stream: "stream",
  2938. Messages: []redis.XMessage{
  2939. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2940. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2941. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2942. }},
  2943. }))
  2944. _, err = client.XReadStreams("stream", "3").Result()
  2945. Expect(err).To(Equal(redis.Nil))
  2946. })
  2947. It("should XRead", func() {
  2948. res, err := client.XRead(&redis.XReadArgs{
  2949. Streams: []string{"stream", "0"},
  2950. Count: 2,
  2951. Block: 100 * time.Millisecond,
  2952. }).Result()
  2953. Expect(err).NotTo(HaveOccurred())
  2954. Expect(res).To(Equal([]redis.XStream{{
  2955. Stream: "stream",
  2956. Messages: []redis.XMessage{
  2957. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2958. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2959. }},
  2960. }))
  2961. _, err = client.XRead(&redis.XReadArgs{
  2962. Streams: []string{"stream", "3"},
  2963. Count: 1,
  2964. Block: 100 * time.Millisecond,
  2965. }).Result()
  2966. Expect(err).To(Equal(redis.Nil))
  2967. })
  2968. Describe("group", func() {
  2969. BeforeEach(func() {
  2970. err := client.XGroupCreate("stream", "group", "0").Err()
  2971. Expect(err).NotTo(HaveOccurred())
  2972. res, err := client.XReadGroup(&redis.XReadGroupArgs{
  2973. Group: "group",
  2974. Consumer: "consumer",
  2975. Streams: []string{"stream", ">"},
  2976. }).Result()
  2977. Expect(err).NotTo(HaveOccurred())
  2978. Expect(res).To(Equal([]redis.XStream{{
  2979. Stream: "stream",
  2980. Messages: []redis.XMessage{
  2981. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  2982. {ID: "2-0", Values: map[string]interface{}{"dos": "deux"}},
  2983. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  2984. }},
  2985. }))
  2986. })
  2987. AfterEach(func() {
  2988. n, err := client.XGroupDestroy("stream", "group").Result()
  2989. Expect(err).NotTo(HaveOccurred())
  2990. Expect(n).To(Equal(int64(1)))
  2991. })
  2992. It("should XReadGroup skip empty", func() {
  2993. n, err := client.XDel("stream", "2-0").Result()
  2994. Expect(err).NotTo(HaveOccurred())
  2995. Expect(n).To(Equal(int64(1)))
  2996. res, err := client.XReadGroup(&redis.XReadGroupArgs{
  2997. Group: "group",
  2998. Consumer: "consumer",
  2999. Streams: []string{"stream", "0"},
  3000. }).Result()
  3001. Expect(err).NotTo(HaveOccurred())
  3002. Expect(res).To(Equal([]redis.XStream{{
  3003. Stream: "stream",
  3004. Messages: []redis.XMessage{
  3005. {ID: "1-0", Values: map[string]interface{}{"uno": "un"}},
  3006. {ID: "2-0", Values: nil},
  3007. {ID: "3-0", Values: map[string]interface{}{"tres": "troix"}},
  3008. }},
  3009. }))
  3010. })
  3011. It("should XGroupCreateMkStream", func() {
  3012. err := client.XGroupCreateMkStream("stream2", "group", "0").Err()
  3013. Expect(err).NotTo(HaveOccurred())
  3014. err = client.XGroupCreateMkStream("stream2", "group", "0").Err()
  3015. Expect(err).To(Equal(proto.RedisError("BUSYGROUP Consumer Group name already exists")))
  3016. n, err := client.XGroupDestroy("stream2", "group").Result()
  3017. Expect(err).NotTo(HaveOccurred())
  3018. Expect(n).To(Equal(int64(1)))
  3019. n, err = client.Del("stream2").Result()
  3020. Expect(err).NotTo(HaveOccurred())
  3021. Expect(n).To(Equal(int64(1)))
  3022. })
  3023. It("should XPending", func() {
  3024. info, err := client.XPending("stream", "group").Result()
  3025. Expect(err).NotTo(HaveOccurred())
  3026. Expect(info).To(Equal(&redis.XPending{
  3027. Count: 3,
  3028. Lower: "1-0",
  3029. Higher: "3-0",
  3030. Consumers: map[string]int64{"consumer": 3},
  3031. }))
  3032. infoExt, err := client.XPendingExt(&redis.XPendingExtArgs{
  3033. Stream: "stream",
  3034. Group: "group",
  3035. Start: "-",
  3036. End: "+",
  3037. Count: 10,
  3038. Consumer: "consumer",
  3039. }).Result()
  3040. Expect(err).NotTo(HaveOccurred())
  3041. for i := range infoExt {
  3042. infoExt[i].Idle = 0
  3043. }
  3044. Expect(infoExt).To(Equal([]redis.XPendingExt{
  3045. {ID: "1-0", Consumer: "consumer", Idle: 0, RetryCount: 1},
  3046. {ID: "2-0", Consumer: "consumer", Idle: 0, RetryCount: 1},
  3047. {ID: "3-0", Consumer: "consumer", Idle: 0, RetryCount: 1},
  3048. }))
  3049. n, err := client.XGroupDelConsumer("stream", "group", "consumer").Result()
  3050. Expect(err).NotTo(HaveOccurred())
  3051. Expect(n).To(Equal(int64(3)))
  3052. })
  3053. It("should XClaim", func() {
  3054. msgs, err := client.XClaim(&redis.XClaimArgs{
  3055. Stream: "stream",
  3056. Group: "group",
  3057. Consumer: "consumer",
  3058. Messages: []string{"1-0", "2-0", "3-0"},
  3059. }).Result()
  3060. Expect(err).NotTo(HaveOccurred())
  3061. Expect(msgs).To(Equal([]redis.XMessage{{
  3062. ID: "1-0",
  3063. Values: map[string]interface{}{"uno": "un"},
  3064. }, {
  3065. ID: "2-0",
  3066. Values: map[string]interface{}{"dos": "deux"},
  3067. }, {
  3068. ID: "3-0",
  3069. Values: map[string]interface{}{"tres": "troix"},
  3070. }}))
  3071. ids, err := client.XClaimJustID(&redis.XClaimArgs{
  3072. Stream: "stream",
  3073. Group: "group",
  3074. Consumer: "consumer",
  3075. Messages: []string{"1-0", "2-0", "3-0"},
  3076. }).Result()
  3077. Expect(err).NotTo(HaveOccurred())
  3078. Expect(ids).To(Equal([]string{"1-0", "2-0", "3-0"}))
  3079. })
  3080. It("should XAck", func() {
  3081. n, err := client.XAck("stream", "group", "1-0", "2-0", "4-0").Result()
  3082. Expect(err).NotTo(HaveOccurred())
  3083. Expect(n).To(Equal(int64(2)))
  3084. })
  3085. })
  3086. })
  3087. Describe("Geo add and radius search", func() {
  3088. BeforeEach(func() {
  3089. n, err := client.GeoAdd(
  3090. "Sicily",
  3091. &redis.GeoLocation{Longitude: 13.361389, Latitude: 38.115556, Name: "Palermo"},
  3092. &redis.GeoLocation{Longitude: 15.087269, Latitude: 37.502669, Name: "Catania"},
  3093. ).Result()
  3094. Expect(err).NotTo(HaveOccurred())
  3095. Expect(n).To(Equal(int64(2)))
  3096. })
  3097. It("should not add same geo location", func() {
  3098. geoAdd := client.GeoAdd(
  3099. "Sicily",
  3100. &redis.GeoLocation{Longitude: 13.361389, Latitude: 38.115556, Name: "Palermo"},
  3101. )
  3102. Expect(geoAdd.Err()).NotTo(HaveOccurred())
  3103. Expect(geoAdd.Val()).To(Equal(int64(0)))
  3104. })
  3105. It("should search geo radius", func() {
  3106. res, err := client.GeoRadius("Sicily", 15, 37, &redis.GeoRadiusQuery{
  3107. Radius: 200,
  3108. }).Result()
  3109. Expect(err).NotTo(HaveOccurred())
  3110. Expect(res).To(HaveLen(2))
  3111. Expect(res[0].Name).To(Equal("Palermo"))
  3112. Expect(res[1].Name).To(Equal("Catania"))
  3113. })
  3114. It("should geo radius and store the result", func() {
  3115. n, err := client.GeoRadiusStore("Sicily", 15, 37, &redis.GeoRadiusQuery{
  3116. Radius: 200,
  3117. Store: "result",
  3118. }).Result()
  3119. Expect(err).NotTo(HaveOccurred())
  3120. Expect(n).To(Equal(int64(2)))
  3121. res, err := client.ZRangeWithScores("result", 0, -1).Result()
  3122. Expect(err).NotTo(HaveOccurred())
  3123. Expect(res).To(ContainElement(redis.Z{
  3124. Score: 3.479099956230698e+15,
  3125. Member: "Palermo",
  3126. }))
  3127. Expect(res).To(ContainElement(redis.Z{
  3128. Score: 3.479447370796909e+15,
  3129. Member: "Catania",
  3130. }))
  3131. })
  3132. It("should geo radius and store dist", func() {
  3133. n, err := client.GeoRadiusStore("Sicily", 15, 37, &redis.GeoRadiusQuery{
  3134. Radius: 200,
  3135. StoreDist: "result",
  3136. }).Result()
  3137. Expect(err).NotTo(HaveOccurred())
  3138. Expect(n).To(Equal(int64(2)))
  3139. res, err := client.ZRangeWithScores("result", 0, -1).Result()
  3140. Expect(err).NotTo(HaveOccurred())
  3141. Expect(res).To(ContainElement(redis.Z{
  3142. Score: 190.44242984775784,
  3143. Member: "Palermo",
  3144. }))
  3145. Expect(res).To(ContainElement(redis.Z{
  3146. Score: 56.4412578701582,
  3147. Member: "Catania",
  3148. }))
  3149. })
  3150. It("should search geo radius with options", func() {
  3151. res, err := client.GeoRadius("Sicily", 15, 37, &redis.GeoRadiusQuery{
  3152. Radius: 200,
  3153. Unit: "km",
  3154. WithGeoHash: true,
  3155. WithCoord: true,
  3156. WithDist: true,
  3157. Count: 2,
  3158. Sort: "ASC",
  3159. }).Result()
  3160. Expect(err).NotTo(HaveOccurred())
  3161. Expect(res).To(HaveLen(2))
  3162. Expect(res[1].Name).To(Equal("Palermo"))
  3163. Expect(res[1].Dist).To(Equal(190.4424))
  3164. Expect(res[1].GeoHash).To(Equal(int64(3479099956230698)))
  3165. Expect(res[1].Longitude).To(Equal(13.361389338970184))
  3166. Expect(res[1].Latitude).To(Equal(38.115556395496299))
  3167. Expect(res[0].Name).To(Equal("Catania"))
  3168. Expect(res[0].Dist).To(Equal(56.4413))
  3169. Expect(res[0].GeoHash).To(Equal(int64(3479447370796909)))
  3170. Expect(res[0].Longitude).To(Equal(15.087267458438873))
  3171. Expect(res[0].Latitude).To(Equal(37.50266842333162))
  3172. })
  3173. It("should search geo radius with WithDist=false", func() {
  3174. res, err := client.GeoRadius("Sicily", 15, 37, &redis.GeoRadiusQuery{
  3175. Radius: 200,
  3176. Unit: "km",
  3177. WithGeoHash: true,
  3178. WithCoord: true,
  3179. Count: 2,
  3180. Sort: "ASC",
  3181. }).Result()
  3182. Expect(err).NotTo(HaveOccurred())
  3183. Expect(res).To(HaveLen(2))
  3184. Expect(res[1].Name).To(Equal("Palermo"))
  3185. Expect(res[1].Dist).To(Equal(float64(0)))
  3186. Expect(res[1].GeoHash).To(Equal(int64(3479099956230698)))
  3187. Expect(res[1].Longitude).To(Equal(13.361389338970184))
  3188. Expect(res[1].Latitude).To(Equal(38.115556395496299))
  3189. Expect(res[0].Name).To(Equal("Catania"))
  3190. Expect(res[0].Dist).To(Equal(float64(0)))
  3191. Expect(res[0].GeoHash).To(Equal(int64(3479447370796909)))
  3192. Expect(res[0].Longitude).To(Equal(15.087267458438873))
  3193. Expect(res[0].Latitude).To(Equal(37.50266842333162))
  3194. })
  3195. It("should search geo radius by member with options", func() {
  3196. res, err := client.GeoRadiusByMember("Sicily", "Catania", &redis.GeoRadiusQuery{
  3197. Radius: 200,
  3198. Unit: "km",
  3199. WithGeoHash: true,
  3200. WithCoord: true,
  3201. WithDist: true,
  3202. Count: 2,
  3203. Sort: "ASC",
  3204. }).Result()
  3205. Expect(err).NotTo(HaveOccurred())
  3206. Expect(res).To(HaveLen(2))
  3207. Expect(res[0].Name).To(Equal("Catania"))
  3208. Expect(res[0].Dist).To(Equal(0.0))
  3209. Expect(res[0].GeoHash).To(Equal(int64(3479447370796909)))
  3210. Expect(res[0].Longitude).To(Equal(15.087267458438873))
  3211. Expect(res[0].Latitude).To(Equal(37.50266842333162))
  3212. Expect(res[1].Name).To(Equal("Palermo"))
  3213. Expect(res[1].Dist).To(Equal(166.2742))
  3214. Expect(res[1].GeoHash).To(Equal(int64(3479099956230698)))
  3215. Expect(res[1].Longitude).To(Equal(13.361389338970184))
  3216. Expect(res[1].Latitude).To(Equal(38.115556395496299))
  3217. })
  3218. It("should search geo radius with no results", func() {
  3219. res, err := client.GeoRadius("Sicily", 99, 37, &redis.GeoRadiusQuery{
  3220. Radius: 200,
  3221. Unit: "km",
  3222. WithGeoHash: true,
  3223. WithCoord: true,
  3224. WithDist: true,
  3225. }).Result()
  3226. Expect(err).NotTo(HaveOccurred())
  3227. Expect(res).To(HaveLen(0))
  3228. })
  3229. It("should get geo distance with unit options", func() {
  3230. // From Redis CLI, note the difference in rounding in m vs
  3231. // km on Redis itself.
  3232. //
  3233. // GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
  3234. // GEODIST Sicily Palermo Catania m
  3235. // "166274.15156960033"
  3236. // GEODIST Sicily Palermo Catania km
  3237. // "166.27415156960032"
  3238. dist, err := client.GeoDist("Sicily", "Palermo", "Catania", "km").Result()
  3239. Expect(err).NotTo(HaveOccurred())
  3240. Expect(dist).To(BeNumerically("~", 166.27, 0.01))
  3241. dist, err = client.GeoDist("Sicily", "Palermo", "Catania", "m").Result()
  3242. Expect(err).NotTo(HaveOccurred())
  3243. Expect(dist).To(BeNumerically("~", 166274.15, 0.01))
  3244. })
  3245. It("should get geo hash in string representation", func() {
  3246. hashes, err := client.GeoHash("Sicily", "Palermo", "Catania").Result()
  3247. Expect(err).NotTo(HaveOccurred())
  3248. Expect(hashes).To(ConsistOf([]string{"sqc8b49rny0", "sqdtr74hyu0"}))
  3249. })
  3250. It("should return geo position", func() {
  3251. pos, err := client.GeoPos("Sicily", "Palermo", "Catania", "NonExisting").Result()
  3252. Expect(err).NotTo(HaveOccurred())
  3253. Expect(pos).To(ConsistOf([]*redis.GeoPos{
  3254. {
  3255. Longitude: 13.361389338970184,
  3256. Latitude: 38.1155563954963,
  3257. },
  3258. {
  3259. Longitude: 15.087267458438873,
  3260. Latitude: 37.50266842333162,
  3261. },
  3262. nil,
  3263. }))
  3264. })
  3265. })
  3266. Describe("marshaling/unmarshaling", func() {
  3267. type convTest struct {
  3268. value interface{}
  3269. wanted string
  3270. dest interface{}
  3271. }
  3272. convTests := []convTest{
  3273. {nil, "", nil},
  3274. {"hello", "hello", new(string)},
  3275. {[]byte("hello"), "hello", new([]byte)},
  3276. {int(1), "1", new(int)},
  3277. {int8(1), "1", new(int8)},
  3278. {int16(1), "1", new(int16)},
  3279. {int32(1), "1", new(int32)},
  3280. {int64(1), "1", new(int64)},
  3281. {uint(1), "1", new(uint)},
  3282. {uint8(1), "1", new(uint8)},
  3283. {uint16(1), "1", new(uint16)},
  3284. {uint32(1), "1", new(uint32)},
  3285. {uint64(1), "1", new(uint64)},
  3286. {float32(1.0), "1", new(float32)},
  3287. {float64(1.0), "1", new(float64)},
  3288. {true, "1", new(bool)},
  3289. {false, "0", new(bool)},
  3290. }
  3291. It("should convert to string", func() {
  3292. for _, test := range convTests {
  3293. err := client.Set("key", test.value, 0).Err()
  3294. Expect(err).NotTo(HaveOccurred())
  3295. s, err := client.Get("key").Result()
  3296. Expect(err).NotTo(HaveOccurred())
  3297. Expect(s).To(Equal(test.wanted))
  3298. if test.dest == nil {
  3299. continue
  3300. }
  3301. err = client.Get("key").Scan(test.dest)
  3302. Expect(err).NotTo(HaveOccurred())
  3303. Expect(deref(test.dest)).To(Equal(test.value))
  3304. }
  3305. })
  3306. })
  3307. Describe("json marshaling/unmarshaling", func() {
  3308. BeforeEach(func() {
  3309. value := &numberStruct{Number: 42}
  3310. err := client.Set("key", value, 0).Err()
  3311. Expect(err).NotTo(HaveOccurred())
  3312. })
  3313. It("should marshal custom values using json", func() {
  3314. s, err := client.Get("key").Result()
  3315. Expect(err).NotTo(HaveOccurred())
  3316. Expect(s).To(Equal(`{"Number":42}`))
  3317. })
  3318. It("should scan custom values using json", func() {
  3319. value := &numberStruct{}
  3320. err := client.Get("key").Scan(value)
  3321. Expect(err).NotTo(HaveOccurred())
  3322. Expect(value.Number).To(Equal(42))
  3323. })
  3324. })
  3325. Describe("Eval", func() {
  3326. It("returns keys and values", func() {
  3327. vals, err := client.Eval(
  3328. "return {KEYS[1],ARGV[1]}",
  3329. []string{"key"},
  3330. "hello",
  3331. ).Result()
  3332. Expect(err).NotTo(HaveOccurred())
  3333. Expect(vals).To(Equal([]interface{}{"key", "hello"}))
  3334. })
  3335. It("returns all values after an error", func() {
  3336. vals, err := client.Eval(
  3337. `return {12, {err="error"}, "abc"}`,
  3338. nil,
  3339. ).Result()
  3340. Expect(err).NotTo(HaveOccurred())
  3341. Expect(vals).To(Equal([]interface{}{int64(12), proto.RedisError("error"), "abc"}))
  3342. })
  3343. })
  3344. })
  3345. type numberStruct struct {
  3346. Number int
  3347. }
  3348. func (s *numberStruct) MarshalBinary() ([]byte, error) {
  3349. return json.Marshal(s)
  3350. }
  3351. func (s *numberStruct) UnmarshalBinary(b []byte) error {
  3352. return json.Unmarshal(b, s)
  3353. }
  3354. func deref(viface interface{}) interface{} {
  3355. v := reflect.ValueOf(viface)
  3356. for v.Kind() == reflect.Ptr {
  3357. v = v.Elem()
  3358. }
  3359. return v.Interface()
  3360. }