/vendor/bundle/jruby/2.1/gems/redis-3.0.7/test/scanning_test.rb

https://github.com/delowong/logstash · Ruby · 413 lines · 314 code · 98 blank · 1 comment · 34 complexity · 910e979ced95a44fe7bf537fdaac0933 MD5 · raw file

  1. # encoding: UTF-8
  2. require File.expand_path("helper", File.dirname(__FILE__))
  3. unless defined?(Enumerator)
  4. Enumerator = Enumerable::Enumerator
  5. end
  6. class TestScanning < Test::Unit::TestCase
  7. include Helper::Client
  8. def test_scan_basic
  9. target_version "2.7.105" do
  10. r.debug :populate, 1000
  11. cursor = 0
  12. all_keys = []
  13. loop {
  14. cursor, keys = r.scan cursor
  15. all_keys += keys
  16. break if cursor == "0"
  17. }
  18. assert_equal 1000, all_keys.uniq.size
  19. end
  20. end
  21. def test_scan_count
  22. target_version "2.7.105" do
  23. r.debug :populate, 1000
  24. cursor = 0
  25. all_keys = []
  26. loop {
  27. cursor, keys = r.scan cursor, :count => 5
  28. all_keys += keys
  29. break if cursor == "0"
  30. }
  31. assert_equal 1000, all_keys.uniq.size
  32. end
  33. end
  34. def test_scan_match
  35. target_version "2.7.105" do
  36. r.debug :populate, 1000
  37. cursor = 0
  38. all_keys = []
  39. loop {
  40. cursor, keys = r.scan cursor, :match => "key:1??"
  41. all_keys += keys
  42. break if cursor == "0"
  43. }
  44. assert_equal 100, all_keys.uniq.size
  45. end
  46. end
  47. def test_scan_each_enumerator
  48. target_version "2.7.105" do
  49. r.debug :populate, 1000
  50. scan_enumerator = r.scan_each
  51. assert_equal true, scan_enumerator.is_a?(::Enumerator)
  52. keys_from_scan = scan_enumerator.to_a.uniq
  53. all_keys = r.keys "*"
  54. assert all_keys.sort == keys_from_scan.sort
  55. end
  56. end
  57. def test_scan_each_enumerator_match
  58. target_version "2.7.105" do
  59. r.debug :populate, 1000
  60. keys_from_scan = r.scan_each(:match => "key:1??").to_a.uniq
  61. all_keys = r.keys "key:1??"
  62. assert all_keys.sort == keys_from_scan.sort
  63. end
  64. end
  65. def test_scan_each_block
  66. target_version "2.7.105" do
  67. r.debug :populate, 100
  68. keys_from_scan = []
  69. r.scan_each {|key|
  70. keys_from_scan << key
  71. }
  72. all_keys = r.keys "*"
  73. assert all_keys.sort == keys_from_scan.uniq.sort
  74. end
  75. end
  76. def test_scan_each_block_match
  77. target_version "2.7.105" do
  78. r.debug :populate, 100
  79. keys_from_scan = []
  80. r.scan_each(:match => "key:1?") {|key|
  81. keys_from_scan << key
  82. }
  83. all_keys = r.keys "key:1?"
  84. assert all_keys.sort == keys_from_scan.uniq.sort
  85. end
  86. end
  87. def test_sscan_with_encoding
  88. target_version "2.7.105" do
  89. [:intset, :hashtable].each do |enc|
  90. r.del "set"
  91. prefix = ""
  92. prefix = "ele:" if enc == :hashtable
  93. elements = []
  94. 100.times { |j| elements << "#{prefix}#{j}" }
  95. r.sadd "set", elements
  96. assert_equal enc.to_s, r.object("encoding", "set")
  97. cursor = 0
  98. all_keys = []
  99. loop {
  100. cursor, keys = r.sscan "set", cursor
  101. all_keys += keys
  102. break if cursor == "0"
  103. }
  104. assert_equal 100, all_keys.uniq.size
  105. end
  106. end
  107. end
  108. def test_sscan_each_enumerator
  109. target_version "2.7.105" do
  110. elements = []
  111. 100.times { |j| elements << "ele:#{j}" }
  112. r.sadd "set", elements
  113. scan_enumerator = r.sscan_each("set")
  114. assert_equal true, scan_enumerator.is_a?(::Enumerator)
  115. keys_from_scan = scan_enumerator.to_a.uniq
  116. all_keys = r.smembers("set")
  117. assert all_keys.sort == keys_from_scan.sort
  118. end
  119. end
  120. def test_sscan_each_enumerator_match
  121. target_version "2.7.105" do
  122. elements = []
  123. 100.times { |j| elements << "ele:#{j}" }
  124. r.sadd "set", elements
  125. keys_from_scan = r.sscan_each("set", :match => "ele:1?").to_a.uniq
  126. all_keys = r.smembers("set").grep(/^ele:1.$/)
  127. assert all_keys.sort == keys_from_scan.sort
  128. end
  129. end
  130. def test_sscan_each_enumerator_block
  131. target_version "2.7.105" do
  132. elements = []
  133. 100.times { |j| elements << "ele:#{j}" }
  134. r.sadd "set", elements
  135. keys_from_scan = []
  136. r.sscan_each("set") do |key|
  137. keys_from_scan << key
  138. end
  139. all_keys = r.smembers("set")
  140. assert all_keys.sort == keys_from_scan.uniq.sort
  141. end
  142. end
  143. def test_sscan_each_enumerator_block_match
  144. target_version "2.7.105" do
  145. elements = []
  146. 100.times { |j| elements << "ele:#{j}" }
  147. r.sadd "set", elements
  148. keys_from_scan = []
  149. r.sscan_each("set", :match => "ele:1?") do |key|
  150. keys_from_scan << key
  151. end
  152. all_keys = r.smembers("set").grep(/^ele:1.$/)
  153. assert all_keys.sort == keys_from_scan.uniq.sort
  154. end
  155. end
  156. def test_hscan_with_encoding
  157. target_version "2.7.105" do
  158. [:ziplist, :hashtable].each do |enc|
  159. r.del "set"
  160. count = 1000
  161. count = 30 if enc == :ziplist
  162. elements = []
  163. count.times { |j| elements << "key:#{j}" << j.to_s }
  164. r.hmset "hash", *elements
  165. assert_equal enc.to_s, r.object("encoding", "hash")
  166. cursor = 0
  167. all_key_values = []
  168. loop {
  169. cursor, key_values = r.hscan "hash", cursor
  170. all_key_values.concat key_values
  171. break if cursor == "0"
  172. }
  173. keys2 = []
  174. all_key_values.each do |k, v|
  175. assert_equal "key:#{v}", k
  176. keys2 << k
  177. end
  178. assert_equal count, keys2.uniq.size
  179. end
  180. end
  181. end
  182. def test_hscan_each_enumerator
  183. target_version "2.7.105" do
  184. count = 1000
  185. elements = []
  186. count.times { |j| elements << "key:#{j}" << j.to_s }
  187. r.hmset "hash", *elements
  188. scan_enumerator = r.hscan_each("hash")
  189. assert_equal true, scan_enumerator.is_a?(::Enumerator)
  190. keys_from_scan = scan_enumerator.to_a.uniq
  191. all_keys = r.hgetall("hash").to_a
  192. assert all_keys.sort == keys_from_scan.sort
  193. end
  194. end
  195. def test_hscan_each_enumerator_match
  196. target_version "2.7.105" do
  197. count = 100
  198. elements = []
  199. count.times { |j| elements << "key:#{j}" << j.to_s }
  200. r.hmset "hash", *elements
  201. keys_from_scan = r.hscan_each("hash", :match => "key:1?").to_a.uniq
  202. all_keys = r.hgetall("hash").to_a.select{|k,v| k =~ /^key:1.$/}
  203. assert all_keys.sort == keys_from_scan.sort
  204. end
  205. end
  206. def test_hscan_each_block
  207. target_version "2.7.105" do
  208. count = 1000
  209. elements = []
  210. count.times { |j| elements << "key:#{j}" << j.to_s }
  211. r.hmset "hash", *elements
  212. keys_from_scan = []
  213. r.hscan_each("hash") do |field, value|
  214. keys_from_scan << [field, value]
  215. end
  216. all_keys = r.hgetall("hash").to_a
  217. assert all_keys.sort == keys_from_scan.uniq.sort
  218. end
  219. end
  220. def test_hscan_each_block_match
  221. target_version "2.7.105" do
  222. count = 1000
  223. elements = []
  224. count.times { |j| elements << "key:#{j}" << j.to_s }
  225. r.hmset "hash", *elements
  226. keys_from_scan = []
  227. r.hscan_each("hash", :match => "key:1?") do |field, value|
  228. keys_from_scan << [field, value]
  229. end
  230. all_keys = r.hgetall("hash").to_a.select{|k,v| k =~ /^key:1.$/}
  231. assert all_keys.sort == keys_from_scan.uniq.sort
  232. end
  233. end
  234. def test_zscan_with_encoding
  235. target_version "2.7.105" do
  236. [:ziplist, :skiplist].each do |enc|
  237. r.del "zset"
  238. count = 1000
  239. count = 30 if enc == :ziplist
  240. elements = []
  241. count.times { |j| elements << j << "key:#{j}" }
  242. r.zadd "zset", elements
  243. assert_equal enc.to_s, r.object("encoding", "zset")
  244. cursor = 0
  245. all_key_scores = []
  246. loop {
  247. cursor, key_scores = r.zscan "zset", cursor
  248. all_key_scores.concat key_scores
  249. break if cursor == "0"
  250. }
  251. keys2 = []
  252. all_key_scores.each do |k, v|
  253. assert_equal true, v.is_a?(Float)
  254. assert_equal "key:#{Integer(v)}", k
  255. keys2 << k
  256. end
  257. assert_equal count, keys2.uniq.size
  258. end
  259. end
  260. end
  261. def test_zscan_each_enumerator
  262. target_version "2.7.105" do
  263. count = 1000
  264. elements = []
  265. count.times { |j| elements << j << "key:#{j}" }
  266. r.zadd "zset", elements
  267. scan_enumerator = r.zscan_each "zset"
  268. assert_equal true, scan_enumerator.is_a?(::Enumerator)
  269. scores_from_scan = scan_enumerator.to_a.uniq
  270. member_scores = r.zrange("zset", 0, -1, :with_scores => true)
  271. assert member_scores.sort == scores_from_scan.sort
  272. end
  273. end
  274. def test_zscan_each_enumerator_match
  275. target_version "2.7.105" do
  276. count = 1000
  277. elements = []
  278. count.times { |j| elements << j << "key:#{j}" }
  279. r.zadd "zset", elements
  280. scores_from_scan = r.zscan_each("zset", :match => "key:1??").to_a.uniq
  281. member_scores = r.zrange("zset", 0, -1, :with_scores => true)
  282. filtered_members = member_scores.select{|k,s| k =~ /^key:1..$/}
  283. assert filtered_members.sort == scores_from_scan.sort
  284. end
  285. end
  286. def test_zscan_each_block
  287. target_version "2.7.105" do
  288. count = 1000
  289. elements = []
  290. count.times { |j| elements << j << "key:#{j}" }
  291. r.zadd "zset", elements
  292. scores_from_scan = []
  293. r.zscan_each("zset") do |member, score|
  294. scores_from_scan << [member, score]
  295. end
  296. member_scores = r.zrange("zset", 0, -1, :with_scores => true)
  297. assert member_scores.sort == scores_from_scan.sort
  298. end
  299. end
  300. def test_zscan_each_block_match
  301. target_version "2.7.105" do
  302. count = 1000
  303. elements = []
  304. count.times { |j| elements << j << "key:#{j}" }
  305. r.zadd "zset", elements
  306. scores_from_scan = []
  307. r.zscan_each("zset", :match => "key:1??") do |member, score|
  308. scores_from_scan << [member, score]
  309. end
  310. member_scores = r.zrange("zset", 0, -1, :with_scores => true)
  311. filtered_members = member_scores.select{|k,s| k =~ /^key:1..$/}
  312. assert filtered_members.sort == scores_from_scan.sort
  313. end
  314. end
  315. end