redis 4.0.1 → 4.8.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 (148) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +220 -0
  3. data/README.md +152 -28
  4. data/lib/redis/client.rb +171 -107
  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 +34 -0
  11. data/lib/redis/cluster/option.rb +100 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +46 -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 +455 -0
  22. data/lib/redis/commands/lists.rb +290 -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 +223 -0
  27. data/lib/redis/commands/sorted_sets.rb +812 -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 +139 -0
  31. data/lib/redis/commands.rb +240 -0
  32. data/lib/redis/connection/command_helper.rb +5 -2
  33. data/lib/redis/connection/hiredis.rb +7 -5
  34. data/lib/redis/connection/registry.rb +2 -1
  35. data/lib/redis/connection/ruby.rb +139 -111
  36. data/lib/redis/connection/synchrony.rb +17 -10
  37. data/lib/redis/connection.rb +3 -1
  38. data/lib/redis/distributed.rb +244 -87
  39. data/lib/redis/errors.rb +57 -0
  40. data/lib/redis/hash_ring.rb +15 -14
  41. data/lib/redis/pipeline.rb +181 -10
  42. data/lib/redis/subscribe.rb +11 -12
  43. data/lib/redis/version.rb +3 -1
  44. data/lib/redis.rb +180 -2716
  45. metadata +45 -195
  46. data/.gitignore +0 -16
  47. data/.travis/Gemfile +0 -13
  48. data/.travis.yml +0 -73
  49. data/.yardopts +0 -3
  50. data/Gemfile +0 -3
  51. data/benchmarking/logging.rb +0 -71
  52. data/benchmarking/pipeline.rb +0 -51
  53. data/benchmarking/speed.rb +0 -21
  54. data/benchmarking/suite.rb +0 -24
  55. data/benchmarking/worker.rb +0 -71
  56. data/bors.toml +0 -14
  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/makefile +0 -42
  70. data/redis.gemspec +0 -42
  71. data/test/bitpos_test.rb +0 -63
  72. data/test/blocking_commands_test.rb +0 -40
  73. data/test/client_test.rb +0 -59
  74. data/test/command_map_test.rb +0 -28
  75. data/test/commands_on_hashes_test.rb +0 -19
  76. data/test/commands_on_hyper_log_log_test.rb +0 -19
  77. data/test/commands_on_lists_test.rb +0 -18
  78. data/test/commands_on_sets_test.rb +0 -75
  79. data/test/commands_on_sorted_sets_test.rb +0 -150
  80. data/test/commands_on_strings_test.rb +0 -99
  81. data/test/commands_on_value_types_test.rb +0 -171
  82. data/test/connection_handling_test.rb +0 -275
  83. data/test/connection_test.rb +0 -57
  84. data/test/db/.gitkeep +0 -0
  85. data/test/distributed_blocking_commands_test.rb +0 -44
  86. data/test/distributed_commands_on_hashes_test.rb +0 -8
  87. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -31
  88. data/test/distributed_commands_on_lists_test.rb +0 -20
  89. data/test/distributed_commands_on_sets_test.rb +0 -106
  90. data/test/distributed_commands_on_sorted_sets_test.rb +0 -16
  91. data/test/distributed_commands_on_strings_test.rb +0 -69
  92. data/test/distributed_commands_on_value_types_test.rb +0 -93
  93. data/test/distributed_commands_requiring_clustering_test.rb +0 -162
  94. data/test/distributed_connection_handling_test.rb +0 -21
  95. data/test/distributed_internals_test.rb +0 -68
  96. data/test/distributed_key_tags_test.rb +0 -50
  97. data/test/distributed_persistence_control_commands_test.rb +0 -24
  98. data/test/distributed_publish_subscribe_test.rb +0 -90
  99. data/test/distributed_remote_server_control_commands_test.rb +0 -64
  100. data/test/distributed_scripting_test.rb +0 -100
  101. data/test/distributed_sorting_test.rb +0 -18
  102. data/test/distributed_test.rb +0 -56
  103. data/test/distributed_transactions_test.rb +0 -30
  104. data/test/encoding_test.rb +0 -14
  105. data/test/error_replies_test.rb +0 -57
  106. data/test/fork_safety_test.rb +0 -60
  107. data/test/helper.rb +0 -201
  108. data/test/helper_test.rb +0 -22
  109. data/test/internals_test.rb +0 -389
  110. data/test/lint/blocking_commands.rb +0 -150
  111. data/test/lint/hashes.rb +0 -162
  112. data/test/lint/hyper_log_log.rb +0 -60
  113. data/test/lint/lists.rb +0 -143
  114. data/test/lint/sets.rb +0 -140
  115. data/test/lint/sorted_sets.rb +0 -316
  116. data/test/lint/strings.rb +0 -246
  117. data/test/lint/value_types.rb +0 -130
  118. data/test/persistence_control_commands_test.rb +0 -24
  119. data/test/pipelining_commands_test.rb +0 -238
  120. data/test/publish_subscribe_test.rb +0 -280
  121. data/test/remote_server_control_commands_test.rb +0 -175
  122. data/test/scanning_test.rb +0 -407
  123. data/test/scripting_test.rb +0 -76
  124. data/test/sentinel_command_test.rb +0 -78
  125. data/test/sentinel_test.rb +0 -253
  126. data/test/sorting_test.rb +0 -57
  127. data/test/ssl_test.rb +0 -69
  128. data/test/support/connection/hiredis.rb +0 -1
  129. data/test/support/connection/ruby.rb +0 -1
  130. data/test/support/connection/synchrony.rb +0 -17
  131. data/test/support/redis_mock.rb +0 -130
  132. data/test/support/ssl/gen_certs.sh +0 -31
  133. data/test/support/ssl/trusted-ca.crt +0 -25
  134. data/test/support/ssl/trusted-ca.key +0 -27
  135. data/test/support/ssl/trusted-cert.crt +0 -81
  136. data/test/support/ssl/trusted-cert.key +0 -28
  137. data/test/support/ssl/untrusted-ca.crt +0 -26
  138. data/test/support/ssl/untrusted-ca.key +0 -27
  139. data/test/support/ssl/untrusted-cert.crt +0 -82
  140. data/test/support/ssl/untrusted-cert.key +0 -28
  141. data/test/support/wire/synchrony.rb +0 -24
  142. data/test/support/wire/thread.rb +0 -5
  143. data/test/synchrony_driver.rb +0 -85
  144. data/test/test.conf.erb +0 -9
  145. data/test/thread_safety_test.rb +0 -60
  146. data/test/transactions_test.rb +0 -262
  147. data/test/unknown_commands_test.rb +0 -12
  148. data/test/url_param_test.rb +0 -136
@@ -1,93 +0,0 @@
1
- require_relative "helper"
2
- require_relative "lint/value_types"
3
-
4
- class TestDistributedCommandsOnValueTypes < Test::Unit::TestCase
5
-
6
- include Helper::Distributed
7
- include Lint::ValueTypes
8
-
9
- def test_del
10
- r.set "foo", "s1"
11
- r.set "bar", "s2"
12
- r.set "baz", "s3"
13
-
14
- assert_equal ["bar", "baz", "foo"], r.keys("*").sort
15
-
16
- assert_equal 1, r.del("foo")
17
-
18
- assert_equal ["bar", "baz"], r.keys("*").sort
19
-
20
- assert_equal 2, r.del("bar", "baz")
21
-
22
- assert_equal [], r.keys("*").sort
23
- end
24
-
25
- def test_del_with_array_argument
26
- r.set "foo", "s1"
27
- r.set "bar", "s2"
28
- r.set "baz", "s3"
29
-
30
- assert_equal ["bar", "baz", "foo"], r.keys("*").sort
31
-
32
- assert_equal 1, r.del(["foo"])
33
-
34
- assert_equal ["bar", "baz"], r.keys("*").sort
35
-
36
- assert_equal 2, r.del(["bar", "baz"])
37
-
38
- assert_equal [], r.keys("*").sort
39
- end
40
-
41
- def test_randomkey
42
- assert_raise Redis::Distributed::CannotDistribute do
43
- r.randomkey
44
- end
45
- end
46
-
47
- def test_rename
48
- assert_raise Redis::Distributed::CannotDistribute do
49
- r.set("foo", "s1")
50
- r.rename "foo", "bar"
51
- end
52
-
53
- assert_equal "s1", r.get("foo")
54
- assert_equal nil, r.get("bar")
55
- end
56
-
57
- def test_renamenx
58
- assert_raise Redis::Distributed::CannotDistribute do
59
- r.set("foo", "s1")
60
- r.rename "foo", "bar"
61
- end
62
-
63
- assert_equal "s1", r.get("foo")
64
- assert_equal nil , r.get("bar")
65
- end
66
-
67
- def test_dbsize
68
- assert_equal [0], r.dbsize
69
-
70
- r.set("foo", "s1")
71
-
72
- assert_equal [1], r.dbsize
73
- end
74
-
75
- def test_flushdb
76
- r.set("foo", "s1")
77
- r.set("bar", "s2")
78
-
79
- assert_equal [2], r.dbsize
80
-
81
- r.flushdb
82
-
83
- assert_equal [0], r.dbsize
84
- end
85
-
86
- def test_migrate
87
- r.set("foo", "s1")
88
-
89
- assert_raise Redis::Distributed::CannotDistribute do
90
- r.migrate("foo", {})
91
- end
92
- end
93
- end
@@ -1,162 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedCommandsRequiringClustering < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def test_rename
8
- r.set("{qux}foo", "s1")
9
- r.rename "{qux}foo", "{qux}bar"
10
-
11
- assert_equal "s1", r.get("{qux}bar")
12
- assert_equal nil, r.get("{qux}foo")
13
- end
14
-
15
- def test_renamenx
16
- r.set("{qux}foo", "s1")
17
- r.set("{qux}bar", "s2")
18
-
19
- assert_equal false, r.renamenx("{qux}foo", "{qux}bar")
20
-
21
- assert_equal "s1", r.get("{qux}foo")
22
- assert_equal "s2", r.get("{qux}bar")
23
- end
24
-
25
- def test_brpoplpush
26
- r.rpush "{qux}foo", "s1"
27
- r.rpush "{qux}foo", "s2"
28
-
29
- assert_equal "s2", r.brpoplpush("{qux}foo", "{qux}bar", :timeout => 1)
30
- assert_equal ["s2"], r.lrange("{qux}bar", 0, -1)
31
- end
32
-
33
- def test_rpoplpush
34
- r.rpush "{qux}foo", "s1"
35
- r.rpush "{qux}foo", "s2"
36
-
37
- assert_equal "s2", r.rpoplpush("{qux}foo", "{qux}bar")
38
- assert_equal ["s2"], r.lrange("{qux}bar", 0, -1)
39
- assert_equal "s1", r.rpoplpush("{qux}foo", "{qux}bar")
40
- assert_equal ["s1", "s2"], r.lrange("{qux}bar", 0, -1)
41
- end
42
-
43
- def test_smove
44
- r.sadd "{qux}foo", "s1"
45
- r.sadd "{qux}bar", "s2"
46
-
47
- assert r.smove("{qux}foo", "{qux}bar", "s1")
48
- assert r.sismember("{qux}bar", "s1")
49
- end
50
-
51
- def test_sinter
52
- r.sadd "{qux}foo", "s1"
53
- r.sadd "{qux}foo", "s2"
54
- r.sadd "{qux}bar", "s2"
55
-
56
- assert_equal ["s2"], r.sinter("{qux}foo", "{qux}bar")
57
- end
58
-
59
- def test_sinterstore
60
- r.sadd "{qux}foo", "s1"
61
- r.sadd "{qux}foo", "s2"
62
- r.sadd "{qux}bar", "s2"
63
-
64
- r.sinterstore("{qux}baz", "{qux}foo", "{qux}bar")
65
-
66
- assert_equal ["s2"], r.smembers("{qux}baz")
67
- end
68
-
69
- def test_sunion
70
- r.sadd "{qux}foo", "s1"
71
- r.sadd "{qux}foo", "s2"
72
- r.sadd "{qux}bar", "s2"
73
- r.sadd "{qux}bar", "s3"
74
-
75
- assert_equal ["s1", "s2", "s3"], r.sunion("{qux}foo", "{qux}bar").sort
76
- end
77
-
78
- def test_sunionstore
79
- r.sadd "{qux}foo", "s1"
80
- r.sadd "{qux}foo", "s2"
81
- r.sadd "{qux}bar", "s2"
82
- r.sadd "{qux}bar", "s3"
83
-
84
- r.sunionstore("{qux}baz", "{qux}foo", "{qux}bar")
85
-
86
- assert_equal ["s1", "s2", "s3"], r.smembers("{qux}baz").sort
87
- end
88
-
89
- def test_sdiff
90
- r.sadd "{qux}foo", "s1"
91
- r.sadd "{qux}foo", "s2"
92
- r.sadd "{qux}bar", "s2"
93
- r.sadd "{qux}bar", "s3"
94
-
95
- assert_equal ["s1"], r.sdiff("{qux}foo", "{qux}bar")
96
- assert_equal ["s3"], r.sdiff("{qux}bar", "{qux}foo")
97
- end
98
-
99
- def test_sdiffstore
100
- r.sadd "{qux}foo", "s1"
101
- r.sadd "{qux}foo", "s2"
102
- r.sadd "{qux}bar", "s2"
103
- r.sadd "{qux}bar", "s3"
104
-
105
- r.sdiffstore("{qux}baz", "{qux}foo", "{qux}bar")
106
-
107
- assert_equal ["s1"], r.smembers("{qux}baz")
108
- end
109
-
110
- def test_sort
111
- r.set("{qux}foo:1", "s1")
112
- r.set("{qux}foo:2", "s2")
113
-
114
- r.rpush("{qux}bar", "1")
115
- r.rpush("{qux}bar", "2")
116
-
117
- assert_equal ["s1"], r.sort("{qux}bar", :get => "{qux}foo:*", :limit => [0, 1])
118
- assert_equal ["s2"], r.sort("{qux}bar", :get => "{qux}foo:*", :limit => [0, 1], :order => "desc alpha")
119
- end
120
-
121
- def test_sort_with_an_array_of_gets
122
- r.set("{qux}foo:1:a", "s1a")
123
- r.set("{qux}foo:1:b", "s1b")
124
-
125
- r.set("{qux}foo:2:a", "s2a")
126
- r.set("{qux}foo:2:b", "s2b")
127
-
128
- r.rpush("{qux}bar", "1")
129
- r.rpush("{qux}bar", "2")
130
-
131
- assert_equal [["s1a", "s1b"]], r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"], :limit => [0, 1])
132
- assert_equal [["s2a", "s2b"]], r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"], :limit => [0, 1], :order => "desc alpha")
133
- assert_equal [["s1a", "s1b"], ["s2a", "s2b"]], r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"])
134
- end
135
-
136
- def test_sort_with_store
137
- r.set("{qux}foo:1", "s1")
138
- r.set("{qux}foo:2", "s2")
139
-
140
- r.rpush("{qux}bar", "1")
141
- r.rpush("{qux}bar", "2")
142
-
143
- r.sort("{qux}bar", :get => "{qux}foo:*", :store => "{qux}baz")
144
- assert_equal ["s1", "s2"], r.lrange("{qux}baz", 0, -1)
145
- end
146
-
147
- def test_bitop
148
- target_version "2.5.10" do
149
- r.set("{qux}foo", "a")
150
- r.set("{qux}bar", "b")
151
-
152
- r.bitop(:and, "{qux}foo&bar", "{qux}foo", "{qux}bar")
153
- assert_equal "\x60", r.get("{qux}foo&bar")
154
- r.bitop(:or, "{qux}foo|bar", "{qux}foo", "{qux}bar")
155
- assert_equal "\x63", r.get("{qux}foo|bar")
156
- r.bitop(:xor, "{qux}foo^bar", "{qux}foo", "{qux}bar")
157
- assert_equal "\x03", r.get("{qux}foo^bar")
158
- r.bitop(:not, "{qux}~foo", "{qux}foo")
159
- assert_equal "\x9E", r.get("{qux}~foo")
160
- end
161
- end
162
- end
@@ -1,21 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedConnectionHandling < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def test_ping
8
- assert_equal ["PONG"], r.ping
9
- end
10
-
11
- def test_select
12
- r.set "foo", "bar"
13
-
14
- r.select 14
15
- assert_equal nil, r.get("foo")
16
-
17
- r.select 15
18
-
19
- assert_equal "bar", r.get("foo")
20
- end
21
- end
@@ -1,68 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedInternals < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def test_provides_a_meaningful_inspect
8
- nodes = ["redis://127.0.0.1:#{PORT}/15", *NODES]
9
- redis = Redis::Distributed.new nodes
10
-
11
- assert_equal "#<Redis client v#{Redis::VERSION} for #{redis.nodes.map(&:id).join(', ')}>", redis.inspect
12
- end
13
-
14
- def test_default_as_urls
15
- nodes = ["redis://127.0.0.1:#{PORT}/15", *NODES]
16
- redis = Redis::Distributed.new nodes
17
- assert_equal ["redis://127.0.0.1:#{PORT}/15", *NODES], redis.nodes.map { |node| node._client.id }
18
- end
19
-
20
- def test_default_as_config_hashes
21
- nodes = [OPTIONS.merge(:host => '127.0.0.1'), OPTIONS.merge(:host => 'somehost', :port => PORT.next)]
22
- redis = Redis::Distributed.new nodes
23
- assert_equal ["redis://127.0.0.1:#{PORT}/15","redis://somehost:#{PORT.next}/15"], redis.nodes.map { |node| node._client.id }
24
- end
25
-
26
- def test_as_mix_and_match
27
- nodes = ["redis://127.0.0.1:7389/15", OPTIONS.merge(:host => 'somehost'), OPTIONS.merge(:host => 'somehost', :port => PORT.next)]
28
- redis = Redis::Distributed.new nodes
29
- assert_equal ["redis://127.0.0.1:7389/15", "redis://somehost:#{PORT}/15", "redis://somehost:#{PORT.next}/15"], redis.nodes.map { |node| node._client.id }
30
- end
31
-
32
- def test_override_id
33
- nodes = [OPTIONS.merge(:host => '127.0.0.1', :id => "test"), OPTIONS.merge( :host => 'somehost', :port => PORT.next, :id => "test1")]
34
- redis = Redis::Distributed.new nodes
35
- assert_equal redis.nodes.first._client.id, "test"
36
- assert_equal redis.nodes.last._client.id, "test1"
37
- assert_equal "#<Redis client v#{Redis::VERSION} for #{redis.nodes.map(&:id).join(', ')}>", redis.inspect
38
- end
39
-
40
- def test_can_be_duped_to_create_a_new_connection
41
- redis = Redis::Distributed.new(NODES)
42
-
43
- clients = redis.info[0]["connected_clients"].to_i
44
-
45
- r2 = redis.dup
46
- r2.ping
47
-
48
- assert_equal clients + 1, redis.info[0]["connected_clients"].to_i
49
- end
50
-
51
- def test_keeps_options_after_dup
52
- r1 = Redis::Distributed.new(NODES, :tag => /^(\w+):/)
53
-
54
- assert_raise(Redis::Distributed::CannotDistribute) do
55
- r1.sinter("foo", "bar")
56
- end
57
-
58
- assert_equal [], r1.sinter("baz:foo", "baz:bar")
59
-
60
- r2 = r1.dup
61
-
62
- assert_raise(Redis::Distributed::CannotDistribute) do
63
- r2.sinter("foo", "bar")
64
- end
65
-
66
- assert_equal [], r2.sinter("baz:foo", "baz:bar")
67
- end
68
- end
@@ -1,50 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedKeyTags < Test::Unit::TestCase
4
-
5
- include Helper
6
- include Helper::Distributed
7
-
8
- def test_hashes_consistently
9
- r1 = Redis::Distributed.new ["redis://127.0.0.1:#{PORT}/15", *NODES]
10
- r2 = Redis::Distributed.new ["redis://127.0.0.1:#{PORT}/15", *NODES]
11
- r3 = Redis::Distributed.new ["redis://127.0.0.1:#{PORT}/15", *NODES]
12
-
13
- assert_equal r1.node_for("foo").id, r2.node_for("foo").id
14
- assert_equal r1.node_for("foo").id, r3.node_for("foo").id
15
- end
16
-
17
- def test_allows_clustering_of_keys
18
- r = Redis::Distributed.new(NODES)
19
- r.add_node("redis://127.0.0.1:#{PORT}/14")
20
- r.flushdb
21
-
22
- 100.times do |i|
23
- r.set "{foo}users:#{i}", i
24
- end
25
-
26
- assert_equal [0, 100], r.nodes.map { |node| node.keys.size }
27
- end
28
-
29
- def test_distributes_keys_if_no_clustering_is_used
30
- r.add_node("redis://127.0.0.1:#{PORT}/14")
31
- r.flushdb
32
-
33
- r.set "users:1", 1
34
- r.set "users:4", 4
35
-
36
- assert_equal [1, 1], r.nodes.map { |node| node.keys.size }
37
- end
38
-
39
- def test_allows_passing_a_custom_tag_extractor
40
- r = Redis::Distributed.new(NODES, :tag => /^(.+?):/)
41
- r.add_node("redis://127.0.0.1:#{PORT}/14")
42
- r.flushdb
43
-
44
- 100.times do |i|
45
- r.set "foo:users:#{i}", i
46
- end
47
-
48
- assert_equal [0, 100], r.nodes.map { |node| node.keys.size }
49
- end
50
- end
@@ -1,24 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedPersistenceControlCommands < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
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,90 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedPublishSubscribe < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def test_subscribe_and_unsubscribe
8
- assert_raise Redis::Distributed::CannotDistribute do
9
- r.subscribe("foo", "bar") { }
10
- end
11
-
12
- assert_raise Redis::Distributed::CannotDistribute do
13
- r.subscribe("{qux}foo", "bar") { }
14
- end
15
- end
16
-
17
- def test_subscribe_and_unsubscribe_with_tags
18
- @subscribed = false
19
- @unsubscribed = false
20
-
21
- wire = Wire.new do
22
- r.subscribe("foo") do |on|
23
- on.subscribe do |channel, total|
24
- @subscribed = true
25
- @t1 = total
26
- end
27
-
28
- on.message do |channel, message|
29
- if message == "s1"
30
- r.unsubscribe
31
- @message = message
32
- end
33
- end
34
-
35
- on.unsubscribe do |channel, total|
36
- @unsubscribed = true
37
- @t2 = total
38
- end
39
- end
40
- end
41
-
42
- # Wait until the subscription is active before publishing
43
- Wire.pass while !@subscribed
44
-
45
- Redis::Distributed.new(NODES).publish("foo", "s1")
46
-
47
- wire.join
48
-
49
- assert @subscribed
50
- assert_equal 1, @t1
51
- assert @unsubscribed
52
- assert_equal 0, @t2
53
- assert_equal "s1", @message
54
- end
55
-
56
- def test_subscribe_within_subscribe
57
- @channels = []
58
-
59
- wire = Wire.new do
60
- r.subscribe("foo") do |on|
61
- on.subscribe do |channel, total|
62
- @channels << channel
63
-
64
- r.subscribe("bar") if channel == "foo"
65
- r.unsubscribe if channel == "bar"
66
- end
67
- end
68
- end
69
-
70
- wire.join
71
-
72
- assert_equal ["foo", "bar"], @channels
73
- end
74
-
75
- def test_other_commands_within_a_subscribe
76
- assert_raise Redis::CommandError do
77
- r.subscribe("foo") do |on|
78
- on.subscribe do |channel, total|
79
- r.set("bar", "s2")
80
- end
81
- end
82
- end
83
- end
84
-
85
- def test_subscribe_without_a_block
86
- assert_raise LocalJumpError do
87
- r.subscribe("foo")
88
- end
89
- end
90
- end
@@ -1,64 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedRemoteServerControlCommands < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def test_info
8
- keys = [
9
- "redis_version",
10
- "uptime_in_seconds",
11
- "uptime_in_days",
12
- "connected_clients",
13
- "used_memory",
14
- "total_connections_received",
15
- "total_commands_processed",
16
- ]
17
-
18
- infos = r.info
19
-
20
- infos.each do |info|
21
- keys.each do |k|
22
- msg = "expected #info to include #{k}"
23
- assert info.keys.include?(k), msg
24
- end
25
- end
26
- end
27
-
28
- def test_info_commandstats
29
- target_version "2.5.7" do
30
- r.nodes.each { |n| n.config(:resetstat) }
31
- r.ping # Executed on every node
32
-
33
- r.info(:commandstats).each do |info|
34
- assert_equal "1", info["ping"]["calls"]
35
- end
36
- end
37
- end
38
-
39
- def test_monitor
40
- begin
41
- r.monitor
42
- rescue Exception => ex
43
- ensure
44
- assert ex.kind_of?(NotImplementedError)
45
- end
46
- end
47
-
48
- def test_echo
49
- assert_equal ["foo bar baz\n"], r.echo("foo bar baz\n")
50
- end
51
-
52
- def test_time
53
- target_version "2.5.4" do
54
- # Test that the difference between the time that Ruby reports and the time
55
- # that Redis reports is minimal (prevents the test from being racy).
56
- r.time.each do |rv|
57
- redis_usec = rv[0] * 1_000_000 + rv[1]
58
- ruby_usec = Integer(Time.now.to_f * 1_000_000)
59
-
60
- assert 500_000 > (ruby_usec - redis_usec).abs
61
- end
62
- end
63
- end
64
- end
@@ -1,100 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedScripting < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def to_sha(script)
8
- r.script(:load, script).first
9
- end
10
-
11
- def test_script_exists
12
- target_version "2.5.9" do # 2.6-rc1
13
- a = to_sha("return 1")
14
- b = a.succ
15
-
16
- assert_equal [true], r.script(:exists, a)
17
- assert_equal [false], r.script(:exists, b)
18
- assert_equal [[true]], r.script(:exists, [a])
19
- assert_equal [[false]], r.script(:exists, [b])
20
- assert_equal [[true, false]], r.script(:exists, [a, b])
21
- end
22
- end
23
-
24
- def test_script_flush
25
- target_version "2.5.9" do # 2.6-rc1
26
- sha = to_sha("return 1")
27
- assert r.script(:exists, sha).first
28
- assert_equal ["OK"], r.script(:flush)
29
- assert !r.script(:exists, sha).first
30
- end
31
- end
32
-
33
- def test_script_kill
34
- target_version "2.5.9" do # 2.6-rc1
35
- redis_mock(:script => lambda { |arg| "+#{arg.upcase}" }) do |redis|
36
- assert_equal ["KILL"], redis.script(:kill)
37
- end
38
- end
39
- end
40
-
41
- def test_eval
42
- target_version "2.5.9" do # 2.6-rc1
43
- assert_raises(Redis::Distributed::CannotDistribute) do
44
- r.eval("return #KEYS")
45
- end
46
-
47
- assert_raises(Redis::Distributed::CannotDistribute) do
48
- r.eval("return KEYS", ["k1", "k2"])
49
- end
50
-
51
- assert_equal ["k1"], r.eval("return KEYS", ["k1"])
52
- assert_equal ["a1", "a2"], r.eval("return ARGV", ["k1"], ["a1", "a2"])
53
- end
54
- end
55
-
56
- def test_eval_with_options_hash
57
- target_version "2.5.9" do # 2.6-rc1
58
- assert_raises(Redis::Distributed::CannotDistribute) do
59
- r.eval("return #KEYS", {})
60
- end
61
-
62
- assert_raises(Redis::Distributed::CannotDistribute) do
63
- r.eval("return KEYS", { :keys => ["k1", "k2"] })
64
- end
65
-
66
- assert_equal ["k1"], r.eval("return KEYS", { :keys => ["k1"] })
67
- assert_equal ["a1", "a2"], r.eval("return ARGV", { :keys => ["k1"], :argv => ["a1", "a2"] })
68
- end
69
- end
70
-
71
- def test_evalsha
72
- target_version "2.5.9" do # 2.6-rc1
73
- assert_raises(Redis::Distributed::CannotDistribute) do
74
- r.evalsha(to_sha("return #KEYS"))
75
- end
76
-
77
- assert_raises(Redis::Distributed::CannotDistribute) do
78
- r.evalsha(to_sha("return KEYS"), ["k1", "k2"])
79
- end
80
-
81
- assert_equal ["k1"], r.evalsha(to_sha("return KEYS"), ["k1"])
82
- assert_equal ["a1", "a2"], r.evalsha(to_sha("return ARGV"), ["k1"], ["a1", "a2"])
83
- end
84
- end
85
-
86
- def test_evalsha_with_options_hash
87
- target_version "2.5.9" do # 2.6-rc1
88
- assert_raises(Redis::Distributed::CannotDistribute) do
89
- r.evalsha(to_sha("return #KEYS"), {})
90
- end
91
-
92
- assert_raises(Redis::Distributed::CannotDistribute) do
93
- r.evalsha(to_sha("return KEYS"), { :keys => ["k1", "k2"] })
94
- end
95
-
96
- assert_equal ["k1"], r.evalsha(to_sha("return KEYS"), { :keys => ["k1"] })
97
- assert_equal ["a1", "a2"], r.evalsha(to_sha("return ARGV"), { :keys => ["k1"], :argv => ["a1", "a2"] })
98
- end
99
- end
100
- end
@@ -1,18 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestDistributedSorting < Test::Unit::TestCase
4
-
5
- include Helper::Distributed
6
-
7
- def test_sort
8
- assert_raise(Redis::Distributed::CannotDistribute) do
9
- r.set("foo:1", "s1")
10
- r.set("foo:2", "s2")
11
-
12
- r.rpush("bar", "1")
13
- r.rpush("bar", "2")
14
-
15
- r.sort("bar", :get => "foo:*", :limit => [0, 1])
16
- end
17
- end
18
- end