beaker 4.23.2 → 4.27.1

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.
@@ -69,8 +69,13 @@ module Beaker
69
69
  begin
70
70
  @logger.debug "Attempting ssh connection to #{host}, user: #{user}, opts: #{ssh_opts}"
71
71
 
72
+ # Work around net-ssh 6+ incompatibilities
72
73
  if ssh_opts.include?(:strict_host_key_checking) && (Net::SSH::Version::CURRENT.major > 5)
73
- ssh_opts[:paranoid] = ssh_opts.delete(:strict_host_key_checking)
74
+ strict_host_key_checking = ssh_opts.delete(:strict_host_key_checking)
75
+
76
+ unless ssh_opts[:verify_host_key].is_a?(Symbol)
77
+ ssh_opts[:verify_host_key] ||= strict_host_key_checking ? :always : :never
78
+ end
74
79
  end
75
80
 
76
81
  Net::SSH.start(host, user, ssh_opts)
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '4.23.2'
3
+ STRING = '4.27.1'
4
4
  end
5
5
  end
@@ -29,8 +29,8 @@ module Beaker
29
29
  it "deletes" do
30
30
  path = '/path/to/delete'
31
31
  corrected_path = '\\path\\to\\delete'
32
- expect( instance ).to receive(:execute).with("del /s /q #{corrected_path}").and_return(0)
33
- expect( instance.rm_rf(path) ).to be === 0
32
+ expect(instance).to receive(:execute).with(%(del /s /q "#{corrected_path}")).and_return(0)
33
+ expect(instance.rm_rf(path)).to eq(0)
34
34
  end
35
35
  end
36
36
 
@@ -39,10 +39,9 @@ module Beaker
39
39
  let(:destination) { '/destination/path/of/content' }
40
40
 
41
41
  it 'rm first' do
42
- expect( instance ).to receive(:execute).with("del /s /q #{destination.gsub(/\//, '\\')}").and_return(0)
43
- expect( instance ).to receive(:execute).with("move /y #{origin.gsub(/\//, '\\')} #{destination.gsub(/\//, '\\')}").and_return(0)
44
- expect( instance.mv(origin, destination) ).to be === 0
45
-
42
+ expect(instance).to receive(:execute).with("del /s /q \"\\destination\\path\\of\\content\"").and_return(0)
43
+ expect(instance).to receive(:execute).with("move /y #{origin.gsub(/\//, '\\')} #{destination.gsub(/\//, '\\')}").and_return(0)
44
+ expect(instance.mv(origin, destination)).to eq(0)
46
45
  end
47
46
 
48
47
  it 'does not rm' do
@@ -99,5 +98,59 @@ module Beaker
99
98
  to be == "set \"LD_PATH=/:/tmp\" && "
100
99
  end
101
100
  end
101
+
102
+ describe '#which' do
103
+ before do
104
+ allow(instance).to receive(:execute)
105
+ .with(where_command, :accept_all_exit_codes => true).and_return(result)
106
+ end
107
+ let(:where_command) { "cmd /C \"where ruby\"" }
108
+
109
+ context 'when only the environment variable PATH is used' do
110
+ let(:result) { "C:\\Ruby26-x64\\bin\\ruby.exe" }
111
+
112
+ it 'returns the correct path' do
113
+ response = instance.which('ruby')
114
+
115
+ expect(response).to eq(result)
116
+ end
117
+ end
118
+
119
+ context 'when command is not found' do
120
+ let(:where_command) { "cmd /C \"where unknown\"" }
121
+ let(:result) { '' }
122
+
123
+ it 'return empty string if command is not found' do
124
+ response = instance.which('unknown')
125
+
126
+ expect(response).to eq(result)
127
+ end
128
+ end
129
+ end
130
+
131
+ describe '#mkdir_p' do
132
+ let(:dir_path) { "C:\\tmpdir\\my_dir" }
133
+ let(:beaker_command) { instance_spy(Beaker::Command) }
134
+ let(:command) {"-Command New-Item -Path '#{dir_path}' -ItemType 'directory'"}
135
+ let(:result) { instance_spy(Beaker::Result) }
136
+
137
+ before do
138
+ allow(Beaker::Command).to receive(:new).
139
+ with('powershell.exe', array_including(command)).and_return(beaker_command)
140
+ allow(instance).to receive(:exec).with(beaker_command, :acceptable_exit_codes => [0, 1]).and_return(result)
141
+ end
142
+
143
+ it 'returns true and creates folder structure' do
144
+ allow(result).to receive(:exit_code).and_return(0)
145
+
146
+ expect(instance.mkdir_p(dir_path)).to be(true)
147
+ end
148
+
149
+ it 'returns false if failed to create directory structure' do
150
+ allow(result).to receive(:exit_code).and_return(1)
151
+
152
+ expect(instance.mkdir_p(dir_path)).to be(false)
153
+ end
154
+ end
102
155
  end
103
156
  end
@@ -25,11 +25,31 @@ module Beaker
25
25
  let (:instance) { PSWindowsFileTest.new(opts, logger) }
26
26
 
27
27
  describe '#cat' do
28
+ let(:path) { '/path/to/cat' }
29
+ let(:content) { 'file content' }
28
30
  it 'reads output for file' do
29
- path = '/path/to/delete'
30
- expect(instance).to receive(:exec)
31
+ expect(instance).to receive(:exec).and_return(double(stdout: content))
31
32
  expect(Beaker::Command).to receive(:new).with('powershell.exe', array_including("-Command type #{path}"))
32
- instance.cat(path)
33
+ expect(instance.cat(path)).to eq(content)
34
+ end
35
+ end
36
+
37
+ describe '#file_exist?' do
38
+ let(:path) { '/path/to/test/file.txt' }
39
+ context 'file exists' do
40
+ it 'returns true' do
41
+ expect(instance).to receive(:exec).and_return(double(stdout: "true\n"))
42
+ expect(Beaker::Command).to receive(:new).with("if exist #{path} echo true")
43
+ expect(instance.file_exist?(path)).to eq(true)
44
+ end
45
+ end
46
+
47
+ context 'file does not exist' do
48
+ it 'returns false' do
49
+ expect(instance).to receive(:exec).and_return(double(stdout: ""))
50
+ expect(Beaker::Command).to receive(:new).with("if exist #{path} echo true")
51
+ expect(instance.file_exist?(path)).to eq(false)
52
+ end
33
53
  end
34
54
  end
35
55
 
@@ -39,7 +59,6 @@ module Beaker
39
59
 
40
60
  before do
41
61
  allow(instance).to receive(:execute).with(anything)
42
-
43
62
  end
44
63
 
45
64
  context 'with dirname sent' do
@@ -169,6 +169,64 @@ module Beaker
169
169
  end
170
170
 
171
171
  describe '#reboot' do
172
+ check_cmd_output = {
173
+ :centos6 => {
174
+ :who => {
175
+ :initial => ' system boot 2020-05-13 03:51',
176
+ :success => ' system boot 2020-05-13 03:52',
177
+ },
178
+ :last => {
179
+ :initial => <<~LAST_F,
180
+ reboot system boot 2.6.32-754.29.1. Tue May 5 17:34:52 2020 - Tue May 5 17:52:48 2020 (00:17)
181
+ reboot system boot 2.6.32-754.29.1. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
182
+ LAST_F
183
+ :success => <<~LAST_F,
184
+ reboot system boot 2.6.32-754.29.1. Tue May 5 17:52:48 2020 - Tue May 5 17:52:49 2020 (00:17)
185
+ reboot system boot 2.6.32-754.29.1. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
186
+ LAST_F
187
+ },
188
+ },
189
+ :centos7 => {
190
+ :who => {
191
+ :initial => ' system boot 2020-05-13 03:51',
192
+ :success => ' system boot 2020-05-13 03:52',
193
+ },
194
+ :last => {
195
+ :initial => <<~LAST_F,
196
+ reboot system boot 3.10.0-1127.el7. Tue May 5 17:34:52 2020 - Tue May 5 17:52:48 2020 (00:17)
197
+ reboot system boot 3.10.0-1127.el7. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
198
+ LAST_F
199
+ :success => <<~LAST_F,
200
+ reboot system boot 3.10.0-1127.el7. Tue May 5 17:52:48 2020 - Tue May 5 17:52:49 2020 (00:17)
201
+ reboot system boot 3.10.0-1127.el7. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
202
+ LAST_F
203
+ },
204
+ },
205
+ :centos8 => {
206
+ :who => {
207
+ :initial => ' system boot 2020-05-13 03:51',
208
+ :success => ' system boot 2020-05-13 03:52',
209
+ },
210
+ :last => {
211
+ :initial => <<~LAST_F,
212
+ reboot system boot 4.18.0-147.8.1.e Tue May 5 17:34:52 2020 still running
213
+ reboot system boot 4.18.0-147.8.1.e Mon May 4 17:41:27 2020 - Tue May 5 17:00:00 2020 (5+00:11)
214
+ LAST_F
215
+ :success => <<~LAST_F,
216
+ reboot system boot 4.18.0-147.8.1.e Tue May 5 17:34:53 2020 still running
217
+ reboot system boot 4.18.0-147.8.1.e Mon May 4 17:41:27 2020 - Tue May 5 17:00:00 2020 (5+00:11)
218
+ LAST_F
219
+ },
220
+ },
221
+ :freebsd => {
222
+ # last -F doesn't work on freebsd so no output will be returned
223
+ :who => {
224
+ :initial => ' system boot May 13 03:51',
225
+ :success => ' system boot May 13 03:52',
226
+ }
227
+ },
228
+ }
229
+
172
230
  # no-op response
173
231
  let (:response) { double( 'response' ) }
174
232
  let (:boot_time_initial_response) { double( 'response' ) }
@@ -179,7 +237,7 @@ module Beaker
179
237
  before :each do
180
238
  # stubs enough to survive the first boot_time call & output parsing
181
239
  # note: just stubs input-chain between calls, parsing methods still run
182
- allow(Beaker::Command).to receive(:new).with('who -b').and_return(:boot_time_command_stub)
240
+ allow(Beaker::Command).to receive(:new).with('last -F reboot || who -b').and_return(:boot_time_command_stub)
183
241
 
184
242
  allow(boot_time_initial_response).to receive(:stdout).and_return(boot_time_initial_stdout)
185
243
  allow(boot_time_success_response).to receive(:stdout).and_return(boot_time_success_stdout)
@@ -190,116 +248,128 @@ module Beaker
190
248
  end
191
249
 
192
250
  context 'new boot time greater than old boot time' do
193
- let (:boot_time_initial_stdout) { ' system boot 2020-05-13 03:51' }
194
- let (:boot_time_success_stdout) { ' system boot 2020-05-13 03:52' }
195
-
196
- it 'passes with defaults' do
197
- expect(instance).to receive(:sleep).with(sleep_time)
198
- # bypass shutdown command itself
199
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response)
200
- # allow the second boot_time and the hash arguments in exec
201
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
202
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
203
-
204
- expect(instance.reboot).to be(nil)
205
- end
251
+ check_cmd_output.each do |check_os, cmd_opts|
252
+ cmd_opts.each do |cmd_name, cmd_outputs|
253
+ context "on '#{check_os}' with the '#{cmd_name}' command" do
254
+ let (:boot_time_initial_stdout) { cmd_outputs[:initial] }
255
+ let (:boot_time_success_stdout) { cmd_outputs[:success] }
256
+
257
+ it 'passes with defaults' do
258
+ expect(instance).to receive(:sleep).with(sleep_time)
259
+ # bypass shutdown command itself
260
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response)
261
+ # allow the second boot_time and the hash arguments in exec
262
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
263
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
206
264
 
207
- it 'passes with wait_time_parameter' do
208
- expect(instance).to receive(:sleep).with(10)
209
- # bypass shutdown command itself
210
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
211
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
212
- # allow the second boot_time and the hash arguments in exec
213
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
265
+ expect(instance.reboot).to be(nil)
266
+ end
214
267
 
215
- expect(instance.reboot(10)).to be(nil)
216
- end
268
+ it 'passes with wait_time_parameter' do
269
+ expect(instance).to receive(:sleep).with(10)
270
+ # bypass shutdown command itself
271
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
272
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
273
+ # allow the second boot_time and the hash arguments in exec
274
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
217
275
 
218
- it 'passes with max_connection_tries parameter' do
219
- expect(instance).to receive(:sleep).with(sleep_time)
220
- # bypass shutdown command itself
221
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
222
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
223
- # allow the second boot_time and the hash arguments in exec
224
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, hash_including(:max_connection_tries => 20)).and_return(boot_time_success_response).once
276
+ expect(instance.reboot(10)).to be(nil)
277
+ end
225
278
 
226
- expect(instance.reboot(sleep_time, 20)).to be(nil)
227
- end
279
+ it 'passes with max_connection_tries parameter' do
280
+ expect(instance).to receive(:sleep).with(sleep_time)
281
+ # bypass shutdown command itself
282
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
283
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
284
+ # allow the second boot_time and the hash arguments in exec
285
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, hash_including(:max_connection_tries => 20)).and_return(boot_time_success_response).once
228
286
 
229
- context 'command errors' do
230
- before :each do
231
- allow(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
232
- end
287
+ expect(instance.reboot(sleep_time, 20)).to be(nil)
288
+ end
233
289
 
234
- it 'raises a reboot failure when command fails' do
235
- expect(instance).not_to receive(:sleep)
236
- expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Host::CommandFailure).once
290
+ context 'command errors' do
291
+ before :each do
292
+ allow(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).at_least(:once)
293
+ end
237
294
 
238
- expect{ instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Command failed when attempting to reboot: .*/)
239
- end
295
+ it 'raises a reboot failure when command fails' do
296
+ expect(instance).to receive(:sleep).at_least(:once)
297
+ expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Host::CommandFailure).at_least(:once)
240
298
 
241
- it 'raises a reboot failure when we receive an unexpected error' do
242
- expect(instance).not_to receive(:sleep)
243
- expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Net::SSH::HostKeyError).once
299
+ expect{ instance.reboot }.to raise_error(Beaker::Host::CommandFailure)
300
+ end
244
301
 
245
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Unexpected exception in reboot: .*/)
246
- end
302
+ it 'raises a reboot failure when we receive an unexpected error' do
303
+ expect(instance).to receive(:sleep).at_least(:once)
304
+ expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Net::SSH::HostKeyError).at_least(:once)
247
305
 
248
- context 'incorrect time string' do
249
- context 'original time' do
250
- let (:boot_time_initial_stdout) { 'boot bad' }
306
+ expect { instance.reboot }.to raise_error(Net::SSH::HostKeyError)
307
+ end
251
308
 
252
- it 'raises a reboot failure' do
253
- expect(instance).not_to receive(:sleep)
309
+ context 'incorrect time string' do
310
+ context 'original time' do
311
+ let (:boot_time_initial_stdout) { 'boot bad' }
254
312
 
255
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Unable to parse time: .*/)
256
- end
257
- end
313
+ it 'raises a reboot failure' do
314
+ # Handle the 'retry'
315
+ allow(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).at_least(:once)
258
316
 
259
- context 'current time' do
260
- let (:boot_time_success_stdout) { 'boot bad' }
317
+ expect(instance).not_to receive(:sleep)
261
318
 
262
- it 'raises a reboot failure' do
263
- expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_return(response).once
264
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
265
- # allow the second boot_time and the hash arguments in exec, repeated 10 times by default
266
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
319
+ expect { instance.reboot }.to raise_error(Beaker::Host::RebootWarning, /Found no valid times in .*/)
320
+ end
321
+ end
322
+
323
+ context 'current time' do
324
+ let (:boot_time_success_stdout) { 'boot bad' }
267
325
 
268
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Unable to parse time: .*/)
326
+ it 'raises a reboot failure' do
327
+ expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_return(response).once
328
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
329
+ # allow the second boot_time and the hash arguments in exec, repeated 10 times by default
330
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).at_least(:once)
331
+
332
+ expect { instance.reboot(10,9,1) }.to raise_error(Beaker::Host::RebootWarning, /Found no valid times in .*/)
333
+ end
334
+ end
335
+ end
269
336
  end
270
337
  end
271
338
  end
272
339
  end
273
340
  end
274
341
 
275
- context 'new boot time less than old boot time' do
276
- let (:boot_time_initial_stdout) { ' system boot 2020-05-13 03:51' }
277
- let (:boot_time_success_stdout) { ' system boot 2020-05-13 03:50' }
342
+ context 'system did not reboot' do
343
+ check_cmd_output.each do |check_os, cmd_opts|
344
+ cmd_opts.each do |cmd_name, cmd_outputs|
345
+ context "on '#{check_os}' with the '#{cmd_name}' command" do
346
+ let (:boot_time_initial_stdout) { cmd_outputs[:initial] }
347
+ let (:boot_time_success_stdout) { cmd_outputs[:initial] }
278
348
 
279
- it 'raises RebootFailure' do
280
- expect(instance).to receive(:sleep).with(sleep_time)
281
- # bypass shutdown command itself
282
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
349
+ it 'raises RebootFailure' do
350
+ expect(instance).to receive(:sleep).with(sleep_time)
351
+ # bypass shutdown command itself
352
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
283
353
 
284
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
285
- # allow the second boot_time and the hash arguments in exec, repeated 18 times by default in order to replicate the previous behavior of the ping based Host.down?
286
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).exactly(18).times
354
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
355
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
287
356
 
288
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
289
- end
357
+ expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
358
+ end
290
359
 
291
- it 'raises RebootFailure if the number of retries is changed' do
292
- expect(instance).to receive(:sleep).with(sleep_time)
293
- # bypass shutdown command itself
294
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
295
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
296
- # allow the second boot_time and the hash arguments in exec, repeated 10 times by default
297
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).exactly(10).times
360
+ it 'raises RebootFailure if the number of retries is changed' do
361
+ expect(instance).to receive(:sleep).with(sleep_time)
362
+ # bypass shutdown command itself
363
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
364
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
365
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
298
366
 
299
- expect { instance.reboot(wait_time=sleep_time, max_connection_tries=9, boot_time_retries=10) }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
367
+ expect { instance.reboot(wait_time=sleep_time, max_connection_tries=9, boot_time_retries=10) }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
368
+ end
369
+ end
370
+ end
300
371
  end
301
372
  end
302
-
303
373
  end
304
374
 
305
375
  describe '#enable_remote_rsyslog' do
@@ -313,40 +383,32 @@ module Beaker
313
383
 
314
384
  end
315
385
 
316
- describe '#parse_uptime' do
317
- it 'parses variation of uptime string' do
318
- expect(instance.parse_uptime("19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31")).to be == "14 mins"
319
- end
320
- it 'parses variation 2 of uptime string' do
321
- expect(instance.parse_uptime("8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40")).to be == "52 days, 20:47"
322
- end
323
- it 'parses variation 3 of uptime string' do
324
- expect(instance.parse_uptime("22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27")).to be == "54 days, 1 min"
386
+ describe '#which' do
387
+ before do
388
+ allow(instance).to receive(:execute)
389
+ .with(where_command, :accept_all_exit_codes => true).and_return(result)
325
390
  end
326
- it 'parses variation 4 of uptime string' do
327
- expect(instance.parse_uptime("18:44:45 up 5 min, 0 users, load average: 0.14, 0.11, 0.05")).to be == "5 min"
328
- end
329
- it 'parses solaris\'s "just up" without time message' do
330
- opts['platform'] = 'solaris-11-x86_64'
331
- expect(instance.parse_uptime("10:05am up 0 users, load average: 0.66, 0.14, 0.05")).to be == "0 min"
332
- end
333
- end
334
391
 
335
- describe '#uptime_int' do
336
- it 'parses time segment variation into a minute value' do
337
- expect(instance.uptime_int("14 mins")).to be == 14
338
- end
339
- it 'parses time segment variation 2 into a minute value' do
340
- expect(instance.uptime_int("52 days, 20:47")).to be == 76127
341
- end
342
- it 'parses time segment variation 3 into a minute value' do
343
- expect(instance.uptime_int("54 days, 1 min")).to be == 77761
392
+ context 'when only the environment variable PATH is used' do
393
+ let(:where_command) { "which ruby" }
394
+ let(:result) { "/usr/bin/ruby.exe" }
395
+
396
+ it 'returns the correct path' do
397
+ response = instance.which('ruby')
398
+
399
+ expect(response).to eq(result)
344
400
  end
345
- it 'parses time segment variation 4 into a minute value' do
346
- expect(instance.uptime_int("54 days")).to be == 77760
347
401
  end
348
- it 'raises if we pass garbage to it' do
349
- expect { instance.uptime_int("solaris roxx my soxx") }.to raise_error
402
+
403
+ context 'when command is not found' do
404
+ let(:where_command) { "which unknown" }
405
+ let(:result) { '' }
406
+
407
+ it 'return empty string if command is not found' do
408
+ response = instance.which('unknown')
409
+
410
+ expect(response).to eq(result)
411
+ end
350
412
  end
351
413
  end
352
414
  end