redis 3.3.5 → 4.0.0.rc1

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +32 -50
  3. data/CHANGELOG.md +7 -9
  4. data/Gemfile +0 -1
  5. data/README.md +31 -75
  6. data/benchmarking/logging.rb +1 -1
  7. data/lib/redis.rb +31 -35
  8. data/lib/redis/client.rb +13 -8
  9. data/lib/redis/connection.rb +2 -2
  10. data/lib/redis/connection/command_helper.rb +2 -8
  11. data/lib/redis/connection/hiredis.rb +2 -2
  12. data/lib/redis/connection/ruby.rb +7 -27
  13. data/lib/redis/connection/synchrony.rb +3 -3
  14. data/lib/redis/pipeline.rb +0 -6
  15. data/lib/redis/version.rb +1 -1
  16. data/makefile +42 -0
  17. data/redis.gemspec +4 -8
  18. data/test/bitpos_test.rb +13 -19
  19. data/test/blocking_commands_test.rb +147 -6
  20. data/test/client_test.rb +1 -1
  21. data/test/command_map_test.rb +3 -5
  22. data/test/commands_on_hashes_test.rb +158 -5
  23. data/test/commands_on_hyper_log_log_test.rb +55 -6
  24. data/test/commands_on_lists_test.rb +139 -5
  25. data/test/commands_on_sets_test.rb +136 -5
  26. data/test/commands_on_sorted_sets_test.rb +312 -5
  27. data/test/commands_on_strings_test.rb +243 -6
  28. data/test/commands_on_value_types_test.rb +120 -7
  29. data/test/connection_handling_test.rb +5 -7
  30. data/test/encoding_test.rb +4 -8
  31. data/test/error_replies_test.rb +2 -4
  32. data/test/fork_safety_test.rb +1 -6
  33. data/test/helper.rb +9 -62
  34. data/test/helper_test.rb +1 -3
  35. data/test/internals_test.rb +67 -49
  36. data/test/persistence_control_commands_test.rb +1 -3
  37. data/test/pipelining_commands_test.rb +4 -8
  38. data/test/publish_subscribe_test.rb +1 -3
  39. data/test/remote_server_control_commands_test.rb +61 -4
  40. data/test/scanning_test.rb +1 -7
  41. data/test/scripting_test.rb +1 -3
  42. data/test/sentinel_command_test.rb +1 -3
  43. data/test/sentinel_test.rb +1 -3
  44. data/test/sorting_test.rb +1 -3
  45. data/test/ssl_test.rb +45 -49
  46. data/test/support/connection/hiredis.rb +1 -1
  47. data/test/support/connection/ruby.rb +1 -1
  48. data/test/support/connection/synchrony.rb +1 -1
  49. data/test/synchrony_driver.rb +6 -9
  50. data/test/thread_safety_test.rb +1 -3
  51. data/test/transactions_test.rb +1 -3
  52. data/test/unknown_commands_test.rb +1 -3
  53. data/test/url_param_test.rb +44 -46
  54. metadata +31 -77
  55. data/Rakefile +0 -87
  56. data/examples/dist_redis.rb +0 -43
  57. data/lib/redis/distributed.rb +0 -873
  58. data/lib/redis/hash_ring.rb +0 -132
  59. data/test/connection_test.rb +0 -57
  60. data/test/distributed_blocking_commands_test.rb +0 -46
  61. data/test/distributed_commands_on_hashes_test.rb +0 -10
  62. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  63. data/test/distributed_commands_on_lists_test.rb +0 -22
  64. data/test/distributed_commands_on_sets_test.rb +0 -83
  65. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  66. data/test/distributed_commands_on_strings_test.rb +0 -59
  67. data/test/distributed_commands_on_value_types_test.rb +0 -95
  68. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  69. data/test/distributed_connection_handling_test.rb +0 -23
  70. data/test/distributed_internals_test.rb +0 -79
  71. data/test/distributed_key_tags_test.rb +0 -52
  72. data/test/distributed_persistence_control_commands_test.rb +0 -26
  73. data/test/distributed_publish_subscribe_test.rb +0 -92
  74. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  75. data/test/distributed_scripting_test.rb +0 -102
  76. data/test/distributed_sorting_test.rb +0 -20
  77. data/test/distributed_test.rb +0 -58
  78. data/test/distributed_transactions_test.rb +0 -32
  79. data/test/lint/blocking_commands.rb +0 -150
  80. data/test/lint/hashes.rb +0 -162
  81. data/test/lint/hyper_log_log.rb +0 -60
  82. data/test/lint/lists.rb +0 -143
  83. data/test/lint/sets.rb +0 -140
  84. data/test/lint/sorted_sets.rb +0 -316
  85. data/test/lint/strings.rb +0 -260
  86. data/test/lint/value_types.rb +0 -122
@@ -1,66 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestDistributedRemoteServerControlCommands < Test::Unit::TestCase
6
-
7
- include Helper::Distributed
8
-
9
- def test_info
10
- keys = [
11
- "redis_version",
12
- "uptime_in_seconds",
13
- "uptime_in_days",
14
- "connected_clients",
15
- "used_memory",
16
- "total_connections_received",
17
- "total_commands_processed",
18
- ]
19
-
20
- infos = r.info
21
-
22
- infos.each do |info|
23
- keys.each do |k|
24
- msg = "expected #info to include #{k}"
25
- assert info.keys.include?(k), msg
26
- end
27
- end
28
- end
29
-
30
- def test_info_commandstats
31
- target_version "2.5.7" do
32
- r.nodes.each { |n| n.config(:resetstat) }
33
- r.ping # Executed on every node
34
-
35
- r.info(:commandstats).each do |info|
36
- assert_equal "1", info["ping"]["calls"]
37
- end
38
- end
39
- end
40
-
41
- def test_monitor
42
- begin
43
- r.monitor
44
- rescue Exception => ex
45
- ensure
46
- assert ex.kind_of?(NotImplementedError)
47
- end
48
- end
49
-
50
- def test_echo
51
- assert_equal ["foo bar baz\n"], r.echo("foo bar baz\n")
52
- end
53
-
54
- def test_time
55
- target_version "2.5.4" do
56
- # Test that the difference between the time that Ruby reports and the time
57
- # that Redis reports is minimal (prevents the test from being racy).
58
- r.time.each do |rv|
59
- redis_usec = rv[0] * 1_000_000 + rv[1]
60
- ruby_usec = Integer(Time.now.to_f * 1_000_000)
61
-
62
- assert 500_000 > (ruby_usec - redis_usec).abs
63
- end
64
- end
65
- end
66
- end
@@ -1,102 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestDistributedScripting < Test::Unit::TestCase
6
-
7
- include Helper::Distributed
8
-
9
- def to_sha(script)
10
- r.script(:load, script).first
11
- end
12
-
13
- def test_script_exists
14
- target_version "2.5.9" do # 2.6-rc1
15
- a = to_sha("return 1")
16
- b = a.succ
17
-
18
- assert_equal [true], r.script(:exists, a)
19
- assert_equal [false], r.script(:exists, b)
20
- assert_equal [[true]], r.script(:exists, [a])
21
- assert_equal [[false]], r.script(:exists, [b])
22
- assert_equal [[true, false]], r.script(:exists, [a, b])
23
- end
24
- end
25
-
26
- def test_script_flush
27
- target_version "2.5.9" do # 2.6-rc1
28
- sha = to_sha("return 1")
29
- assert r.script(:exists, sha).first
30
- assert_equal ["OK"], r.script(:flush)
31
- assert !r.script(:exists, sha).first
32
- end
33
- end
34
-
35
- def test_script_kill
36
- target_version "2.5.9" do # 2.6-rc1
37
- redis_mock(:script => lambda { |arg| "+#{arg.upcase}" }) do |redis|
38
- assert_equal ["KILL"], redis.script(:kill)
39
- end
40
- end
41
- end
42
-
43
- def test_eval
44
- target_version "2.5.9" do # 2.6-rc1
45
- assert_raises(Redis::Distributed::CannotDistribute) do
46
- r.eval("return #KEYS")
47
- end
48
-
49
- assert_raises(Redis::Distributed::CannotDistribute) do
50
- r.eval("return KEYS", ["k1", "k2"])
51
- end
52
-
53
- assert_equal ["k1"], r.eval("return KEYS", ["k1"])
54
- assert_equal ["a1", "a2"], r.eval("return ARGV", ["k1"], ["a1", "a2"])
55
- end
56
- end
57
-
58
- def test_eval_with_options_hash
59
- target_version "2.5.9" do # 2.6-rc1
60
- assert_raises(Redis::Distributed::CannotDistribute) do
61
- r.eval("return #KEYS", {})
62
- end
63
-
64
- assert_raises(Redis::Distributed::CannotDistribute) do
65
- r.eval("return KEYS", { :keys => ["k1", "k2"] })
66
- end
67
-
68
- assert_equal ["k1"], r.eval("return KEYS", { :keys => ["k1"] })
69
- assert_equal ["a1", "a2"], r.eval("return ARGV", { :keys => ["k1"], :argv => ["a1", "a2"] })
70
- end
71
- end
72
-
73
- def test_evalsha
74
- target_version "2.5.9" do # 2.6-rc1
75
- assert_raises(Redis::Distributed::CannotDistribute) do
76
- r.evalsha(to_sha("return #KEYS"))
77
- end
78
-
79
- assert_raises(Redis::Distributed::CannotDistribute) do
80
- r.evalsha(to_sha("return KEYS"), ["k1", "k2"])
81
- end
82
-
83
- assert_equal ["k1"], r.evalsha(to_sha("return KEYS"), ["k1"])
84
- assert_equal ["a1", "a2"], r.evalsha(to_sha("return ARGV"), ["k1"], ["a1", "a2"])
85
- end
86
- end
87
-
88
- def test_evalsha_with_options_hash
89
- target_version "2.5.9" do # 2.6-rc1
90
- assert_raises(Redis::Distributed::CannotDistribute) do
91
- r.evalsha(to_sha("return #KEYS"), {})
92
- end
93
-
94
- assert_raises(Redis::Distributed::CannotDistribute) do
95
- r.evalsha(to_sha("return KEYS"), { :keys => ["k1", "k2"] })
96
- end
97
-
98
- assert_equal ["k1"], r.evalsha(to_sha("return KEYS"), { :keys => ["k1"] })
99
- assert_equal ["a1", "a2"], r.evalsha(to_sha("return ARGV"), { :keys => ["k1"], :argv => ["a1", "a2"] })
100
- end
101
- end
102
- end
@@ -1,20 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestDistributedSorting < Test::Unit::TestCase
6
-
7
- include Helper::Distributed
8
-
9
- def test_sort
10
- assert_raise(Redis::Distributed::CannotDistribute) do
11
- r.set("foo:1", "s1")
12
- r.set("foo:2", "s2")
13
-
14
- r.rpush("bar", "1")
15
- r.rpush("bar", "2")
16
-
17
- r.sort("bar", :get => "foo:*", :limit => [0, 1])
18
- end
19
- end
20
- end
@@ -1,58 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestDistributed < Test::Unit::TestCase
6
-
7
- include Helper::Distributed
8
-
9
- def test_handle_multiple_servers
10
- @r = Redis::Distributed.new ["redis://localhost:#{PORT}/15", *NODES]
11
-
12
- 100.times do |idx|
13
- @r.set(idx.to_s, "foo#{idx}")
14
- end
15
-
16
- 100.times do |idx|
17
- assert_equal "foo#{idx}", @r.get(idx.to_s)
18
- end
19
-
20
- assert_equal "0", @r.keys("*").sort.first
21
- assert_equal "string", @r.type("1")
22
- end
23
-
24
- def test_add_nodes
25
- logger = Logger.new("/dev/null")
26
-
27
- @r = Redis::Distributed.new NODES, :logger => logger, :timeout => 10
28
-
29
- assert_equal "127.0.0.1", @r.nodes[0].client.host
30
- assert_equal PORT, @r.nodes[0].client.port
31
- assert_equal 15, @r.nodes[0].client.db
32
- assert_equal 10, @r.nodes[0].client.timeout
33
- assert_equal logger, @r.nodes[0].client.logger
34
-
35
- @r.add_node("redis://127.0.0.1:6380/14")
36
-
37
- assert_equal "127.0.0.1", @r.nodes[1].client.host
38
- assert_equal 6380, @r.nodes[1].client.port
39
- assert_equal 14, @r.nodes[1].client.db
40
- assert_equal 10, @r.nodes[1].client.timeout
41
- assert_equal logger, @r.nodes[1].client.logger
42
- end
43
-
44
- def test_pipelining_commands_cannot_be_distributed
45
- assert_raise Redis::Distributed::CannotDistribute do
46
- r.pipelined do
47
- r.lpush "foo", "s1"
48
- r.lpush "foo", "s2"
49
- end
50
- end
51
- end
52
-
53
- def test_unknown_commands_does_not_work_by_default
54
- assert_raise NoMethodError do
55
- r.not_yet_implemented_command
56
- end
57
- end
58
- end
@@ -1,32 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestDistributedTransactions < Test::Unit::TestCase
6
-
7
- include Helper::Distributed
8
-
9
- def test_multi_discard
10
- @foo = nil
11
-
12
- assert_raise Redis::Distributed::CannotDistribute do
13
- r.multi { @foo = 1 }
14
- end
15
-
16
- assert_equal nil, @foo
17
-
18
- assert_raise Redis::Distributed::CannotDistribute do
19
- r.discard
20
- end
21
- end
22
-
23
- def test_watch_unwatch
24
- assert_raise Redis::Distributed::CannotDistribute do
25
- r.watch("foo")
26
- end
27
-
28
- assert_raise Redis::Distributed::CannotDistribute do
29
- r.unwatch
30
- end
31
- end
32
- end
@@ -1,150 +0,0 @@
1
- module Lint
2
-
3
- module BlockingCommands
4
-
5
- def setup
6
- super
7
-
8
- r.rpush("{zap}foo", "s1")
9
- r.rpush("{zap}foo", "s2")
10
- r.rpush("{zap}bar", "s1")
11
- r.rpush("{zap}bar", "s2")
12
- end
13
-
14
- def to_protocol(obj)
15
- case obj
16
- when String
17
- "$#{obj.length}\r\n#{obj}\r\n"
18
- when Array
19
- "*#{obj.length}\r\n" + obj.map { |e| to_protocol(e) }.join
20
- else
21
- fail
22
- end
23
- end
24
-
25
- def mock(options = {}, &blk)
26
- commands = {
27
- :blpop => lambda do |*args|
28
- sleep options[:delay] if options.has_key?(:delay)
29
- to_protocol([args.first, args.last])
30
- end,
31
- :brpop => lambda do |*args|
32
- sleep options[:delay] if options.has_key?(:delay)
33
- to_protocol([args.first, args.last])
34
- end,
35
- :brpoplpush => lambda do |*args|
36
- sleep options[:delay] if options.has_key?(:delay)
37
- to_protocol(args.last)
38
- end
39
- }
40
-
41
- redis_mock(commands, &blk)
42
- end
43
-
44
- def test_blpop
45
- assert_equal ["{zap}foo", "s1"], r.blpop("{zap}foo")
46
- assert_equal ["{zap}foo", "s2"], r.blpop(["{zap}foo"])
47
- assert_equal ["{zap}bar", "s1"], r.blpop(["{zap}bar", "{zap}foo"])
48
- assert_equal ["{zap}bar", "s2"], r.blpop(["{zap}foo", "{zap}bar"])
49
- end
50
-
51
- def test_blpop_timeout
52
- mock do |r|
53
- assert_equal ["{zap}foo", "0"], r.blpop("{zap}foo")
54
- assert_equal ["{zap}foo", "1"], r.blpop("{zap}foo", :timeout => 1)
55
- end
56
- end
57
-
58
- def test_blpop_with_old_prototype
59
- assert_equal ["{zap}foo", "s1"], r.blpop("{zap}foo", 0)
60
- assert_equal ["{zap}foo", "s2"], r.blpop("{zap}foo", 0)
61
- assert_equal ["{zap}bar", "s1"], r.blpop("{zap}bar", "{zap}foo", 0)
62
- assert_equal ["{zap}bar", "s2"], r.blpop("{zap}foo", "{zap}bar", 0)
63
- end
64
-
65
- def test_blpop_timeout_with_old_prototype
66
- mock do |r|
67
- assert_equal ["{zap}foo", "0"], r.blpop("{zap}foo", 0)
68
- assert_equal ["{zap}foo", "1"], r.blpop("{zap}foo", 1)
69
- end
70
- end
71
-
72
- def test_brpop
73
- assert_equal ["{zap}foo", "s2"], r.brpop("{zap}foo")
74
- assert_equal ["{zap}foo", "s1"], r.brpop(["{zap}foo"])
75
- assert_equal ["{zap}bar", "s2"], r.brpop(["{zap}bar", "{zap}foo"])
76
- assert_equal ["{zap}bar", "s1"], r.brpop(["{zap}foo", "{zap}bar"])
77
- end
78
-
79
- def test_brpop_timeout
80
- mock do |r|
81
- assert_equal ["{zap}foo", "0"], r.brpop("{zap}foo")
82
- assert_equal ["{zap}foo", "1"], r.brpop("{zap}foo", :timeout => 1)
83
- end
84
- end
85
-
86
- def test_brpop_with_old_prototype
87
- assert_equal ["{zap}foo", "s2"], r.brpop("{zap}foo", 0)
88
- assert_equal ["{zap}foo", "s1"], r.brpop("{zap}foo", 0)
89
- assert_equal ["{zap}bar", "s2"], r.brpop("{zap}bar", "{zap}foo", 0)
90
- assert_equal ["{zap}bar", "s1"], r.brpop("{zap}foo", "{zap}bar", 0)
91
- end
92
-
93
- def test_brpop_timeout_with_old_prototype
94
- mock do |r|
95
- assert_equal ["{zap}foo", "0"], r.brpop("{zap}foo", 0)
96
- assert_equal ["{zap}foo", "1"], r.brpop("{zap}foo", 1)
97
- end
98
- end
99
-
100
- def test_brpoplpush
101
- assert_equal "s2", r.brpoplpush("{zap}foo", "{zap}qux")
102
- assert_equal ["s2"], r.lrange("{zap}qux", 0, -1)
103
- end
104
-
105
- def test_brpoplpush_timeout
106
- mock do |r|
107
- assert_equal "0", r.brpoplpush("{zap}foo", "{zap}bar")
108
- assert_equal "1", r.brpoplpush("{zap}foo", "{zap}bar", :timeout => 1)
109
- end
110
- end
111
-
112
- def test_brpoplpush_with_old_prototype
113
- assert_equal "s2", r.brpoplpush("{zap}foo", "{zap}qux", 0)
114
- assert_equal ["s2"], r.lrange("{zap}qux", 0, -1)
115
- end
116
-
117
- def test_brpoplpush_timeout_with_old_prototype
118
- mock do |r|
119
- assert_equal "0", r.brpoplpush("{zap}foo", "{zap}bar", 0)
120
- assert_equal "1", r.brpoplpush("{zap}foo", "{zap}bar", 1)
121
- end
122
- end
123
-
124
- driver(:ruby, :hiredis) do
125
- def test_blpop_socket_timeout
126
- mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
127
- assert_raises(Redis::TimeoutError) do
128
- r.blpop("{zap}foo", :timeout => 1)
129
- end
130
- end
131
- end
132
-
133
- def test_brpop_socket_timeout
134
- mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
135
- assert_raises(Redis::TimeoutError) do
136
- r.brpop("{zap}foo", :timeout => 1)
137
- end
138
- end
139
- end
140
-
141
- def test_brpoplpush_socket_timeout
142
- mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
143
- assert_raises(Redis::TimeoutError) do
144
- r.brpoplpush("{zap}foo", "{zap}bar", :timeout => 1)
145
- end
146
- end
147
- end
148
- end
149
- end
150
- end
data/test/lint/hashes.rb DELETED
@@ -1,162 +0,0 @@
1
- module Lint
2
-
3
- module Hashes
4
-
5
- def test_hset_and_hget
6
- r.hset("foo", "f1", "s1")
7
-
8
- assert_equal "s1", r.hget("foo", "f1")
9
- end
10
-
11
- def test_hsetnx
12
- r.hset("foo", "f1", "s1")
13
- r.hsetnx("foo", "f1", "s2")
14
-
15
- assert_equal "s1", r.hget("foo", "f1")
16
-
17
- r.del("foo")
18
- r.hsetnx("foo", "f1", "s2")
19
-
20
- assert_equal "s2", r.hget("foo", "f1")
21
- end
22
-
23
- def test_hdel
24
- r.hset("foo", "f1", "s1")
25
-
26
- assert_equal "s1", r.hget("foo", "f1")
27
-
28
- assert_equal 1, r.hdel("foo", "f1")
29
-
30
- assert_equal nil, r.hget("foo", "f1")
31
- end
32
-
33
- def test_variadic_hdel
34
- target_version "2.3.9" do
35
- r.hset("foo", "f1", "s1")
36
- r.hset("foo", "f2", "s2")
37
-
38
- assert_equal "s1", r.hget("foo", "f1")
39
- assert_equal "s2", r.hget("foo", "f2")
40
-
41
- assert_equal 2, r.hdel("foo", ["f1", "f2"])
42
-
43
- assert_equal nil, r.hget("foo", "f1")
44
- assert_equal nil, r.hget("foo", "f2")
45
- end
46
- end
47
-
48
- def test_hexists
49
- assert_equal false, r.hexists("foo", "f1")
50
-
51
- r.hset("foo", "f1", "s1")
52
-
53
- assert r.hexists("foo", "f1")
54
- end
55
-
56
- def test_hlen
57
- assert_equal 0, r.hlen("foo")
58
-
59
- r.hset("foo", "f1", "s1")
60
-
61
- assert_equal 1, r.hlen("foo")
62
-
63
- r.hset("foo", "f2", "s2")
64
-
65
- assert_equal 2, r.hlen("foo")
66
- end
67
-
68
- def test_hkeys
69
- assert_equal [], r.hkeys("foo")
70
-
71
- r.hset("foo", "f1", "s1")
72
- r.hset("foo", "f2", "s2")
73
-
74
- assert_equal ["f1", "f2"], r.hkeys("foo")
75
- end
76
-
77
- def test_hvals
78
- assert_equal [], r.hvals("foo")
79
-
80
- r.hset("foo", "f1", "s1")
81
- r.hset("foo", "f2", "s2")
82
-
83
- assert_equal ["s1", "s2"], r.hvals("foo")
84
- end
85
-
86
- def test_hgetall
87
- assert({} == r.hgetall("foo"))
88
-
89
- r.hset("foo", "f1", "s1")
90
- r.hset("foo", "f2", "s2")
91
-
92
- assert({"f1" => "s1", "f2" => "s2"} == r.hgetall("foo"))
93
- end
94
-
95
- def test_hmset
96
- r.hmset("hash", "foo1", "bar1", "foo2", "bar2")
97
-
98
- assert_equal "bar1", r.hget("hash", "foo1")
99
- assert_equal "bar2", r.hget("hash", "foo2")
100
- end
101
-
102
- def test_hmset_with_invalid_arguments
103
- assert_raise(Redis::CommandError) do
104
- r.hmset("hash", "foo1", "bar1", "foo2", "bar2", "foo3")
105
- end
106
- end
107
-
108
- def test_mapped_hmset
109
- r.mapped_hmset("foo", :f1 => "s1", :f2 => "s2")
110
-
111
- assert_equal "s1", r.hget("foo", "f1")
112
- assert_equal "s2", r.hget("foo", "f2")
113
- end
114
-
115
- def test_hmget
116
- r.hset("foo", "f1", "s1")
117
- r.hset("foo", "f2", "s2")
118
- r.hset("foo", "f3", "s3")
119
-
120
- assert_equal ["s2", "s3"], r.hmget("foo", "f2", "f3")
121
- end
122
-
123
- def test_hmget_mapped
124
- r.hset("foo", "f1", "s1")
125
- r.hset("foo", "f2", "s2")
126
- r.hset("foo", "f3", "s3")
127
-
128
- assert({"f1" => "s1"} == r.mapped_hmget("foo", "f1"))
129
- assert({"f1" => "s1", "f2" => "s2"} == r.mapped_hmget("foo", "f1", "f2"))
130
- end
131
-
132
- def test_hincrby
133
- r.hincrby("foo", "f1", 1)
134
-
135
- assert_equal "1", r.hget("foo", "f1")
136
-
137
- r.hincrby("foo", "f1", 2)
138
-
139
- assert_equal "3", r.hget("foo", "f1")
140
-
141
- r.hincrby("foo", "f1", -1)
142
-
143
- assert_equal "2", r.hget("foo", "f1")
144
- end
145
-
146
- def test_hincrbyfloat
147
- target_version "2.5.4" do
148
- r.hincrbyfloat("foo", "f1", 1.23)
149
-
150
- assert_equal "1.23", r.hget("foo", "f1")
151
-
152
- r.hincrbyfloat("foo", "f1", 0.77)
153
-
154
- assert_equal "2", r.hget("foo", "f1")
155
-
156
- r.hincrbyfloat("foo", "f1", -0.1)
157
-
158
- assert_equal "1.9", r.hget("foo", "f1")
159
- end
160
- end
161
- end
162
- end