redis 2.0.0 → 2.2.1

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 (81) hide show
  1. data/.gitignore +8 -0
  2. data/CHANGELOG.md +49 -0
  3. data/README.md +208 -0
  4. data/Rakefile +183 -73
  5. data/TODO.md +4 -0
  6. data/benchmarking/logging.rb +62 -0
  7. data/benchmarking/pipeline.rb +51 -0
  8. data/benchmarking/speed.rb +21 -0
  9. data/benchmarking/suite.rb +24 -0
  10. data/benchmarking/thread_safety.rb +38 -0
  11. data/benchmarking/worker.rb +71 -0
  12. data/examples/basic.rb +15 -0
  13. data/examples/dist_redis.rb +43 -0
  14. data/examples/incr-decr.rb +17 -0
  15. data/examples/list.rb +26 -0
  16. data/examples/pubsub.rb +31 -0
  17. data/examples/sets.rb +36 -0
  18. data/examples/unicorn/config.ru +3 -0
  19. data/examples/unicorn/unicorn.rb +20 -0
  20. data/lib/redis/client.rb +149 -165
  21. data/lib/redis/connection/command_helper.rb +45 -0
  22. data/lib/redis/connection/hiredis.rb +49 -0
  23. data/lib/redis/connection/registry.rb +12 -0
  24. data/lib/redis/connection/ruby.rb +135 -0
  25. data/lib/redis/connection/synchrony.rb +129 -0
  26. data/lib/redis/connection.rb +9 -0
  27. data/lib/redis/distributed.rb +182 -7
  28. data/lib/redis/pipeline.rb +22 -1
  29. data/lib/redis/subscribe.rb +19 -4
  30. data/lib/redis/version.rb +3 -0
  31. data/lib/redis.rb +715 -155
  32. data/redis.gemspec +24 -0
  33. data/test/commands_on_hashes_test.rb +32 -0
  34. data/test/commands_on_lists_test.rb +60 -0
  35. data/test/commands_on_sets_test.rb +78 -0
  36. data/test/commands_on_sorted_sets_test.rb +109 -0
  37. data/test/commands_on_strings_test.rb +80 -0
  38. data/test/commands_on_value_types_test.rb +88 -0
  39. data/test/connection_handling_test.rb +88 -0
  40. data/test/db/.gitignore +1 -0
  41. data/test/distributed_blocking_commands_test.rb +53 -0
  42. data/test/distributed_commands_on_hashes_test.rb +12 -0
  43. data/test/distributed_commands_on_lists_test.rb +24 -0
  44. data/test/distributed_commands_on_sets_test.rb +85 -0
  45. data/test/distributed_commands_on_strings_test.rb +50 -0
  46. data/test/distributed_commands_on_value_types_test.rb +73 -0
  47. data/test/distributed_commands_requiring_clustering_test.rb +148 -0
  48. data/test/distributed_connection_handling_test.rb +25 -0
  49. data/test/distributed_internals_test.rb +27 -0
  50. data/test/distributed_key_tags_test.rb +53 -0
  51. data/test/distributed_persistence_control_commands_test.rb +24 -0
  52. data/test/distributed_publish_subscribe_test.rb +101 -0
  53. data/test/distributed_remote_server_control_commands_test.rb +43 -0
  54. data/test/distributed_sorting_test.rb +21 -0
  55. data/test/distributed_test.rb +59 -0
  56. data/test/distributed_transactions_test.rb +34 -0
  57. data/test/encoding_test.rb +16 -0
  58. data/test/error_replies_test.rb +53 -0
  59. data/test/helper.rb +145 -0
  60. data/test/internals_test.rb +160 -0
  61. data/test/lint/hashes.rb +114 -0
  62. data/test/lint/internals.rb +37 -0
  63. data/test/lint/lists.rb +93 -0
  64. data/test/lint/sets.rb +66 -0
  65. data/test/lint/sorted_sets.rb +167 -0
  66. data/test/lint/strings.rb +137 -0
  67. data/test/lint/value_types.rb +84 -0
  68. data/test/persistence_control_commands_test.rb +22 -0
  69. data/test/pipelining_commands_test.rb +123 -0
  70. data/test/publish_subscribe_test.rb +158 -0
  71. data/test/redis_mock.rb +80 -0
  72. data/test/remote_server_control_commands_test.rb +82 -0
  73. data/test/sorting_test.rb +44 -0
  74. data/test/synchrony_driver.rb +57 -0
  75. data/test/test.conf +8 -0
  76. data/test/thread_safety_test.rb +30 -0
  77. data/test/transactions_test.rb +100 -0
  78. data/test/unknown_commands_test.rb +14 -0
  79. data/test/url_param_test.rb +60 -0
  80. metadata +130 -22
  81. data/README.markdown +0 -120
data/redis.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $:.unshift File.expand_path("../lib", __FILE__)
4
+ require "redis/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{redis}
8
+ s.version = Redis::VERSION
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ezra Zygmuntowicz", "Taylor Weibley", "Matthew Clark", "Brian McKinney", "Salvatore Sanfilippo", "Luca Guidi", "Michel Martens", "Damian Janowski", "Pieter Noordhuis"]
12
+ s.autorequire = %q{redis}
13
+ s.description = %q{Ruby client library for Redis, the key value storage server}
14
+ s.summary = %q{Ruby client library for Redis, the key value storage server}
15
+ s.email = %q{ez@engineyard.com}
16
+ s.homepage = %q{http://github.com/ezmobius/redis-rb}
17
+ s.rubyforge_project = "redis-rb"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ s.rubygems_version = %q{1.5.0}
24
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+
5
+ setup do
6
+ init Redis.new(OPTIONS)
7
+ end
8
+
9
+ load './test/lint/hashes.rb'
10
+
11
+ test "HSETNX" do |r|
12
+ r.hset("foo", "f1", "s1")
13
+ r.hsetnx("foo", "f1", "s2")
14
+
15
+ assert "s1" == r.hget("foo", "f1")
16
+
17
+ r.del("foo")
18
+ r.hsetnx("foo", "f1", "s2")
19
+
20
+ assert "s2" == r.hget("foo", "f1")
21
+ end
22
+
23
+ test "Mapped HMGET in a pipeline returns plain array" do |r|
24
+ r.hset("foo", "f1", "s1")
25
+ r.hset("foo", "f2", "s2")
26
+
27
+ result = r.pipelined do
28
+ assert nil == r.mapped_hmget("foo", "f1", "f2")
29
+ end
30
+
31
+ assert result[0] == ["s1", "s2"]
32
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+
5
+ setup do
6
+ init Redis.new(OPTIONS)
7
+ end
8
+
9
+ load './test/lint/lists.rb'
10
+
11
+ test "RPUSHX" do |r|
12
+ r.rpushx "foo", "s1"
13
+ r.rpush "foo", "s2"
14
+ r.rpushx "foo", "s3"
15
+
16
+ assert 2 == r.llen("foo")
17
+ assert ["s2", "s3"] == r.lrange("foo", 0, -1)
18
+ end
19
+
20
+ test "LPUSHX" do |r|
21
+ r.lpushx "foo", "s1"
22
+ r.lpush "foo", "s2"
23
+ r.lpushx "foo", "s3"
24
+
25
+ assert 2 == r.llen("foo")
26
+ assert ["s3", "s2"] == r.lrange("foo", 0, -1)
27
+ end
28
+
29
+ test "LINSERT" do |r|
30
+ r.rpush "foo", "s1"
31
+ r.rpush "foo", "s3"
32
+ r.linsert "foo", :before, "s3", "s2"
33
+
34
+ assert ["s1", "s2", "s3"] == r.lrange("foo", 0, -1)
35
+
36
+ assert_raise(RuntimeError) do
37
+ r.linsert "foo", :anywhere, "s3", "s2"
38
+ end
39
+ end
40
+
41
+ test "RPOPLPUSH" do |r|
42
+ r.rpush "foo", "s1"
43
+ r.rpush "foo", "s2"
44
+
45
+ assert "s2" == r.rpoplpush("foo", "bar")
46
+ assert ["s2"] == r.lrange("bar", 0, -1)
47
+ assert "s1" == r.rpoplpush("foo", "bar")
48
+ assert ["s1", "s2"] == r.lrange("bar", 0, -1)
49
+ end
50
+
51
+ test "BRPOPLPUSH" do |r|
52
+ r.rpush "foo", "s1"
53
+ r.rpush "foo", "s2"
54
+
55
+ assert_equal "s2", r.brpoplpush("foo", "bar", 1)
56
+
57
+ assert_equal nil, r.brpoplpush("baz", "qux", 1)
58
+
59
+ assert_equal ["s2"], r.lrange("bar", 0, -1)
60
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+
5
+ setup do
6
+ init Redis.new(OPTIONS)
7
+ end
8
+
9
+ load './test/lint/sets.rb'
10
+
11
+ test "SMOVE" do |r|
12
+ r.sadd "foo", "s1"
13
+ r.sadd "bar", "s2"
14
+
15
+ assert r.smove("foo", "bar", "s1")
16
+ assert r.sismember("bar", "s1")
17
+ end
18
+
19
+ test "SINTER" do |r|
20
+ r.sadd "foo", "s1"
21
+ r.sadd "foo", "s2"
22
+ r.sadd "bar", "s2"
23
+
24
+ assert ["s2"] == r.sinter("foo", "bar")
25
+ end
26
+
27
+ test "SINTERSTORE" do |r|
28
+ r.sadd "foo", "s1"
29
+ r.sadd "foo", "s2"
30
+ r.sadd "bar", "s2"
31
+
32
+ r.sinterstore("baz", "foo", "bar")
33
+
34
+ assert ["s2"] == r.smembers("baz")
35
+ end
36
+
37
+ test "SUNION" do |r|
38
+ r.sadd "foo", "s1"
39
+ r.sadd "foo", "s2"
40
+ r.sadd "bar", "s2"
41
+ r.sadd "bar", "s3"
42
+
43
+ assert ["s1", "s2", "s3"] == r.sunion("foo", "bar").sort
44
+ end
45
+
46
+ test "SUNIONSTORE" do |r|
47
+ r.sadd "foo", "s1"
48
+ r.sadd "foo", "s2"
49
+ r.sadd "bar", "s2"
50
+ r.sadd "bar", "s3"
51
+
52
+ r.sunionstore("baz", "foo", "bar")
53
+
54
+ assert ["s1", "s2", "s3"] == r.smembers("baz").sort
55
+ end
56
+
57
+ test "SDIFF" do |r|
58
+ r.sadd "foo", "s1"
59
+ r.sadd "foo", "s2"
60
+ r.sadd "bar", "s2"
61
+ r.sadd "bar", "s3"
62
+
63
+ assert ["s1"] == r.sdiff("foo", "bar")
64
+ assert ["s3"] == r.sdiff("bar", "foo")
65
+ end
66
+
67
+ test "SDIFFSTORE" do |r|
68
+ r.sadd "foo", "s1"
69
+ r.sadd "foo", "s2"
70
+ r.sadd "bar", "s2"
71
+ r.sadd "bar", "s3"
72
+
73
+ r.sdiffstore("baz", "foo", "bar")
74
+
75
+ assert ["s1"] == r.smembers("baz")
76
+ end
77
+
78
+
@@ -0,0 +1,109 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+
5
+ setup do
6
+ init Redis.new(OPTIONS)
7
+ end
8
+
9
+ load './test/lint/sorted_sets.rb'
10
+
11
+ test "ZCOUNT" do |r|
12
+ r.zadd "foo", 1, "s1"
13
+ r.zadd "foo", 2, "s2"
14
+ r.zadd "foo", 3, "s3"
15
+
16
+ assert 2 == r.zcount("foo", 2, 3)
17
+ end
18
+
19
+ test "ZUNIONSTORE" do |r|
20
+ r.zadd "foo", 1, "s1"
21
+ r.zadd "bar", 2, "s2"
22
+ r.zadd "foo", 3, "s3"
23
+ r.zadd "bar", 4, "s4"
24
+
25
+ assert 4 == r.zunionstore("foobar", ["foo", "bar"])
26
+ assert ["s1", "s2", "s3", "s4"] == r.zrange("foobar", 0, -1)
27
+ end
28
+
29
+ test "ZUNIONSTORE with WEIGHTS" do |r|
30
+ r.zadd "foo", 1, "s1"
31
+ r.zadd "foo", 3, "s3"
32
+ r.zadd "bar", 20, "s2"
33
+ r.zadd "bar", 40, "s4"
34
+
35
+ assert 4 == r.zunionstore("foobar", ["foo", "bar"])
36
+ assert ["s1", "s3", "s2", "s4"] == r.zrange("foobar", 0, -1)
37
+
38
+ assert 4 == r.zunionstore("foobar", ["foo", "bar"], :weights => [10, 1])
39
+ assert ["s1", "s2", "s3", "s4"] == r.zrange("foobar", 0, -1)
40
+ end
41
+
42
+ test "ZUNIONSTORE with AGGREGATE" do |r|
43
+ r.zadd "foo", 1, "s1"
44
+ r.zadd "foo", 2, "s2"
45
+ r.zadd "bar", 4, "s2"
46
+ r.zadd "bar", 3, "s3"
47
+
48
+ assert 3 == r.zunionstore("foobar", ["foo", "bar"])
49
+ assert ["s1", "s3", "s2"] == r.zrange("foobar", 0, -1)
50
+
51
+ assert 3 == r.zunionstore("foobar", ["foo", "bar"], :aggregate => :min)
52
+ assert ["s1", "s2", "s3"] == r.zrange("foobar", 0, -1)
53
+
54
+ assert 3 == r.zunionstore("foobar", ["foo", "bar"], :aggregate => :max)
55
+ assert ["s1", "s3", "s2"] == r.zrange("foobar", 0, -1)
56
+ end
57
+
58
+ test "ZINTERSTORE" do |r|
59
+ r.zadd "foo", 1, "s1"
60
+ r.zadd "bar", 2, "s1"
61
+ r.zadd "foo", 3, "s3"
62
+ r.zadd "bar", 4, "s4"
63
+
64
+ assert 1 == r.zinterstore("foobar", ["foo", "bar"])
65
+ assert ["s1"] == r.zrange("foobar", 0, -1)
66
+ end
67
+
68
+ test "ZINTERSTORE with WEIGHTS" do |r|
69
+ r.zadd "foo", 1, "s1"
70
+ r.zadd "foo", 2, "s2"
71
+ r.zadd "foo", 3, "s3"
72
+ r.zadd "bar", 20, "s2"
73
+ r.zadd "bar", 30, "s3"
74
+ r.zadd "bar", 40, "s4"
75
+
76
+ assert 2 == r.zinterstore("foobar", ["foo", "bar"])
77
+ assert ["s2", "s3"] == r.zrange("foobar", 0, -1)
78
+
79
+ assert 2 == r.zinterstore("foobar", ["foo", "bar"], :weights => [10, 1])
80
+ assert ["s2", "s3"] == r.zrange("foobar", 0, -1)
81
+
82
+ assert "40" == r.zscore("foobar", "s2")
83
+ assert "60" == r.zscore("foobar", "s3")
84
+ end
85
+
86
+ test "ZINTERSTORE with AGGREGATE" do |r|
87
+ r.zadd "foo", 1, "s1"
88
+ r.zadd "foo", 2, "s2"
89
+ r.zadd "foo", 3, "s3"
90
+ r.zadd "bar", 20, "s2"
91
+ r.zadd "bar", 30, "s3"
92
+ r.zadd "bar", 40, "s4"
93
+
94
+ assert 2 == r.zinterstore("foobar", ["foo", "bar"])
95
+ assert ["s2", "s3"] == r.zrange("foobar", 0, -1)
96
+ assert "22" == r.zscore("foobar", "s2")
97
+ assert "33" == r.zscore("foobar", "s3")
98
+
99
+ assert 2 == r.zinterstore("foobar", ["foo", "bar"], :aggregate => :min)
100
+ assert ["s2", "s3"] == r.zrange("foobar", 0, -1)
101
+ assert "2" == r.zscore("foobar", "s2")
102
+ assert "3" == r.zscore("foobar", "s3")
103
+
104
+ assert 2 == r.zinterstore("foobar", ["foo", "bar"], :aggregate => :max)
105
+ assert ["s2", "s3"] == r.zrange("foobar", 0, -1)
106
+ assert "20" == r.zscore("foobar", "s2")
107
+ assert "30" == r.zscore("foobar", "s3")
108
+ end
109
+
@@ -0,0 +1,80 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+
5
+ setup do
6
+ init Redis.new(OPTIONS)
7
+ end
8
+
9
+ load './test/lint/strings.rb'
10
+
11
+ test "MGET" do |r|
12
+ r.set("foo", "s1")
13
+ r.set("bar", "s2")
14
+
15
+ assert ["s1", "s2"] == r.mget("foo", "bar")
16
+ assert ["s1", "s2", nil] == r.mget("foo", "bar", "baz")
17
+ end
18
+
19
+ test "MGET mapped" do |r|
20
+ r.set("foo", "s1")
21
+ r.set("bar", "s2")
22
+
23
+ response = r.mapped_mget("foo", "bar")
24
+
25
+ assert "s1" == response["foo"]
26
+ assert "s2" == response["bar"]
27
+
28
+ response = r.mapped_mget("foo", "bar", "baz")
29
+
30
+ assert "s1" == response["foo"]
31
+ assert "s2" == response["bar"]
32
+ assert nil == response["baz"]
33
+ end
34
+
35
+ test "Mapped MGET in a pipeline returns plain array" do |r|
36
+ r.set("foo", "s1")
37
+ r.set("bar", "s2")
38
+
39
+ result = r.pipelined do
40
+ assert nil == r.mapped_mget("foo", "bar")
41
+ end
42
+
43
+ assert result[0] == ["s1", "s2"]
44
+ end
45
+
46
+ test "MSET" do |r|
47
+ r.mset(:foo, "s1", :bar, "s2")
48
+
49
+ assert "s1" == r.get("foo")
50
+ assert "s2" == r.get("bar")
51
+ end
52
+
53
+ test "MSET mapped" do |r|
54
+ r.mapped_mset(:foo => "s1", :bar => "s2")
55
+
56
+ assert "s1" == r.get("foo")
57
+ assert "s2" == r.get("bar")
58
+ end
59
+
60
+ test "MSETNX" do |r|
61
+ r.set("foo", "s1")
62
+ r.msetnx(:foo, "s2", :bar, "s3")
63
+
64
+ assert "s1" == r.get("foo")
65
+ assert nil == r.get("bar")
66
+ end
67
+
68
+ test "MSETNX mapped" do |r|
69
+ r.set("foo", "s1")
70
+ r.mapped_msetnx(:foo => "s2", :bar => "s3")
71
+
72
+ assert "s1" == r.get("foo")
73
+ assert nil == r.get("bar")
74
+ end
75
+
76
+ test "STRLEN" do |r|
77
+ r.set "foo", "lorem"
78
+
79
+ assert 5 == r.strlen("foo")
80
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require File.expand_path("./redis_mock", File.dirname(__FILE__))
5
+
6
+ include RedisMock::Helper
7
+
8
+ setup do
9
+ init Redis.new(OPTIONS)
10
+ end
11
+
12
+ load "./test/lint/value_types.rb"
13
+
14
+ test "DEL" do |r|
15
+ r.set "foo", "s1"
16
+ r.set "bar", "s2"
17
+ r.set "baz", "s3"
18
+
19
+ assert ["bar", "baz", "foo"] == r.keys("*").sort
20
+
21
+ assert 1 == r.del("foo")
22
+
23
+ assert ["bar", "baz"] == r.keys("*").sort
24
+
25
+ assert 2 == r.del("bar", "baz")
26
+
27
+ assert [] == r.keys("*").sort
28
+ end
29
+
30
+ test "RANDOMKEY" do |r|
31
+ assert r.randomkey.to_s.empty?
32
+
33
+ r.set("foo", "s1")
34
+
35
+ assert "foo" == r.randomkey
36
+
37
+ r.set("bar", "s2")
38
+
39
+ 4.times do
40
+ assert ["foo", "bar"].include?(r.randomkey)
41
+ end
42
+ end
43
+
44
+ test "RENAME" do |r|
45
+ r.set("foo", "s1")
46
+ r.rename "foo", "bar"
47
+
48
+ assert "s1" == r.get("bar")
49
+ assert nil == r.get("foo")
50
+ end
51
+
52
+ test "RENAMENX" do |r|
53
+ r.set("foo", "s1")
54
+ r.set("bar", "s2")
55
+
56
+ assert false == r.renamenx("foo", "bar")
57
+
58
+ assert "s1" == r.get("foo")
59
+ assert "s2" == r.get("bar")
60
+ end
61
+
62
+ test "DBSIZE" do |r|
63
+ assert 0 == r.dbsize
64
+
65
+ r.set("foo", "s1")
66
+
67
+ assert 1 == r.dbsize
68
+ end
69
+
70
+ test "FLUSHDB" do |r|
71
+ r.set("foo", "s1")
72
+ r.set("bar", "s2")
73
+
74
+ assert 2 == r.dbsize
75
+
76
+ r.flushdb
77
+
78
+ assert 0 == r.dbsize
79
+ end
80
+
81
+ test "FLUSHALL" do
82
+ redis_mock(:flushall => lambda { "+FLUSHALL" }) do
83
+ redis = Redis.new(OPTIONS.merge(:port => 6380))
84
+
85
+ assert "FLUSHALL" == redis.flushall
86
+ end
87
+ end
88
+
@@ -0,0 +1,88 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require File.expand_path("./redis_mock", File.dirname(__FILE__))
5
+
6
+ include RedisMock::Helper
7
+
8
+ setup do
9
+ init Redis.new(OPTIONS)
10
+ end
11
+
12
+ test "AUTH" do
13
+ replies = {
14
+ :auth => lambda { |password| $auth = password; "+OK" },
15
+ :get => lambda { |key| $auth == "secret" ? "$3\r\nbar" : "$-1" },
16
+ }
17
+
18
+ redis_mock(replies) do
19
+ redis = Redis.new(OPTIONS.merge(:port => 6380, :password => "secret"))
20
+
21
+ assert "bar" == redis.get("foo")
22
+ end
23
+ end
24
+
25
+ test "PING" do |r|
26
+ assert "PONG" == r.ping
27
+ end
28
+
29
+ test "SELECT" do |r|
30
+ r.set "foo", "bar"
31
+
32
+ r.select 14
33
+ assert nil == r.get("foo")
34
+
35
+ r.client.disconnect
36
+
37
+ assert nil == r.get("foo")
38
+ end
39
+
40
+ test "QUIT" do |r|
41
+ r.quit
42
+
43
+ assert !r.client.connected?
44
+ end
45
+
46
+ test "SHUTDOWN" do
47
+ redis_mock(:shutdown => lambda { "+SHUTDOWN" }) do
48
+ redis = Redis.new(OPTIONS.merge(:port => 6380))
49
+
50
+ # SHUTDOWN does not reply: test that it does not raise here.
51
+ assert nil == redis.shutdown
52
+ end
53
+ end
54
+
55
+ test "SLAVEOF" do
56
+ redis_mock(:slaveof => lambda { |host, port| "+SLAVEOF #{host} #{port}" }) do
57
+ redis = Redis.new(OPTIONS.merge(:port => 6380))
58
+
59
+ assert "SLAVEOF localhost 6381" == redis.slaveof("localhost", 6381)
60
+ end
61
+ end
62
+
63
+ test "BGREWRITEAOF" do
64
+ redis_mock(:bgrewriteaof => lambda { "+BGREWRITEAOF" }) do
65
+ redis = Redis.new(OPTIONS.merge(:port => 6380))
66
+
67
+ assert "BGREWRITEAOF" == redis.bgrewriteaof
68
+ end
69
+ end
70
+
71
+ test "CONFIG GET" do |r|
72
+ assert "300" == r.config(:get, "*")["timeout"]
73
+
74
+ assert r.config(:get, "timeout") == { "timeout" => "300" }
75
+ end
76
+
77
+ test "CONFIG SET" do |r|
78
+ begin
79
+ assert "OK" == r.config(:set, "timeout", 200)
80
+ assert "200" == r.config(:get, "*")["timeout"]
81
+
82
+ assert "OK" == r.config(:set, "timeout", 100)
83
+ assert "100" == r.config(:get, "*")["timeout"]
84
+ ensure
85
+ r.config :set, "timeout", 300
86
+ end
87
+ end
88
+
@@ -0,0 +1 @@
1
+ redis.pid
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ test "BLPOP" do |r|
12
+ r.lpush("foo", "s1")
13
+ r.lpush("foo", "s2")
14
+
15
+ wire = Wire.new do
16
+ redis = Redis::Distributed.new(NODES)
17
+ Wire.sleep 0.3
18
+ redis.lpush("foo", "s3")
19
+ end
20
+
21
+ assert ["foo", "s2"] == r.blpop("foo", 1)
22
+ assert ["foo", "s1"] == r.blpop("foo", 1)
23
+ assert ["foo", "s3"] == r.blpop("foo", 1)
24
+
25
+ wire.join
26
+ end
27
+
28
+ test "BRPOP" do |r|
29
+ r.rpush("foo", "s1")
30
+ r.rpush("foo", "s2")
31
+
32
+ wire = Wire.new do
33
+ redis = Redis::Distributed.new(NODES)
34
+ Wire.sleep 0.3
35
+ redis.rpush("foo", "s3")
36
+ end
37
+
38
+ assert ["foo", "s2"] == r.brpop("foo", 1)
39
+ assert ["foo", "s1"] == r.brpop("foo", 1)
40
+ assert ["foo", "s3"] == r.brpop("foo", 1)
41
+
42
+ wire.join
43
+ end
44
+
45
+ test "BRPOP should unset a configured socket timeout" do |r|
46
+ r = Redis::Distributed.new(NODES, :timeout => 1)
47
+
48
+ assert_nothing_raised do
49
+ r.brpop("foo", 2)
50
+ end # Errno::EAGAIN raised if socket times out before redis command times out
51
+
52
+ assert r.nodes.all? { |node| node.client.timeout == 1 }
53
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ load './test/lint/hashes.rb'
12
+
@@ -0,0 +1,24 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ load './test/lint/lists.rb'
12
+
13
+ test "RPOPLPUSH" do |r|
14
+ assert_raise Redis::Distributed::CannotDistribute do
15
+ r.rpoplpush("foo", "bar")
16
+ end
17
+ end
18
+
19
+ test "BRPOPLPUSH" do |r|
20
+ assert_raise Redis::Distributed::CannotDistribute do
21
+ r.brpoplpush("foo", "bar", 1)
22
+ end
23
+ end
24
+