who_can 0.3.4

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.
@@ -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