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
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env rspec
2
+
3
+ @agent_file = File.join(File.dirname(__FILE__), '../../../../../', 'plugins', 'mcollective', 'agent', 'rpcutil.rb')
4
+
5
+ require 'spec_helper'
6
+ require @agent_file
7
+
8
+ module MCollective
9
+ module Agent
10
+ describe Rpcutil do
11
+ module Facts
12
+ def self.[](fact)
13
+ {'fact1' => 'value1', 'fact2' => 'value2', 'fact3' => 'value3'}[fact]
14
+ end
15
+ end
16
+
17
+ before :each do
18
+ @agent = MCollective::Test::LocalAgentTest.new('rpcutil', :agent_file => @agent_file).plugin
19
+ end
20
+
21
+ describe '#inventory' do
22
+ it 'should return the node inventory' do
23
+ facts = mock
24
+ facts.stubs(:get_facts).returns({:key => 'value'})
25
+ Agents.stubs(:agentlist).returns(['test'])
26
+ PluginManager.stubs(:[]).with('facts_plugin').returns(facts)
27
+ MCollective.stubs(:version).returns('2.4.0')
28
+ PluginManager.stubs(:grep).with(/_data$/).returns(['test_data'])
29
+ Config.any_instance.stubs(:classesfile).returns('classes.txt')
30
+ File.stubs(:exist?).with('classes.txt').returns(true)
31
+ File.stubs(:readlines).with('classes.txt').returns(['class1', 'class2'])
32
+ result = @agent.call(:inventory)
33
+ result.should be_successful
34
+ result.should have_data_items({:agents=>["test"],
35
+ :facts=>{:key=>"value"},
36
+ :version=>"2.4.0",
37
+ :classes=>["class1", "class2"],
38
+ :main_collective=>"mcollective",
39
+ :collectives=>["production", "staging"],
40
+ :data_plugins=>["test_data"]})
41
+ end
42
+ end
43
+
44
+ describe '#get_fact' do
45
+ it 'should return the value of the queried fact' do
46
+ result = @agent.call(:get_fact, :fact => 'fact1')
47
+ result.should be_successful
48
+ result.should have_data_items({:fact => 'fact1', :value => 'value1'})
49
+ end
50
+
51
+ it 'should not break if the fact is not present' do
52
+ result = @agent.call(:get_fact, :fact => 'fact4')
53
+ result.should be_successful
54
+ result.should have_data_items({:fact => 'fact4', :value => nil })
55
+ end
56
+ end
57
+
58
+ describe '#get_facts' do
59
+ it 'should return the value of the supplied facts' do
60
+ result = @agent.call(:get_facts, :facts => 'fact1, fact3')
61
+ result.should be_successful
62
+ result.should have_data_items(:values => {'fact1' => 'value1', 'fact3' => 'value3'})
63
+ end
64
+
65
+ it 'should not break if the facts are not present' do
66
+ result = @agent.call(:get_facts, :facts => 'fact4, fact5')
67
+ result.should be_successful
68
+ result.should have_data_items(:values => {'fact4' => nil, 'fact5' => nil})
69
+ end
70
+ end
71
+
72
+ describe '#daemon_stats' do
73
+ it "it should return the daemon's statistics" do
74
+ stats = {:threads => 2,
75
+ :agents => ['agent1', 'agent2'],
76
+ :pid => 42,
77
+ :times => 12345,
78
+ :configfile => '/etc/mcollective/server.cfg',
79
+ :version => '2.4.0',
80
+ :stats => {}}
81
+ config = mock
82
+ Config.stubs(:instance).returns(config)
83
+ MCollective.stubs(:version).returns('2.4.0')
84
+ config.stubs(:configfile).returns('/etc/mcollective/server.cfg')
85
+ PluginManager.stubs(:[]).returns(stats)
86
+ result = @agent.call(:daemon_stats)
87
+ result.should be_successful
88
+ stats.delete(:stats)
89
+ result.should have_data_items(stats)
90
+ end
91
+ end
92
+
93
+ describe '#agent_inventory' do
94
+ it 'should return the agent inventory' do
95
+ meta = {:license => 'ASL 2',
96
+ :description => 'Agent for testing',
97
+ :url => 'http://www.theurl.net',
98
+ :version => '1',
99
+ :author => 'rspec'}
100
+ agent = mock
101
+ agent.stubs(:meta).returns(meta)
102
+ agent.stubs(:timeout).returns(2)
103
+ PluginManager.stubs(:[]).with('test_agent').returns(agent)
104
+ Agents.stubs(:agentlist).returns(['test'])
105
+
106
+ result = @agent.call(:agent_inventory)
107
+ result.should be_successful
108
+ result.should have_data_items(:agents => [meta.merge({:timeout => 2, :name => 'test', :agent => 'test'})])
109
+ end
110
+ end
111
+
112
+ describe '#get_config_item' do
113
+ it 'should return the value of the requested config item' do
114
+ Config.any_instance.stubs(:respond_to?).with(:main_collective).returns(true)
115
+ result = @agent.call(:get_config_item, :item => :main_collective)
116
+ result.should be_successful
117
+ result.should have_data_items(:item => :main_collective, :value => "mcollective")
118
+ end
119
+
120
+ it 'should fail if the config item has not been defined' do
121
+ result = @agent.call(:get_config_item, :item => :failure)
122
+ result.should be_aborted_error
123
+ end
124
+ end
125
+
126
+ describe '#ping' do
127
+ it 'should return the current time on the host' do
128
+ Time.expects(:now).returns("123456")
129
+ result = @agent.call(:ping)
130
+ result.should be_successful
131
+ result.should have_data_items(:pong => 123456)
132
+ end
133
+ end
134
+
135
+ describe '#collective_info' do
136
+ it 'should return the main collective and list of defined collectives' do
137
+ result = @agent.call(:collective_info)
138
+ result.should be_successful
139
+ result.should have_data_items({:main_collective => 'mcollective', :collectives => ['production', 'staging']})
140
+ end
141
+ end
142
+
143
+ describe '#get_data' do
144
+ let(:query_data) do
145
+ {:key1 => 'value1', :key2 => 'value2'}
146
+ end
147
+
148
+ let(:data) do
149
+ mock
150
+ end
151
+
152
+ let(:ddl) do
153
+ mock
154
+ end
155
+
156
+ it 'should return the data results if a query has been specified' do
157
+ data.stubs(:lookup).with('query').returns(query_data)
158
+ Data.stubs(:ddl).with('test_data').returns(ddl)
159
+ Data.stubs(:ddl_transform_input).with(ddl, 'query').returns('query')
160
+ Data.stubs(:[]).with('test_data').returns(data)
161
+ result = @agent.call(:get_data, :source => 'test_data', :query => 'query')
162
+ result.should be_successful
163
+ result.should have_data_items(:key1 => 'value1', :key2 => 'value2')
164
+ end
165
+
166
+ it 'should return the data results if no query has been specified' do
167
+ data.stubs(:lookup).with(nil).returns(query_data)
168
+ Data.stubs(:[]).with('test_data').returns(data)
169
+ result = @agent.call(:get_data, :source => 'test_data')
170
+ result.should be_successful
171
+ result.should have_data_items(:key1 => 'value1', :key2 => 'value2')
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env rspec
2
+
3
+ require 'spec_helper'
4
+ require File.join(File.dirname(__FILE__), '../../../../../', 'plugins', 'mcollective', 'application', 'plugin.rb')
5
+
6
+ module MCollective
7
+ class Application
8
+ describe Plugin do
9
+
10
+ let(:ddl) { mock }
11
+
12
+ before do
13
+ @app = MCollective::Application::Plugin.new()
14
+ @app.configuration[:rpctemplate] = "rspec-helptemplate.erb"
15
+ end
16
+
17
+ describe "#doc_command" do
18
+ it "should display doc output for a plugin that exists when using 'plugin'" do
19
+ @app.configuration[:target] = "rspec"
20
+ PluginManager.stubs(:find).with(:agent, "ddl").returns(["rspec"])
21
+ PluginManager.stubs(:find).with(:aggregate, "ddl").returns([""])
22
+ PluginManager.stubs(:find).with(:data, "ddl").returns([""])
23
+ PluginManager.stubs(:find).with(:discovery, "ddl").returns([""])
24
+ PluginManager.stubs(:find).with(:validator, "ddl").returns([""])
25
+ @app.stubs(:load_plugin_ddl).with('rspec', :agent).returns(ddl)
26
+ ddl.expects(:help).with("rspec-helptemplate.erb").returns("agent_template")
27
+ @app.expects(:puts).with("agent_template")
28
+ @app.doc_command
29
+ end
30
+
31
+ it "should display doc output for a plugin that exists when using 'plugintype/plugin'" do
32
+ @app.configuration[:target] = "agent/rspec"
33
+ @app.stubs(:load_plugin_ddl).with(:rspec, "agent").returns(ddl)
34
+ ddl.expects(:help).with("rspec-helptemplate.erb").returns("agent_template")
35
+ @app.expects(:puts).with("agent_template")
36
+ @app.doc_command
37
+ end
38
+
39
+ it "should display a failure message for a plugin that doesn't exist when using 'plugin'" do
40
+ @app.configuration[:target] = "rspec"
41
+ PluginManager.stubs(:find).returns([""])
42
+ @app.expects(:abort).with("Could not find a plugin named 'rspec' in any supported plugin type").raises("test_error")
43
+
44
+ expect{
45
+ @app.doc_command
46
+ }.to raise_error "test_error"
47
+ end
48
+
49
+ it "should display a failure message for a plugin that doens't exist when using 'plugintype/plugin'" do
50
+ @app.configuration[:target] = "agent/rspec"
51
+ @app.expects(:load_plugin_ddl).with(:rspec, "agent").returns(nil)
52
+ @app.expects(:abort).with("Could not find a 'agent' plugin named 'rspec'").raises("test_error")
53
+
54
+ expect{
55
+ @app.doc_command
56
+ }.to raise_error "test_error"
57
+ end
58
+
59
+ it "should display a failure message if duplicate plugins are found" do
60
+ @app.configuration[:target] = "rspec"
61
+ PluginManager.stubs(:find).returns(["rspec"])
62
+ @app.stubs(:abort).with("Duplicate plugin name found, please specify a full path like agent/rpcutil").raises("test_error")
63
+
64
+ expect{
65
+ @app.doc_command
66
+ }.to raise_error "test_error"
67
+ end
68
+
69
+ it "should display a failure message for a plugintype that doens't exist" do
70
+ @app.configuration[:target] = "foo/rspec"
71
+ @app.stubs(:load_plugin_ddl).with(:rspec, "foo").returns(nil)
72
+ @app.stubs(:abort).with("Could not find a 'foo' plugin named 'rspec'").raises("test_error")
73
+
74
+ expect{
75
+ @app.doc_command
76
+ }.to raise_error "test_error"
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env rspec
2
+
3
+ require 'spec_helper'
4
+ require File.join(File.dirname(__FILE__), '../../../../../', 'plugins', 'mcollective', 'audit', 'logfile.rb')
5
+
6
+ module MCollective
7
+ module RPC
8
+ describe Logfile do
9
+ let(:file) do
10
+ mock
11
+ end
12
+
13
+ let(:request) do
14
+ req = mock
15
+ req.stubs(:uniqid).returns("1234")
16
+ req.stubs(:time).returns(1389179593)
17
+ req.stubs(:caller).returns("test_user")
18
+ req.stubs(:sender).returns("test_host")
19
+ req.stubs(:agent).returns("rspec_agent")
20
+ req.stubs(:action).returns("testme")
21
+ req.stubs(:data).returns({})
22
+ req
23
+ end
24
+
25
+ before :each do
26
+ Time.stubs(:now).returns(Time.at(1389180255))
27
+ file.expects(:puts).with("[2014-01-08 11:24:15 UTC] reqid=1234: reqtime=1389179593 caller=test_user@test_host " +
28
+ "agent=rspec_agent action=testme data={}")
29
+ end
30
+
31
+ it 'should log to a user defined logfile' do
32
+ Config.any_instance.stubs(:pluginconf).returns("rpcaudit.logfile" => "/nonexisting")
33
+ File.expects(:open).with("/nonexisting", "a").yields(file)
34
+ Logfile.new.audit_request(request, nil)
35
+ end
36
+
37
+ it 'should log to a default logfile' do
38
+ Config.any_instance.stubs(:pluginconf).returns({})
39
+ File.expects(:open).with("/var/log/mcollective-audit.log", "a").yields(file)
40
+ Logfile.new.audit_request(request, nil)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -95,6 +95,8 @@ module MCollective
95
95
  "activemq.randomize" => "true",
96
96
  "activemq.backup" => "true",
97
97
  "activemq.timeout" => "1",
98
+ "activemq.max_hbrlck_fails" => 3,
99
+ "activemq.max_hbread_fails" => 3,
98
100
  "activemq.connect_timeout" => "5"}
99
101
 
100
102
 
@@ -114,9 +116,12 @@ module MCollective
114
116
  :use_exponential_back_off => false,
115
117
  :max_reconnect_attempts => 5,
116
118
  :initial_reconnect_delay => 0.02,
119
+ :max_hbread_fails => 3,
120
+ :max_hbrlck_fails => 3,
117
121
  :randomize => true,
118
122
  :reliable => true,
119
123
  :logger => "logger",
124
+ :connect_headers => {},
120
125
  :hosts => [{:passcode => 'password1',
121
126
  :host => 'host1',
122
127
  :port => 6163,
@@ -130,12 +135,56 @@ module MCollective
130
135
  ])
131
136
 
132
137
  @c.expects(:ssl_parameters).with(2, true).returns(true)
138
+ @c.expects(:connection_headers).returns({})
133
139
 
134
140
  @c.instance_variable_set("@connection", nil)
135
141
  @c.connect(connector)
136
142
  end
137
143
  end
138
144
 
145
+ describe "#connection_headers" do
146
+ before do
147
+ @c.stubs(:stomp_version).returns("1.2.10")
148
+ end
149
+
150
+ it "should default to stomp 1.0 only" do
151
+ @config.expects(:pluginconf).returns({}).at_least_once
152
+ @c.connection_headers[:"accept-version"] == "1.0"
153
+ end
154
+
155
+ it "should support setting the vhost" do
156
+ @config.expects(:pluginconf).returns("activemq.vhost" => "rspec").at_least_once
157
+ @c.connection_headers.should == {:host => "rspec", :"accept-version" => "1.0"}
158
+ end
159
+
160
+ it "should log a warning about not using Stomp 1.1" do
161
+ @config.expects(:pluginconf).returns("activemq.heartbeat_interval" => "0").at_least_once
162
+ Log.expects(:warn).with(regexp_matches(/without STOMP 1.1 heartbeats/))
163
+ @c.connection_headers
164
+ end
165
+
166
+ it "should not support stomp 1.1 with older versions of the stomp gem" do
167
+ @config.expects(:pluginconf).returns("activemq.heartbeat_interval" => "30").at_least_once
168
+ @c.expects(:stomp_version).returns("1.0.0").once
169
+ expect { @c.connection_headers }.to raise_error("Setting STOMP 1.1 properties like heartbeat intervals require at least version 1.2.10 of the STOMP gem")
170
+ end
171
+
172
+ it "should force the heartbeat to min 30 seconds" do
173
+ @config.expects(:pluginconf).returns("activemq.heartbeat_interval" => "10").at_least_once
174
+ @c.connection_headers[:"heart-beat"].should == "30500,29500"
175
+ end
176
+
177
+ it "should default to 1.0 and 1.1 support" do
178
+ @config.expects(:pluginconf).returns("activemq.heartbeat_interval" => "30").at_least_once
179
+ @c.connection_headers[:"accept-version"].should == "1.1,1.0"
180
+ end
181
+
182
+ it "should support stomp 1.1 only operation" do
183
+ @config.expects(:pluginconf).returns("activemq.heartbeat_interval" => "30", "activemq.stomp_1_0_fallback" => 0).at_least_once
184
+ @c.connection_headers[:"accept-version"].should == "1.1"
185
+ end
186
+ end
187
+
139
188
  describe "#ssl_paramaters" do
140
189
  it "should ensure all settings are provided" do
141
190
  pluginconf = {"activemq.pool.1.host" => "host1",
@@ -161,6 +210,8 @@ module MCollective
161
210
  "activemq.pool.1.ssl.ca" => "rspec1.ca,rspec2.ca"}
162
211
 
163
212
  @config.expects(:pluginconf).returns(pluginconf).at_least_once
213
+ @c.expects(:get_key_file).returns("rspec.key").at_least_once
214
+ @c.expects(:get_cert_file).returns("rspec.cert").at_least_once
164
215
 
165
216
  File.expects(:exist?).with("rspec.cert").twice.returns(true)
166
217
  File.expects(:exist?).with("rspec.key").twice.returns(true)
@@ -197,6 +248,33 @@ module MCollective
197
248
  end
198
249
  end
199
250
 
251
+ describe "#get_key_file" do
252
+ it "should return the filename from the environment variable" do
253
+ ENV["MCOLLECTIVE_ACTIVEMQ_POOL2_SSL_KEY"] = "/path/to/rspec/env"
254
+ @c.get_key_file(2).should == "/path/to/rspec/env"
255
+ end
256
+
257
+ it "should return the filename defined in the config file if the environment varialbe doesn't exist" do
258
+ ENV.delete("MCOLLECTIVE_ACTIVEMQ_POOL2_SSL_KEY")
259
+ @c.expects(:get_option).with("activemq.pool.2.ssl.key", false).returns("/path/to/rspec/conf")
260
+ @c.get_key_file(2).should == "/path/to/rspec/conf"
261
+ end
262
+
263
+ end
264
+
265
+ describe "#get_cert_file" do
266
+ it "should return the filename from the environment variable" do
267
+ ENV["MCOLLECTIVE_ACTIVEMQ_POOL2_SSL_CERT"] = "/path/to/rspec/env"
268
+ @c.get_cert_file(2).should == "/path/to/rspec/env"
269
+ end
270
+
271
+ it "should return the filename defined in the config file if the environment varialbe doesn't exist" do
272
+ ENV.delete("MCOLLECTIVE_ACTIVEMQ_POOL2_SSL_CERT")
273
+ @c.expects(:get_option).with("activemq.pool.2.ssl.cert", false).returns("/path/to/rspec/conf")
274
+ @c.get_cert_file(2).should == "/path/to/rspec/conf"
275
+ end
276
+ end
277
+
200
278
  describe "#receive" do
201
279
  it "should receive from the middleware" do
202
280
  payload = mock
@@ -376,24 +454,31 @@ module MCollective
376
454
  it "should disconnect from the stomp connection" do
377
455
  @connection.expects(:disconnect)
378
456
  @c.disconnect
457
+ @c.connection.should == nil
379
458
  end
380
459
  end
381
460
 
382
461
  describe "#headers_for" do
383
- it "should return empty headers if priority is 0" do
462
+ it "should not set priority header if priority is 0" do
384
463
  message = mock
385
464
  message.expects(:type).returns(:foo)
465
+ message.stubs(:ttl).returns(30)
466
+
467
+ Time.expects(:now).twice.returns(Time.at(1368557431))
386
468
 
387
469
  @c.instance_variable_set("@msgpriority", 0)
388
- @c.headers_for(message).should == {}
470
+ @c.headers_for(message).should_not includes("priority")
389
471
  end
390
472
 
391
473
  it "should return a priority if priority is non 0" do
392
474
  message = mock
393
475
  message.expects(:type).returns(:foo)
476
+ message.stubs(:ttl).returns(30)
477
+
478
+ Time.expects(:now).twice.returns(Time.at(1368557431))
394
479
 
395
480
  @c.instance_variable_set("@msgpriority", 1)
396
- @c.headers_for(message).should == {"priority" => 1}
481
+ @c.headers_for(message)["priority"].should == 1
397
482
  end
398
483
 
399
484
  it "should set mc_identity for direct requests" do
@@ -402,10 +487,16 @@ module MCollective
402
487
  message.expects(:agent).returns("rspecagent")
403
488
  message.expects(:collective).returns("mcollective")
404
489
  message.expects(:reply_to).returns(nil)
490
+ message.stubs(:ttl).returns(30)
491
+
492
+ Time.expects(:now).twice.returns(Time.at(1368557431))
405
493
 
406
494
  @c.instance_variable_set("@msgpriority", 0)
407
495
  @c.expects(:make_target).with("rspecagent", :reply, "mcollective").returns({:name => "test"})
408
- @c.headers_for(message, "some.node").should == {"mc_identity"=>"some.node", "reply-to"=>"test"}
496
+
497
+ headers = @c.headers_for(message, "some.node")
498
+ headers["mc_identity"].should == "some.node"
499
+ headers["reply-to"].should == "test"
409
500
  end
410
501
 
411
502
  it "should set a reply-to header for :request type messages" do
@@ -414,10 +505,13 @@ module MCollective
414
505
  message.expects(:agent).returns("rspecagent")
415
506
  message.expects(:collective).returns("mcollective")
416
507
  message.expects(:reply_to).returns(nil)
508
+ message.stubs(:ttl).returns(30)
509
+
510
+ Time.expects(:now).twice.returns(Time.at(1368557431))
417
511
 
418
512
  @c.instance_variable_set("@msgpriority", 0)
419
513
  @c.expects(:make_target).with("rspecagent", :reply, "mcollective").returns({:name => "test"})
420
- @c.headers_for(message).should == {"reply-to" => "test"}
514
+ @c.headers_for(message)["reply-to"].should == "test"
421
515
  end
422
516
 
423
517
  it "should set reply-to correctly if the message defines it" do
@@ -426,9 +520,23 @@ module MCollective
426
520
  message.expects(:agent).returns("rspecagent")
427
521
  message.expects(:collective).returns("mcollective")
428
522
  message.expects(:reply_to).returns("rspec").twice
523
+ message.stubs(:ttl).returns(30)
429
524
 
430
- @c.headers_for(message).should == {"reply-to" => "rspec"}
525
+ Time.expects(:now).twice.returns(Time.at(1368557431))
431
526
 
527
+ @c.headers_for(message)["reply-to"].should == "rspec"
528
+ end
529
+
530
+ it "should set the timestamp and ttl based on the message object" do
531
+ message = mock
532
+ message.expects(:type).returns(:foo)
533
+ message.stubs(:ttl).returns(100)
534
+
535
+ Time.expects(:now).twice.returns(Time.at(1368557431))
536
+
537
+ headers = @c.headers_for(message)
538
+ headers["timestamp"].should == "1368557431000"
539
+ headers["expires"].should == "1368557541000"
432
540
  end
433
541
  end
434
542
 
@@ -504,28 +612,11 @@ module MCollective
504
612
  end
505
613
 
506
614
  describe "#get_bool_option" do
507
- it "should return the default if option isnt set" do
508
- @config.expects(:pluginconf).returns({}).once
509
- @c.get_bool_option("test", "default").should == "default"
510
- end
511
-
512
- ["1", "yes", "true"].each do |boolean|
513
- it "should map options to true correctly" do
514
- @config.expects(:pluginconf).returns({"test" => boolean}).twice
515
- @c.get_bool_option("test", "default").should == true
516
- end
517
- end
518
-
519
- ["0", "no", "false"].each do |boolean|
520
- it "should map options to false correctly" do
521
- @config.expects(:pluginconf).returns({"test" => boolean}).twice
522
- @c.get_bool_option("test", "default").should == false
523
- end
524
- end
615
+ it "should use Util::str_to_bool to translate a boolean value found in the config" do
616
+ @config.expects(:pluginconf).returns({"rspec" => "true"})
617
+ Util.expects(:str_to_bool).with("true").returns(true)
525
618
 
526
- it "should return default for non boolean options" do
527
- @config.expects(:pluginconf).returns({"test" => "foo"}).twice
528
- @c.get_bool_option("test", "default").should == "default"
619
+ @c.get_bool_option("rspec", "true").should be_true
529
620
  end
530
621
  end
531
622
  end