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.
Files changed (133) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +278 -15
  3. data/README.md +260 -76
  4. data/lib/redis/client.rb +239 -115
  5. data/lib/redis/cluster/command.rb +79 -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 +120 -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 +315 -0
  15. data/lib/redis/commands/bitmaps.rb +63 -0
  16. data/lib/redis/commands/cluster.rb +45 -0
  17. data/lib/redis/commands/connection.rb +58 -0
  18. data/lib/redis/commands/geo.rb +84 -0
  19. data/lib/redis/commands/hashes.rb +251 -0
  20. data/lib/redis/commands/hyper_log_log.rb +37 -0
  21. data/lib/redis/commands/keys.rb +411 -0
  22. data/lib/redis/commands/lists.rb +289 -0
  23. data/lib/redis/commands/pubsub.rb +72 -0
  24. data/lib/redis/commands/scripting.rb +114 -0
  25. data/lib/redis/commands/server.rb +188 -0
  26. data/lib/redis/commands/sets.rb +207 -0
  27. data/lib/redis/commands/sorted_sets.rb +804 -0
  28. data/lib/redis/commands/streams.rb +382 -0
  29. data/lib/redis/commands/strings.rb +313 -0
  30. data/lib/redis/commands/transactions.rb +92 -0
  31. data/lib/redis/commands.rb +242 -0
  32. data/lib/redis/connection/command_helper.rb +7 -10
  33. data/lib/redis/connection/hiredis.rb +11 -6
  34. data/lib/redis/connection/registry.rb +2 -1
  35. data/lib/redis/connection/ruby.rb +173 -64
  36. data/lib/redis/connection/synchrony.rb +32 -8
  37. data/lib/redis/connection.rb +3 -1
  38. data/lib/redis/distributed.rb +233 -74
  39. data/lib/redis/errors.rb +48 -0
  40. data/lib/redis/hash_ring.rb +30 -72
  41. data/lib/redis/pipeline.rb +145 -12
  42. data/lib/redis/subscribe.rb +20 -13
  43. data/lib/redis/version.rb +3 -1
  44. data/lib/redis.rb +171 -2476
  45. metadata +71 -165
  46. data/.gitignore +0 -15
  47. data/.travis/Gemfile +0 -11
  48. data/.travis.yml +0 -54
  49. data/.yardopts +0 -3
  50. data/Gemfile +0 -4
  51. data/Rakefile +0 -68
  52. data/benchmarking/logging.rb +0 -71
  53. data/benchmarking/pipeline.rb +0 -51
  54. data/benchmarking/speed.rb +0 -21
  55. data/benchmarking/suite.rb +0 -24
  56. data/benchmarking/worker.rb +0 -71
  57. data/examples/basic.rb +0 -15
  58. data/examples/consistency.rb +0 -114
  59. data/examples/dist_redis.rb +0 -43
  60. data/examples/incr-decr.rb +0 -17
  61. data/examples/list.rb +0 -26
  62. data/examples/pubsub.rb +0 -37
  63. data/examples/sentinel/sentinel.conf +0 -9
  64. data/examples/sentinel/start +0 -49
  65. data/examples/sentinel.rb +0 -41
  66. data/examples/sets.rb +0 -36
  67. data/examples/unicorn/config.ru +0 -3
  68. data/examples/unicorn/unicorn.rb +0 -20
  69. data/redis.gemspec +0 -43
  70. data/test/bitpos_test.rb +0 -69
  71. data/test/blocking_commands_test.rb +0 -42
  72. data/test/command_map_test.rb +0 -30
  73. data/test/commands_on_hashes_test.rb +0 -21
  74. data/test/commands_on_hyper_log_log_test.rb +0 -21
  75. data/test/commands_on_lists_test.rb +0 -20
  76. data/test/commands_on_sets_test.rb +0 -77
  77. data/test/commands_on_sorted_sets_test.rb +0 -123
  78. data/test/commands_on_strings_test.rb +0 -101
  79. data/test/commands_on_value_types_test.rb +0 -131
  80. data/test/connection_handling_test.rb +0 -189
  81. data/test/db/.gitkeep +0 -0
  82. data/test/distributed_blocking_commands_test.rb +0 -46
  83. data/test/distributed_commands_on_hashes_test.rb +0 -10
  84. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  85. data/test/distributed_commands_on_lists_test.rb +0 -22
  86. data/test/distributed_commands_on_sets_test.rb +0 -83
  87. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  88. data/test/distributed_commands_on_strings_test.rb +0 -59
  89. data/test/distributed_commands_on_value_types_test.rb +0 -95
  90. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  91. data/test/distributed_connection_handling_test.rb +0 -23
  92. data/test/distributed_internals_test.rb +0 -70
  93. data/test/distributed_key_tags_test.rb +0 -52
  94. data/test/distributed_persistence_control_commands_test.rb +0 -26
  95. data/test/distributed_publish_subscribe_test.rb +0 -92
  96. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  97. data/test/distributed_scripting_test.rb +0 -102
  98. data/test/distributed_sorting_test.rb +0 -20
  99. data/test/distributed_test.rb +0 -58
  100. data/test/distributed_transactions_test.rb +0 -32
  101. data/test/encoding_test.rb +0 -18
  102. data/test/error_replies_test.rb +0 -59
  103. data/test/fork_safety_test.rb +0 -65
  104. data/test/helper.rb +0 -232
  105. data/test/helper_test.rb +0 -24
  106. data/test/internals_test.rb +0 -434
  107. data/test/lint/blocking_commands.rb +0 -150
  108. data/test/lint/hashes.rb +0 -162
  109. data/test/lint/hyper_log_log.rb +0 -60
  110. data/test/lint/lists.rb +0 -143
  111. data/test/lint/sets.rb +0 -125
  112. data/test/lint/sorted_sets.rb +0 -238
  113. data/test/lint/strings.rb +0 -260
  114. data/test/lint/value_types.rb +0 -122
  115. data/test/persistence_control_commands_test.rb +0 -26
  116. data/test/pipelining_commands_test.rb +0 -242
  117. data/test/publish_subscribe_test.rb +0 -210
  118. data/test/remote_server_control_commands_test.rb +0 -117
  119. data/test/scanning_test.rb +0 -413
  120. data/test/scripting_test.rb +0 -78
  121. data/test/sorting_test.rb +0 -59
  122. data/test/support/connection/hiredis.rb +0 -1
  123. data/test/support/connection/ruby.rb +0 -1
  124. data/test/support/connection/synchrony.rb +0 -17
  125. data/test/support/redis_mock.rb +0 -115
  126. data/test/support/wire/synchrony.rb +0 -24
  127. data/test/support/wire/thread.rb +0 -5
  128. data/test/synchrony_driver.rb +0 -88
  129. data/test/test.conf +0 -9
  130. data/test/thread_safety_test.rb +0 -32
  131. data/test/transactions_test.rb +0 -264
  132. data/test/unknown_commands_test.rb +0 -14
  133. 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
@@ -1,10 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
- require "lint/hashes"
5
-
6
- class TestDistributedCommandsOnHashes < Test::Unit::TestCase
7
-
8
- include Helper::Distributed
9
- include Lint::Hashes
10
- end