redis 4.1.0.beta1 → 4.1.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 +4 -4
- data/CHANGELOG.md +13 -2
- data/README.md +45 -0
- data/lib/redis.rb +497 -20
- data/lib/redis/client.rb +14 -6
- data/lib/redis/cluster.rb +1 -0
- data/lib/redis/cluster/command_loader.rb +2 -0
- data/lib/redis/cluster/node_loader.rb +2 -0
- data/lib/redis/cluster/option.rb +1 -0
- data/lib/redis/cluster/slot_loader.rb +2 -0
- data/lib/redis/distributed.rb +3 -4
- data/lib/redis/version.rb +1 -1
- metadata +20 -243
- data/.gitignore +0 -19
- data/.travis.yml +0 -61
- data/.travis/Gemfile +0 -18
- data/.yardopts +0 -3
- data/Gemfile +0 -8
- 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/bin/build +0 -71
- data/bors.toml +0 -14
- 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.rb +0 -41
- data/examples/sentinel/start +0 -49
- data/examples/sets.rb +0 -36
- data/examples/unicorn/config.ru +0 -3
- data/examples/unicorn/unicorn.rb +0 -20
- data/makefile +0 -74
- data/redis.gemspec +0 -42
- data/test/bitpos_test.rb +0 -63
- data/test/blocking_commands_test.rb +0 -40
- data/test/client_test.rb +0 -76
- data/test/cluster_abnormal_state_test.rb +0 -38
- data/test/cluster_blocking_commands_test.rb +0 -15
- data/test/cluster_client_internals_test.rb +0 -77
- data/test/cluster_client_key_hash_tags_test.rb +0 -88
- data/test/cluster_client_options_test.rb +0 -147
- data/test/cluster_client_pipelining_test.rb +0 -59
- data/test/cluster_client_replicas_test.rb +0 -36
- data/test/cluster_client_slots_test.rb +0 -94
- data/test/cluster_client_transactions_test.rb +0 -71
- data/test/cluster_commands_on_cluster_test.rb +0 -165
- data/test/cluster_commands_on_connection_test.rb +0 -40
- data/test/cluster_commands_on_geo_test.rb +0 -74
- data/test/cluster_commands_on_hashes_test.rb +0 -11
- data/test/cluster_commands_on_hyper_log_log_test.rb +0 -17
- data/test/cluster_commands_on_keys_test.rb +0 -134
- data/test/cluster_commands_on_lists_test.rb +0 -15
- data/test/cluster_commands_on_pub_sub_test.rb +0 -101
- data/test/cluster_commands_on_scripting_test.rb +0 -56
- data/test/cluster_commands_on_server_test.rb +0 -221
- data/test/cluster_commands_on_sets_test.rb +0 -39
- data/test/cluster_commands_on_sorted_sets_test.rb +0 -35
- data/test/cluster_commands_on_streams_test.rb +0 -196
- data/test/cluster_commands_on_strings_test.rb +0 -15
- data/test/cluster_commands_on_transactions_test.rb +0 -41
- data/test/cluster_commands_on_value_types_test.rb +0 -14
- data/test/command_map_test.rb +0 -28
- data/test/commands_on_geo_test.rb +0 -116
- data/test/commands_on_hashes_test.rb +0 -7
- data/test/commands_on_hyper_log_log_test.rb +0 -7
- data/test/commands_on_lists_test.rb +0 -7
- data/test/commands_on_sets_test.rb +0 -7
- data/test/commands_on_sorted_sets_test.rb +0 -7
- data/test/commands_on_strings_test.rb +0 -7
- data/test/commands_on_value_types_test.rb +0 -207
- data/test/connection_handling_test.rb +0 -275
- data/test/connection_test.rb +0 -57
- data/test/distributed_blocking_commands_test.rb +0 -52
- data/test/distributed_commands_on_hashes_test.rb +0 -21
- data/test/distributed_commands_on_hyper_log_log_test.rb +0 -26
- data/test/distributed_commands_on_lists_test.rb +0 -19
- data/test/distributed_commands_on_sets_test.rb +0 -105
- data/test/distributed_commands_on_sorted_sets_test.rb +0 -59
- data/test/distributed_commands_on_strings_test.rb +0 -79
- data/test/distributed_commands_on_value_types_test.rb +0 -129
- data/test/distributed_commands_requiring_clustering_test.rb +0 -162
- data/test/distributed_connection_handling_test.rb +0 -21
- data/test/distributed_internals_test.rb +0 -68
- data/test/distributed_key_tags_test.rb +0 -50
- data/test/distributed_persistence_control_commands_test.rb +0 -24
- data/test/distributed_publish_subscribe_test.rb +0 -90
- data/test/distributed_remote_server_control_commands_test.rb +0 -64
- data/test/distributed_scripting_test.rb +0 -100
- data/test/distributed_sorting_test.rb +0 -18
- data/test/distributed_test.rb +0 -56
- data/test/distributed_transactions_test.rb +0 -30
- data/test/encoding_test.rb +0 -14
- data/test/error_replies_test.rb +0 -57
- data/test/fork_safety_test.rb +0 -60
- data/test/helper.rb +0 -344
- data/test/helper_test.rb +0 -22
- data/test/internals_test.rb +0 -395
- data/test/lint/blocking_commands.rb +0 -174
- data/test/lint/hashes.rb +0 -203
- data/test/lint/hyper_log_log.rb +0 -74
- data/test/lint/lists.rb +0 -159
- data/test/lint/sets.rb +0 -282
- data/test/lint/sorted_sets.rb +0 -497
- data/test/lint/strings.rb +0 -348
- data/test/lint/value_types.rb +0 -130
- data/test/persistence_control_commands_test.rb +0 -24
- data/test/pipelining_commands_test.rb +0 -246
- data/test/publish_subscribe_test.rb +0 -280
- data/test/remote_server_control_commands_test.rb +0 -175
- data/test/scanning_test.rb +0 -407
- data/test/scripting_test.rb +0 -76
- data/test/sentinel_command_test.rb +0 -78
- data/test/sentinel_test.rb +0 -253
- data/test/sorting_test.rb +0 -57
- data/test/ssl_test.rb +0 -69
- data/test/support/cluster/orchestrator.rb +0 -199
- 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 -130
- data/test/support/ssl/gen_certs.sh +0 -31
- data/test/support/ssl/trusted-ca.crt +0 -25
- data/test/support/ssl/trusted-ca.key +0 -27
- data/test/support/ssl/trusted-cert.crt +0 -81
- data/test/support/ssl/trusted-cert.key +0 -28
- data/test/support/ssl/untrusted-ca.crt +0 -26
- data/test/support/ssl/untrusted-ca.key +0 -27
- data/test/support/ssl/untrusted-cert.crt +0 -82
- data/test/support/ssl/untrusted-cert.key +0 -28
- data/test/support/wire/synchrony.rb +0 -24
- data/test/support/wire/thread.rb +0 -5
- data/test/synchrony_driver.rb +0 -85
- data/test/test.conf.erb +0 -9
- data/test/thread_safety_test.rb +0 -60
- data/test/transactions_test.rb +0 -272
- data/test/unknown_commands_test.rb +0 -12
- data/test/url_param_test.rb +0 -136
@@ -1,74 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
|
5
|
-
# ruby -w -Itest test/cluster_commands_on_geo_test.rb
|
6
|
-
# @see https://redis.io/commands#geo
|
7
|
-
class TestClusterCommandsOnGeo < Test::Unit::TestCase
|
8
|
-
include Helper::Cluster
|
9
|
-
|
10
|
-
MIN_REDIS_VERSION = '3.2.0'
|
11
|
-
|
12
|
-
def add_sicily
|
13
|
-
redis.geoadd('Sicily',
|
14
|
-
13.361389, 38.115556, 'Palermo',
|
15
|
-
15.087269, 37.502669, 'Catania')
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_geoadd
|
19
|
-
target_version(MIN_REDIS_VERSION) do
|
20
|
-
assert_equal 2, add_sicily
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_geohash
|
25
|
-
target_version(MIN_REDIS_VERSION) do
|
26
|
-
add_sicily
|
27
|
-
assert_equal %w[sqc8b49rny0 sqdtr74hyu0], redis.geohash('Sicily', %w[Palermo Catania])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_geopos
|
32
|
-
target_version(MIN_REDIS_VERSION) do
|
33
|
-
add_sicily
|
34
|
-
expected = [%w[13.36138933897018433 38.11555639549629859],
|
35
|
-
%w[15.08726745843887329 37.50266842333162032],
|
36
|
-
nil]
|
37
|
-
assert_equal expected, redis.geopos('Sicily', %w[Palermo Catania NonExisting])
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_geodist
|
42
|
-
target_version(MIN_REDIS_VERSION) do
|
43
|
-
add_sicily
|
44
|
-
assert_equal '166274.1516', redis.geodist('Sicily', 'Palermo', 'Catania')
|
45
|
-
assert_equal '166.2742', redis.geodist('Sicily', 'Palermo', 'Catania', 'km')
|
46
|
-
assert_equal '103.3182', redis.geodist('Sicily', 'Palermo', 'Catania', 'mi')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_georadius
|
51
|
-
target_version(MIN_REDIS_VERSION) do
|
52
|
-
add_sicily
|
53
|
-
|
54
|
-
expected = [%w[Palermo 190.4424], %w[Catania 56.4413]]
|
55
|
-
assert_equal expected, redis.georadius('Sicily', 15, 37, 200, 'km', 'WITHDIST')
|
56
|
-
|
57
|
-
expected = [['Palermo', %w[13.36138933897018433 38.11555639549629859]],
|
58
|
-
['Catania', %w[15.08726745843887329 37.50266842333162032]]]
|
59
|
-
assert_equal expected, redis.georadius('Sicily', 15, 37, 200, 'km', 'WITHCOORD')
|
60
|
-
|
61
|
-
expected = [['Palermo', '190.4424', %w[13.36138933897018433 38.11555639549629859]],
|
62
|
-
['Catania', '56.4413', %w[15.08726745843887329 37.50266842333162032]]]
|
63
|
-
assert_equal expected, redis.georadius('Sicily', 15, 37, 200, 'km', 'WITHDIST', 'WITHCOORD')
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_georadiusbymember
|
68
|
-
target_version(MIN_REDIS_VERSION) do
|
69
|
-
redis.geoadd('Sicily', 13.583333, 37.316667, 'Agrigento')
|
70
|
-
add_sicily
|
71
|
-
assert_equal %w[Agrigento Palermo], redis.georadiusbymember('Sicily', 'Agrigento', 100, 'km')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
require_relative 'lint/hashes'
|
5
|
-
|
6
|
-
# ruby -w -Itest test/cluster_commands_on_hashes_test.rb
|
7
|
-
# @see https://redis.io/commands#hash
|
8
|
-
class TestClusterCommandsOnHashes < Test::Unit::TestCase
|
9
|
-
include Helper::Cluster
|
10
|
-
include Lint::Hashes
|
11
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
require_relative 'lint/hyper_log_log'
|
5
|
-
|
6
|
-
# ruby -w -Itest test/cluster_commands_on_hyper_log_log_test.rb
|
7
|
-
# @see https://redis.io/commands#hyperloglog
|
8
|
-
class TestClusterCommandsOnHyperLogLog < Test::Unit::TestCase
|
9
|
-
include Helper::Cluster
|
10
|
-
include Lint::HyperLogLog
|
11
|
-
|
12
|
-
def test_pfmerge
|
13
|
-
assert_raise Redis::CommandError do
|
14
|
-
super
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,134 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
|
5
|
-
# ruby -w -Itest test/cluster_commands_on_keys_test.rb
|
6
|
-
# @see https://redis.io/commands#generic
|
7
|
-
class TestClusterCommandsOnKeys < Test::Unit::TestCase
|
8
|
-
include Helper::Cluster
|
9
|
-
|
10
|
-
def set_some_keys
|
11
|
-
redis.set('key1', 'Hello')
|
12
|
-
redis.set('key2', 'World')
|
13
|
-
|
14
|
-
redis.set('{key}1', 'Hello')
|
15
|
-
redis.set('{key}2', 'World')
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_del
|
19
|
-
set_some_keys
|
20
|
-
|
21
|
-
assert_raise(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
|
22
|
-
redis.del('key1', 'key2')
|
23
|
-
end
|
24
|
-
|
25
|
-
assert_equal 2, redis.del('{key}1', '{key}2')
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_migrate
|
29
|
-
redis.set('mykey', 1)
|
30
|
-
|
31
|
-
assert_raise(Redis::CommandError, 'ERR Target instance replied with error: MOVED 14687 127.0.0.1:7002') do
|
32
|
-
# We cannot move between cluster nodes.
|
33
|
-
redis.migrate('mykey', host: '127.0.0.1', port: 7000)
|
34
|
-
end
|
35
|
-
|
36
|
-
redis_cluster_mock(migrate: ->(*_) { '-IOERR error or timeout writing to target instance' }) do |redis|
|
37
|
-
assert_raise(Redis::CommandError, 'IOERR error or timeout writing to target instance') do
|
38
|
-
redis.migrate('mykey', host: '127.0.0.1', port: 11211)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
redis_cluster_mock(migrate: ->(*_) { '+OK' }) do |redis|
|
43
|
-
assert_equal 'OK', redis.migrate('mykey', host: '127.0.0.1', port: 6379)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_object
|
48
|
-
redis.lpush('mylist', 'Hello World')
|
49
|
-
assert_equal 1, redis.object('refcount', 'mylist')
|
50
|
-
expected_encoding = version < '3.2.0' ? 'ziplist' : 'quicklist'
|
51
|
-
assert_equal expected_encoding, redis.object('encoding', 'mylist')
|
52
|
-
expected_instance_type = RUBY_VERSION < '2.4.0' ? Fixnum : Integer
|
53
|
-
assert_instance_of expected_instance_type, redis.object('idletime', 'mylist')
|
54
|
-
|
55
|
-
redis.set('foo', 1000)
|
56
|
-
assert_equal 'int', redis.object('encoding', 'foo')
|
57
|
-
|
58
|
-
redis.set('bar', '1000bar')
|
59
|
-
assert_equal 'embstr', redis.object('encoding', 'bar')
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_randomkey
|
63
|
-
set_some_keys
|
64
|
-
assert_true redis.randomkey.is_a?(String)
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_rename
|
68
|
-
set_some_keys
|
69
|
-
|
70
|
-
assert_raise(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
|
71
|
-
redis.rename('key1', 'key3')
|
72
|
-
end
|
73
|
-
|
74
|
-
assert_equal 'OK', redis.rename('{key}1', '{key}3')
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_renamenx
|
78
|
-
set_some_keys
|
79
|
-
|
80
|
-
assert_raise(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
|
81
|
-
redis.renamenx('key1', 'key2')
|
82
|
-
end
|
83
|
-
|
84
|
-
assert_equal false, redis.renamenx('{key}1', '{key}2')
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_sort
|
88
|
-
redis.lpush('mylist', 3)
|
89
|
-
redis.lpush('mylist', 1)
|
90
|
-
redis.lpush('mylist', 5)
|
91
|
-
redis.lpush('mylist', 2)
|
92
|
-
redis.lpush('mylist', 4)
|
93
|
-
assert_equal %w[1 2 3 4 5], redis.sort('mylist')
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_touch
|
97
|
-
target_version('3.2.1') do
|
98
|
-
set_some_keys
|
99
|
-
assert_equal 1, redis.touch('key1')
|
100
|
-
assert_equal 1, redis.touch('key2')
|
101
|
-
assert_equal 1, redis.touch('key1', 'key2')
|
102
|
-
assert_equal 2, redis.touch('{key}1', '{key}2')
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_unlink
|
107
|
-
target_version('4.0.0') do
|
108
|
-
set_some_keys
|
109
|
-
assert_raise(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
|
110
|
-
redis.unlink('key1', 'key2', 'key3')
|
111
|
-
end
|
112
|
-
assert_equal 2, redis.unlink('{key}1', '{key}2', '{key}3')
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_wait
|
117
|
-
set_some_keys
|
118
|
-
assert_equal 1, redis.wait(1, 0)
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_scan
|
122
|
-
set_some_keys
|
123
|
-
|
124
|
-
cursor = 0
|
125
|
-
all_keys = []
|
126
|
-
loop do
|
127
|
-
cursor, keys = redis.scan(cursor, match: '{key}*')
|
128
|
-
all_keys += keys
|
129
|
-
break if cursor == '0'
|
130
|
-
end
|
131
|
-
|
132
|
-
assert_equal 2, all_keys.uniq.size
|
133
|
-
end
|
134
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
require_relative 'lint/lists'
|
5
|
-
|
6
|
-
# ruby -w -Itest test/cluster_commands_on_lists_test.rb
|
7
|
-
# @see https://redis.io/commands#list
|
8
|
-
class TestClusterCommandsOnLists < Test::Unit::TestCase
|
9
|
-
include Helper::Cluster
|
10
|
-
include Lint::Lists
|
11
|
-
|
12
|
-
def test_rpoplpush
|
13
|
-
assert_raise(Redis::CommandError) { super }
|
14
|
-
end
|
15
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
|
5
|
-
# ruby -w -Itest test/cluster_commands_on_pub_sub_test.rb
|
6
|
-
# @see https://redis.io/commands#pubsub
|
7
|
-
class TestClusterCommandsOnPubSub < Test::Unit::TestCase
|
8
|
-
include Helper::Cluster
|
9
|
-
|
10
|
-
def test_publish_subscribe_unsubscribe_pubsub
|
11
|
-
sub_cnt = 0
|
12
|
-
messages = {}
|
13
|
-
|
14
|
-
wire = Wire.new do
|
15
|
-
redis.subscribe('channel1', 'channel2') do |on|
|
16
|
-
on.subscribe { |_c, t| sub_cnt = t }
|
17
|
-
on.unsubscribe { |_c, t| sub_cnt = t }
|
18
|
-
on.message do |c, msg|
|
19
|
-
messages[c] = msg
|
20
|
-
# FIXME: blocking occurs when `unsubscribe` method was called with channel arguments
|
21
|
-
redis.unsubscribe if messages.size == 2
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
Wire.pass until sub_cnt == 2
|
27
|
-
|
28
|
-
publisher = build_another_client
|
29
|
-
|
30
|
-
assert_equal %w[channel1 channel2], publisher.pubsub(:channels)
|
31
|
-
assert_equal %w[channel1 channel2], publisher.pubsub(:channels, 'cha*')
|
32
|
-
assert_equal [], publisher.pubsub(:channels, 'chachacha*')
|
33
|
-
assert_equal({}, publisher.pubsub(:numsub))
|
34
|
-
assert_equal({ 'channel1' => 1, 'channel2' => 1, 'channel3' => 0 },
|
35
|
-
publisher.pubsub(:numsub, 'channel1', 'channel2', 'channel3'))
|
36
|
-
assert_equal 0, publisher.pubsub(:numpat)
|
37
|
-
|
38
|
-
publisher.publish('channel1', 'one')
|
39
|
-
publisher.publish('channel2', 'two')
|
40
|
-
|
41
|
-
wire.join
|
42
|
-
|
43
|
-
assert_equal({ 'channel1' => 'one', 'channel2' => 'two' }, messages.sort.to_h)
|
44
|
-
|
45
|
-
assert_equal [], publisher.pubsub(:channels)
|
46
|
-
assert_equal [], publisher.pubsub(:channels, 'cha*')
|
47
|
-
assert_equal [], publisher.pubsub(:channels, 'chachacha*')
|
48
|
-
assert_equal({}, publisher.pubsub(:numsub))
|
49
|
-
assert_equal({ 'channel1' => 0, 'channel2' => 0, 'channel3' => 0 },
|
50
|
-
publisher.pubsub(:numsub, 'channel1', 'channel2', 'channel3'))
|
51
|
-
assert_equal 0, publisher.pubsub(:numpat)
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_publish_psubscribe_punsubscribe_pubsub
|
55
|
-
sub_cnt = 0
|
56
|
-
messages = {}
|
57
|
-
|
58
|
-
wire = Wire.new do
|
59
|
-
redis.psubscribe('cha*', 'her*') do |on|
|
60
|
-
on.psubscribe { |_c, t| sub_cnt = t }
|
61
|
-
on.punsubscribe { |_c, t| sub_cnt = t }
|
62
|
-
on.pmessage do |_ptn, chn, msg|
|
63
|
-
messages[chn] = msg
|
64
|
-
# FIXME: blocking occurs when `unsubscribe` method was called with channel arguments
|
65
|
-
redis.punsubscribe if messages.size == 3
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
Wire.pass until sub_cnt == 2
|
71
|
-
|
72
|
-
publisher = build_another_client
|
73
|
-
|
74
|
-
assert_equal [], publisher.pubsub(:channels)
|
75
|
-
assert_equal [], publisher.pubsub(:channels, 'cha*')
|
76
|
-
assert_equal [], publisher.pubsub(:channels, 'her*')
|
77
|
-
assert_equal [], publisher.pubsub(:channels, 'guc*')
|
78
|
-
assert_equal({}, publisher.pubsub(:numsub))
|
79
|
-
assert_equal({ 'channel1' => 0, 'channel2' => 0, 'hermes3' => 0, 'gucci4' => 0 },
|
80
|
-
publisher.pubsub(:numsub, 'channel1', 'channel2', 'hermes3', 'gucci4'))
|
81
|
-
assert_equal 2, publisher.pubsub(:numpat)
|
82
|
-
|
83
|
-
publisher.publish('chanel1', 'one')
|
84
|
-
publisher.publish('chanel2', 'two')
|
85
|
-
publisher.publish('hermes3', 'three')
|
86
|
-
publisher.publish('gucci4', 'four')
|
87
|
-
|
88
|
-
wire.join
|
89
|
-
|
90
|
-
assert_equal({ 'chanel1' => 'one', 'chanel2' => 'two', 'hermes3' => 'three' }, messages.sort.to_h)
|
91
|
-
|
92
|
-
assert_equal [], publisher.pubsub(:channels)
|
93
|
-
assert_equal [], publisher.pubsub(:channels, 'cha*')
|
94
|
-
assert_equal [], publisher.pubsub(:channels, 'her*')
|
95
|
-
assert_equal [], publisher.pubsub(:channels, 'guc*')
|
96
|
-
assert_equal({}, publisher.pubsub(:numsub))
|
97
|
-
assert_equal({ 'channel1' => 0, 'channel2' => 0, 'hermes3' => 0, 'gucci4' => 0 },
|
98
|
-
publisher.pubsub(:numsub, 'channel1', 'channel2', 'hermes3', 'gucci4'))
|
99
|
-
assert_equal 0, publisher.pubsub(:numpat)
|
100
|
-
end
|
101
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
|
5
|
-
# ruby -w -Itest test/cluster_commands_on_scripting_test.rb
|
6
|
-
# @see https://redis.io/commands#scripting
|
7
|
-
class TestClusterCommandsOnScripting < Test::Unit::TestCase
|
8
|
-
include Helper::Cluster
|
9
|
-
|
10
|
-
def test_eval
|
11
|
-
script = 'return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}'
|
12
|
-
argv = %w[first second]
|
13
|
-
|
14
|
-
keys = %w[key1 key2]
|
15
|
-
assert_raise(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
|
16
|
-
redis.eval(script, keys: keys, argv: argv)
|
17
|
-
end
|
18
|
-
|
19
|
-
keys = %w[{key}1 {key}2]
|
20
|
-
expected = %w[{key}1 {key}2 first second]
|
21
|
-
assert_equal expected, redis.eval(script, keys: keys, argv: argv)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_evalsha
|
25
|
-
sha = redis.script(:load, 'return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}')
|
26
|
-
expected = %w[{key}1 {key}2 first second]
|
27
|
-
assert_equal expected, redis.evalsha(sha, keys: %w[{key}1 {key}2], argv: %w[first second])
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_script_debug
|
31
|
-
target_version('3.2.0') do
|
32
|
-
assert_equal 'OK', redis.script(:debug, 'yes')
|
33
|
-
assert_equal 'OK', redis.script(:debug, 'no')
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_script_exists
|
38
|
-
sha = redis.script(:load, 'return 1')
|
39
|
-
assert_equal true, redis.script(:exists, sha)
|
40
|
-
assert_equal false, redis.script(:exists, 'unknownsha')
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_script_flush
|
44
|
-
assert_equal 'OK', redis.script(:flush)
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_script_kill
|
48
|
-
redis_cluster_mock(kill: -> { '+OK' }) do |redis|
|
49
|
-
assert_equal 'OK', redis.script(:kill)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_script_load
|
54
|
-
assert_equal 'e0e1f9fabfc9d4800c877a703b823ac0578ff8db', redis.script(:load, 'return 1')
|
55
|
-
end
|
56
|
-
end
|
@@ -1,221 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'helper'
|
4
|
-
|
5
|
-
# ruby -w -Itest test/cluster_commands_on_server_test.rb
|
6
|
-
# @see https://redis.io/commands#server
|
7
|
-
class TestClusterCommandsOnServer < Test::Unit::TestCase
|
8
|
-
include Helper::Cluster
|
9
|
-
|
10
|
-
def test_bgrewriteaof
|
11
|
-
assert_equal 'Background append only file rewriting started', redis.bgrewriteaof
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_bgsave
|
15
|
-
redis_cluster_mock(bgsave: ->(*_) { '+OK' }) do |redis|
|
16
|
-
assert_equal 'OK', redis.bgsave
|
17
|
-
end
|
18
|
-
|
19
|
-
err_msg = 'ERR An AOF log rewriting in progress: '\
|
20
|
-
"can't BGSAVE right now. "\
|
21
|
-
'Use BGSAVE SCHEDULE in order to schedule a BGSAVE whenever possible.'
|
22
|
-
|
23
|
-
redis_cluster_mock(bgsave: ->(*_) { "-Error #{err_msg}" }) do |redis|
|
24
|
-
assert_raise(Redis::Cluster::CommandErrorCollection, 'Command error replied on any node') do
|
25
|
-
redis.bgsave
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_client_kill
|
31
|
-
redis_cluster_mock(client: ->(*_) { '-Error ERR No such client' }) do |redis|
|
32
|
-
assert_raise(Redis::CommandError, 'ERR No such client') do
|
33
|
-
redis.client(:kill, '127.0.0.1:6379')
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
redis_cluster_mock(client: ->(*_) { '+OK' }) do |redis|
|
38
|
-
assert_equal 'OK', redis.client(:kill, '127.0.0.1:6379')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_client_list
|
43
|
-
a_client_info = redis.client(:list).first
|
44
|
-
actual = a_client_info.keys.sort
|
45
|
-
expected = %w[addr age cmd db events fd flags id idle multi name obl oll omem psub qbuf qbuf-free sub]
|
46
|
-
assert_equal expected, actual
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_client_getname
|
50
|
-
redis.client(:setname, 'my-client-01')
|
51
|
-
assert_equal 'my-client-01', redis.client(:getname)
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_client_pause
|
55
|
-
assert_equal 'OK', redis.client(:pause, 0)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_client_reply
|
59
|
-
target_version('3.2.0') do
|
60
|
-
assert_equal 'OK', redis.client(:reply, 'ON')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_client_setname
|
65
|
-
assert_equal 'OK', redis.client(:setname, 'my-client-01')
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_command
|
69
|
-
assert_instance_of Array, redis.command
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_command_count
|
73
|
-
assert_true(redis.command(:count) > 0)
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_command_getkeys
|
77
|
-
assert_equal %w[a c e], redis.command(:getkeys, :mset, 'a', 'b', 'c', 'd', 'e', 'f')
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_command_info
|
81
|
-
expected = [
|
82
|
-
['get', 2, %w[readonly fast], 1, 1, 1],
|
83
|
-
['set', -3, %w[write denyoom], 1, 1, 1],
|
84
|
-
['eval', -3, %w[noscript movablekeys], 0, 0, 0]
|
85
|
-
]
|
86
|
-
assert_equal expected, redis.command(:info, :get, :set, :eval)
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_config_get
|
90
|
-
expected_keys = if version < '3.2.0'
|
91
|
-
%w[hash-max-ziplist-entries list-max-ziplist-entries set-max-intset-entries zset-max-ziplist-entries]
|
92
|
-
else
|
93
|
-
%w[hash-max-ziplist-entries set-max-intset-entries zset-max-ziplist-entries]
|
94
|
-
end
|
95
|
-
|
96
|
-
assert_equal expected_keys, redis.config(:get, '*max-*-entries*').keys.sort
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_config_rewrite
|
100
|
-
redis_cluster_mock(config: ->(*_) { '-Error ERR Rewriting config file: Permission denied' }) do |redis|
|
101
|
-
assert_raise(Redis::Cluster::CommandErrorCollection, 'Command error replied on any node') do
|
102
|
-
redis.config(:rewrite)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
redis_cluster_mock(config: ->(*_) { '+OK' }) do |redis|
|
107
|
-
assert_equal 'OK', redis.config(:rewrite)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_config_set
|
112
|
-
assert_equal 'OK', redis.config(:set, 'hash-max-ziplist-entries', 512)
|
113
|
-
end
|
114
|
-
|
115
|
-
def test_config_resetstat
|
116
|
-
assert_equal 'OK', redis.config(:resetstat)
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_config_db_size
|
120
|
-
10.times { |i| redis.set("key#{i}", 1) }
|
121
|
-
assert_equal 10, redis.dbsize
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_debug_object
|
125
|
-
# DEBUG OBJECT is a debugging command that should not be used by clients.
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_debug_segfault
|
129
|
-
# DEBUG SEGFAULT performs an invalid memory access that crashes Redis.
|
130
|
-
# It is used to simulate bugs during the development.
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_flushall
|
134
|
-
assert_equal 'OK', redis.flushall
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_flushdb
|
138
|
-
assert_equal 'OK', redis.flushdb
|
139
|
-
end
|
140
|
-
|
141
|
-
def test_info
|
142
|
-
assert_equal({ 'cluster_enabled' => '1' }, redis.info(:cluster))
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_lastsave
|
146
|
-
assert_instance_of Array, redis.lastsave
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_memory_doctor
|
150
|
-
target_version('4.0.0') do
|
151
|
-
assert_instance_of String, redis.memory(:doctor)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def test_memory_help
|
156
|
-
target_version('4.0.0') do
|
157
|
-
assert_instance_of Array, redis.memory(:help)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def test_memory_malloc_stats
|
162
|
-
target_version('4.0.0') do
|
163
|
-
assert_instance_of String, redis.memory('malloc-stats')
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_memory_purge
|
168
|
-
target_version('4.0.0') do
|
169
|
-
assert_equal 'OK', redis.memory(:purge)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def test_memory_stats
|
174
|
-
target_version('4.0.0') do
|
175
|
-
assert_instance_of Array, redis.memory(:stats)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def test_memory_usage
|
180
|
-
target_version('4.0.0') do
|
181
|
-
redis.set('key1', 'Hello World')
|
182
|
-
assert_equal 61, redis.memory(:usage, 'key1')
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
def test_monitor
|
187
|
-
# Add MONITOR command test
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_role
|
191
|
-
assert_equal %w[master master master], redis.role.map(&:first)
|
192
|
-
end
|
193
|
-
|
194
|
-
def test_save
|
195
|
-
assert_equal 'OK', redis.save
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_shutdown
|
199
|
-
assert_raise(Redis::Cluster::OrchestrationCommandNotSupported, 'SHUTDOWN command should be...') do
|
200
|
-
redis.shutdown
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def test_slaveof
|
205
|
-
assert_raise(Redis::CommandError, 'ERR SLAVEOF not allowed in cluster mode.') do
|
206
|
-
redis.slaveof(:no, :one)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def test_slowlog
|
211
|
-
assert_instance_of Array, redis.slowlog(:get, 1)
|
212
|
-
end
|
213
|
-
|
214
|
-
def test_sync
|
215
|
-
# Internal command used for replication
|
216
|
-
end
|
217
|
-
|
218
|
-
def test_time
|
219
|
-
assert_instance_of Array, redis.time
|
220
|
-
end
|
221
|
-
end
|