modesty 0.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.
Files changed (130) hide show
  1. data/Gemfile +13 -0
  2. data/Gemfile.lock +18 -0
  3. data/LICENSE +21 -0
  4. data/README.md +121 -0
  5. data/Rakefile +29 -0
  6. data/VERSION +1 -0
  7. data/init.rb +1 -0
  8. data/lib/modesty.rb +26 -0
  9. data/lib/modesty/api.rb +14 -0
  10. data/lib/modesty/core_ext.rb +5 -0
  11. data/lib/modesty/core_ext/array.rb +21 -0
  12. data/lib/modesty/core_ext/fixnum.rb +5 -0
  13. data/lib/modesty/core_ext/hash.rb +39 -0
  14. data/lib/modesty/core_ext/string.rb +9 -0
  15. data/lib/modesty/core_ext/symbol.rb +33 -0
  16. data/lib/modesty/datastore.rb +51 -0
  17. data/lib/modesty/datastore/redis.rb +180 -0
  18. data/lib/modesty/experiment.rb +87 -0
  19. data/lib/modesty/experiment/base.rb +47 -0
  20. data/lib/modesty/experiment/builder.rb +48 -0
  21. data/lib/modesty/experiment/console.rb +4 -0
  22. data/lib/modesty/experiment/data.rb +75 -0
  23. data/lib/modesty/experiment/interface.rb +29 -0
  24. data/lib/modesty/experiment/significance.rb +376 -0
  25. data/lib/modesty/experiment/stats.rb +163 -0
  26. data/lib/modesty/frameworks/rails.rb +27 -0
  27. data/lib/modesty/identity.rb +32 -0
  28. data/lib/modesty/load.rb +80 -0
  29. data/lib/modesty/load/load_experiments.rb +14 -0
  30. data/lib/modesty/load/load_metrics.rb +17 -0
  31. data/lib/modesty/metric.rb +56 -0
  32. data/lib/modesty/metric/base.rb +38 -0
  33. data/lib/modesty/metric/builder.rb +23 -0
  34. data/lib/modesty/metric/data.rb +133 -0
  35. data/modesty.gemspec +192 -0
  36. data/spec/core_ext_spec.rb +17 -0
  37. data/spec/experiment_spec.rb +239 -0
  38. data/spec/identity_spec.rb +161 -0
  39. data/spec/load_spec.rb +87 -0
  40. data/spec/metric_spec.rb +176 -0
  41. data/spec/rails_spec.rb +48 -0
  42. data/spec/redis_spec.rb +29 -0
  43. data/spec/significance_spec.rb +147 -0
  44. data/spec/spec.opts +1 -0
  45. data/test/myapp/config/modesty.yml +9 -0
  46. data/test/myapp/modesty/experiments/cookbook.rb +4 -0
  47. data/test/myapp/modesty/metrics/kitchen_metrics.rb +9 -0
  48. data/test/myapp/modesty/metrics/stove/burner_metrics.rb +2 -0
  49. data/vendor/.piston.yml +8 -0
  50. data/vendor/mock_redis/.gitignore +2 -0
  51. data/vendor/mock_redis/README +8 -0
  52. data/vendor/mock_redis/lib/mock_redis.rb +10 -0
  53. data/vendor/mock_redis/lib/mock_redis/hash.rb +61 -0
  54. data/vendor/mock_redis/lib/mock_redis/list.rb +6 -0
  55. data/vendor/mock_redis/lib/mock_redis/misc.rb +69 -0
  56. data/vendor/mock_redis/lib/mock_redis/set.rb +108 -0
  57. data/vendor/mock_redis/lib/mock_redis/string.rb +32 -0
  58. data/vendor/redis-rb/.gitignore +8 -0
  59. data/vendor/redis-rb/LICENSE +20 -0
  60. data/vendor/redis-rb/README.markdown +129 -0
  61. data/vendor/redis-rb/Rakefile +155 -0
  62. data/vendor/redis-rb/benchmarking/logging.rb +62 -0
  63. data/vendor/redis-rb/benchmarking/pipeline.rb +51 -0
  64. data/vendor/redis-rb/benchmarking/speed.rb +21 -0
  65. data/vendor/redis-rb/benchmarking/suite.rb +24 -0
  66. data/vendor/redis-rb/benchmarking/thread_safety.rb +38 -0
  67. data/vendor/redis-rb/benchmarking/worker.rb +71 -0
  68. data/vendor/redis-rb/examples/basic.rb +15 -0
  69. data/vendor/redis-rb/examples/dist_redis.rb +43 -0
  70. data/vendor/redis-rb/examples/incr-decr.rb +17 -0
  71. data/vendor/redis-rb/examples/list.rb +26 -0
  72. data/vendor/redis-rb/examples/pubsub.rb +31 -0
  73. data/vendor/redis-rb/examples/sets.rb +36 -0
  74. data/vendor/redis-rb/examples/unicorn/config.ru +3 -0
  75. data/vendor/redis-rb/examples/unicorn/unicorn.rb +20 -0
  76. data/vendor/redis-rb/lib/redis.rb +676 -0
  77. data/vendor/redis-rb/lib/redis/client.rb +201 -0
  78. data/vendor/redis-rb/lib/redis/compat.rb +21 -0
  79. data/vendor/redis-rb/lib/redis/connection.rb +134 -0
  80. data/vendor/redis-rb/lib/redis/distributed.rb +526 -0
  81. data/vendor/redis-rb/lib/redis/hash_ring.rb +131 -0
  82. data/vendor/redis-rb/lib/redis/pipeline.rb +13 -0
  83. data/vendor/redis-rb/lib/redis/subscribe.rb +79 -0
  84. data/vendor/redis-rb/redis.gemspec +29 -0
  85. data/vendor/redis-rb/test/commands_on_hashes_test.rb +46 -0
  86. data/vendor/redis-rb/test/commands_on_lists_test.rb +50 -0
  87. data/vendor/redis-rb/test/commands_on_sets_test.rb +78 -0
  88. data/vendor/redis-rb/test/commands_on_sorted_sets_test.rb +109 -0
  89. data/vendor/redis-rb/test/commands_on_strings_test.rb +70 -0
  90. data/vendor/redis-rb/test/commands_on_value_types_test.rb +88 -0
  91. data/vendor/redis-rb/test/connection_handling_test.rb +87 -0
  92. data/vendor/redis-rb/test/db/.gitignore +1 -0
  93. data/vendor/redis-rb/test/distributd_key_tags_test.rb +53 -0
  94. data/vendor/redis-rb/test/distributed_blocking_commands_test.rb +54 -0
  95. data/vendor/redis-rb/test/distributed_commands_on_hashes_test.rb +12 -0
  96. data/vendor/redis-rb/test/distributed_commands_on_lists_test.rb +18 -0
  97. data/vendor/redis-rb/test/distributed_commands_on_sets_test.rb +85 -0
  98. data/vendor/redis-rb/test/distributed_commands_on_strings_test.rb +50 -0
  99. data/vendor/redis-rb/test/distributed_commands_on_value_types_test.rb +73 -0
  100. data/vendor/redis-rb/test/distributed_commands_requiring_clustering_test.rb +141 -0
  101. data/vendor/redis-rb/test/distributed_connection_handling_test.rb +25 -0
  102. data/vendor/redis-rb/test/distributed_internals_test.rb +18 -0
  103. data/vendor/redis-rb/test/distributed_persistence_control_commands_test.rb +24 -0
  104. data/vendor/redis-rb/test/distributed_publish_subscribe_test.rb +90 -0
  105. data/vendor/redis-rb/test/distributed_remote_server_control_commands_test.rb +31 -0
  106. data/vendor/redis-rb/test/distributed_sorting_test.rb +21 -0
  107. data/vendor/redis-rb/test/distributed_test.rb +60 -0
  108. data/vendor/redis-rb/test/distributed_transactions_test.rb +34 -0
  109. data/vendor/redis-rb/test/encoding_test.rb +16 -0
  110. data/vendor/redis-rb/test/helper.rb +86 -0
  111. data/vendor/redis-rb/test/internals_test.rb +27 -0
  112. data/vendor/redis-rb/test/lint/hashes.rb +90 -0
  113. data/vendor/redis-rb/test/lint/internals.rb +53 -0
  114. data/vendor/redis-rb/test/lint/lists.rb +93 -0
  115. data/vendor/redis-rb/test/lint/sets.rb +66 -0
  116. data/vendor/redis-rb/test/lint/sorted_sets.rb +132 -0
  117. data/vendor/redis-rb/test/lint/strings.rb +98 -0
  118. data/vendor/redis-rb/test/lint/value_types.rb +84 -0
  119. data/vendor/redis-rb/test/persistence_control_commands_test.rb +22 -0
  120. data/vendor/redis-rb/test/pipelining_commands_test.rb +78 -0
  121. data/vendor/redis-rb/test/publish_subscribe_test.rb +151 -0
  122. data/vendor/redis-rb/test/redis_mock.rb +64 -0
  123. data/vendor/redis-rb/test/remote_server_control_commands_test.rb +56 -0
  124. data/vendor/redis-rb/test/sorting_test.rb +44 -0
  125. data/vendor/redis-rb/test/test.conf +8 -0
  126. data/vendor/redis-rb/test/thread_safety_test.rb +34 -0
  127. data/vendor/redis-rb/test/transactions_test.rb +91 -0
  128. data/vendor/redis-rb/test/unknown_commands_test.rb +14 -0
  129. data/vendor/redis-rb/test/url_param_test.rb +52 -0
  130. metadata +277 -0
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ load './test/lint/strings.rb'
12
+
13
+ test "MGET" do |r|
14
+ assert_raise Redis::Distributed::CannotDistribute do
15
+ r.mget("foo", "bar")
16
+ end
17
+ end
18
+
19
+ test "MGET mapped" do |r|
20
+ assert_raise Redis::Distributed::CannotDistribute do
21
+ r.mapped_mget("foo", "bar")
22
+ end
23
+ end
24
+
25
+ test "MSET" do |r|
26
+ assert_raise Redis::Distributed::CannotDistribute do
27
+ r.mset(:foo, "s1", :bar, "s2")
28
+ end
29
+ end
30
+
31
+ test "MSET mapped" do |r|
32
+ assert_raise Redis::Distributed::CannotDistribute do
33
+ r.mapped_mset(:foo => "s1", :bar => "s2")
34
+ end
35
+ end
36
+
37
+ test "MSETNX" do |r|
38
+ assert_raise Redis::Distributed::CannotDistribute do
39
+ r.set("foo", "s1")
40
+ r.msetnx(:foo, "s2", :bar, "s3")
41
+ end
42
+ end
43
+
44
+ test "MSETNX mapped" do |r|
45
+ assert_raise Redis::Distributed::CannotDistribute do
46
+ r.set("foo", "s1")
47
+ r.mapped_msetnx(:foo => "s2", :bar => "s3")
48
+ end
49
+ end
50
+
@@ -0,0 +1,73 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init(Redis::Distributed.new(NODES, :logger => ::Logger.new(log)))
9
+ end
10
+
11
+ load "./test/lint/value_types.rb"
12
+
13
+ test "DEL" do |r|
14
+ r.set "foo", "s1"
15
+ r.set "bar", "s2"
16
+ r.set "baz", "s3"
17
+
18
+ assert ["bar", "baz", "foo"] == r.keys("*").sort
19
+
20
+ assert [1] == r.del("foo")
21
+
22
+ assert ["bar", "baz"] == r.keys("*").sort
23
+
24
+ assert [2] == r.del("bar", "baz")
25
+
26
+ assert [] == r.keys("*").sort
27
+ end
28
+
29
+ test "RANDOMKEY" do |r|
30
+ assert_raise Redis::Distributed::CannotDistribute do
31
+ r.randomkey
32
+ end
33
+ end
34
+
35
+ test "RENAME" do |r|
36
+ assert_raise Redis::Distributed::CannotDistribute do
37
+ r.set("foo", "s1")
38
+ r.rename "foo", "bar"
39
+ end
40
+
41
+ assert "s1" == r.get("foo")
42
+ assert nil == r.get("bar")
43
+ end
44
+
45
+ test "RENAMENX" do |r|
46
+ assert_raise Redis::Distributed::CannotDistribute do
47
+ r.set("foo", "s1")
48
+ r.rename "foo", "bar"
49
+ end
50
+
51
+ assert "s1" == r.get("foo")
52
+ assert nil == r.get("bar")
53
+ end
54
+
55
+ test "DBSIZE" do |r|
56
+ assert [0] == r.dbsize
57
+
58
+ r.set("foo", "s1")
59
+
60
+ assert [1] == r.dbsize
61
+ end
62
+
63
+ test "FLUSHDB" do |r|
64
+ r.set("foo", "s1")
65
+ r.set("bar", "s2")
66
+
67
+ assert [2] == r.dbsize
68
+
69
+ r.flushdb
70
+
71
+ assert [0] == r.dbsize
72
+ end
73
+
@@ -0,0 +1,141 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ test "RENAME" do |r|
12
+ r.set("{qux}foo", "s1")
13
+ r.rename "{qux}foo", "{qux}bar"
14
+
15
+ assert "s1" == r.get("{qux}bar")
16
+ assert nil == r.get("{qux}foo")
17
+ end
18
+
19
+ test "RENAMENX" do |r|
20
+ r.set("{qux}foo", "s1")
21
+ r.set("{qux}bar", "s2")
22
+
23
+ assert false == r.renamenx("{qux}foo", "{qux}bar")
24
+
25
+ assert "s1" == r.get("{qux}foo")
26
+ assert "s2" == r.get("{qux}bar")
27
+ end
28
+
29
+ test "RPOPLPUSH" do |r|
30
+ r.rpush "{qux}foo", "s1"
31
+ r.rpush "{qux}foo", "s2"
32
+
33
+ assert "s2" == r.rpoplpush("{qux}foo", "{qux}bar")
34
+ assert ["s2"] == r.lrange("{qux}bar", 0, -1)
35
+ assert "s1" == r.rpoplpush("{qux}foo", "{qux}bar")
36
+ assert ["s1", "s2"] == r.lrange("{qux}bar", 0, -1)
37
+ end
38
+
39
+ test "SMOVE" do |r|
40
+ r.sadd "{qux}foo", "s1"
41
+ r.sadd "{qux}bar", "s2"
42
+
43
+ assert r.smove("{qux}foo", "{qux}bar", "s1")
44
+ assert r.sismember("{qux}bar", "s1")
45
+ end
46
+
47
+ test "SINTER" do |r|
48
+ r.sadd "{qux}foo", "s1"
49
+ r.sadd "{qux}foo", "s2"
50
+ r.sadd "{qux}bar", "s2"
51
+
52
+ assert ["s2"] == r.sinter("{qux}foo", "{qux}bar")
53
+ end
54
+
55
+ test "SINTERSTORE" do |r|
56
+ r.sadd "{qux}foo", "s1"
57
+ r.sadd "{qux}foo", "s2"
58
+ r.sadd "{qux}bar", "s2"
59
+
60
+ r.sinterstore("{qux}baz", "{qux}foo", "{qux}bar")
61
+
62
+ assert ["s2"] == r.smembers("{qux}baz")
63
+ end
64
+
65
+ test "SUNION" do |r|
66
+ r.sadd "{qux}foo", "s1"
67
+ r.sadd "{qux}foo", "s2"
68
+ r.sadd "{qux}bar", "s2"
69
+ r.sadd "{qux}bar", "s3"
70
+
71
+ assert ["s1", "s2", "s3"] == r.sunion("{qux}foo", "{qux}bar").sort
72
+ end
73
+
74
+ test "SUNIONSTORE" do |r|
75
+ r.sadd "{qux}foo", "s1"
76
+ r.sadd "{qux}foo", "s2"
77
+ r.sadd "{qux}bar", "s2"
78
+ r.sadd "{qux}bar", "s3"
79
+
80
+ r.sunionstore("{qux}baz", "{qux}foo", "{qux}bar")
81
+
82
+ assert ["s1", "s2", "s3"] == r.smembers("{qux}baz").sort
83
+ end
84
+
85
+ test "SDIFF" do |r|
86
+ r.sadd "{qux}foo", "s1"
87
+ r.sadd "{qux}foo", "s2"
88
+ r.sadd "{qux}bar", "s2"
89
+ r.sadd "{qux}bar", "s3"
90
+
91
+ assert ["s1"] == r.sdiff("{qux}foo", "{qux}bar")
92
+ assert ["s3"] == r.sdiff("{qux}bar", "{qux}foo")
93
+ end
94
+
95
+ test "SDIFFSTORE" do |r|
96
+ r.sadd "{qux}foo", "s1"
97
+ r.sadd "{qux}foo", "s2"
98
+ r.sadd "{qux}bar", "s2"
99
+ r.sadd "{qux}bar", "s3"
100
+
101
+ r.sdiffstore("{qux}baz", "{qux}foo", "{qux}bar")
102
+
103
+ assert ["s1"] == r.smembers("{qux}baz")
104
+ end
105
+
106
+ test "SORT" do |r|
107
+ r.set("{qux}foo:1", "s1")
108
+ r.set("{qux}foo:2", "s2")
109
+
110
+ r.rpush("{qux}bar", "1")
111
+ r.rpush("{qux}bar", "2")
112
+
113
+ assert ["s1"] == r.sort("{qux}bar", :get => "{qux}foo:*", :limit => [0, 1])
114
+ assert ["s2"] == r.sort("{qux}bar", :get => "{qux}foo:*", :limit => [0, 1], :order => "desc alpha")
115
+ end
116
+
117
+ test "SORT with an array of GETs" do |r|
118
+ r.set("{qux}foo:1:a", "s1a")
119
+ r.set("{qux}foo:1:b", "s1b")
120
+
121
+ r.set("{qux}foo:2:a", "s2a")
122
+ r.set("{qux}foo:2:b", "s2b")
123
+
124
+ r.rpush("{qux}bar", "1")
125
+ r.rpush("{qux}bar", "2")
126
+
127
+ assert ["s1a", "s1b"] == r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"], :limit => [0, 1])
128
+ assert ["s2a", "s2b"] == r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"], :limit => [0, 1], :order => "desc alpha")
129
+ end
130
+
131
+ test "SORT with STORE" do |r|
132
+ r.set("{qux}foo:1", "s1")
133
+ r.set("{qux}foo:2", "s2")
134
+
135
+ r.rpush("{qux}bar", "1")
136
+ r.rpush("{qux}bar", "2")
137
+
138
+ r.sort("{qux}bar", :get => "{qux}foo:*", :store => "{qux}baz")
139
+ assert ["s1", "s2"] == r.lrange("{qux}baz", 0, -1)
140
+ end
141
+
@@ -0,0 +1,25 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ test "PING" do |r|
12
+ assert ["PONG"] == r.ping
13
+ end
14
+
15
+ test "SELECT" do |r|
16
+ r.set "foo", "bar"
17
+
18
+ r.select 14
19
+ assert nil == r.get("foo")
20
+
21
+ r.select 15
22
+
23
+ assert "bar" == r.get("foo")
24
+ end
25
+
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require File.expand_path("./redis_mock", File.dirname(__FILE__))
5
+
6
+ include RedisMock::Helper
7
+
8
+ require "redis/distributed"
9
+
10
+ setup do
11
+ log = StringIO.new
12
+ [init(Redis::Distributed.new(NODES, :logger => ::Logger.new(log))), log]
13
+ end
14
+
15
+ $TEST_PIPELINING = false
16
+ $TEST_INSPECT = false
17
+
18
+ load File.expand_path("./lint/internals.rb", File.dirname(__FILE__))
@@ -0,0 +1,24 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ test "SAVE and BGSAVE" do |r|
12
+ assert_nothing_raised do
13
+ r.save
14
+ end
15
+
16
+ assert_nothing_raised do
17
+ r.bgsave
18
+ end
19
+ end
20
+
21
+ test "LASTSAVE" do |r|
22
+ assert r.lastsave.all? { |t| Time.at(t) <= Time.now }
23
+ end
24
+
@@ -0,0 +1,90 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ test "SUBSCRIBE and UNSUBSCRIBE" do |r|
12
+ assert_raise Redis::Distributed::CannotDistribute do
13
+ r.subscribe("foo", "bar") { }
14
+ end
15
+
16
+ assert_raise Redis::Distributed::CannotDistribute do
17
+ r.subscribe("{qux}foo", "bar") { }
18
+ end
19
+ end
20
+
21
+ test "SUBSCRIBE and UNSUBSCRIBE with tags" do |r|
22
+ thread = Thread.new do
23
+ r.subscribe("foo") do |on|
24
+ on.subscribe do |channel, total|
25
+ @subscribed = true
26
+ @t1 = total
27
+ end
28
+
29
+ on.message do |channel, message|
30
+ if message == "s1"
31
+ r.unsubscribe
32
+ @message = message
33
+ end
34
+ end
35
+
36
+ on.unsubscribe do |channel, total|
37
+ @unsubscribed = true
38
+ @t2 = total
39
+ end
40
+ end
41
+ end
42
+
43
+ Redis::Distributed.new(NODES).publish("foo", "s1")
44
+
45
+ thread.join
46
+
47
+ assert @subscribed
48
+ assert 1 == @t1
49
+ assert @unsubscribed
50
+ assert 0 == @t2
51
+ assert "s1" == @message
52
+ end
53
+
54
+ test "SUBSCRIBE within SUBSCRIBE" do |r|
55
+ @channels = []
56
+
57
+ thread = Thread.new do
58
+ r.subscribe("foo") do |on|
59
+ on.subscribe do |channel, total|
60
+ @channels << channel
61
+
62
+ r.subscribe("bar") if channel == "foo"
63
+ r.unsubscribe if channel == "bar"
64
+ end
65
+ end
66
+ end
67
+
68
+ Redis::Distributed.new(NODES).publish("foo", "s1")
69
+
70
+ thread.join
71
+
72
+ assert ["foo", "bar"] == @channels
73
+ end
74
+
75
+ test "other commands within a SUBSCRIBE" do |r|
76
+ assert_raise RuntimeError 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
+ test "SUBSCRIBE without a block" do |r|
86
+ assert_raise LocalJumpError do
87
+ r.subscribe("foo")
88
+ end
89
+ end
90
+
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path("./helper", File.dirname(__FILE__))
4
+ require "redis/distributed"
5
+
6
+ setup do
7
+ log = StringIO.new
8
+ init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
9
+ end
10
+
11
+ test "INFO" do |r|
12
+ %w(last_save_time redis_version total_connections_received connected_clients total_commands_processed connected_slaves uptime_in_seconds used_memory uptime_in_days changes_since_last_save).each do |x|
13
+ r.info.each do |info|
14
+ assert info.keys.include?(x)
15
+ end
16
+ end
17
+ end
18
+
19
+ test "MONITOR" do |r|
20
+ begin
21
+ r.monitor
22
+ rescue Exception => ex
23
+ ensure
24
+ assert ex.kind_of?(NotImplementedError)
25
+ end
26
+ end
27
+
28
+ test "ECHO" do |r|
29
+ assert ["foo bar baz\n"] == r.echo("foo bar baz\n")
30
+ end
31
+