mcollective-client 2.2.4 → 2.4.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.

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