who_can 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module WhoCan::Heartbeater
4
+
5
+ describe "EKG" do
6
+ include EventedSpec::AMQPSpec
7
+ include WhoCan::Logging
8
+
9
+ default_timeout 3.0
10
+ default_options :host => 'localhost'
11
+
12
+ amqp_before do
13
+ @ekg = EKG.new(AMQP.connection, :interval => 0.2, :max_failures => 1, :timeout => 0.5)
14
+ end
15
+
16
+ it "should fire failure when connection dies" do
17
+ @ekg.on_heartbeat_failure do
18
+ done
19
+ end
20
+
21
+ @ekg.start! do
22
+ AMQP.connection.disconnect
23
+ end
24
+
25
+ end
26
+
27
+ it "should fire failure when there is a tcp connection loss" do
28
+ @ekg.on_heartbeat_failure do
29
+ logger.debug {"heartbeat failure received"}
30
+
31
+ @ekg.shutdown! do
32
+ logger.debug { "on shutdown fired" }
33
+ done
34
+ end
35
+ end
36
+
37
+ @ekg.on_start do
38
+ logger.debug {"sending tcp_connection_lost"}
39
+ AMQP.connection.tcp_connection_lost
40
+ end
41
+
42
+ @ekg.start!
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module WhoCan
5
+ describe "Pinger" do
6
+ include EventedSpec::AMQPSpec
7
+ default_timeout 1.0
8
+ default_options :host => 'localhost'
9
+
10
+ amqp_before do
11
+ @who_can = WhoCan.new(AMQP.connection) #default opts
12
+ @pinger = @who_can.new_pinger
13
+ end
14
+
15
+ it "should interact with the responder" do
16
+ responder = @who_can.new_responder("test_exchange")
17
+ responder.on_ping do |response|
18
+ response.delay = 0.1
19
+ response.response = "HAI"
20
+ end
21
+
22
+ responder.setup! do
23
+ @pinger.start! do
24
+ @pinger.ping!("test_exchange") do |header, payload|
25
+ payload.should == 'HAI'
26
+ done
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ it "should respond to two pings" do
33
+ responder = @who_can.new_responder("test_exchange")
34
+ responder.on_ping do |response|
35
+ response.delay = 0.1
36
+ response.response = "HAI"
37
+ end
38
+
39
+ responder.setup! do
40
+ @pinger.start! do
41
+ @pinger.ping!("test_exchange") do |header, payload|
42
+ payload.should == 'HAI'
43
+ @pinger.ping!("test_exchange") do |header, payload|
44
+ payload.should == 'HAI'
45
+ done
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ #
52
+ # it "should open an exchange twice" do
53
+ # AMQP::Channel.new do |channel|
54
+ # channel.fanout("two_time_exchanger") do |exchange|
55
+ # $stderr.puts("got exchange first time")
56
+ # ex = channel.fanout("two_time_exchanger", :nowait => false)
57
+ # ex.publish("OH HAI fucker") { ex.should be_a(AMQP::Exchange); done}
58
+ # end
59
+ # end
60
+ # end
61
+
62
+ end
63
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module WhoCan
5
+ class TestingError < StandardError; end
6
+
7
+ describe "Pinger" do
8
+ include EventedSpec::AMQPSpec
9
+ default_timeout 3.0
10
+ default_options :host => 'localhost'
11
+
12
+ amqp_before do
13
+ @who_can = WhoCan.new(AMQP.connection) #default opts
14
+ @pinger = @who_can.new_pinger
15
+ end
16
+
17
+ it "should call back with the responders info" do
18
+ #channel = @who_can.channel
19
+
20
+ exchange_name = "test_exchange"
21
+
22
+ call_pinger = lambda do
23
+ @pinger.start! do
24
+ @pinger.ping!(exchange_name) do |header, payload|
25
+ payload.should == "HAI"
26
+ done
27
+ end
28
+ end
29
+ end
30
+
31
+ AMQP::Channel.new do |channel|
32
+ channel.fanout(exchange_name) do |exchange|
33
+ channel.queue('', :exclusive => true, :auto_delete => true) do |queue|
34
+ queue.bind(exchange) do
35
+ queue.subscribe do |header, payload|
36
+ channel.default_exchange.publish("HAI", :routing_key => header.reply_to, :message_id => header.message_id) {}
37
+ end
38
+ call_pinger.call
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ it "should call the errback when there is a timeout" do
46
+ @pinger.start! do
47
+ @pinger.ping!("exchangename", 0.1) do |header, payload|
48
+ raise "Should not have reached the pinger callback"
49
+ end.errback do
50
+ done
51
+ end
52
+ end
53
+ end
54
+
55
+ it "should call the errback when there is an exception in queueing" do
56
+ @pinger.start! do
57
+ flexmock(@pinger.channel).should_receive(:fanout).and_raise(TestingError)
58
+
59
+ @pinger.ping!("exchangename", 0.1) do |header, payload|
60
+ raise "Should not have reached the pinger callback"
61
+ end.errback do |exc|
62
+ exc.should be_a(TestingError)
63
+ done
64
+ end
65
+ end
66
+ end
67
+
68
+ it "should not error when the responder has not already setup the exchange" do
69
+ lambda do
70
+ @pinger.start! do
71
+ @pinger.ping!("test_exchange") do |header, payload|
72
+ raise "oh no, shouln't have called the block"
73
+ end
74
+ end
75
+ end.should_not raise_error
76
+
77
+ EM.add_timer(0.1) do
78
+ done
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module WhoCan
5
+
6
+ describe "Responder" do
7
+ include EventedSpec::AMQPSpec
8
+ default_timeout 3.0
9
+ default_options :host => 'localhost'
10
+
11
+ amqp_before do
12
+ @who_can = WhoCan.new(AMQP.connection) #default opts
13
+ @exchange_name = "test_exchange"
14
+ @responder = @who_can.new_responder(@exchange_name)
15
+ end
16
+
17
+
18
+ it "should respond to the pings" do
19
+ @responder.on_ping do |response|
20
+ response.delay = 0.1
21
+ response.response = "OHHAI"
22
+ end
23
+
24
+ @responder.setup! do
25
+
26
+ AMQP::Channel.new do |channel|
27
+ channel.queue('', :exclusive => true, :auto_delete => true) do |queue|
28
+ queue.subscribe do |header, payload|
29
+ payload.should == "OHHAI"
30
+ done
31
+ end
32
+
33
+ channel.fanout(@exchange_name) do |exchange|
34
+ exchange.publish("PING", :reply_to => queue.name, :message_id => "MYMESSAGEID") {}
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+
41
+
42
+ end
43
+
44
+
45
+ end
46
+
47
+
48
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "who_can/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "who_can"
7
+ s.version = WhoCan::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Jonathan D. Simms", "Topper Bowers"]
10
+ s.email = ["simms@hp.com", "topper.bowers@hp.com"]
11
+
12
+ s.summary = %q{An AMQP-based scatter-gather job queuing protocol library}
13
+ s.description = s.summary
14
+
15
+ s.add_dependency('eventmachine', '~> 1.0.0.beta.3')
16
+ s.add_dependency('amqp', '~> 0.8.0.rc13')
17
+ s.add_dependency('uuidtools', '~> 2.1.2')
18
+ s.add_dependency('deferred', '~> 0.5.0')
19
+ s.add_dependency('state_machine', '~> 1.0.1')
20
+ s.add_dependency('activesupport', '~> 3.0.7')
21
+
22
+ s.add_development_dependency('ZenTest', '>= 4.5.0')
23
+ s.add_development_dependency('rspec', '~> 2.5.0')
24
+ s.add_development_dependency('evented-spec', '~> 0.4.1')
25
+ s.add_development_dependency('flexmock', '~> 0.8.11')
26
+ s.add_development_dependency('ruby-graphviz', '~> 0.9.0')
27
+
28
+ s.files = `git ls-files`.split("\n")
29
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
31
+ s.require_paths = ["lib"]
32
+ end
metadata ADDED
@@ -0,0 +1,290 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: who_can
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 4
10
+ version: 0.3.4
11
+ platform: ruby
12
+ authors:
13
+ - Jonathan D. Simms
14
+ - Topper Bowers
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2012-02-02 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: eventmachine
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 62196357
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 0
34
+ - beta
35
+ - 3
36
+ version: 1.0.0.beta.3
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: amqp
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ hash: 15424143
48
+ segments:
49
+ - 0
50
+ - 8
51
+ - 0
52
+ - rc
53
+ - 13
54
+ version: 0.8.0.rc13
55
+ type: :runtime
56
+ version_requirements: *id002
57
+ - !ruby/object:Gem::Dependency
58
+ name: uuidtools
59
+ prerelease: false
60
+ requirement: &id003 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ hash: 15
66
+ segments:
67
+ - 2
68
+ - 1
69
+ - 2
70
+ version: 2.1.2
71
+ type: :runtime
72
+ version_requirements: *id003
73
+ - !ruby/object:Gem::Dependency
74
+ name: deferred
75
+ prerelease: false
76
+ requirement: &id004 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ hash: 11
82
+ segments:
83
+ - 0
84
+ - 5
85
+ - 0
86
+ version: 0.5.0
87
+ type: :runtime
88
+ version_requirements: *id004
89
+ - !ruby/object:Gem::Dependency
90
+ name: state_machine
91
+ prerelease: false
92
+ requirement: &id005 !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ hash: 21
98
+ segments:
99
+ - 1
100
+ - 0
101
+ - 1
102
+ version: 1.0.1
103
+ type: :runtime
104
+ version_requirements: *id005
105
+ - !ruby/object:Gem::Dependency
106
+ name: activesupport
107
+ prerelease: false
108
+ requirement: &id006 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ hash: 9
114
+ segments:
115
+ - 3
116
+ - 0
117
+ - 7
118
+ version: 3.0.7
119
+ type: :runtime
120
+ version_requirements: *id006
121
+ - !ruby/object:Gem::Dependency
122
+ name: ZenTest
123
+ prerelease: false
124
+ requirement: &id007 !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 43
130
+ segments:
131
+ - 4
132
+ - 5
133
+ - 0
134
+ version: 4.5.0
135
+ type: :development
136
+ version_requirements: *id007
137
+ - !ruby/object:Gem::Dependency
138
+ name: rspec
139
+ prerelease: false
140
+ requirement: &id008 !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ hash: 27
146
+ segments:
147
+ - 2
148
+ - 5
149
+ - 0
150
+ version: 2.5.0
151
+ type: :development
152
+ version_requirements: *id008
153
+ - !ruby/object:Gem::Dependency
154
+ name: evented-spec
155
+ prerelease: false
156
+ requirement: &id009 !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ~>
160
+ - !ruby/object:Gem::Version
161
+ hash: 13
162
+ segments:
163
+ - 0
164
+ - 4
165
+ - 1
166
+ version: 0.4.1
167
+ type: :development
168
+ version_requirements: *id009
169
+ - !ruby/object:Gem::Dependency
170
+ name: flexmock
171
+ prerelease: false
172
+ requirement: &id010 !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ~>
176
+ - !ruby/object:Gem::Version
177
+ hash: 41
178
+ segments:
179
+ - 0
180
+ - 8
181
+ - 11
182
+ version: 0.8.11
183
+ type: :development
184
+ version_requirements: *id010
185
+ - !ruby/object:Gem::Dependency
186
+ name: ruby-graphviz
187
+ prerelease: false
188
+ requirement: &id011 !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ~>
192
+ - !ruby/object:Gem::Version
193
+ hash: 59
194
+ segments:
195
+ - 0
196
+ - 9
197
+ - 0
198
+ version: 0.9.0
199
+ type: :development
200
+ version_requirements: *id011
201
+ description: An AMQP-based scatter-gather job queuing protocol library
202
+ email:
203
+ - simms@hp.com
204
+ - topper.bowers@hp.com
205
+ executables: []
206
+
207
+ extensions: []
208
+
209
+ extra_rdoc_files: []
210
+
211
+ files:
212
+ - .gitignore
213
+ - .rspec
214
+ - .rvmrc
215
+ - Gemfile
216
+ - Rakefile
217
+ - lib/who_can.rb
218
+ - lib/who_can/base.rb
219
+ - lib/who_can/connection_manager.rb
220
+ - lib/who_can/connection_wrapper.rb
221
+ - lib/who_can/heartbeater.rb
222
+ - lib/who_can/heartbeater/beat.rb
223
+ - lib/who_can/heartbeater/ekg.rb
224
+ - lib/who_can/logging.rb
225
+ - lib/who_can/pinger.rb
226
+ - lib/who_can/responder.rb
227
+ - lib/who_can/version.rb
228
+ - poc/heartbeater.rb
229
+ - poc/submitter.rb
230
+ - poc/who_can_with_hearbeat.rb
231
+ - scripts/cross_cluster_ping.rb
232
+ - spec/spec_helper.rb
233
+ - spec/support/evented_spec_extensions.rb
234
+ - spec/support/logging.rb
235
+ - spec/support/logging_progress_bar_formatter.rb
236
+ - spec/who_can/base_spec.rb
237
+ - spec/who_can/connection_manager_spec.rb
238
+ - spec/who_can/connection_wrapper_spec.rb
239
+ - spec/who_can/heartbeater/beat_spec.rb
240
+ - spec/who_can/heartbeater/ekg_spec.rb
241
+ - spec/who_can/pinger_responder_integration_spec.rb
242
+ - spec/who_can/pinger_spec.rb
243
+ - spec/who_can/responder_spec.rb
244
+ - who_can.gemspec
245
+ homepage:
246
+ licenses: []
247
+
248
+ post_install_message:
249
+ rdoc_options: []
250
+
251
+ require_paths:
252
+ - lib
253
+ required_ruby_version: !ruby/object:Gem::Requirement
254
+ none: false
255
+ requirements:
256
+ - - ">="
257
+ - !ruby/object:Gem::Version
258
+ hash: 3
259
+ segments:
260
+ - 0
261
+ version: "0"
262
+ required_rubygems_version: !ruby/object:Gem::Requirement
263
+ none: false
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ hash: 3
268
+ segments:
269
+ - 0
270
+ version: "0"
271
+ requirements: []
272
+
273
+ rubyforge_project:
274
+ rubygems_version: 1.8.10
275
+ signing_key:
276
+ specification_version: 3
277
+ summary: An AMQP-based scatter-gather job queuing protocol library
278
+ test_files:
279
+ - spec/spec_helper.rb
280
+ - spec/support/evented_spec_extensions.rb
281
+ - spec/support/logging.rb
282
+ - spec/support/logging_progress_bar_formatter.rb
283
+ - spec/who_can/base_spec.rb
284
+ - spec/who_can/connection_manager_spec.rb
285
+ - spec/who_can/connection_wrapper_spec.rb
286
+ - spec/who_can/heartbeater/beat_spec.rb
287
+ - spec/who_can/heartbeater/ekg_spec.rb
288
+ - spec/who_can/pinger_responder_integration_spec.rb
289
+ - spec/who_can/pinger_spec.rb
290
+ - spec/who_can/responder_spec.rb