redis 4.0.0.rc1 → 4.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +164 -3
  3. data/README.md +127 -18
  4. data/lib/redis/client.rb +164 -93
  5. data/lib/redis/cluster/command.rb +81 -0
  6. data/lib/redis/cluster/command_loader.rb +33 -0
  7. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  8. data/lib/redis/cluster/node.rb +108 -0
  9. data/lib/redis/cluster/node_key.rb +31 -0
  10. data/lib/redis/cluster/node_loader.rb +37 -0
  11. data/lib/redis/cluster/option.rb +93 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +49 -0
  14. data/lib/redis/cluster.rb +291 -0
  15. data/lib/redis/connection/command_helper.rb +5 -2
  16. data/lib/redis/connection/hiredis.rb +4 -3
  17. data/lib/redis/connection/registry.rb +2 -1
  18. data/lib/redis/connection/ruby.rb +125 -106
  19. data/lib/redis/connection/synchrony.rb +18 -5
  20. data/lib/redis/connection.rb +2 -0
  21. data/lib/redis/distributed.rb +995 -0
  22. data/lib/redis/errors.rb +48 -0
  23. data/lib/redis/hash_ring.rb +89 -0
  24. data/lib/redis/pipeline.rb +55 -9
  25. data/lib/redis/subscribe.rb +11 -12
  26. data/lib/redis/version.rb +3 -1
  27. data/lib/redis.rb +1433 -381
  28. metadata +34 -141
  29. data/.gitignore +0 -16
  30. data/.travis/Gemfile +0 -11
  31. data/.travis.yml +0 -71
  32. data/.yardopts +0 -3
  33. data/Gemfile +0 -3
  34. data/benchmarking/logging.rb +0 -71
  35. data/benchmarking/pipeline.rb +0 -51
  36. data/benchmarking/speed.rb +0 -21
  37. data/benchmarking/suite.rb +0 -24
  38. data/benchmarking/worker.rb +0 -71
  39. data/examples/basic.rb +0 -15
  40. data/examples/consistency.rb +0 -114
  41. data/examples/incr-decr.rb +0 -17
  42. data/examples/list.rb +0 -26
  43. data/examples/pubsub.rb +0 -37
  44. data/examples/sentinel/sentinel.conf +0 -9
  45. data/examples/sentinel/start +0 -49
  46. data/examples/sentinel.rb +0 -41
  47. data/examples/sets.rb +0 -36
  48. data/examples/unicorn/config.ru +0 -3
  49. data/examples/unicorn/unicorn.rb +0 -20
  50. data/makefile +0 -42
  51. data/redis.gemspec +0 -40
  52. data/test/bitpos_test.rb +0 -63
  53. data/test/blocking_commands_test.rb +0 -183
  54. data/test/client_test.rb +0 -59
  55. data/test/command_map_test.rb +0 -28
  56. data/test/commands_on_hashes_test.rb +0 -174
  57. data/test/commands_on_hyper_log_log_test.rb +0 -70
  58. data/test/commands_on_lists_test.rb +0 -154
  59. data/test/commands_on_sets_test.rb +0 -208
  60. data/test/commands_on_sorted_sets_test.rb +0 -444
  61. data/test/commands_on_strings_test.rb +0 -338
  62. data/test/commands_on_value_types_test.rb +0 -246
  63. data/test/connection_handling_test.rb +0 -275
  64. data/test/db/.gitkeep +0 -0
  65. data/test/encoding_test.rb +0 -14
  66. data/test/error_replies_test.rb +0 -57
  67. data/test/fork_safety_test.rb +0 -60
  68. data/test/helper.rb +0 -179
  69. data/test/helper_test.rb +0 -22
  70. data/test/internals_test.rb +0 -435
  71. data/test/persistence_control_commands_test.rb +0 -24
  72. data/test/pipelining_commands_test.rb +0 -238
  73. data/test/publish_subscribe_test.rb +0 -280
  74. data/test/remote_server_control_commands_test.rb +0 -175
  75. data/test/scanning_test.rb +0 -407
  76. data/test/scripting_test.rb +0 -76
  77. data/test/sentinel_command_test.rb +0 -78
  78. data/test/sentinel_test.rb +0 -253
  79. data/test/sorting_test.rb +0 -57
  80. data/test/ssl_test.rb +0 -69
  81. data/test/support/connection/hiredis.rb +0 -1
  82. data/test/support/connection/ruby.rb +0 -1
  83. data/test/support/connection/synchrony.rb +0 -17
  84. data/test/support/redis_mock.rb +0 -130
  85. data/test/support/ssl/gen_certs.sh +0 -31
  86. data/test/support/ssl/trusted-ca.crt +0 -25
  87. data/test/support/ssl/trusted-ca.key +0 -27
  88. data/test/support/ssl/trusted-cert.crt +0 -81
  89. data/test/support/ssl/trusted-cert.key +0 -28
  90. data/test/support/ssl/untrusted-ca.crt +0 -26
  91. data/test/support/ssl/untrusted-ca.key +0 -27
  92. data/test/support/ssl/untrusted-cert.crt +0 -82
  93. data/test/support/ssl/untrusted-cert.key +0 -28
  94. data/test/support/wire/synchrony.rb +0 -24
  95. data/test/support/wire/thread.rb +0 -5
  96. data/test/synchrony_driver.rb +0 -85
  97. data/test/test.conf.erb +0 -9
  98. data/test/thread_safety_test.rb +0 -60
  99. data/test/transactions_test.rb +0 -262
  100. data/test/unknown_commands_test.rb +0 -12
  101. data/test/url_param_test.rb +0 -136
@@ -1,435 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestInternals < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- def test_logger
8
- r.ping
9
-
10
- assert log.string["[Redis] command=PING"]
11
- assert log.string =~ /\[Redis\] call_time=\d+\.\d+ ms/
12
- end
13
-
14
- def test_logger_with_pipelining
15
- r.pipelined do
16
- r.set "foo", "bar"
17
- r.get "foo"
18
- end
19
-
20
- assert log.string[" command=SET args=\"foo\" \"bar\""]
21
- assert log.string[" command=GET args=\"foo\""]
22
- end
23
-
24
- def test_recovers_from_failed_commands
25
- # See https://github.com/redis/redis-rb/issues#issue/28
26
-
27
- assert_raise(Redis::CommandError) do
28
- r.command_that_doesnt_exist
29
- end
30
-
31
- assert_nothing_raised do
32
- r.info
33
- end
34
- end
35
-
36
- def test_raises_on_protocol_errors
37
- redis_mock(:ping => lambda { |*_| "foo" }) do |redis|
38
- assert_raise(Redis::ProtocolError) do
39
- redis.ping
40
- end
41
- end
42
- end
43
-
44
- def test_provides_a_meaningful_inspect
45
- assert_equal "#<Redis client v#{Redis::VERSION} for redis://127.0.0.1:#{PORT}/15>", r.inspect
46
- end
47
-
48
- def test_redis_current
49
- assert_equal "127.0.0.1", Redis.current._client.host
50
- assert_equal 6379, Redis.current._client.port
51
- assert_equal 0, Redis.current._client.db
52
-
53
- Redis.current = Redis.new(OPTIONS.merge(:port => 6380, :db => 1))
54
-
55
- t = Thread.new do
56
- assert_equal "127.0.0.1", Redis.current._client.host
57
- assert_equal 6380, Redis.current._client.port
58
- assert_equal 1, Redis.current._client.db
59
- end
60
-
61
- t.join
62
-
63
- assert_equal "127.0.0.1", Redis.current._client.host
64
- assert_equal 6380, Redis.current._client.port
65
- assert_equal 1, Redis.current._client.db
66
- end
67
-
68
- def test_redis_connected?
69
- fresh_client = _new_client
70
- assert !fresh_client.connected?
71
-
72
- fresh_client.ping
73
- assert fresh_client.connected?
74
-
75
- fresh_client.quit
76
- assert !fresh_client.connected?
77
- end
78
-
79
- def test_default_id_with_host_and_port
80
- redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0))
81
- assert_equal "redis://host:1234/0", redis._client.id
82
- end
83
-
84
- def test_default_id_with_host_and_port_and_explicit_scheme
85
- redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0, :scheme => "foo"))
86
- assert_equal "redis://host:1234/0", redis._client.id
87
- end
88
-
89
- def test_default_id_with_path
90
- redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0))
91
- assert_equal "redis:///tmp/redis.sock/0", redis._client.id
92
- end
93
-
94
- def test_default_id_with_path_and_explicit_scheme
95
- redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0, :scheme => "foo"))
96
- assert_equal "redis:///tmp/redis.sock/0", redis._client.id
97
- end
98
-
99
- def test_override_id
100
- redis = Redis.new(OPTIONS.merge(:id => "test"))
101
- assert_equal redis._client.id, "test"
102
- end
103
-
104
- def test_timeout
105
- assert_nothing_raised do
106
- Redis.new(OPTIONS.merge(:timeout => 0))
107
- end
108
- end
109
-
110
- def test_id_inside_multi
111
- redis = Redis.new(OPTIONS)
112
- id = nil
113
-
114
- redis.multi do
115
- id = redis.id
116
- end
117
-
118
- assert_equal id, "redis://127.0.0.1:6381/15"
119
- end
120
-
121
- driver(:ruby) do
122
- def test_tcp_keepalive
123
- keepalive = {:time => 20, :intvl => 10, :probes => 5}
124
-
125
- redis = Redis.new(OPTIONS.merge(:tcp_keepalive => keepalive))
126
- redis.ping
127
-
128
- connection = redis._client.connection
129
- actual_keepalive = connection.get_tcp_keepalive
130
-
131
- [:time, :intvl, :probes].each do |key|
132
- if actual_keepalive.has_key?(key)
133
- assert_equal actual_keepalive[key], keepalive[key]
134
- end
135
- end
136
- end
137
- end
138
-
139
- def test_time
140
- target_version "2.5.4" do
141
- # Test that the difference between the time that Ruby reports and the time
142
- # that Redis reports is minimal (prevents the test from being racy).
143
- rv = r.time
144
-
145
- redis_usec = rv[0] * 1_000_000 + rv[1]
146
- ruby_usec = Integer(Time.now.to_f * 1_000_000)
147
-
148
- assert 500_000 > (ruby_usec - redis_usec).abs
149
- end
150
- end
151
-
152
- def test_connection_timeout
153
- opts = OPTIONS.merge(:host => "10.255.255.254", :connect_timeout => 0.1, :timeout => 5.0)
154
- start_time = Time.now
155
- assert_raise Redis::CannotConnectError do
156
- Redis.new(opts).ping
157
- end
158
- assert (Time.now - start_time) <= opts[:timeout]
159
- end
160
-
161
- def close_on_ping(seq, options = {})
162
- $request = 0
163
-
164
- command = lambda do
165
- idx = $request
166
- $request += 1
167
-
168
- rv = "+%d" % idx
169
- rv = nil if seq.include?(idx)
170
- rv
171
- end
172
-
173
- redis_mock({:ping => command}, {:timeout => 0.1}.merge(options)) do |redis|
174
- yield(redis)
175
- end
176
- end
177
-
178
- def test_retry_by_default
179
- close_on_ping([0]) do |redis|
180
- assert_equal "1", redis.ping
181
- end
182
- end
183
-
184
- def test_retry_when_wrapped_in_with_reconnect_true
185
- close_on_ping([0]) do |redis|
186
- redis.with_reconnect(true) do
187
- assert_equal "1", redis.ping
188
- end
189
- end
190
- end
191
-
192
- def test_dont_retry_when_wrapped_in_with_reconnect_false
193
- close_on_ping([0]) do |redis|
194
- assert_raise Redis::ConnectionError do
195
- redis.with_reconnect(false) do
196
- redis.ping
197
- end
198
- end
199
- end
200
- end
201
-
202
- def test_dont_retry_when_wrapped_in_without_reconnect
203
- close_on_ping([0]) do |redis|
204
- assert_raise Redis::ConnectionError do
205
- redis.without_reconnect do
206
- redis.ping
207
- end
208
- end
209
- end
210
- end
211
-
212
- def test_retry_only_once_when_read_raises_econnreset
213
- close_on_ping([0, 1]) do |redis|
214
- assert_raise Redis::ConnectionError do
215
- redis.ping
216
- end
217
-
218
- assert !redis._client.connected?
219
- end
220
- end
221
-
222
- def test_retry_with_custom_reconnect_attempts
223
- close_on_ping([0, 1], :reconnect_attempts => 2) do |redis|
224
- assert_equal "2", redis.ping
225
- end
226
- end
227
-
228
- def test_retry_with_custom_reconnect_attempts_can_still_fail
229
- close_on_ping([0, 1, 2], :reconnect_attempts => 2) do |redis|
230
- assert_raise Redis::ConnectionError do
231
- redis.ping
232
- end
233
-
234
- assert !redis._client.connected?
235
- end
236
- end
237
-
238
- def test_don_t_retry_when_second_read_in_pipeline_raises_econnreset
239
- close_on_ping([1]) do |redis|
240
- assert_raise Redis::ConnectionError do
241
- redis.pipelined do
242
- redis.ping
243
- redis.ping # Second #read times out
244
- end
245
- end
246
-
247
- assert !redis._client.connected?
248
- end
249
- end
250
-
251
- def close_on_connection(seq)
252
- $n = 0
253
-
254
- read_command = lambda do |session|
255
- Array.new(session.gets[1..-3].to_i) do
256
- bytes = session.gets[1..-3].to_i
257
- arg = session.read(bytes)
258
- session.read(2) # Discard \r\n
259
- arg
260
- end
261
- end
262
-
263
- handler = lambda do |session|
264
- n = $n
265
- $n += 1
266
-
267
- select = read_command.call(session)
268
- if select[0].downcase == "select"
269
- session.write("+OK\r\n")
270
- else
271
- raise "Expected SELECT"
272
- end
273
-
274
- if !seq.include?(n)
275
- while read_command.call(session)
276
- session.write("+#{n}\r\n")
277
- end
278
- end
279
- end
280
-
281
- redis_mock_with_handler(handler) do |redis|
282
- yield(redis)
283
- end
284
- end
285
-
286
- def test_retry_on_write_error_by_default
287
- close_on_connection([0]) do |redis|
288
- assert_equal "1", redis._client.call(["x" * 128 * 1024])
289
- end
290
- end
291
-
292
- def test_retry_on_write_error_when_wrapped_in_with_reconnect_true
293
- close_on_connection([0]) do |redis|
294
- redis.with_reconnect(true) do
295
- assert_equal "1", redis._client.call(["x" * 128 * 1024])
296
- end
297
- end
298
- end
299
-
300
- def test_dont_retry_on_write_error_when_wrapped_in_with_reconnect_false
301
- close_on_connection([0]) do |redis|
302
- assert_raise Redis::ConnectionError do
303
- redis.with_reconnect(false) do
304
- redis._client.call(["x" * 128 * 1024])
305
- end
306
- end
307
- end
308
- end
309
-
310
- def test_dont_retry_on_write_error_when_wrapped_in_without_reconnect
311
- close_on_connection([0]) do |redis|
312
- assert_raise Redis::ConnectionError do
313
- redis.without_reconnect do
314
- redis._client.call(["x" * 128 * 1024])
315
- end
316
- end
317
- end
318
- end
319
-
320
- def test_connecting_to_unix_domain_socket
321
- assert_nothing_raised do
322
- Redis.new(OPTIONS.merge(:path => ENV.fetch("SOCKET_PATH"))).ping
323
- end
324
- end
325
-
326
- driver(:ruby, :hiredis) do
327
- def test_bubble_timeout_without_retrying
328
- serv = TCPServer.new(6380)
329
-
330
- redis = Redis.new(:port => 6380, :timeout => 0.1)
331
-
332
- assert_raise(Redis::TimeoutError) do
333
- redis.ping
334
- end
335
-
336
- ensure
337
- serv.close if serv
338
- end
339
- end
340
-
341
- def test_client_options
342
- redis = Redis.new(OPTIONS.merge(:host => "host", :port => 1234, :db => 1, :scheme => "foo"))
343
-
344
- assert_equal "host", redis._client.options[:host]
345
- assert_equal 1234, redis._client.options[:port]
346
- assert_equal 1, redis._client.options[:db]
347
- assert_equal "foo", redis._client.options[:scheme]
348
- end
349
-
350
- def test_does_not_change_self_client_options
351
- redis = Redis.new(OPTIONS.merge(:host => "host", :port => 1234, :db => 1, :scheme => "foo"))
352
- options = redis._client.options
353
-
354
- options[:host] << "new_host"
355
- options[:scheme] << "bar"
356
- options.merge!(:db => 0)
357
-
358
- assert_equal "host", redis._client.options[:host]
359
- assert_equal 1, redis._client.options[:db]
360
- assert_equal "foo", redis._client.options[:scheme]
361
- end
362
-
363
- def test_resolves_localhost
364
- assert_nothing_raised do
365
- Redis.new(OPTIONS.merge(:host => 'localhost')).ping
366
- end
367
- end
368
-
369
- class << self
370
- def af_family_supported(af)
371
- hosts = {
372
- Socket::AF_INET => "127.0.0.1",
373
- Socket::AF_INET6 => "::1",
374
- }
375
-
376
- begin
377
- s = Socket.new(af, Socket::SOCK_STREAM, 0)
378
- begin
379
- tries = 5
380
- begin
381
- sa = Socket.pack_sockaddr_in(1024 + Random.rand(63076), hosts[af])
382
- s.bind(sa)
383
- rescue Errno::EADDRINUSE
384
- tries -= 1
385
- retry if tries > 0
386
-
387
- raise
388
- end
389
- yield
390
- rescue Errno::EADDRNOTAVAIL
391
- ensure
392
- s.close
393
- end
394
- rescue Errno::ESOCKTNOSUPPORT
395
- end
396
- end
397
- end
398
-
399
- def af_test(host)
400
- commands = {
401
- :ping => lambda { |*_| "+pong" },
402
- }
403
-
404
- redis_mock(commands, :host => host) do |redis|
405
- assert_nothing_raised do
406
- redis.ping
407
- end
408
- end
409
- end
410
-
411
- driver(:ruby) do
412
- af_family_supported(Socket::AF_INET) do
413
- def test_connect_ipv4
414
- af_test("127.0.0.1")
415
- end
416
- end
417
- end
418
-
419
- driver(:ruby) do
420
- af_family_supported(Socket::AF_INET6) do
421
- def test_connect_ipv6
422
- af_test("::1")
423
- end
424
- end
425
- end
426
-
427
- def test_can_be_duped_to_create_a_new_connection
428
- clients = r.info["connected_clients"].to_i
429
-
430
- r2 = r.dup
431
- r2.ping
432
-
433
- assert_equal clients + 1, r.info["connected_clients"].to_i
434
- end
435
- end
@@ -1,24 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestPersistenceControlCommands < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- def test_save
8
- redis_mock(:save => lambda { "+SAVE" }) do |redis|
9
- assert_equal "SAVE", redis.save
10
- end
11
- end
12
-
13
- def test_bgsave
14
- redis_mock(:bgsave => lambda { "+BGSAVE" }) do |redis|
15
- assert_equal "BGSAVE", redis.bgsave
16
- end
17
- end
18
-
19
- def test_lastsave
20
- redis_mock(:lastsave => lambda { "+LASTSAVE" }) do |redis|
21
- assert_equal "LASTSAVE", redis.lastsave
22
- end
23
- end
24
- end
@@ -1,238 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestPipeliningCommands < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- def test_bulk_commands
8
- r.pipelined do
9
- r.lpush "foo", "s1"
10
- r.lpush "foo", "s2"
11
- end
12
-
13
- assert_equal 2, r.llen("foo")
14
- assert_equal "s2", r.lpop("foo")
15
- assert_equal "s1", r.lpop("foo")
16
- end
17
-
18
- def test_multi_bulk_commands
19
- r.pipelined do
20
- r.mset("foo", "s1", "bar", "s2")
21
- r.mset("baz", "s3", "qux", "s4")
22
- end
23
-
24
- assert_equal "s1", r.get("foo")
25
- assert_equal "s2", r.get("bar")
26
- assert_equal "s3", r.get("baz")
27
- assert_equal "s4", r.get("qux")
28
- end
29
-
30
- def test_bulk_and_multi_bulk_commands_mixed
31
- r.pipelined do
32
- r.lpush "foo", "s1"
33
- r.lpush "foo", "s2"
34
- r.mset("baz", "s3", "qux", "s4")
35
- end
36
-
37
- assert_equal 2, r.llen("foo")
38
- assert_equal "s2", r.lpop("foo")
39
- assert_equal "s1", r.lpop("foo")
40
- assert_equal "s3", r.get("baz")
41
- assert_equal "s4", r.get("qux")
42
- end
43
-
44
- def test_multi_bulk_and_bulk_commands_mixed
45
- r.pipelined do
46
- r.mset("baz", "s3", "qux", "s4")
47
- r.lpush "foo", "s1"
48
- r.lpush "foo", "s2"
49
- end
50
-
51
- assert_equal 2, r.llen("foo")
52
- assert_equal "s2", r.lpop("foo")
53
- assert_equal "s1", r.lpop("foo")
54
- assert_equal "s3", r.get("baz")
55
- assert_equal "s4", r.get("qux")
56
- end
57
-
58
- def test_pipelined_with_an_empty_block
59
- assert_nothing_raised do
60
- r.pipelined do
61
- end
62
- end
63
-
64
- assert_equal 0, r.dbsize
65
- end
66
-
67
- def test_returning_the_result_of_a_pipeline
68
- result = r.pipelined do
69
- r.set "foo", "bar"
70
- r.get "foo"
71
- r.get "bar"
72
- end
73
-
74
- assert_equal ["OK", "bar", nil], result
75
- end
76
-
77
- def test_assignment_of_results_inside_the_block
78
- r.pipelined do
79
- @first = r.sadd("foo", 1)
80
- @second = r.sadd("foo", 1)
81
- end
82
-
83
- assert_equal true, @first.value
84
- assert_equal false, @second.value
85
- end
86
-
87
- # Although we could support accessing the values in these futures,
88
- # it doesn't make a lot of sense.
89
- def test_assignment_of_results_inside_the_block_with_errors
90
- assert_raise(Redis::CommandError) do
91
- r.pipelined do
92
- r.doesnt_exist
93
- @first = r.sadd("foo", 1)
94
- @second = r.sadd("foo", 1)
95
- end
96
- end
97
-
98
- assert_raise(Redis::FutureNotReady) { @first.value }
99
- assert_raise(Redis::FutureNotReady) { @second.value }
100
- end
101
-
102
- def test_assignment_of_results_inside_a_nested_block
103
- r.pipelined do
104
- @first = r.sadd("foo", 1)
105
-
106
- r.pipelined do
107
- @second = r.sadd("foo", 1)
108
- end
109
- end
110
-
111
- assert_equal true, @first.value
112
- assert_equal false, @second.value
113
- end
114
-
115
- def test_futures_raise_when_confused_with_something_else
116
- r.pipelined do
117
- @result = r.sadd("foo", 1)
118
- end
119
-
120
- assert_raise(NoMethodError) { @result.to_s }
121
- end
122
-
123
- def test_futures_raise_when_trying_to_access_their_values_too_early
124
- r.pipelined do
125
- assert_raise(Redis::FutureNotReady) do
126
- r.sadd("foo", 1).value
127
- end
128
- end
129
- end
130
-
131
- def test_futures_can_be_identified
132
- r.pipelined do
133
- @result = r.sadd("foo", 1)
134
- end
135
-
136
- assert_equal true, @result.is_a?(Redis::Future)
137
- assert_equal true, @result.is_a?(::BasicObject)
138
- assert_equal Redis::Future, @result.class
139
- end
140
-
141
- def test_returning_the_result_of_an_empty_pipeline
142
- result = r.pipelined do
143
- end
144
-
145
- assert_equal [], result
146
- end
147
-
148
- def test_nesting_pipeline_blocks
149
- r.pipelined do
150
- r.set("foo", "s1")
151
- r.pipelined do
152
- r.set("bar", "s2")
153
- end
154
- end
155
-
156
- assert_equal "s1", r.get("foo")
157
- assert_equal "s2", r.get("bar")
158
- end
159
-
160
- def test_info_in_a_pipeline_returns_hash
161
- result = r.pipelined do
162
- r.info
163
- end
164
-
165
- assert result.first.kind_of?(Hash)
166
- end
167
-
168
- def test_config_get_in_a_pipeline_returns_hash
169
- result = r.pipelined do
170
- r.config(:get, "*")
171
- end
172
-
173
- assert result.first.kind_of?(Hash)
174
- end
175
-
176
- def test_hgetall_in_a_pipeline_returns_hash
177
- r.hmset("hash", "field", "value")
178
- result = r.pipelined do
179
- r.hgetall("hash")
180
- end
181
-
182
- assert_equal result.first, { "field" => "value" }
183
- end
184
-
185
- def test_keys_in_a_pipeline
186
- r.set("key", "value")
187
- result = r.pipelined do
188
- r.keys("*")
189
- end
190
-
191
- assert_equal ["key"], result.first
192
- end
193
-
194
- def test_pipeline_yields_a_connection
195
- r.pipelined do |p|
196
- p.set("foo", "bar")
197
- end
198
-
199
- assert_equal "bar", r.get("foo")
200
- end
201
-
202
- def test_pipeline_select
203
- r.select 1
204
- r.set("db", "1")
205
-
206
- r.pipelined do |p|
207
- p.select 2
208
- p.set("db", "2")
209
- end
210
-
211
- r.select 1
212
- assert_equal "1", r.get("db")
213
-
214
- r.select 2
215
- assert_equal "2", r.get("db")
216
- end
217
-
218
- def test_pipeline_select_client_db
219
- r.select 1
220
- r.pipelined do |p2|
221
- p2.select 2
222
- end
223
-
224
- assert_equal 2, r._client.db
225
- end
226
-
227
- def test_nested_pipeline_select_client_db
228
- r.select 1
229
- r.pipelined do |p2|
230
- p2.select 2
231
- p2.pipelined do |p3|
232
- p3.select 3
233
- end
234
- end
235
-
236
- assert_equal 3, r._client.db
237
- end
238
- end