redis 3.3.5 → 4.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +32 -50
  3. data/CHANGELOG.md +7 -9
  4. data/Gemfile +0 -1
  5. data/README.md +31 -75
  6. data/benchmarking/logging.rb +1 -1
  7. data/lib/redis.rb +31 -35
  8. data/lib/redis/client.rb +13 -8
  9. data/lib/redis/connection.rb +2 -2
  10. data/lib/redis/connection/command_helper.rb +2 -8
  11. data/lib/redis/connection/hiredis.rb +2 -2
  12. data/lib/redis/connection/ruby.rb +7 -27
  13. data/lib/redis/connection/synchrony.rb +3 -3
  14. data/lib/redis/pipeline.rb +0 -6
  15. data/lib/redis/version.rb +1 -1
  16. data/makefile +42 -0
  17. data/redis.gemspec +4 -8
  18. data/test/bitpos_test.rb +13 -19
  19. data/test/blocking_commands_test.rb +147 -6
  20. data/test/client_test.rb +1 -1
  21. data/test/command_map_test.rb +3 -5
  22. data/test/commands_on_hashes_test.rb +158 -5
  23. data/test/commands_on_hyper_log_log_test.rb +55 -6
  24. data/test/commands_on_lists_test.rb +139 -5
  25. data/test/commands_on_sets_test.rb +136 -5
  26. data/test/commands_on_sorted_sets_test.rb +312 -5
  27. data/test/commands_on_strings_test.rb +243 -6
  28. data/test/commands_on_value_types_test.rb +120 -7
  29. data/test/connection_handling_test.rb +5 -7
  30. data/test/encoding_test.rb +4 -8
  31. data/test/error_replies_test.rb +2 -4
  32. data/test/fork_safety_test.rb +1 -6
  33. data/test/helper.rb +9 -62
  34. data/test/helper_test.rb +1 -3
  35. data/test/internals_test.rb +67 -49
  36. data/test/persistence_control_commands_test.rb +1 -3
  37. data/test/pipelining_commands_test.rb +4 -8
  38. data/test/publish_subscribe_test.rb +1 -3
  39. data/test/remote_server_control_commands_test.rb +61 -4
  40. data/test/scanning_test.rb +1 -7
  41. data/test/scripting_test.rb +1 -3
  42. data/test/sentinel_command_test.rb +1 -3
  43. data/test/sentinel_test.rb +1 -3
  44. data/test/sorting_test.rb +1 -3
  45. data/test/ssl_test.rb +45 -49
  46. data/test/support/connection/hiredis.rb +1 -1
  47. data/test/support/connection/ruby.rb +1 -1
  48. data/test/support/connection/synchrony.rb +1 -1
  49. data/test/synchrony_driver.rb +6 -9
  50. data/test/thread_safety_test.rb +1 -3
  51. data/test/transactions_test.rb +1 -3
  52. data/test/unknown_commands_test.rb +1 -3
  53. data/test/url_param_test.rb +44 -46
  54. metadata +31 -77
  55. data/Rakefile +0 -87
  56. data/examples/dist_redis.rb +0 -43
  57. data/lib/redis/distributed.rb +0 -873
  58. data/lib/redis/hash_ring.rb +0 -132
  59. data/test/connection_test.rb +0 -57
  60. data/test/distributed_blocking_commands_test.rb +0 -46
  61. data/test/distributed_commands_on_hashes_test.rb +0 -10
  62. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  63. data/test/distributed_commands_on_lists_test.rb +0 -22
  64. data/test/distributed_commands_on_sets_test.rb +0 -83
  65. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  66. data/test/distributed_commands_on_strings_test.rb +0 -59
  67. data/test/distributed_commands_on_value_types_test.rb +0 -95
  68. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  69. data/test/distributed_connection_handling_test.rb +0 -23
  70. data/test/distributed_internals_test.rb +0 -79
  71. data/test/distributed_key_tags_test.rb +0 -52
  72. data/test/distributed_persistence_control_commands_test.rb +0 -26
  73. data/test/distributed_publish_subscribe_test.rb +0 -92
  74. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  75. data/test/distributed_scripting_test.rb +0 -102
  76. data/test/distributed_sorting_test.rb +0 -20
  77. data/test/distributed_test.rb +0 -58
  78. data/test/distributed_transactions_test.rb +0 -32
  79. data/test/lint/blocking_commands.rb +0 -150
  80. data/test/lint/hashes.rb +0 -162
  81. data/test/lint/hyper_log_log.rb +0 -60
  82. data/test/lint/lists.rb +0 -143
  83. data/test/lint/sets.rb +0 -140
  84. data/test/lint/sorted_sets.rb +0 -316
  85. data/test/lint/strings.rb +0 -260
  86. data/test/lint/value_types.rb +0 -122
data/lib/redis/client.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "redis/errors"
1
+ require_relative "errors"
2
2
  require "socket"
3
3
  require "cgi"
4
4
 
@@ -451,12 +451,12 @@ class Redis
451
451
  case options[:tcp_keepalive]
452
452
  when Hash
453
453
  [:time, :intvl, :probes].each do |key|
454
- unless options[:tcp_keepalive][key].is_a?(Integer)
455
- raise "Expected the #{key.inspect} key in :tcp_keepalive to be an Integer"
454
+ unless options[:tcp_keepalive][key].is_a?(Fixnum)
455
+ raise "Expected the #{key.inspect} key in :tcp_keepalive to be a Fixnum"
456
456
  end
457
457
  end
458
458
 
459
- when Integer
459
+ when Fixnum
460
460
  if options[:tcp_keepalive] >= 60
461
461
  options[:tcp_keepalive] = {:time => options[:tcp_keepalive] - 20, :intvl => 10, :probes => 2}
462
462
 
@@ -478,11 +478,16 @@ class Redis
478
478
 
479
479
  if driver.kind_of?(String)
480
480
  begin
481
- require "redis/connection/#{driver}"
482
- driver = Connection.const_get(driver.capitalize)
483
- rescue LoadError, NameError
484
- raise RuntimeError, "Cannot load driver #{driver.inspect}"
481
+ require_relative "connection/#{driver}"
482
+ rescue LoadError, NameError => e
483
+ begin
484
+ require "connection/#{driver}"
485
+ rescue LoadError, NameError => e
486
+ raise RuntimeError, "Cannot load driver #{driver.inspect}: #{e.message}"
487
+ end
485
488
  end
489
+
490
+ driver = Connection.const_get(driver.capitalize)
486
491
  end
487
492
 
488
493
  driver
@@ -1,4 +1,4 @@
1
- require "redis/connection/registry"
1
+ require_relative "connection/registry"
2
2
 
3
3
  # If a connection driver was required before this file, the array
4
4
  # Redis::Connection.drivers will contain one or more classes. The last driver
@@ -6,4 +6,4 @@ require "redis/connection/registry"
6
6
  # the plain Ruby driver as our default. Another driver can be required at a
7
7
  # later point in time, causing it to be the last element of the #drivers array
8
8
  # and therefore be chosen by default.
9
- require "redis/connection/ruby" if Redis::Connection.drivers.empty?
9
+ require_relative "connection/ruby" if Redis::Connection.drivers.empty?
@@ -30,14 +30,8 @@ class Redis
30
30
 
31
31
  protected
32
32
 
33
- if defined?(Encoding::default_external)
34
- def encode(string)
35
- string.force_encoding(Encoding::default_external)
36
- end
37
- else
38
- def encode(string)
39
- string
40
- end
33
+ def encode(string)
34
+ string.force_encoding(Encoding.default_external)
41
35
  end
42
36
  end
43
37
  end
@@ -1,5 +1,5 @@
1
- require "redis/connection/registry"
2
- require "redis/errors"
1
+ require_relative "registry"
2
+ require_relative "../errors"
3
3
  require "hiredis/connection"
4
4
  require "timeout"
5
5
 
@@ -1,6 +1,6 @@
1
- require "redis/connection/registry"
2
- require "redis/connection/command_helper"
3
- require "redis/errors"
1
+ require_relative "registry"
2
+ require_relative "command_helper"
3
+ require_relative "../errors"
4
4
  require "socket"
5
5
  require "timeout"
6
6
 
@@ -10,31 +10,12 @@ rescue LoadError
10
10
  # Not all systems have OpenSSL support
11
11
  end
12
12
 
13
- if RUBY_VERSION < "1.9.3"
14
- class String
15
- # Ruby 1.8.7 does not have byteslice, but it handles encodings differently anyway.
16
- # We can simply slice the string, which is a byte array there.
17
- def byteslice(*args)
18
- slice(*args)
19
- end
20
- end
21
- end
22
-
23
13
  class Redis
24
14
  module Connection
25
15
  module SocketMixin
26
16
 
27
17
  CRLF = "\r\n".freeze
28
18
 
29
- # Exceptions raised during non-blocking I/O ops that require retrying the op
30
- if RUBY_VERSION >= "1.9.3"
31
- NBIO_READ_EXCEPTIONS = [IO::WaitReadable]
32
- NBIO_WRITE_EXCEPTIONS = [IO::WaitWritable]
33
- else
34
- NBIO_READ_EXCEPTIONS = [Errno::EWOULDBLOCK, Errno::EAGAIN]
35
- NBIO_WRITE_EXCEPTIONS = [Errno::EWOULDBLOCK, Errno::EAGAIN]
36
- end
37
-
38
19
  def initialize(*args)
39
20
  super(*args)
40
21
 
@@ -83,13 +64,13 @@ class Redis
83
64
  begin
84
65
  read_nonblock(nbytes)
85
66
 
86
- rescue *NBIO_READ_EXCEPTIONS
67
+ rescue IO::WaitReadable
87
68
  if IO.select([self], nil, nil, @timeout)
88
69
  retry
89
70
  else
90
71
  raise Redis::TimeoutError
91
72
  end
92
- rescue *NBIO_WRITE_EXCEPTIONS
73
+ rescue IO::WaitWritable
93
74
  if IO.select(nil, [self], nil, @timeout)
94
75
  retry
95
76
  else
@@ -105,13 +86,13 @@ class Redis
105
86
  begin
106
87
  write_nonblock(data)
107
88
 
108
- rescue *NBIO_WRITE_EXCEPTIONS
89
+ rescue IO::WaitWritable
109
90
  if IO.select(nil, [self], nil, @write_timeout)
110
91
  retry
111
92
  else
112
93
  raise Redis::TimeoutError
113
94
  end
114
- rescue *NBIO_READ_EXCEPTIONS
95
+ rescue IO::WaitReadable
115
96
  if IO.select([self], nil, nil, @write_timeout)
116
97
  retry
117
98
  else
@@ -307,7 +288,6 @@ class Redis
307
288
  raise ArgumentError, "SSL incompatible with unix sockets" if config[:ssl]
308
289
  sock = UNIXSocket.connect(config[:path], config[:connect_timeout])
309
290
  elsif config[:scheme] == "rediss" || config[:ssl]
310
- raise ArgumentError, "This library does not support SSL on Ruby < 1.9" if RUBY_VERSION < "1.9.3"
311
291
  sock = SSLSocket.connect(config[:host], config[:port], config[:connect_timeout], config[:ssl_params])
312
292
  else
313
293
  sock = TCPSocket.connect(config[:host], config[:port], config[:connect_timeout])
@@ -1,6 +1,6 @@
1
- require "redis/connection/command_helper"
2
- require "redis/connection/registry"
3
- require "redis/errors"
1
+ require_relative "command_helper"
2
+ require_relative "registry"
3
+ require_relative "../errors"
4
4
  require "em-synchrony"
5
5
  require "hiredis/reader"
6
6
 
@@ -1,10 +1,4 @@
1
1
  class Redis
2
- unless defined?(::BasicObject)
3
- class BasicObject
4
- instance_methods.each { |meth| undef_method(meth) unless meth =~ /\A(__|instance_eval)/ }
5
- end
6
- end
7
-
8
2
  class Pipeline
9
3
  attr_accessor :db
10
4
 
data/lib/redis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Redis
2
- VERSION = "3.3.5"
2
+ VERSION = "4.0.0.rc1"
3
3
  end
data/makefile ADDED
@@ -0,0 +1,42 @@
1
+ TEST_FILES := $(shell find test -name *_test.rb -type f)
2
+ REDIS_BRANCH := unstable
3
+ TMP := tmp
4
+ BUILD_DIR := ${TMP}/redis-${REDIS_BRANCH}
5
+ TARBALL := ${TMP}/redis-${REDIS_BRANCH}.tar.gz
6
+ BINARY := ${BUILD_DIR}/src/redis-server
7
+ PID_PATH := ${BUILD_DIR}/redis.pid
8
+ SOCKET_PATH := ${BUILD_DIR}/redis.sock
9
+ PORT := 6381
10
+
11
+ test: ${TEST_FILES}
12
+ make start
13
+ env SOCKET_PATH=${SOCKET_PATH} \
14
+ ruby -v $$(echo $? | tr ' ' '\n' | awk '{ print "-r./" $$0 }') -e ''
15
+ make stop
16
+
17
+ ${TMP}:
18
+ mkdir $@
19
+
20
+ ${TARBALL}: ${TMP}
21
+ wget https://github.com/antirez/redis/archive/${REDIS_BRANCH}.tar.gz -O $@
22
+
23
+ ${BINARY}: ${TARBALL} ${TMP}
24
+ rm -rf ${BUILD_DIR}
25
+ mkdir -p ${BUILD_DIR}
26
+ tar xf ${TARBALL} -C ${TMP}
27
+ cd ${BUILD_DIR} && make
28
+
29
+ stop:
30
+ (test -f ${PID_PATH} && (kill $$(cat ${PID_PATH}) || true) && rm -f ${PID_PATH}) || true
31
+
32
+ start: ${BINARY}
33
+ ${BINARY} \
34
+ --daemonize yes \
35
+ --pidfile ${PID_PATH} \
36
+ --port ${PORT} \
37
+ --unixsocket ${SOCKET_PATH}
38
+
39
+ clean:
40
+ (test -d ${BUILD_DIR} && cd ${BUILD_DIR}/src && make clean distclean) || true
41
+
42
+ .PHONY: test start stop
data/redis.gemspec CHANGED
@@ -1,8 +1,4 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- $:.unshift File.expand_path("../lib", __FILE__)
4
-
5
- require "redis/version"
1
+ require "./lib/redis/version"
6
2
 
7
3
  Gem::Specification.new do |s|
8
4
  s.name = "redis"
@@ -15,8 +11,7 @@ Gem::Specification.new do |s|
15
11
 
16
12
  s.description = <<-EOS
17
13
  A Ruby client that tries to match Redis' API one-to-one, while still
18
- providing an idiomatic interface. It features thread-safety,
19
- client-side sharding, pipelining, and an obsession for performance.
14
+ providing an idiomatic interface.
20
15
  EOS
21
16
 
22
17
  s.license = "MIT"
@@ -39,6 +34,7 @@ Gem::Specification.new do |s|
39
34
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
40
35
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
41
36
 
42
- s.add_development_dependency("rake", "<11.0.0")
43
37
  s.add_development_dependency("test-unit", "3.1.5")
38
+ s.add_development_dependency("hiredis")
39
+ s.add_development_dependency("em-synchrony")
44
40
  end
data/test/bitpos_test.rb CHANGED
@@ -1,10 +1,4 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- unless defined?(Enumerator)
6
- Enumerator = Enumerable::Enumerator
7
- end
1
+ require_relative "helper"
8
2
 
9
3
  class TestBitpos < Test::Unit::TestCase
10
4
 
@@ -13,48 +7,48 @@ class TestBitpos < Test::Unit::TestCase
13
7
  def test_bitpos_empty_zero
14
8
  target_version "2.9.11" do
15
9
  r.del "foo"
16
- assert_equal 0, r.bitpos("foo", 0)
10
+ assert_equal(0, r.bitpos("foo", 0))
17
11
  end
18
12
  end
19
13
 
20
14
  def test_bitpos_empty_one
21
15
  target_version "2.9.11" do
22
16
  r.del "foo"
23
- assert_equal -1, r.bitpos("foo", 1)
17
+ assert_equal(-1, r.bitpos("foo", 1))
24
18
  end
25
19
  end
26
20
 
27
21
  def test_bitpos_zero
28
22
  target_version "2.9.11" do
29
23
  r.set "foo", "\xff\xf0\x00"
30
- assert_equal 12, r.bitpos("foo", 0)
24
+ assert_equal(12, r.bitpos("foo", 0))
31
25
  end
32
26
  end
33
27
 
34
28
  def test_bitpos_one
35
29
  target_version "2.9.11" do
36
30
  r.set "foo", "\x00\x0f\x00"
37
- assert_equal 12, r.bitpos("foo", 1)
31
+ assert_equal(12, r.bitpos("foo", 1))
38
32
  end
39
33
  end
40
34
 
41
35
  def test_bitpos_zero_end_is_given
42
36
  target_version "2.9.11" do
43
37
  r.set "foo", "\xff\xff\xff"
44
- assert_equal 24, r.bitpos("foo", 0)
45
- assert_equal 24, r.bitpos("foo", 0, 0)
46
- assert_equal -1, r.bitpos("foo", 0, 0, -1)
38
+ assert_equal(24, r.bitpos("foo", 0))
39
+ assert_equal(24, r.bitpos("foo", 0, 0))
40
+ assert_equal(-1, r.bitpos("foo", 0, 0, -1))
47
41
  end
48
42
  end
49
43
 
50
44
  def test_bitpos_one_intervals
51
45
  target_version "2.9.11" do
52
46
  r.set "foo", "\x00\xff\x00"
53
- assert_equal 8, r.bitpos("foo", 1, 0, -1)
54
- assert_equal 8, r.bitpos("foo", 1, 1, -1)
55
- assert_equal -1, r.bitpos("foo", 1, 2, -1)
56
- assert_equal -1, r.bitpos("foo", 1, 2, 200)
57
- assert_equal 8, r.bitpos("foo", 1, 1, 1)
47
+ assert_equal(8, r.bitpos("foo", 1, 0, -1))
48
+ assert_equal(8, r.bitpos("foo", 1, 1, -1))
49
+ assert_equal(-1, r.bitpos("foo", 1, 2, -1))
50
+ assert_equal(-1, r.bitpos("foo", 1, 2, 200))
51
+ assert_equal(8, r.bitpos("foo", 1, 1, 1))
58
52
  end
59
53
  end
60
54
 
@@ -1,12 +1,153 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
- require "lint/blocking_commands"
1
+ require_relative "helper"
5
2
 
6
3
  class TestBlockingCommands < Test::Unit::TestCase
7
4
 
8
5
  include Helper::Client
9
- include Lint::BlockingCommands
6
+
7
+ def setup
8
+ super
9
+
10
+ r.rpush("{zap}foo", "s1")
11
+ r.rpush("{zap}foo", "s2")
12
+ r.rpush("{zap}bar", "s1")
13
+ r.rpush("{zap}bar", "s2")
14
+ end
15
+
16
+ def to_protocol(obj)
17
+ case obj
18
+ when String
19
+ "$#{obj.length}\r\n#{obj}\r\n"
20
+ when Array
21
+ "*#{obj.length}\r\n" + obj.map { |e| to_protocol(e) }.join
22
+ else
23
+ fail
24
+ end
25
+ end
26
+
27
+ def mock(options = {}, &blk)
28
+ commands = {
29
+ :blpop => lambda do |*args|
30
+ sleep options[:delay] if options.has_key?(:delay)
31
+ to_protocol([args.first, args.last])
32
+ end,
33
+ :brpop => lambda do |*args|
34
+ sleep options[:delay] if options.has_key?(:delay)
35
+ to_protocol([args.first, args.last])
36
+ end,
37
+ :brpoplpush => lambda do |*args|
38
+ sleep options[:delay] if options.has_key?(:delay)
39
+ to_protocol(args.last)
40
+ end
41
+ }
42
+
43
+ redis_mock(commands, &blk)
44
+ end
45
+
46
+ def test_blpop
47
+ assert_equal ["{zap}foo", "s1"], r.blpop("{zap}foo")
48
+ assert_equal ["{zap}foo", "s2"], r.blpop(["{zap}foo"])
49
+ assert_equal ["{zap}bar", "s1"], r.blpop(["{zap}bar", "{zap}foo"])
50
+ assert_equal ["{zap}bar", "s2"], r.blpop(["{zap}foo", "{zap}bar"])
51
+ end
52
+
53
+ def test_blpop_timeout
54
+ mock do |r|
55
+ assert_equal ["{zap}foo", "0"], r.blpop("{zap}foo")
56
+ assert_equal ["{zap}foo", "1"], r.blpop("{zap}foo", :timeout => 1)
57
+ end
58
+ end
59
+
60
+ def test_blpop_with_old_prototype
61
+ assert_equal ["{zap}foo", "s1"], r.blpop("{zap}foo", 0)
62
+ assert_equal ["{zap}foo", "s2"], r.blpop("{zap}foo", 0)
63
+ assert_equal ["{zap}bar", "s1"], r.blpop("{zap}bar", "{zap}foo", 0)
64
+ assert_equal ["{zap}bar", "s2"], r.blpop("{zap}foo", "{zap}bar", 0)
65
+ end
66
+
67
+ def test_blpop_timeout_with_old_prototype
68
+ mock do |r|
69
+ assert_equal ["{zap}foo", "0"], r.blpop("{zap}foo", 0)
70
+ assert_equal ["{zap}foo", "1"], r.blpop("{zap}foo", 1)
71
+ end
72
+ end
73
+
74
+ def test_brpop
75
+ assert_equal ["{zap}foo", "s2"], r.brpop("{zap}foo")
76
+ assert_equal ["{zap}foo", "s1"], r.brpop(["{zap}foo"])
77
+ assert_equal ["{zap}bar", "s2"], r.brpop(["{zap}bar", "{zap}foo"])
78
+ assert_equal ["{zap}bar", "s1"], r.brpop(["{zap}foo", "{zap}bar"])
79
+ end
80
+
81
+ def test_brpop_timeout
82
+ mock do |r|
83
+ assert_equal ["{zap}foo", "0"], r.brpop("{zap}foo")
84
+ assert_equal ["{zap}foo", "1"], r.brpop("{zap}foo", :timeout => 1)
85
+ end
86
+ end
87
+
88
+ def test_brpop_with_old_prototype
89
+ assert_equal ["{zap}foo", "s2"], r.brpop("{zap}foo", 0)
90
+ assert_equal ["{zap}foo", "s1"], r.brpop("{zap}foo", 0)
91
+ assert_equal ["{zap}bar", "s2"], r.brpop("{zap}bar", "{zap}foo", 0)
92
+ assert_equal ["{zap}bar", "s1"], r.brpop("{zap}foo", "{zap}bar", 0)
93
+ end
94
+
95
+ def test_brpop_timeout_with_old_prototype
96
+ mock do |r|
97
+ assert_equal ["{zap}foo", "0"], r.brpop("{zap}foo", 0)
98
+ assert_equal ["{zap}foo", "1"], r.brpop("{zap}foo", 1)
99
+ end
100
+ end
101
+
102
+ def test_brpoplpush
103
+ assert_equal "s2", r.brpoplpush("{zap}foo", "{zap}qux")
104
+ assert_equal ["s2"], r.lrange("{zap}qux", 0, -1)
105
+ end
106
+
107
+ def test_brpoplpush_timeout
108
+ mock do |r|
109
+ assert_equal "0", r.brpoplpush("{zap}foo", "{zap}bar")
110
+ assert_equal "1", r.brpoplpush("{zap}foo", "{zap}bar", :timeout => 1)
111
+ end
112
+ end
113
+
114
+ def test_brpoplpush_with_old_prototype
115
+ assert_equal "s2", r.brpoplpush("{zap}foo", "{zap}qux", 0)
116
+ assert_equal ["s2"], r.lrange("{zap}qux", 0, -1)
117
+ end
118
+
119
+ def test_brpoplpush_timeout_with_old_prototype
120
+ mock do |r|
121
+ assert_equal "0", r.brpoplpush("{zap}foo", "{zap}bar", 0)
122
+ assert_equal "1", r.brpoplpush("{zap}foo", "{zap}bar", 1)
123
+ end
124
+ end
125
+
126
+ driver(:ruby, :hiredis) do
127
+ def test_blpop_socket_timeout
128
+ mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
129
+ assert_raises(Redis::TimeoutError) do
130
+ r.blpop("{zap}foo", :timeout => 1)
131
+ end
132
+ end
133
+ end
134
+
135
+ def test_brpop_socket_timeout
136
+ mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
137
+ assert_raises(Redis::TimeoutError) do
138
+ r.brpop("{zap}foo", :timeout => 1)
139
+ end
140
+ end
141
+ end
142
+
143
+ def test_brpoplpush_socket_timeout
144
+ mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
145
+ assert_raises(Redis::TimeoutError) do
146
+ r.brpoplpush("{zap}foo", "{zap}bar", :timeout => 1)
147
+ end
148
+ end
149
+ end
150
+ end
10
151
 
11
152
  def assert_takes_longer_than_client_timeout
12
153
  timeout = OPTIONS[:timeout]
@@ -17,7 +158,7 @@ class TestBlockingCommands < Test::Unit::TestCase
17
158
  yield(r)
18
159
  t2 = Time.now
19
160
 
20
- assert timeout == r.client.timeout
161
+ assert timeout == r._client.timeout
21
162
  assert delay <= (t2 - t1)
22
163
  end
23
164
  end