mcollective-client 2.2.4 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of mcollective-client might be problematic. Click here for more details.

Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/lib/mcollective/application.rb +25 -34
  3. data/lib/mcollective/client.rb +91 -33
  4. data/lib/mcollective/config.rb +42 -43
  5. data/lib/mcollective/data/base.rb +1 -1
  6. data/lib/mcollective/data/result.rb +6 -2
  7. data/lib/mcollective/ddl/agentddl.rb +28 -1
  8. data/lib/mcollective/ddl/base.rb +8 -6
  9. data/lib/mcollective/log.rb +11 -3
  10. data/lib/mcollective/logger/file_logger.rb +4 -4
  11. data/lib/mcollective/matcher.rb +9 -1
  12. data/lib/mcollective/message.rb +14 -23
  13. data/lib/mcollective/optionparser.rb +9 -1
  14. data/lib/mcollective/pluginpackager.rb +24 -3
  15. data/lib/mcollective/pluginpackager/agent_definition.rb +12 -12
  16. data/lib/mcollective/pluginpackager/standard_definition.rb +12 -12
  17. data/lib/mcollective/rpc/agent.rb +15 -12
  18. data/lib/mcollective/rpc/client.rb +67 -31
  19. data/lib/mcollective/rpc/helpers.rb +7 -1
  20. data/lib/mcollective/rpc/reply.rb +3 -1
  21. data/lib/mcollective/shell.rb +45 -8
  22. data/lib/mcollective/util.rb +37 -1
  23. data/lib/mcollective/windows_daemon.rb +14 -3
  24. data/spec/spec_helper.rb +2 -0
  25. data/spec/unit/application_spec.rb +45 -26
  26. data/spec/unit/cache_spec.rb +3 -3
  27. data/spec/unit/client_spec.rb +269 -24
  28. data/spec/unit/config_spec.rb +89 -26
  29. data/spec/unit/data/base_spec.rb +1 -0
  30. data/spec/unit/data/result_spec.rb +19 -1
  31. data/spec/unit/data_spec.rb +3 -0
  32. data/spec/unit/ddl/agentddl_spec.rb +32 -0
  33. data/spec/unit/ddl/base_spec.rb +4 -0
  34. data/spec/unit/ddl/dataddl_spec.rb +1 -1
  35. data/spec/unit/log_spec.rb +44 -27
  36. data/spec/unit/logger/base_spec.rb +1 -1
  37. data/spec/unit/matcher_spec.rb +14 -0
  38. data/spec/unit/message_spec.rb +24 -0
  39. data/spec/unit/optionparser_spec.rb +99 -0
  40. data/spec/unit/pluginpackager/agent_definition_spec.rb +48 -17
  41. data/spec/unit/pluginpackager/standard_definition_spec.rb +44 -20
  42. data/spec/unit/pluginpackager_spec.rb +31 -7
  43. data/spec/unit/plugins/mcollective/agent/rpcutil_spec.rb +176 -0
  44. data/spec/unit/plugins/mcollective/application/plugin_spec.rb +81 -0
  45. data/spec/unit/plugins/mcollective/audit/logfile_spec.rb +44 -0
  46. data/spec/unit/plugins/mcollective/connector/activemq_spec.rb +118 -27
  47. data/spec/unit/plugins/mcollective/connector/rabbitmq_spec.rb +168 -34
  48. data/spec/unit/plugins/mcollective/data/agent_data_spec.rb +1 -0
  49. data/spec/unit/plugins/mcollective/data/fstat_data_spec.rb +1 -0
  50. data/spec/unit/plugins/mcollective/discovery/flatfile_spec.rb +10 -0
  51. data/spec/unit/plugins/mcollective/discovery/stdin_spec.rb +65 -0
  52. data/spec/unit/plugins/mcollective/facts/yaml_facts_spec.rb +65 -0
  53. data/spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb +240 -219
  54. data/spec/unit/plugins/mcollective/packagers/modulepackage_packager_spec.rb +209 -0
  55. data/spec/unit/plugins/mcollective/packagers/rpmpackage_packager_spec.rb +223 -109
  56. data/spec/unit/rpc/actionrunner_spec.rb +2 -1
  57. data/spec/unit/rpc/agent_spec.rb +130 -1
  58. data/spec/unit/rpc/client_spec.rb +169 -3
  59. data/spec/unit/security/base_spec.rb +0 -1
  60. data/spec/unit/shell_spec.rb +76 -3
  61. data/spec/unit/util_spec.rb +69 -1
  62. data/spec/unit/windows_daemon_spec.rb +30 -9
  63. metadata +104 -90
  64. data/spec/unit/plugins/mcollective/connector/stomp/eventlogger_spec.rb +0 -34
  65. data/spec/unit/plugins/mcollective/connector/stomp_spec.rb +0 -424
  66. data/spec/unit/plugins/mcollective/validator/any_validator_spec.rb +0 -15
@@ -11,15 +11,26 @@ module MCollective
11
11
 
12
12
  def service_main
13
13
  Log.debug("Starting Windows Service Daemon")
14
+ while running?
15
+ return if state != RUNNING
16
+ @runner = Runner.new(nil)
17
+ @runner.run
18
+ end
14
19
 
15
- runner = Runner.new(nil)
16
- runner.run
20
+ # Right now we don't have a way to let the connection and windows sleeper threads
21
+ # run to conclusion. Until that is possible we iterate the list of living threads
22
+ # and kill everything that isn't the main thread. This lets us exit cleanly.
23
+ Thread.list.each do |t|
24
+ if t != Thread.current
25
+ t.kill
26
+ end
27
+ end
17
28
  end
18
29
 
19
30
  def service_stop
20
31
  Log.info("Windows service stopping")
32
+ @runner.stop
21
33
  PluginManager["connector_plugin"].disconnect
22
- exit! 0
23
34
  end
24
35
  end
25
36
  end
@@ -15,11 +15,13 @@ require 'ostruct'
15
15
  require 'tmpdir'
16
16
  require 'tempfile'
17
17
  require 'fileutils'
18
+ require 'mcollective/test'
18
19
 
19
20
  require 'monkey_patches/instance_variable_defined'
20
21
 
21
22
  RSpec.configure do |config|
22
23
  config.mock_with :mocha
24
+ config.include(MCollective::Test::Matchers)
23
25
 
24
26
  config.before :each do
25
27
  MCollective::Config.instance.set_config_defaults("")
@@ -174,6 +174,25 @@ module MCollective
174
174
  @argv_backup.each{|a| ARGV << a}
175
175
  end
176
176
 
177
+ it "should support unsetting boolean options" do
178
+ Application.any_instance.stubs("main").returns(true)
179
+
180
+ Application.option :foo,
181
+ :description => "meh",
182
+ :arguments => "--[no-]foo",
183
+ :type => :boolean
184
+
185
+ ARGV.clear
186
+ ARGV << "--no-foo"
187
+
188
+ a = Application.new
189
+ a.run
190
+ a.configuration.should == {:foo=>false}
191
+
192
+ ARGV.clear
193
+ @argv_backup.each{|a| ARGV << a}
194
+ end
195
+
177
196
  it "should set the application description as head" do
178
197
  OptionParser.any_instance.stubs(:define_head).with("meh")
179
198
 
@@ -395,7 +414,7 @@ module MCollective
395
414
 
396
415
  describe "#halt" do
397
416
  before do
398
- @stats = {:discoverytime => 0, :discovered => 0, :failcount => 0, :responses => 0}
417
+ @stats = {:discoverytime => 0, :discovered => 0, :failcount => 0, :responses => 0, :okcount => 0}
399
418
  end
400
419
 
401
420
  it "should exit with code 0 if discovery was done and all responses passed" do
@@ -404,28 +423,25 @@ module MCollective
404
423
  @stats[:discoverytime] = 2
405
424
  @stats[:discovered] = 2
406
425
  @stats[:responses] = 2
426
+ @stats[:okcount] = 2
407
427
 
408
- app.expects(:exit).with(0)
409
-
410
- app.halt(@stats)
428
+ app.halt_code(@stats).should == 0
411
429
  end
412
430
 
413
431
  it "should exit with code 0 if no discovery were done but responses were received" do
414
432
  app = Application.new
415
433
 
416
434
  @stats[:responses] = 1
435
+ @stats[:okcount] = 1
436
+ @stats[:discovered] = 1
417
437
 
418
- app.expects(:exit).with(0)
419
-
420
- app.halt(@stats)
438
+ app.halt_code(@stats).should == 0
421
439
  end
422
440
 
423
- it "should exit with code 0 if discovery info is missing" do
441
+ it "should exit with code 1 if discovery info is missing" do
424
442
  app = Application.new
425
443
 
426
- app.expects(:exit).with(0)
427
-
428
- app.halt({})
444
+ app.halt_code({}).should == 1
429
445
  end
430
446
 
431
447
  it "should exit with code 1 if no nodes were discovered and discovery was done" do
@@ -433,22 +449,29 @@ module MCollective
433
449
 
434
450
  @stats[:discoverytime] = 2
435
451
 
436
- app.expects(:exit).with(1)
437
-
438
- app.halt(@stats)
452
+ app.halt_code(@stats).should == 1
439
453
  end
440
454
 
441
455
  it "should exit with code 2 if a request failed for some nodes" do
442
456
  app = Application.new
443
457
 
444
- @stats[:discovered] = 1
458
+ @stats[:discovered] = 2
445
459
  @stats[:failcount] = 1
446
460
  @stats[:discoverytime] = 2
447
- @stats[:responses] = 1
461
+ @stats[:responses] = 2
462
+
463
+ app.halt_code(@stats).should == 2
464
+ end
465
+
466
+ it "should exit with code 2 when no discovery were done and there were failure results" do
467
+ app = Application.new
448
468
 
449
- app.expects(:exit).with(2)
469
+ @stats[:discovered] = 1
470
+ @stats[:failcount] = 1
471
+ @stats[:discoverytime] = 0
472
+ @stats[:responses] = 1
450
473
 
451
- app.halt(@stats)
474
+ app.halt_code(@stats).should == 2
452
475
  end
453
476
 
454
477
  it "should exit with code 3 if no responses were received after discovery" do
@@ -457,17 +480,13 @@ module MCollective
457
480
  @stats[:discovered] = 1
458
481
  @stats[:discoverytime] = 2
459
482
 
460
- app.expects(:exit).with(3)
461
-
462
- app.halt(@stats)
483
+ app.halt_code(@stats).should == 3
463
484
  end
464
485
 
465
486
  it "should exit with code 4 if no discovery was done and no responses were received" do
466
487
  app = Application.new
467
488
 
468
- app.expects(:exit).with(4)
469
-
470
- app.halt(@stats)
489
+ app.halt_code(@stats).should == 4
471
490
  end
472
491
  end
473
492
 
@@ -573,8 +592,8 @@ module MCollective
573
592
  e.stubs(:backtrace).returns(["rspec"])
574
593
  e.stubs(:to_s).returns("rspec")
575
594
 
576
- @app.expects(:options).returns({:verbose => true}).twice
577
- out.expects(:puts).with(regexp_matches(/ application failed to run, use -v for full error details/))
595
+ @app.expects(:options).returns({:verbose => true}).times(3)
596
+ out.expects(:puts).with(regexp_matches(/ application failed to run/))
578
597
  out.expects(:puts).with(regexp_matches(/from rspec <---/))
579
598
  out.expects(:puts).with(regexp_matches(/rspec.+Mocha::Mock/))
580
599
 
@@ -76,14 +76,14 @@ module MCollective
76
76
  end
77
77
  end
78
78
 
79
- describe "#valid?" do
80
- it "should return >0 for valid" do
79
+ describe "#ttl" do
80
+ it "should return a positive value for an unexpired item" do
81
81
  Cache.setup("rspec", 300)
82
82
  Cache.write("rspec", :key, :val)
83
83
  Cache.ttl("rspec", :key).should >= 0
84
84
  end
85
85
 
86
- it "should return <0 for invalid" do
86
+ it "should return <0 for an expired item" do
87
87
  Cache.setup("rspec", 300)
88
88
  Cache.write("rspec", :key, :val)
89
89
 
@@ -27,44 +27,122 @@ module MCollective
27
27
 
28
28
  describe "#sendreq" do
29
29
  it "should send the supplied message" do
30
+ request = mock
31
+ request.stubs(:agent)
32
+ request.stubs(:ttl)
33
+ request.stubs(:collective)
34
+ @client.expects(:createreq).with(request, "rspec", {}).returns(request)
35
+ request.expects(:publish)
36
+ request.expects(:requestid).returns("13fegbcw").twice
37
+ result = @client.sendreq(request, "rspec")
38
+ result.should == "13fegbcw"
39
+ end
40
+ end
41
+
42
+ describe "#createreq" do
43
+ it "should create a request" do
30
44
  message = Message.new("rspec", nil, {:agent => "rspec", :type => :request, :collective => "mcollective", :filter => Util.empty_filter, :options => Util.default_options})
45
+ message.stubs(:encode!)
46
+ @client.stubs(:subscribe)
47
+ message.stubs(:reply_to)
48
+ result = @client.createreq(message, "rspec")
49
+ result.should == message
50
+ end
31
51
 
32
- message.expects(:encode!)
33
- @client.expects(:subscribe).with("rspec", :reply)
34
- message.expects(:publish)
35
- message.expects(:requestid).twice
36
- @client.sendreq(message, "rspec")
52
+ it "should create a new request if the message if not of type Message" do
53
+ message = mock
54
+ message.stubs(:encode!)
55
+ @client.stubs(:subscribe)
56
+ message.stubs(:reply_to)
57
+ Message.expects(:new).returns(message)
58
+ result = @client.createreq("message", "rspec")
59
+ result.should == message
37
60
  end
38
61
 
39
- it "should not subscribe to a reply queue for a message with a reply-to" do
62
+ it "should subscripe to the reply queue unless has been specified" do
40
63
  message = Message.new("rspec", nil, {:agent => "rspec", :type => :request, :collective => "mcollective", :filter => Util.empty_filter, :options => Util.default_options})
41
- message.reply_to = "rspec"
64
+ message.stubs(:encode!)
65
+ @client.expects(:subscribe).with("rspec", :reply)
66
+ message.stubs(:reply_to).returns(nil)
67
+ @client.createreq(message, "rspec")
68
+ end
42
69
 
43
- message.expects(:encode!)
70
+ it "should not subscribe to the reply queue if one has been specified" do
71
+ message = Message.new("rspec", nil, {:agent => "rspec", :type => :request, :collective => "mcollective", :filter => Util.empty_filter, :options => Util.default_options})
72
+ message.stubs(:encode!)
44
73
  @client.expects(:subscribe).never
45
- message.expects(:publish)
46
- message.expects(:requestid).twice
47
- @client.sendreq(message, "rspec")
74
+ message.stubs(:reply_to).returns(:reply)
75
+ @client.createreq(message, "rspec")
48
76
  end
49
77
  end
50
- describe "#req" do
51
- it "should record the requestid" do
52
- message = Message.new("rspec", nil, {:agent => "rspec", :type => :request, :collective => "mcollective", :filter => Util.empty_filter, :options => Util.default_options})
53
- message.discovered_hosts = ["rspec"]
54
78
 
55
- reply = mock
56
- reply.stubs("payload").returns("rspec payload")
79
+ describe "#subscribe" do
80
+ it "should subscribe to a destination if it hasn't already" do
81
+ subscription = mock
82
+ Util.stubs(:make_subscriptions).returns(subscription)
83
+ Util.expects(:subscribe).with(subscription)
84
+ @client.subscribe("rspec", :queue)
85
+ @client.instance_variable_get(:@subscriptions).should == {"rspec" => 1}
86
+ end
57
87
 
58
- @client.expects(:sendreq).returns("823a3419a0975c3facbde121f72ab61f")
59
- @client.expects(:receive).returns(reply)
88
+ it "should not subscribe to a destination if it already has" do
89
+ @client.instance_variable_get(:@subscriptions)["rspec"] = 1
90
+ Util.expects(:make_subscription).never
91
+ @client.subscribe("rspec", :queue)
92
+ end
93
+ end
60
94
 
61
- @discoverer.expects(:discovery_timeout).with(message.options[:timeout], message.options[:filter]).returns(0)
95
+ describe "#unsubscribe" do
96
+ it "should unsubscribe if a subscription has been made" do
97
+ subscription = mock
98
+ @client.instance_variable_get(:@subscriptions)["rspec"] = 1
99
+ Util.expects(:make_subscriptions).returns(subscription)
100
+ Util.expects(:unsubscribe).with(subscription)
101
+ @client.unsubscribe("rspec", :queue)
102
+ end
103
+
104
+ it "should no unsubscribe if a subscription hasn't been made" do
105
+ Util.expects(:make_subscription).never
106
+ @client.unsubscribe("rspec", :queue)
107
+ end
108
+ end
62
109
 
63
- Time.stubs(:now).returns(Time.at(1340621250), Time.at(1340621251))
110
+ describe "receive" do
111
+ let(:message) do
112
+ m = mock
113
+ m.stubs(:type=)
114
+ m.stubs(:expected_msgid=)
115
+ m.stubs(:decode!)
116
+ m.stubs(:requestid).returns("erfs123")
117
+ m
118
+ end
119
+
120
+ let(:badmessage) do
121
+ m = mock
122
+ m.stubs(:type=)
123
+ m.stubs(:expected_msgid=)
124
+ m.stubs(:decode!)
125
+ m.stubs(:requestid).returns("badmessage")
126
+ m
127
+ end
128
+
129
+ it "should receive a message" do
130
+ @connector.stubs(:receive).returns(message)
131
+ result = @client.receive("erfs123")
132
+ result.should == message
133
+ end
134
+
135
+ it "log and retry if the message reqid does not match the expected msgid" do
136
+ Log.expects(:debug).with("Ignoring a message for some other client : Message reqid badmessage does not match our reqid erfs123")
137
+ @connector.stubs(:receive).returns(badmessage, message)
138
+ @client.receive("erfs123")
139
+ end
64
140
 
65
- @client.req(message){}.should == {:blocktime => 1.0, :discoverytime => 0, :noresponsefrom => [],
66
- :requestid => "823a3419a0975c3facbde121f72ab61f", :responses => 1,
67
- :starttime => 1340621250.0, :totaltime => 1.0}
141
+ it "should log and retry if a SecurityValidationFailed expection is raised" do
142
+ Log.expects(:warn).with("Ignoring a message that did not pass security validations")
143
+ badmessage.stubs(:decode!).raises(SecurityValidationFailed)
144
+ @connector.stubs(:receive).returns(badmessage, message)
145
+ @client.receive("erfs123")
68
146
  end
69
147
  end
70
148
 
@@ -74,5 +152,172 @@ module MCollective
74
152
  @client.discover({}, 1).should == []
75
153
  end
76
154
  end
155
+
156
+ describe "#req" do
157
+ let(:message) do
158
+ m = Message.new("rspec", nil, {:agent => "rspec",
159
+ :type => :request,
160
+ :collective => "mcollective",
161
+ :filter => Util.empty_filter,
162
+ :options => Util.default_options})
163
+ m.discovered_hosts = ["rspec"]
164
+ m
165
+ end
166
+
167
+ let(:request) do
168
+ r = mock
169
+ r.stubs(:requestid).returns("erfs123")
170
+ r
171
+ end
172
+
173
+ before :each do
174
+ @client.expects(:unsubscribe)
175
+ @discoverer.expects(:discovery_timeout).with(message.options[:timeout], message.options[:filter]).returns(0)
176
+ @client.stubs(:createreq).returns(request)
177
+ @client.expects(:update_stat)
178
+ end
179
+
180
+ it "should thread the publisher and receiver if configured" do
181
+ @client.instance_variable_get(:@options)[:threaded] = true
182
+ @client.expects(:threaded_req).with(request, nil, 0, 1)
183
+ message.options[:threaded] = true
184
+ @client.req(message)
185
+ end
186
+
187
+ it "should not thread the publisher and receiver if configured" do
188
+ @client.instance_variable_set(:@threaded, false)
189
+ @client.expects(:unthreaded_req).with(request, nil, 0, 1)
190
+ @client.req(message)
191
+ end
192
+ end
193
+
194
+ describe "#unthreaded_req" do
195
+ it "should start a publisher and then start a receiver" do
196
+ request = mock
197
+ request.stubs(:requestid).returns("erfs123")
198
+ @client.expects(:start_publisher).with(request, 5)
199
+ @client.expects(:start_receiver).with("erfs123", 2, 10)
200
+ @client.unthreaded_req(request, 5, 10, 2)
201
+ end
202
+ end
203
+
204
+ describe "#threaded_req" do
205
+ it "should start a publisher thread and a receiver thread" do
206
+ request = mock
207
+ request.stubs(:requestid).returns("erfs123")
208
+ p_thread = mock
209
+ r_thread = mock
210
+ Thread.expects(:new).yields.returns(p_thread)
211
+ Thread.expects(:new).yields.returns(r_thread)
212
+ @client.expects(:start_publisher).with(request, 5)
213
+ @client.expects(:start_receiver).with("erfs123", 2, 15).returns(2)
214
+ p_thread.expects(:join)
215
+ result = @client.threaded_req(request, 5, 10, 2)
216
+ result.should == 2
217
+ end
218
+ end
219
+
220
+ describe "#start_publisher" do
221
+ let(:message) do
222
+ m = mock
223
+ m.stubs(:requestid)
224
+ m.stubs(:agent)
225
+ m.stubs(:ttl)
226
+ m.stubs(:collective)
227
+ m
228
+ end
229
+
230
+ it "should publish the message" do
231
+ Timeout.stubs(:timeout).with(2).yields
232
+ message.expects(:publish)
233
+ @client.start_publisher(message, 2)
234
+ end
235
+
236
+ it "should log a warning on a timeout" do
237
+ Timeout.stubs(:timeout).raises(Timeout::Error)
238
+ Log.expects(:warn).with("Could not publish all messages. Publishing timed out.")
239
+ @client.start_publisher(message,2)
240
+ end
241
+ end
242
+
243
+ describe "#start_receiver" do
244
+ it "should go into a receive loop and receive until it reaches waitfor" do
245
+ results = []
246
+ Timeout.stubs(:timeout).yields
247
+ message = mock
248
+ @client.stubs(:receive).with("erfs123").returns(message)
249
+ message.stubs(:payload).returns("msg1", "msg2", "msg3")
250
+ @client.start_receiver("erfs123", 3, 5) do |msg|
251
+ results << msg
252
+ end
253
+ results.should == ["msg1", "msg2", "msg3"]
254
+ end
255
+
256
+ it "should log a warning if a timeout occurs" do
257
+ results = []
258
+ Timeout.stubs(:timeout).yields
259
+ message = mock
260
+ @client.stubs(:receive).with("erfs123").returns(message)
261
+ message.stubs(:payload).returns("msg1", "msg2", "timeout")
262
+ Log.expects(:warn).with("Could not receive all responses. Expected : 3. Received : 2")
263
+ responded = @client.start_receiver("erfs123", 3, 5) do |msg|
264
+ if msg == "timeout"
265
+ raise Timeout::Error
266
+ end
267
+ results << msg
268
+ end
269
+ results.should == ["msg1", "msg2"]
270
+ responded.should == 2
271
+ end
272
+
273
+ it "should not log a warning if a the response count is larger or equal to the expected number of responses" do
274
+ results = []
275
+ Timeout.stubs(:timeout).yields
276
+ message = mock
277
+ @client.stubs(:receive).with("erfs123").returns(message)
278
+ message.stubs(:payload).returns("msg1", "msg2", "timeout")
279
+ Log.expects(:warn).never
280
+ responded = @client.start_receiver("erfs123", 2, 5) do |msg|
281
+ if msg == "timeout"
282
+ raise Timeout::Error
283
+ end
284
+ results << msg
285
+ end
286
+ results.should == ["msg1", "msg2"]
287
+ responded.should == 2
288
+ end
289
+ end
290
+
291
+ describe "#update_stat" do
292
+ let(:before) do
293
+ { :starttime => Time.now.to_f,
294
+ :discoverytime => 0,
295
+ :blocktime => 0,
296
+ :totaltime => 0 }
297
+ end
298
+
299
+ let(:after) do
300
+ { :starttime => 10.0,
301
+ :discoverytime => 0,
302
+ :blocktime => 10.0,
303
+ :totaltime => 10.0,
304
+ :responses => 5,
305
+ :requestid => "erfs123",
306
+ :noresponsefrom => [] }
307
+ end
308
+
309
+ it "should update stats and return the stats hash" do
310
+ Time.stubs(:now).returns(10, 20)
311
+ @client.update_stat(before, 5, "erfs123").should == after
312
+ end
313
+ end
314
+
315
+ describe "#discovered_req" do
316
+ it "should raise a deprecation exception" do
317
+ expect{
318
+ @client.discovered_req(nil, nil)
319
+ }.to raise_error("Client#discovered_req has been removed, please port your agent and client to the SimpleRPC framework")
320
+ end
321
+ end
77
322
  end
78
323
  end