ruby_skynet 1.3.0.alpha3 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ruby_skynet.rb +5 -11
- data/lib/ruby_skynet/client.rb +15 -8
- data/lib/ruby_skynet/common.rb +54 -14
- data/lib/ruby_skynet/connection.rb +56 -16
- data/lib/ruby_skynet/doozer/service_registry.rb +14 -3
- data/lib/ruby_skynet/railties/ruby_skynet.rake +7 -10
- data/lib/ruby_skynet/ruby_skynet.rb +2 -9
- data/lib/ruby_skynet/server.rb +62 -75
- data/lib/ruby_skynet/service.rb +1 -4
- data/lib/ruby_skynet/version.rb +1 -1
- data/lib/ruby_skynet/zookeeper/service_registry.rb +14 -3
- metadata +32 -28
- data/Gemfile +0 -20
- data/Gemfile.lock +0 -45
- data/Rakefile +0 -44
- data/lib/ruby_skynet/base.rb +0 -47
- data/lib/ruby_skynet/static_service_registry.rb +0 -75
- data/ruby_skynet.gemspec +0 -25
- data/test/client_test.rb +0 -120
- data/test/service_registry_test.rb +0 -122
- data/test/service_test.rb +0 -71
- data/test/zookeeper_registry_test.rb +0 -209
data/test/client_test.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
# Allow test to be run in-place without requiring a gem install
|
2
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
-
$LOAD_PATH.unshift File.dirname(__FILE__)
|
4
|
-
|
5
|
-
require 'rubygems'
|
6
|
-
require 'test/unit'
|
7
|
-
require 'shoulda'
|
8
|
-
require 'ruby_skynet'
|
9
|
-
|
10
|
-
# Register an appender if one is not already registered
|
11
|
-
SemanticLogger.default_level = :trace
|
12
|
-
SemanticLogger.add_appender('test.log') if SemanticLogger.appenders.size == 0
|
13
|
-
|
14
|
-
class ClientTestService
|
15
|
-
include RubySkynet::Service
|
16
|
-
|
17
|
-
# Methods implemented by this service
|
18
|
-
# Must take a Hash as input
|
19
|
-
# Must Return a Hash response or nil for no response
|
20
|
-
def test1(params)
|
21
|
-
{ 'result' => 'test1' }
|
22
|
-
end
|
23
|
-
|
24
|
-
def sleep(params)
|
25
|
-
Kernel.sleep params['duration'] || 1
|
26
|
-
{ 'result' => 'sleep' }
|
27
|
-
end
|
28
|
-
|
29
|
-
def fail(params)
|
30
|
-
if params['attempt'].to_i >= 2
|
31
|
-
{ 'result' => 'fail' }
|
32
|
-
else
|
33
|
-
nil
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# Test Client Class
|
40
|
-
class ClientTestServiceClient < RubySkynet::Client
|
41
|
-
end
|
42
|
-
|
43
|
-
# Unit Test for ResilientSocket::TCPClient
|
44
|
-
class ClientTest < Test::Unit::TestCase
|
45
|
-
context RubySkynet::Client do
|
46
|
-
|
47
|
-
context "without server" do
|
48
|
-
should "raise exception when not registered" do
|
49
|
-
exception = assert_raise RubySkynet::ServiceUnavailable do
|
50
|
-
client = RubySkynet::Client.new('SomeService','*','ClientTest')
|
51
|
-
client.call(:test, :hello => 'there')
|
52
|
-
end
|
53
|
-
assert_match /No servers available for service: SomeService with version: -1 in region: ClientTest/, exception.message
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
context "with server" do
|
59
|
-
setup do
|
60
|
-
@region = 'ClientTest'
|
61
|
-
RubySkynet.region = @region
|
62
|
-
RubySkynet::Server.start
|
63
|
-
# Give Service Registry time to push out the presence of the service above
|
64
|
-
sleep 0.1
|
65
|
-
|
66
|
-
@service_name = 'ClientTestService'
|
67
|
-
@version = 1
|
68
|
-
|
69
|
-
@read_timeout = 3.0
|
70
|
-
end
|
71
|
-
|
72
|
-
teardown do
|
73
|
-
RubySkynet::Server.stop
|
74
|
-
end
|
75
|
-
|
76
|
-
context "with client connection" do
|
77
|
-
setup do
|
78
|
-
@client = RubySkynet::Client.new(@service_name, @version, @region)
|
79
|
-
end
|
80
|
-
|
81
|
-
should "successfully send and receive data" do
|
82
|
-
reply = @client.call(:test1, 'some' => 'parameters')
|
83
|
-
assert_equal 'test1', reply['result']
|
84
|
-
end
|
85
|
-
|
86
|
-
should "timeout on receive" do
|
87
|
-
request = { 'duration' => @read_timeout + 0.5}
|
88
|
-
|
89
|
-
exception = assert_raise ResilientSocket::ReadTimeout do
|
90
|
-
# Read 4 bytes from server
|
91
|
-
@client.call('sleep', request, :read_timeout => @read_timeout)
|
92
|
-
end
|
93
|
-
assert_match /Timedout after #{@read_timeout} seconds trying to read/, exception.message
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
context "using client class" do
|
98
|
-
setup do
|
99
|
-
@client = ClientTestServiceClient.new("ClientTestService")
|
100
|
-
end
|
101
|
-
|
102
|
-
should "successfully send and receive data" do
|
103
|
-
reply = @client.test1('some' => 'parameters')
|
104
|
-
assert_equal 'test1', reply['result']
|
105
|
-
end
|
106
|
-
|
107
|
-
should "timeout on receive" do
|
108
|
-
request = { 'duration' => @read_timeout + 0.5}
|
109
|
-
|
110
|
-
exception = assert_raise ResilientSocket::ReadTimeout do
|
111
|
-
# Read 4 bytes from server
|
112
|
-
@client.sleep(request, :read_timeout => @read_timeout)
|
113
|
-
end
|
114
|
-
assert_match /Timedout after #{@read_timeout} seconds trying to read/, exception.message
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
# Allow test to be run in-place without requiring a gem install
|
2
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'ruby_skynet'
|
8
|
-
|
9
|
-
# Register an appender if one is not already registered
|
10
|
-
SemanticLogger.default_level = :trace
|
11
|
-
SemanticLogger.add_appender('test.log') if SemanticLogger.appenders.size == 0
|
12
|
-
|
13
|
-
# Unit Test
|
14
|
-
class ServiceRegistryTest < Test::Unit::TestCase
|
15
|
-
context RubySkynet::ServiceRegistry do
|
16
|
-
|
17
|
-
setup do
|
18
|
-
@service_name = 'MyRegistryService'
|
19
|
-
@version = 5
|
20
|
-
@region = 'RegistryTest'
|
21
|
-
@hostname = '127.0.0.1'
|
22
|
-
@port = 2100
|
23
|
-
@service_key = "/services/#{@service_name}/#{@version}/#{@region}/#{@hostname}/#{@port}"
|
24
|
-
RubySkynet.local_ip_address = @hostname
|
25
|
-
end
|
26
|
-
|
27
|
-
teardown do
|
28
|
-
RubySkynet.local_ip_address = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
context "with a registered service" do
|
32
|
-
setup do
|
33
|
-
RubySkynet.service_registry.register_service(@service_name, @version, @region, @hostname, @port)
|
34
|
-
RubySkynet.service_registry.register_service(@service_name, @version, @region+'BLAH', @hostname, @port)
|
35
|
-
# Allow time for registry callback that service was registered
|
36
|
-
sleep 0.1
|
37
|
-
end
|
38
|
-
|
39
|
-
teardown do
|
40
|
-
RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @hostname, @port)
|
41
|
-
RubySkynet.service_registry.deregister_service(@service_name, @version, @region+'BLAH', @hostname, @port)
|
42
|
-
# Allow time for registry callback that service was deregistered
|
43
|
-
sleep 0.1
|
44
|
-
# No servers should be in the local registry
|
45
|
-
# assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version, @region)
|
46
|
-
end
|
47
|
-
|
48
|
-
should "find server using exact match" do
|
49
|
-
assert (servers = RubySkynet.service_registry.servers_for(@service_name, @version, @region)), RubySkynet.service_registry.to_h.inspect
|
50
|
-
assert_equal 1, servers.size
|
51
|
-
assert_equal "#{@hostname}:#{@port}", servers.first
|
52
|
-
end
|
53
|
-
|
54
|
-
should "find server using * version match" do
|
55
|
-
assert (servers = RubySkynet.service_registry.servers_for(@service_name, '*', @region)), RubySkynet.service_registry.to_h.inspect
|
56
|
-
assert_equal 1, servers.size
|
57
|
-
assert_equal "#{@hostname}:#{@port}", servers.first
|
58
|
-
end
|
59
|
-
|
60
|
-
context "with multiple servers" do
|
61
|
-
setup do
|
62
|
-
@second_hostname = '127.0.10.1'
|
63
|
-
RubySkynet.service_registry.register_service(@service_name, @version, @region, @hostname, @port+1)
|
64
|
-
RubySkynet.service_registry.register_service(@service_name, @version, @region, @hostname, @port+3)
|
65
|
-
RubySkynet.service_registry.register_service(@service_name, @version-1, @region, @hostname, @port+2)
|
66
|
-
RubySkynet.service_registry.register_service(@service_name, @version, @region, @second_hostname, @port)
|
67
|
-
end
|
68
|
-
|
69
|
-
teardown do
|
70
|
-
RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @hostname, @port+1)
|
71
|
-
RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @hostname, @port+3)
|
72
|
-
RubySkynet.service_registry.deregister_service(@service_name, @version-1, @region, @hostname, @port+2)
|
73
|
-
RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @second_hostname, @port)
|
74
|
-
end
|
75
|
-
|
76
|
-
should "using * version match" do
|
77
|
-
assert (servers = RubySkynet.service_registry.servers_for(@service_name, '*', @region)), RubySkynet.service_registry.to_h.inspect
|
78
|
-
expected = RubySkynet::ServiceRegistry.respond_to?(:score_for_server) ? 3 : 4
|
79
|
-
assert_equal expected, servers.size, servers
|
80
|
-
assert_equal true, servers.include?("#{@hostname}:#{@port}"), servers
|
81
|
-
assert_equal true, servers.include?("#{@hostname}:#{@port+1}"), servers
|
82
|
-
assert_equal true, servers.include?("#{@hostname}:#{@port+3}"), servers
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
should "return nil when service not found" do
|
87
|
-
assert_raise RubySkynet::ServiceUnavailable do
|
88
|
-
RubySkynet.service_registry.servers_for('MissingService', @version, @region)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
should "return nil when version not found" do
|
93
|
-
assert_raise RubySkynet::ServiceUnavailable do
|
94
|
-
RubySkynet.service_registry.servers_for(@service_name, @version+1, @region)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
should "return nil when region not found" do
|
99
|
-
assert_raise RubySkynet::ServiceUnavailable do
|
100
|
-
RubySkynet.service_registry.servers_for(@service_name, @version, 'OtherRegion')
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context "scoring" do
|
106
|
-
[
|
107
|
-
['192.168.11.0', 4 ],
|
108
|
-
['192.168.11.10', 3 ],
|
109
|
-
['192.168.10.0', 2 ],
|
110
|
-
['192.5.10.0', 1 ],
|
111
|
-
['10.0.11.0', 0 ],
|
112
|
-
].each do |test|
|
113
|
-
should "handle score #{test[1]}" do
|
114
|
-
skip "Not applicable to Static Service Registry" unless RubySkynet::ServiceRegistry.respond_to?(:score_for_server)
|
115
|
-
local_ip_address = "192.168.11.0"
|
116
|
-
assert_equal test[1], RubySkynet::ServiceRegistry.score_for_server(test[0], local_ip_address), "Local: #{local_ip_address} Server: #{test[0]} Score: #{test[1]}"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
122
|
-
end
|
data/test/service_test.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
# Allow test to be run in-place without requiring a gem install
|
2
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'ruby_skynet'
|
8
|
-
|
9
|
-
# Register an appender if one is not already registered
|
10
|
-
SemanticLogger.default_level = :trace
|
11
|
-
SemanticLogger.add_appender('test.log') if SemanticLogger.appenders.size == 0
|
12
|
-
|
13
|
-
class TestService
|
14
|
-
include RubySkynet::Service
|
15
|
-
|
16
|
-
# Methods implemented by this service
|
17
|
-
# Must take a Hash as input
|
18
|
-
# Must Return a Hash response or nil for no response
|
19
|
-
def echo(params)
|
20
|
-
params
|
21
|
-
end
|
22
|
-
|
23
|
-
def exception_test(params)
|
24
|
-
raise "Exception message"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Unit Test for ResilientSocket::TCPClient
|
29
|
-
class ServiceTest < Test::Unit::TestCase
|
30
|
-
context 'RubySkynet::Service' do
|
31
|
-
context "with server" do
|
32
|
-
setup do
|
33
|
-
@region = 'Test'
|
34
|
-
@service_name = 'TestService'
|
35
|
-
@version = 1
|
36
|
-
RubySkynet.region = @region
|
37
|
-
RubySkynet::Server.start
|
38
|
-
sleep 0.2
|
39
|
-
end
|
40
|
-
|
41
|
-
teardown do
|
42
|
-
RubySkynet::Server.stop
|
43
|
-
SemanticLogger::Logger.flush
|
44
|
-
end
|
45
|
-
|
46
|
-
should "be running" do
|
47
|
-
assert_equal true, RubySkynet::Server.running?
|
48
|
-
end
|
49
|
-
|
50
|
-
context "using a client" do
|
51
|
-
setup do
|
52
|
-
@client = RubySkynet::Client.new(@service_name, @version, @region)
|
53
|
-
end
|
54
|
-
|
55
|
-
should "successfully send and receive data" do
|
56
|
-
reply = @client.call(:echo, 'some' => 'parameters')
|
57
|
-
assert_equal 'some', reply.keys.first
|
58
|
-
assert_equal 'parameters', reply.values.first
|
59
|
-
end
|
60
|
-
|
61
|
-
# Cellulloid 0.13.0.pre2 is doing something weird here and preventing the
|
62
|
-
# Server from receiving the exception
|
63
|
-
should "handle service exceptions" do
|
64
|
-
reply = @client.call(:exception_test, 'some' => 'parameters')
|
65
|
-
assert_equal "Exception message", reply['exception']['message']
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,209 +0,0 @@
|
|
1
|
-
# Allow test to be run in-place without requiring a gem install
|
2
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'ruby_skynet/zookeeper'
|
8
|
-
require 'date'
|
9
|
-
|
10
|
-
# NOTE:
|
11
|
-
# This test assumes that ZooKeeper is running locally on the default port
|
12
|
-
|
13
|
-
# Register an appender if one is not already registered
|
14
|
-
SemanticLogger.default_level = :trace
|
15
|
-
SemanticLogger.add_appender('test.log') if SemanticLogger.appenders.size == 0
|
16
|
-
|
17
|
-
# Unit Test for RubySkynet::Zookeeper::Registry
|
18
|
-
class ZookeeperRegistryTest < Test::Unit::TestCase
|
19
|
-
context RubySkynet::Zookeeper::Registry do
|
20
|
-
setup do
|
21
|
-
@date = Date.parse('2013-04-04')
|
22
|
-
@time = Time.at(1365102658)
|
23
|
-
@test_data = {
|
24
|
-
'bar' => 'test',
|
25
|
-
'one' => 'one',
|
26
|
-
'string_with_underscores' => 'and_a_value',
|
27
|
-
'two' => :two,
|
28
|
-
'integer' => 10,
|
29
|
-
'float' => 10.5,
|
30
|
-
'date' => @date,
|
31
|
-
'time' => @time,
|
32
|
-
'false' => false,
|
33
|
-
'true' => true,
|
34
|
-
'child' => { :symbol_with_underscores => :and_a_value, :this => 'is', :an => ['array', :symbol, :smallest => {'a' => 'b', :c => :d}]}
|
35
|
-
}
|
36
|
-
@test_data['all_types'] = @test_data.dup
|
37
|
-
end
|
38
|
-
|
39
|
-
context "serialization" do
|
40
|
-
setup do
|
41
|
-
@json = {
|
42
|
-
'bar' => 'test',
|
43
|
-
'one' => 'one',
|
44
|
-
'string_with_underscores' => 'and_a_value',
|
45
|
-
'two' => ':two',
|
46
|
-
'integer' => '10',
|
47
|
-
'float' => '10.5',
|
48
|
-
'date' => @date.to_s,
|
49
|
-
'time' => @time.to_s,
|
50
|
-
'false' => 'false',
|
51
|
-
'true' => 'true',
|
52
|
-
'child' => "{\":symbol_with_underscores\":\":and_a_value\",\":this\":\"is\",\":an\":[\"array\",\":symbol\",{\":smallest\":{\"a\":\"b\",\":c\":\":d\"}}]}",
|
53
|
-
'all_types' => "{\"bar\":\"test\",\"one\":\"one\",\"string_with_underscores\":\"and_a_value\",\"two\":\":two\",\"integer\":\"10\",\"float\":\"10.5\",\"date\":\"2013-04-04\",\"time\":\"2013-04-04 15:10:58 -0400\",\"false\":\"false\",\"true\":\"true\",\"child\":{\":symbol_with_underscores\":\":and_a_value\",\":this\":\"is\",\":an\":[\"array\",\":symbol\",{\":smallest\":{\"a\":\"b\",\":c\":\":d\"}}]}}"
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
should ".serialize" do
|
58
|
-
@test_data.each_pair do |k,v|
|
59
|
-
assert_equal @json[k], RubySkynet::Zookeeper::Json::Serializer.serialize(v), "Key: #{k}"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
should ".deserialize" do
|
64
|
-
@json.each_pair do |k,v|
|
65
|
-
assert_equal @test_data[k], RubySkynet::Zookeeper::Json::Deserializer.deserialize(v), "Key: #{k}"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context "with registry" do
|
71
|
-
setup do
|
72
|
-
params = {
|
73
|
-
:root => "/registrytest",
|
74
|
-
:registry => {
|
75
|
-
:connect_timeout => 5,
|
76
|
-
}
|
77
|
-
}
|
78
|
-
@registry = RubySkynet::Zookeeper::Registry.new(params)
|
79
|
-
@registry.each_pair {|k,v, ver, num_children| @registry.delete(k) if num_children == 0}
|
80
|
-
@test_data.each_pair {|k,v| @registry[k] = v}
|
81
|
-
@path = 'a/b/c/d/e/f/g/h'
|
82
|
-
@registry[@path] = 'hello'
|
83
|
-
# Ensure hash is not modified
|
84
|
-
assert_equal "/registrytest", params[:root]
|
85
|
-
assert_equal 5, params[:registry][:connect_timeout]
|
86
|
-
end
|
87
|
-
|
88
|
-
def teardown
|
89
|
-
if @registry
|
90
|
-
@registry.each_pair {|k,v, ver, num_children| @registry.delete(k) if num_children == 0}
|
91
|
-
# Allow callbacks to complete so that errors are not generated on close
|
92
|
-
sleep 0.1
|
93
|
-
@registry.close
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
should "#[]" do
|
98
|
-
@test_data.each_pair do |k,v|
|
99
|
-
assert_equal v, @registry[k], "Expected #{k}=>#{v}, #{@registry.to_h.inspect}"
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
should "#each_pair" do
|
104
|
-
h = {}
|
105
|
-
@registry.each_pair {|k,v| h[k] = v}
|
106
|
-
assert_hash_equal @test_data, h
|
107
|
-
end
|
108
|
-
|
109
|
-
should "#to_h" do
|
110
|
-
assert_hash_equal @test_data, @registry.to_h
|
111
|
-
end
|
112
|
-
|
113
|
-
should "#[]=" do
|
114
|
-
@registry['three'] = 'value'
|
115
|
-
# Give Zookeeper time to send back the change
|
116
|
-
sleep 0.3
|
117
|
-
result = @registry['three']
|
118
|
-
assert_equal 'value', result
|
119
|
-
end
|
120
|
-
|
121
|
-
should "#delete parent paths when no other leaf nodes exist" do
|
122
|
-
@registry.delete(@path)
|
123
|
-
assert_equal nil, @registry['a']
|
124
|
-
end
|
125
|
-
|
126
|
-
[nil, '*'].each do |monitor_path|
|
127
|
-
context "with monitor_path:#{monitor_path}" do
|
128
|
-
should "callback on update" do
|
129
|
-
updated_revision = nil
|
130
|
-
updated_path = nil
|
131
|
-
updated_value = nil
|
132
|
-
@registry.on_update(monitor_path||'bar') do |path, value, revision|
|
133
|
-
updated_revision = revision
|
134
|
-
updated_path = path
|
135
|
-
updated_value = value
|
136
|
-
end
|
137
|
-
# Allow monitoring thread to start
|
138
|
-
sleep 0.1
|
139
|
-
@registry['bar'] = 'updated'
|
140
|
-
# Allow Zookeeper to send back the change
|
141
|
-
sleep 0.3
|
142
|
-
assert_equal 'bar', updated_path
|
143
|
-
assert_equal 'updated', updated_value
|
144
|
-
assert_equal true, updated_revision > 0
|
145
|
-
end
|
146
|
-
|
147
|
-
should "callback on delete" do
|
148
|
-
deleted_path = nil
|
149
|
-
@registry.on_delete(monitor_path||'bar') do |path, revision|
|
150
|
-
deleted_path = path
|
151
|
-
end
|
152
|
-
# Allow monitoring thread to start
|
153
|
-
sleep 0.1
|
154
|
-
# Allow Zookeeper to send back the change
|
155
|
-
@registry.delete('bar')
|
156
|
-
sleep 2
|
157
|
-
assert_equal 'bar', deleted_path
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
['other', 'one'].each do |monitor_path|
|
163
|
-
context "with monitor_path:#{monitor_path}" do
|
164
|
-
should "not callback on update" do
|
165
|
-
updated_path = nil
|
166
|
-
updated_value = nil
|
167
|
-
@registry.on_update(monitor_path) do |path, value|
|
168
|
-
updated_path = path
|
169
|
-
updated_value = value
|
170
|
-
end
|
171
|
-
# Allow monitoring thread to start
|
172
|
-
sleep 0.1
|
173
|
-
@registry['bar'] = 'updated'
|
174
|
-
# Allow Zookeeper to send back the change
|
175
|
-
sleep 0.3
|
176
|
-
assert_equal nil, updated_path
|
177
|
-
assert_equal nil, updated_value
|
178
|
-
end
|
179
|
-
|
180
|
-
should "not callback on delete" do
|
181
|
-
deleted_path = nil
|
182
|
-
@registry.on_delete(monitor_path) do |path|
|
183
|
-
deleted_path = path
|
184
|
-
end
|
185
|
-
# Allow monitoring thread to start
|
186
|
-
sleep 0.1
|
187
|
-
# Allow Zookeeper to send back the change
|
188
|
-
@registry.delete('bar')
|
189
|
-
sleep 0.3
|
190
|
-
assert_equal nil, deleted_path
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
# Verify that two hashes match
|
199
|
-
def assert_hash_equal(expected, actual)
|
200
|
-
expected.each_pair do |k,v|
|
201
|
-
if v.is_a?(Hash)
|
202
|
-
assert_hash_equal(v, actual[k])
|
203
|
-
else
|
204
|
-
assert_equal expected[k], actual[k], "Expected: #{expected.inspect}, Actual:#{actual.inspect}"
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
end
|