redis 3.2.0 → 4.6.0
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +278 -15
- data/README.md +260 -76
- data/lib/redis/client.rb +239 -115
- data/lib/redis/cluster/command.rb +79 -0
- data/lib/redis/cluster/command_loader.rb +33 -0
- data/lib/redis/cluster/key_slot_converter.rb +72 -0
- data/lib/redis/cluster/node.rb +120 -0
- data/lib/redis/cluster/node_key.rb +31 -0
- data/lib/redis/cluster/node_loader.rb +37 -0
- data/lib/redis/cluster/option.rb +93 -0
- data/lib/redis/cluster/slot.rb +86 -0
- data/lib/redis/cluster/slot_loader.rb +49 -0
- data/lib/redis/cluster.rb +315 -0
- data/lib/redis/commands/bitmaps.rb +63 -0
- data/lib/redis/commands/cluster.rb +45 -0
- data/lib/redis/commands/connection.rb +58 -0
- data/lib/redis/commands/geo.rb +84 -0
- data/lib/redis/commands/hashes.rb +251 -0
- data/lib/redis/commands/hyper_log_log.rb +37 -0
- data/lib/redis/commands/keys.rb +411 -0
- data/lib/redis/commands/lists.rb +289 -0
- data/lib/redis/commands/pubsub.rb +72 -0
- data/lib/redis/commands/scripting.rb +114 -0
- data/lib/redis/commands/server.rb +188 -0
- data/lib/redis/commands/sets.rb +207 -0
- data/lib/redis/commands/sorted_sets.rb +804 -0
- data/lib/redis/commands/streams.rb +382 -0
- data/lib/redis/commands/strings.rb +313 -0
- data/lib/redis/commands/transactions.rb +92 -0
- data/lib/redis/commands.rb +242 -0
- data/lib/redis/connection/command_helper.rb +7 -10
- data/lib/redis/connection/hiredis.rb +11 -6
- data/lib/redis/connection/registry.rb +2 -1
- data/lib/redis/connection/ruby.rb +173 -64
- data/lib/redis/connection/synchrony.rb +32 -8
- data/lib/redis/connection.rb +3 -1
- data/lib/redis/distributed.rb +233 -74
- data/lib/redis/errors.rb +48 -0
- data/lib/redis/hash_ring.rb +30 -72
- data/lib/redis/pipeline.rb +145 -12
- data/lib/redis/subscribe.rb +20 -13
- data/lib/redis/version.rb +3 -1
- data/lib/redis.rb +171 -2476
- metadata +71 -165
- data/.gitignore +0 -15
- data/.travis/Gemfile +0 -11
- data/.travis.yml +0 -54
- data/.yardopts +0 -3
- data/Gemfile +0 -4
- data/Rakefile +0 -68
- data/benchmarking/logging.rb +0 -71
- data/benchmarking/pipeline.rb +0 -51
- data/benchmarking/speed.rb +0 -21
- data/benchmarking/suite.rb +0 -24
- data/benchmarking/worker.rb +0 -71
- data/examples/basic.rb +0 -15
- data/examples/consistency.rb +0 -114
- data/examples/dist_redis.rb +0 -43
- data/examples/incr-decr.rb +0 -17
- data/examples/list.rb +0 -26
- data/examples/pubsub.rb +0 -37
- data/examples/sentinel/sentinel.conf +0 -9
- data/examples/sentinel/start +0 -49
- data/examples/sentinel.rb +0 -41
- data/examples/sets.rb +0 -36
- data/examples/unicorn/config.ru +0 -3
- data/examples/unicorn/unicorn.rb +0 -20
- data/redis.gemspec +0 -43
- data/test/bitpos_test.rb +0 -69
- data/test/blocking_commands_test.rb +0 -42
- data/test/command_map_test.rb +0 -30
- data/test/commands_on_hashes_test.rb +0 -21
- data/test/commands_on_hyper_log_log_test.rb +0 -21
- data/test/commands_on_lists_test.rb +0 -20
- data/test/commands_on_sets_test.rb +0 -77
- data/test/commands_on_sorted_sets_test.rb +0 -123
- data/test/commands_on_strings_test.rb +0 -101
- data/test/commands_on_value_types_test.rb +0 -131
- data/test/connection_handling_test.rb +0 -189
- data/test/db/.gitkeep +0 -0
- data/test/distributed_blocking_commands_test.rb +0 -46
- data/test/distributed_commands_on_hashes_test.rb +0 -10
- data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
- data/test/distributed_commands_on_lists_test.rb +0 -22
- data/test/distributed_commands_on_sets_test.rb +0 -83
- data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
- data/test/distributed_commands_on_strings_test.rb +0 -59
- data/test/distributed_commands_on_value_types_test.rb +0 -95
- data/test/distributed_commands_requiring_clustering_test.rb +0 -164
- data/test/distributed_connection_handling_test.rb +0 -23
- data/test/distributed_internals_test.rb +0 -70
- data/test/distributed_key_tags_test.rb +0 -52
- data/test/distributed_persistence_control_commands_test.rb +0 -26
- data/test/distributed_publish_subscribe_test.rb +0 -92
- data/test/distributed_remote_server_control_commands_test.rb +0 -66
- data/test/distributed_scripting_test.rb +0 -102
- data/test/distributed_sorting_test.rb +0 -20
- data/test/distributed_test.rb +0 -58
- data/test/distributed_transactions_test.rb +0 -32
- data/test/encoding_test.rb +0 -18
- data/test/error_replies_test.rb +0 -59
- data/test/fork_safety_test.rb +0 -65
- data/test/helper.rb +0 -232
- data/test/helper_test.rb +0 -24
- data/test/internals_test.rb +0 -434
- data/test/lint/blocking_commands.rb +0 -150
- data/test/lint/hashes.rb +0 -162
- data/test/lint/hyper_log_log.rb +0 -60
- data/test/lint/lists.rb +0 -143
- data/test/lint/sets.rb +0 -125
- data/test/lint/sorted_sets.rb +0 -238
- data/test/lint/strings.rb +0 -260
- data/test/lint/value_types.rb +0 -122
- data/test/persistence_control_commands_test.rb +0 -26
- data/test/pipelining_commands_test.rb +0 -242
- data/test/publish_subscribe_test.rb +0 -210
- data/test/remote_server_control_commands_test.rb +0 -117
- data/test/scanning_test.rb +0 -413
- data/test/scripting_test.rb +0 -78
- data/test/sorting_test.rb +0 -59
- data/test/support/connection/hiredis.rb +0 -1
- data/test/support/connection/ruby.rb +0 -1
- data/test/support/connection/synchrony.rb +0 -17
- data/test/support/redis_mock.rb +0 -115
- data/test/support/wire/synchrony.rb +0 -24
- data/test/support/wire/thread.rb +0 -5
- data/test/synchrony_driver.rb +0 -88
- data/test/test.conf +0 -9
- data/test/thread_safety_test.rb +0 -32
- data/test/transactions_test.rb +0 -264
- data/test/unknown_commands_test.rb +0 -14
- data/test/url_param_test.rb +0 -132
@@ -1,77 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
require "lint/sets"
|
5
|
-
|
6
|
-
class TestCommandsOnSets < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Helper::Client
|
9
|
-
include Lint::Sets
|
10
|
-
|
11
|
-
def test_smove
|
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
|
-
def test_sinter
|
20
|
-
r.sadd "foo", "s1"
|
21
|
-
r.sadd "foo", "s2"
|
22
|
-
r.sadd "bar", "s2"
|
23
|
-
|
24
|
-
assert_equal ["s2"], r.sinter("foo", "bar")
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_sinterstore
|
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_equal ["s2"], r.smembers("baz")
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_sunion
|
38
|
-
r.sadd "foo", "s1"
|
39
|
-
r.sadd "foo", "s2"
|
40
|
-
r.sadd "bar", "s2"
|
41
|
-
r.sadd "bar", "s3"
|
42
|
-
|
43
|
-
assert_equal ["s1", "s2", "s3"], r.sunion("foo", "bar").sort
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_sunionstore
|
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_equal ["s1", "s2", "s3"], r.smembers("baz").sort
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_sdiff
|
58
|
-
r.sadd "foo", "s1"
|
59
|
-
r.sadd "foo", "s2"
|
60
|
-
r.sadd "bar", "s2"
|
61
|
-
r.sadd "bar", "s3"
|
62
|
-
|
63
|
-
assert_equal ["s1"], r.sdiff("foo", "bar")
|
64
|
-
assert_equal ["s3"], r.sdiff("bar", "foo")
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_sdiffstore
|
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_equal ["s1"], r.smembers("baz")
|
76
|
-
end
|
77
|
-
end
|
@@ -1,123 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
require "lint/sorted_sets"
|
5
|
-
|
6
|
-
class TestCommandsOnSortedSets < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Helper::Client
|
9
|
-
include Lint::SortedSets
|
10
|
-
|
11
|
-
def test_zrangebylex
|
12
|
-
target_version "2.8.9" do
|
13
|
-
r.zadd "foo", 0, "aaren"
|
14
|
-
r.zadd "foo", 0, "abagael"
|
15
|
-
r.zadd "foo", 0, "abby"
|
16
|
-
r.zadd "foo", 0, "abbygail"
|
17
|
-
|
18
|
-
assert_equal ["aaren", "abagael", "abby", "abbygail"], r.zrangebylex("foo", "[a", "[a\xff")
|
19
|
-
assert_equal ["aaren", "abagael"], r.zrangebylex("foo", "[a", "[a\xff", :limit => [0, 2])
|
20
|
-
assert_equal ["abby", "abbygail"], r.zrangebylex("foo", "(abb", "(abb\xff")
|
21
|
-
assert_equal ["abbygail"], r.zrangebylex("foo", "(abby", "(abby\xff")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_zcount
|
26
|
-
r.zadd "foo", 1, "s1"
|
27
|
-
r.zadd "foo", 2, "s2"
|
28
|
-
r.zadd "foo", 3, "s3"
|
29
|
-
|
30
|
-
assert_equal 2, r.zcount("foo", 2, 3)
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_zunionstore
|
34
|
-
r.zadd "foo", 1, "s1"
|
35
|
-
r.zadd "bar", 2, "s2"
|
36
|
-
r.zadd "foo", 3, "s3"
|
37
|
-
r.zadd "bar", 4, "s4"
|
38
|
-
|
39
|
-
assert_equal 4, r.zunionstore("foobar", ["foo", "bar"])
|
40
|
-
assert_equal ["s1", "s2", "s3", "s4"], r.zrange("foobar", 0, -1)
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_zunionstore_with_weights
|
44
|
-
r.zadd "foo", 1, "s1"
|
45
|
-
r.zadd "foo", 3, "s3"
|
46
|
-
r.zadd "bar", 20, "s2"
|
47
|
-
r.zadd "bar", 40, "s4"
|
48
|
-
|
49
|
-
assert_equal 4, r.zunionstore("foobar", ["foo", "bar"])
|
50
|
-
assert_equal ["s1", "s3", "s2", "s4"], r.zrange("foobar", 0, -1)
|
51
|
-
|
52
|
-
assert_equal 4, r.zunionstore("foobar", ["foo", "bar"], :weights => [10, 1])
|
53
|
-
assert_equal ["s1", "s2", "s3", "s4"], r.zrange("foobar", 0, -1)
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_zunionstore_with_aggregate
|
57
|
-
r.zadd "foo", 1, "s1"
|
58
|
-
r.zadd "foo", 2, "s2"
|
59
|
-
r.zadd "bar", 4, "s2"
|
60
|
-
r.zadd "bar", 3, "s3"
|
61
|
-
|
62
|
-
assert_equal 3, r.zunionstore("foobar", ["foo", "bar"])
|
63
|
-
assert_equal ["s1", "s3", "s2"], r.zrange("foobar", 0, -1)
|
64
|
-
|
65
|
-
assert_equal 3, r.zunionstore("foobar", ["foo", "bar"], :aggregate => :min)
|
66
|
-
assert_equal ["s1", "s2", "s3"], r.zrange("foobar", 0, -1)
|
67
|
-
|
68
|
-
assert_equal 3, r.zunionstore("foobar", ["foo", "bar"], :aggregate => :max)
|
69
|
-
assert_equal ["s1", "s3", "s2"], r.zrange("foobar", 0, -1)
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_zinterstore
|
73
|
-
r.zadd "foo", 1, "s1"
|
74
|
-
r.zadd "bar", 2, "s1"
|
75
|
-
r.zadd "foo", 3, "s3"
|
76
|
-
r.zadd "bar", 4, "s4"
|
77
|
-
|
78
|
-
assert_equal 1, r.zinterstore("foobar", ["foo", "bar"])
|
79
|
-
assert_equal ["s1"], r.zrange("foobar", 0, -1)
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_zinterstore_with_weights
|
83
|
-
r.zadd "foo", 1, "s1"
|
84
|
-
r.zadd "foo", 2, "s2"
|
85
|
-
r.zadd "foo", 3, "s3"
|
86
|
-
r.zadd "bar", 20, "s2"
|
87
|
-
r.zadd "bar", 30, "s3"
|
88
|
-
r.zadd "bar", 40, "s4"
|
89
|
-
|
90
|
-
assert_equal 2, r.zinterstore("foobar", ["foo", "bar"])
|
91
|
-
assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
|
92
|
-
|
93
|
-
assert_equal 2, r.zinterstore("foobar", ["foo", "bar"], :weights => [10, 1])
|
94
|
-
assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
|
95
|
-
|
96
|
-
assert_equal 40.0, r.zscore("foobar", "s2")
|
97
|
-
assert_equal 60.0, r.zscore("foobar", "s3")
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_zinterstore_with_aggregate
|
101
|
-
r.zadd "foo", 1, "s1"
|
102
|
-
r.zadd "foo", 2, "s2"
|
103
|
-
r.zadd "foo", 3, "s3"
|
104
|
-
r.zadd "bar", 20, "s2"
|
105
|
-
r.zadd "bar", 30, "s3"
|
106
|
-
r.zadd "bar", 40, "s4"
|
107
|
-
|
108
|
-
assert_equal 2, r.zinterstore("foobar", ["foo", "bar"])
|
109
|
-
assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
|
110
|
-
assert_equal 22.0, r.zscore("foobar", "s2")
|
111
|
-
assert_equal 33.0, r.zscore("foobar", "s3")
|
112
|
-
|
113
|
-
assert_equal 2, r.zinterstore("foobar", ["foo", "bar"], :aggregate => :min)
|
114
|
-
assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
|
115
|
-
assert_equal 2.0, r.zscore("foobar", "s2")
|
116
|
-
assert_equal 3.0, r.zscore("foobar", "s3")
|
117
|
-
|
118
|
-
assert_equal 2, r.zinterstore("foobar", ["foo", "bar"], :aggregate => :max)
|
119
|
-
assert_equal ["s2", "s3"], r.zrange("foobar", 0, -1)
|
120
|
-
assert_equal 20.0, r.zscore("foobar", "s2")
|
121
|
-
assert_equal 30.0, r.zscore("foobar", "s3")
|
122
|
-
end
|
123
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
require "lint/strings"
|
5
|
-
|
6
|
-
class TestCommandsOnStrings < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Helper::Client
|
9
|
-
include Lint::Strings
|
10
|
-
|
11
|
-
def test_mget
|
12
|
-
r.set("foo", "s1")
|
13
|
-
r.set("bar", "s2")
|
14
|
-
|
15
|
-
assert_equal ["s1", "s2"] , r.mget("foo", "bar")
|
16
|
-
assert_equal ["s1", "s2", nil], r.mget("foo", "bar", "baz")
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_mget_mapped
|
20
|
-
r.set("foo", "s1")
|
21
|
-
r.set("bar", "s2")
|
22
|
-
|
23
|
-
response = r.mapped_mget("foo", "bar")
|
24
|
-
|
25
|
-
assert_equal "s1", response["foo"]
|
26
|
-
assert_equal "s2", response["bar"]
|
27
|
-
|
28
|
-
response = r.mapped_mget("foo", "bar", "baz")
|
29
|
-
|
30
|
-
assert_equal "s1", response["foo"]
|
31
|
-
assert_equal "s2", response["bar"]
|
32
|
-
assert_equal nil , response["baz"]
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_mapped_mget_in_a_pipeline_returns_hash
|
36
|
-
r.set("foo", "s1")
|
37
|
-
r.set("bar", "s2")
|
38
|
-
|
39
|
-
result = r.pipelined do
|
40
|
-
r.mapped_mget("foo", "bar")
|
41
|
-
end
|
42
|
-
|
43
|
-
assert_equal result[0], { "foo" => "s1", "bar" => "s2" }
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_mset
|
47
|
-
r.mset(:foo, "s1", :bar, "s2")
|
48
|
-
|
49
|
-
assert_equal "s1", r.get("foo")
|
50
|
-
assert_equal "s2", r.get("bar")
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_mset_mapped
|
54
|
-
r.mapped_mset(:foo => "s1", :bar => "s2")
|
55
|
-
|
56
|
-
assert_equal "s1", r.get("foo")
|
57
|
-
assert_equal "s2", r.get("bar")
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_msetnx
|
61
|
-
r.set("foo", "s1")
|
62
|
-
assert_equal false, r.msetnx(:foo, "s2", :bar, "s3")
|
63
|
-
assert_equal "s1", r.get("foo")
|
64
|
-
assert_equal nil, r.get("bar")
|
65
|
-
|
66
|
-
r.del("foo")
|
67
|
-
assert_equal true, r.msetnx(:foo, "s2", :bar, "s3")
|
68
|
-
assert_equal "s2", r.get("foo")
|
69
|
-
assert_equal "s3", r.get("bar")
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_msetnx_mapped
|
73
|
-
r.set("foo", "s1")
|
74
|
-
assert_equal false, r.mapped_msetnx(:foo => "s2", :bar => "s3")
|
75
|
-
assert_equal "s1", r.get("foo")
|
76
|
-
assert_equal nil, r.get("bar")
|
77
|
-
|
78
|
-
r.del("foo")
|
79
|
-
assert_equal true, r.mapped_msetnx(:foo => "s2", :bar => "s3")
|
80
|
-
assert_equal "s2", r.get("foo")
|
81
|
-
assert_equal "s3", r.get("bar")
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_bitop
|
85
|
-
try_encoding("UTF-8") do
|
86
|
-
target_version "2.5.10" do
|
87
|
-
r.set("foo", "a")
|
88
|
-
r.set("bar", "b")
|
89
|
-
|
90
|
-
r.bitop(:and, "foo&bar", "foo", "bar")
|
91
|
-
assert_equal "\x60", r.get("foo&bar")
|
92
|
-
r.bitop(:or, "foo|bar", "foo", "bar")
|
93
|
-
assert_equal "\x63", r.get("foo|bar")
|
94
|
-
r.bitop(:xor, "foo^bar", "foo", "bar")
|
95
|
-
assert_equal "\x03", r.get("foo^bar")
|
96
|
-
r.bitop(:not, "~foo", "foo")
|
97
|
-
assert_equal "\x9E", r.get("~foo")
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
require "lint/value_types"
|
5
|
-
|
6
|
-
class TestCommandsOnValueTypes < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Helper::Client
|
9
|
-
include Lint::ValueTypes
|
10
|
-
|
11
|
-
def test_del
|
12
|
-
r.set "foo", "s1"
|
13
|
-
r.set "bar", "s2"
|
14
|
-
r.set "baz", "s3"
|
15
|
-
|
16
|
-
assert_equal ["bar", "baz", "foo"], r.keys("*").sort
|
17
|
-
|
18
|
-
assert_equal 1, r.del("foo")
|
19
|
-
|
20
|
-
assert_equal ["bar", "baz"], r.keys("*").sort
|
21
|
-
|
22
|
-
assert_equal 2, r.del("bar", "baz")
|
23
|
-
|
24
|
-
assert_equal [], r.keys("*").sort
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_del_with_array_argument
|
28
|
-
r.set "foo", "s1"
|
29
|
-
r.set "bar", "s2"
|
30
|
-
r.set "baz", "s3"
|
31
|
-
|
32
|
-
assert_equal ["bar", "baz", "foo"], r.keys("*").sort
|
33
|
-
|
34
|
-
assert_equal 1, r.del(["foo"])
|
35
|
-
|
36
|
-
assert_equal ["bar", "baz"], r.keys("*").sort
|
37
|
-
|
38
|
-
assert_equal 2, r.del(["bar", "baz"])
|
39
|
-
|
40
|
-
assert_equal [], r.keys("*").sort
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_randomkey
|
44
|
-
assert r.randomkey.to_s.empty?
|
45
|
-
|
46
|
-
r.set("foo", "s1")
|
47
|
-
|
48
|
-
assert_equal "foo", r.randomkey
|
49
|
-
|
50
|
-
r.set("bar", "s2")
|
51
|
-
|
52
|
-
4.times do
|
53
|
-
assert ["foo", "bar"].include?(r.randomkey)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_rename
|
58
|
-
r.set("foo", "s1")
|
59
|
-
r.rename "foo", "bar"
|
60
|
-
|
61
|
-
assert_equal "s1", r.get("bar")
|
62
|
-
assert_equal nil, r.get("foo")
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_renamenx
|
66
|
-
r.set("foo", "s1")
|
67
|
-
r.set("bar", "s2")
|
68
|
-
|
69
|
-
assert_equal false, r.renamenx("foo", "bar")
|
70
|
-
|
71
|
-
assert_equal "s1", r.get("foo")
|
72
|
-
assert_equal "s2", r.get("bar")
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_dbsize
|
76
|
-
assert_equal 0, r.dbsize
|
77
|
-
|
78
|
-
r.set("foo", "s1")
|
79
|
-
|
80
|
-
assert_equal 1, r.dbsize
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_flushdb
|
84
|
-
r.set("foo", "s1")
|
85
|
-
r.set("bar", "s2")
|
86
|
-
|
87
|
-
assert_equal 2, r.dbsize
|
88
|
-
|
89
|
-
r.flushdb
|
90
|
-
|
91
|
-
assert_equal 0, r.dbsize
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_flushall
|
95
|
-
redis_mock(:flushall => lambda { "+FLUSHALL" }) do |redis|
|
96
|
-
assert_equal "FLUSHALL", redis.flushall
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_migrate
|
101
|
-
redis_mock(:migrate => lambda { |*args| args }) do |redis|
|
102
|
-
options = { :host => "127.0.0.1", :port => 1234 }
|
103
|
-
|
104
|
-
assert_raise(RuntimeError, /host not specified/) do
|
105
|
-
redis.migrate("foo", options.reject { |key, _| key == :host })
|
106
|
-
end
|
107
|
-
|
108
|
-
assert_raise(RuntimeError, /port not specified/) do
|
109
|
-
redis.migrate("foo", options.reject { |key, _| key == :port })
|
110
|
-
end
|
111
|
-
|
112
|
-
default_db = redis.client.db.to_i
|
113
|
-
default_timeout = redis.client.timeout.to_i
|
114
|
-
|
115
|
-
# Test defaults
|
116
|
-
actual = redis.migrate("foo", options)
|
117
|
-
expected = ["127.0.0.1", "1234", "foo", default_db.to_s, default_timeout.to_s]
|
118
|
-
assert_equal expected, actual
|
119
|
-
|
120
|
-
# Test db override
|
121
|
-
actual = redis.migrate("foo", options.merge(:db => default_db + 1))
|
122
|
-
expected = ["127.0.0.1", "1234", "foo", (default_db + 1).to_s, default_timeout.to_s]
|
123
|
-
assert_equal expected, actual
|
124
|
-
|
125
|
-
# Test timeout override
|
126
|
-
actual = redis.migrate("foo", options.merge(:timeout => default_timeout + 1))
|
127
|
-
expected = ["127.0.0.1", "1234", "foo", default_db.to_s, (default_timeout + 1).to_s]
|
128
|
-
assert_equal expected, actual
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
@@ -1,189 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestConnectionHandling < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Client
|
8
|
-
|
9
|
-
def test_auth
|
10
|
-
commands = {
|
11
|
-
:auth => lambda { |password| $auth = password; "+OK" },
|
12
|
-
:get => lambda { |key| $auth == "secret" ? "$3\r\nbar" : "$-1" },
|
13
|
-
}
|
14
|
-
|
15
|
-
redis_mock(commands, :password => "secret") do |redis|
|
16
|
-
assert_equal "bar", redis.get("foo")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_ping
|
21
|
-
assert_equal "PONG", r.ping
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_select
|
25
|
-
r.set "foo", "bar"
|
26
|
-
|
27
|
-
r.select 14
|
28
|
-
assert_equal nil, r.get("foo")
|
29
|
-
|
30
|
-
r.client.disconnect
|
31
|
-
|
32
|
-
assert_equal nil, r.get("foo")
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_quit
|
36
|
-
r.quit
|
37
|
-
|
38
|
-
assert !r.client.connected?
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_shutdown
|
42
|
-
commands = {
|
43
|
-
:shutdown => lambda { :exit }
|
44
|
-
}
|
45
|
-
|
46
|
-
redis_mock(commands) do |redis|
|
47
|
-
# SHUTDOWN does not reply: test that it does not raise here.
|
48
|
-
assert_equal nil, redis.shutdown
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_shutdown_with_error
|
53
|
-
connections = 0
|
54
|
-
commands = {
|
55
|
-
:select => lambda { |*_| connections += 1; "+OK\r\n" },
|
56
|
-
:connections => lambda { ":#{connections}\r\n" },
|
57
|
-
:shutdown => lambda { "-ERR could not shutdown\r\n" }
|
58
|
-
}
|
59
|
-
|
60
|
-
redis_mock(commands) do |redis|
|
61
|
-
connections = redis.connections
|
62
|
-
|
63
|
-
# SHUTDOWN replies with an error: test that it gets raised
|
64
|
-
assert_raise Redis::CommandError do
|
65
|
-
redis.shutdown
|
66
|
-
end
|
67
|
-
|
68
|
-
# The connection should remain in tact
|
69
|
-
assert_equal connections, redis.connections
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_shutdown_from_pipeline
|
74
|
-
commands = {
|
75
|
-
:shutdown => lambda { :exit }
|
76
|
-
}
|
77
|
-
|
78
|
-
redis_mock(commands) do |redis|
|
79
|
-
result = redis.pipelined do
|
80
|
-
redis.shutdown
|
81
|
-
end
|
82
|
-
|
83
|
-
assert_equal nil, result
|
84
|
-
assert !redis.client.connected?
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_shutdown_with_error_from_pipeline
|
89
|
-
connections = 0
|
90
|
-
commands = {
|
91
|
-
:select => lambda { |*_| connections += 1; "+OK\r\n" },
|
92
|
-
:connections => lambda { ":#{connections}\r\n" },
|
93
|
-
:shutdown => lambda { "-ERR could not shutdown\r\n" }
|
94
|
-
}
|
95
|
-
|
96
|
-
redis_mock(commands) do |redis|
|
97
|
-
connections = redis.connections
|
98
|
-
|
99
|
-
# SHUTDOWN replies with an error: test that it gets raised
|
100
|
-
assert_raise Redis::CommandError do
|
101
|
-
redis.pipelined do
|
102
|
-
redis.shutdown
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
# The connection should remain in tact
|
107
|
-
assert_equal connections, redis.connections
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_shutdown_from_multi_exec
|
112
|
-
commands = {
|
113
|
-
:multi => lambda { "+OK\r\n" },
|
114
|
-
:shutdown => lambda { "+QUEUED\r\n" },
|
115
|
-
:exec => lambda { :exit }
|
116
|
-
}
|
117
|
-
|
118
|
-
redis_mock(commands) do |redis|
|
119
|
-
result = redis.multi do
|
120
|
-
redis.shutdown
|
121
|
-
end
|
122
|
-
|
123
|
-
assert_equal nil, result
|
124
|
-
assert !redis.client.connected?
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_shutdown_with_error_from_multi_exec
|
129
|
-
connections = 0
|
130
|
-
commands = {
|
131
|
-
:select => lambda { |*_| connections += 1; "+OK\r\n" },
|
132
|
-
:connections => lambda { ":#{connections}\r\n" },
|
133
|
-
:multi => lambda { "+OK\r\n" },
|
134
|
-
:shutdown => lambda { "+QUEUED\r\n" },
|
135
|
-
:exec => lambda { "*1\r\n-ERR could not shutdown\r\n" }
|
136
|
-
}
|
137
|
-
|
138
|
-
redis_mock(commands) do |redis|
|
139
|
-
connections = redis.connections
|
140
|
-
|
141
|
-
# SHUTDOWN replies with an error: test that it gets returned
|
142
|
-
# We should test for Redis::CommandError here, but hiredis doesn't yet do
|
143
|
-
# custom error classes.
|
144
|
-
err = nil
|
145
|
-
|
146
|
-
begin
|
147
|
-
redis.multi { redis.shutdown }
|
148
|
-
rescue => err
|
149
|
-
end
|
150
|
-
|
151
|
-
assert err.kind_of?(StandardError)
|
152
|
-
|
153
|
-
# The connection should remain intact
|
154
|
-
assert_equal connections, redis.connections
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_slaveof
|
159
|
-
redis_mock(:slaveof => lambda { |host, port| "+SLAVEOF #{host} #{port}" }) do |redis|
|
160
|
-
assert_equal "SLAVEOF somehost 6381", redis.slaveof("somehost", 6381)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_bgrewriteaof
|
165
|
-
redis_mock(:bgrewriteaof => lambda { "+BGREWRITEAOF" }) do |redis|
|
166
|
-
assert_equal "BGREWRITEAOF", redis.bgrewriteaof
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_config_get
|
171
|
-
assert r.config(:get, "*")["timeout"] != nil
|
172
|
-
|
173
|
-
config = r.config(:get, "timeout")
|
174
|
-
assert_equal ["timeout"], config.keys
|
175
|
-
assert config.values.compact.size > 0
|
176
|
-
end
|
177
|
-
|
178
|
-
def test_config_set
|
179
|
-
begin
|
180
|
-
assert_equal "OK", r.config(:set, "timeout", 200)
|
181
|
-
assert_equal "200", r.config(:get, "*")["timeout"]
|
182
|
-
|
183
|
-
assert_equal "OK", r.config(:set, "timeout", 100)
|
184
|
-
assert_equal "100", r.config(:get, "*")["timeout"]
|
185
|
-
ensure
|
186
|
-
r.config :set, "timeout", 300
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
data/test/db/.gitkeep
DELETED
File without changes
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
require "lint/blocking_commands"
|
5
|
-
|
6
|
-
class TestDistributedBlockingCommands < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Helper::Distributed
|
9
|
-
include Lint::BlockingCommands
|
10
|
-
|
11
|
-
def test_blpop_raises
|
12
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
13
|
-
r.blpop(["foo", "bar"])
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_blpop_raises_with_old_prototype
|
18
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
19
|
-
r.blpop("foo", "bar", 0)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_brpop_raises
|
24
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
25
|
-
r.brpop(["foo", "bar"])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_brpop_raises_with_old_prototype
|
30
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
31
|
-
r.brpop("foo", "bar", 0)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_brpoplpush_raises
|
36
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
37
|
-
r.brpoplpush("foo", "bar")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_brpoplpush_raises_with_old_prototype
|
42
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
43
|
-
r.brpoplpush("foo", "bar", 0)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|