subprocess 0.1.6 → 0.15
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.
- data/README.md +72 -0
- data/lib/subprocess.rb +529 -20
- metadata +55 -121
- data/History.txt +0 -4
- data/Manifest.txt +0 -46
- data/PostInstall.txt +0 -7
- data/README.rdoc +0 -77
- data/Rakefile +0 -20
- data/TODO.rdoc +0 -1
- data/examples/simple.irb +0 -22
- data/examples/simple_timeout.irb +0 -22
- data/features/multiple_popens_sequence.feature +0 -23
- data/features/popen.feature +0 -45
- data/features/popen_over_ssh.feature +0 -44
- data/features/popen_over_ssh_without_blocking.feature +0 -16
- data/features/popen_remote_fails_with_invalid_auth_data.feature +0 -13
- data/features/popen_reports_runtime.feature +0 -11
- data/features/popen_running.feature +0 -11
- data/features/popen_with_timeout.feature +0 -19
- data/features/popen_without_blocking.feature +0 -16
- data/features/step_definitions/common_steps.rb +0 -168
- data/features/step_definitions/multiple_popens_sequence_steps.rb +0 -73
- data/features/step_definitions/popen_over_ssh_steps.rb +0 -29
- data/features/step_definitions/popen_over_ssh_without_blocking_steps.rb +0 -30
- data/features/step_definitions/popen_remote_fails_with_invalid_auth_dat_steps.rb +0 -19
- data/features/step_definitions/popen_reports_runtime_steps.rb +0 -13
- data/features/step_definitions/popen_running_steps.rb +0 -12
- data/features/step_definitions/popen_steps.rb +0 -34
- data/features/step_definitions/popen_with_timeout_steps.rb +0 -24
- data/features/step_definitions/popen_without_blocking_steps.rb +0 -33
- data/features/support/common.rb +0 -29
- data/features/support/env.rb +0 -15
- data/features/support/matchers.rb +0 -11
- data/lib/core_ext/hash.rb +0 -14
- data/lib/core_ext/process_status.rb +0 -14
- data/lib/subprocess/popen.rb +0 -188
- data/lib/subprocess/popen_factory.rb +0 -63
- data/lib/subprocess/popen_remote.rb +0 -64
- data/lib/subprocess/popen_sequence.rb +0 -57
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -10
- data/spec/subprocess/popen_spec.rb +0 -32
- data/spec/subprocess_spec.rb +0 -2
- data/subprocess.gemspec +0 -36
- data/tasks/rspec.rake +0 -21
@@ -1,44 +0,0 @@
|
|
1
|
-
Feature: Run simple remote subprocesses over ssh in ruby
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run remote system subprocesses over ssh
|
5
|
-
And I want to have them presented as objects
|
6
|
-
So that I can get more data about said subprocesses
|
7
|
-
And so that I can have more fine grained control of said subprocesses
|
8
|
-
|
9
|
-
Scenario Outline: run simple remote subprocesses
|
10
|
-
Given I have a new remote Subprocess instance initialized with "<command>"
|
11
|
-
When I invoke the run method of said remote subprocess
|
12
|
-
And I invoke the wait method of said remote subprocess
|
13
|
-
Then the remote instances exit status is "<exitstatus>"
|
14
|
-
And the remote instances stdout matches "<stdout>"
|
15
|
-
And the remote instances stderr matches "<stderr>"
|
16
|
-
And the remote instance should have a numerical pid
|
17
|
-
|
18
|
-
Scenarios: zero exit code remote subprocesses with stdout
|
19
|
-
| command | exitstatus | stdout | stderr |
|
20
|
-
| echo 1 | 0 | 1 | |
|
21
|
-
|
22
|
-
Scenarios: zero exit code remote subprocesses with stderr
|
23
|
-
| command | exitstatus | stdout | stderr |
|
24
|
-
| echo 1 1>&2 | 0 | | 1 |
|
25
|
-
|
26
|
-
Scenarios: zero exit code remote subprocesses with stdout and stderr
|
27
|
-
| command | exitstatus | stdout | stderr |
|
28
|
-
| echo 1 && echo 1 1>&2 | 0 | 1 | 1 |
|
29
|
-
|
30
|
-
Scenarios: nonzero exit code remote subprocesses with stdout
|
31
|
-
| command | exitstatus | stdout | stderr |
|
32
|
-
| echo 1 && exit 1 | 1 | 1 | |
|
33
|
-
| echo 1 && exit 2 | 2 | 1 | |
|
34
|
-
| echo 1 && exit 99 | 99 | 1 | |
|
35
|
-
|
36
|
-
Scenarios: nonzero exit code remote subprocesses with stderr
|
37
|
-
| command | exitstatus | stdout | stderr |
|
38
|
-
| echo 1 1>&2 && exit 1 | 1 | | 1 |
|
39
|
-
|
40
|
-
Scenarios: nonzero exit code remote subprocesses with stdout and stderr
|
41
|
-
| command | exitstatus | stdout | stderr |
|
42
|
-
| echo 1 && echo 1 1>&2 && exit 1 | 1 | 1 | 1 |
|
43
|
-
|
44
|
-
|
@@ -1,16 +0,0 @@
|
|
1
|
-
Feature: Run simple remote subprocesses without blocking and over ssh in ruby
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run remote system subprocesses that do not block over ssh
|
5
|
-
And I want to have them presented as objects
|
6
|
-
So that I can get more data about said subprocesses
|
7
|
-
And so that I can have more fine grained control of said subprocesses
|
8
|
-
|
9
|
-
Scenario: run simple remote nonblocking subprocess
|
10
|
-
Given I have a new remote nonblocking subprocess that takes a long time to run
|
11
|
-
When I invoke the run method of said nonblocking remote subprocess
|
12
|
-
Then the remote nonblocking subprocess should not block
|
13
|
-
And the remote nonblocking subprocess should report its run status
|
14
|
-
And the remote nonblocking subprocess should support being waited on till complete
|
15
|
-
And the remote nonblocking subprocess should have status info
|
16
|
-
|
@@ -1,13 +0,0 @@
|
|
1
|
-
Feature: Run simple remote subprocesses that has bad auth data
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run system remote subprocesses that require auth data
|
5
|
-
So they can be secure
|
6
|
-
And actually remote :)
|
7
|
-
|
8
|
-
Scenario: run simple remote subprocess with bad auth data
|
9
|
-
Given I have a new remote subproces with invalid username
|
10
|
-
And invalid password
|
11
|
-
When I run the remote subprocess
|
12
|
-
Then the remote subprocess should return an error
|
13
|
-
|
@@ -1,11 +0,0 @@
|
|
1
|
-
Feature: Run simple subprocesses that report run time
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run system subprocesses that report their run time
|
5
|
-
So that I know how long it took to run
|
6
|
-
|
7
|
-
Scenario: run simple subprocess that takes 3 seconds
|
8
|
-
Given I have a new subprocess that takes 3 seconds
|
9
|
-
When I wait on said 3 second process to complete
|
10
|
-
Then the subprocess should report a run time of around 3 seconds
|
11
|
-
|
@@ -1,11 +0,0 @@
|
|
1
|
-
Feature: Run simple subprocesses that report running
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run system subprocesses that report their running status
|
5
|
-
So that I know when said subprocess is finished without waiting
|
6
|
-
|
7
|
-
Scenario: run simple subprocess that finishes fast
|
8
|
-
Given I have a new subprocess that runs fast
|
9
|
-
When I invoke the run method of said fast subprocess
|
10
|
-
Then the subprocess should report running as false without waiting
|
11
|
-
|
@@ -1,19 +0,0 @@
|
|
1
|
-
Feature: Run simple subprocesses stopping them at timeout if not complete
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run system subprocesses
|
5
|
-
And I want them to terminate by a set timeout
|
6
|
-
So that I don't end up with a bunch of zombies
|
7
|
-
|
8
|
-
Scenario: run simple subprocess that goes past timeout
|
9
|
-
Given I have a new subprocess that takes more than 5 seconds to run
|
10
|
-
And I set a timeout of 5 seconds
|
11
|
-
When I invoke the run method of said subprocess with timeout
|
12
|
-
Then the subprocess should exit with exitcode 1
|
13
|
-
|
14
|
-
Scenario: run simple subprocess that does not go past timeout
|
15
|
-
Given I have a new subprocess that takes less than 5 seconds to run
|
16
|
-
And I set a timeout of 5 seconds
|
17
|
-
When I invoke the run method of said subprocess with timeout
|
18
|
-
Then the subprocess should complete fine
|
19
|
-
|
@@ -1,16 +0,0 @@
|
|
1
|
-
Feature: Run simple subprocesses without blocking in ruby
|
2
|
-
|
3
|
-
As a ruby hacker
|
4
|
-
I want to run system subprocesses that do not block
|
5
|
-
And I want to have them presented as objects
|
6
|
-
So that I can get more data about said subprocesses
|
7
|
-
And so that I can have more fine grained control of said subprocesses
|
8
|
-
|
9
|
-
Scenario: run simple subprocess without blocking
|
10
|
-
Given I have a new subprocess that takes a long time to run
|
11
|
-
When I invoke the run method of said nonblocking subprocess
|
12
|
-
Then the subprocess should not block
|
13
|
-
And the subprocess should report its run status
|
14
|
-
And the subprocess should support being waited on till complete
|
15
|
-
And the subprocess should have status info
|
16
|
-
|
@@ -1,168 +0,0 @@
|
|
1
|
-
Given /^this project is active project folder/ do
|
2
|
-
@active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
|
3
|
-
end
|
4
|
-
|
5
|
-
Given /^env variable \$([\w_]+) set to "(.*)"/ do |env_var, value|
|
6
|
-
ENV[env_var] = value
|
7
|
-
end
|
8
|
-
|
9
|
-
Given /"(.*)" folder is deleted/ do |folder|
|
10
|
-
in_project_folder { FileUtils.rm_rf folder }
|
11
|
-
end
|
12
|
-
|
13
|
-
When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, arguments|
|
14
|
-
@stdout = StringIO.new
|
15
|
-
in_project_folder do
|
16
|
-
if Object.const_defined?("APP_ROOT")
|
17
|
-
APP_ROOT.replace(FileUtils.pwd)
|
18
|
-
else
|
19
|
-
APP_ROOT = FileUtils.pwd
|
20
|
-
end
|
21
|
-
run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
|
22
|
-
end
|
23
|
-
File.open(File.join(@tmp_root, "generator.out"), "w") do |f|
|
24
|
-
@stdout.rewind
|
25
|
-
f << @stdout.read
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
30
|
-
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
31
|
-
in_project_folder do
|
32
|
-
system "#{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
37
|
-
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
38
|
-
in_project_folder do
|
39
|
-
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
44
|
-
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
45
|
-
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
|
46
|
-
in_project_folder do
|
47
|
-
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
When /^I invoke task "rake (.*)"/ do |task|
|
52
|
-
@stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
|
53
|
-
in_project_folder do
|
54
|
-
system "rake #{task} --trace > #{@stdout} 2> #{@stdout}"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
Then /^folder "(.*)" (is|is not) created/ do |folder, is|
|
59
|
-
in_project_folder do
|
60
|
-
File.exists?(folder).should(is == 'is' ? be_true : be_false)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
Then /^file "(.*)" (is|is not) created/ do |file, is|
|
65
|
-
in_project_folder do
|
66
|
-
File.exists?(file).should(is == 'is' ? be_true : be_false)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
Then /^file with name matching "(.*)" is created/ do |pattern|
|
71
|
-
in_project_folder do
|
72
|
-
Dir[pattern].should_not be_empty
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
Then /^file "(.*)" contents (does|does not) match \/(.*)\// do |file, does, regex|
|
77
|
-
in_project_folder do
|
78
|
-
actual_output = File.read(file)
|
79
|
-
(does == 'does') ?
|
80
|
-
actual_output.should(match(/#{regex}/)) :
|
81
|
-
actual_output.should_not(match(/#{regex}/))
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file, project_file|
|
86
|
-
File.exists?(gem_file).should be_true
|
87
|
-
File.exists?(project_file).should be_true
|
88
|
-
gem_file_contents = File.read(File.dirname(__FILE__) + "/../../#{gem_file}")
|
89
|
-
project_file_contents = File.read(File.join(@active_project_folder, project_file))
|
90
|
-
project_file_contents.should == gem_file_contents
|
91
|
-
end
|
92
|
-
|
93
|
-
Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
|
94
|
-
actual_output = File.read(@stdout)
|
95
|
-
does_invoke == "does" ?
|
96
|
-
actual_output.should(match(/dependency\s+#{generator}/)) :
|
97
|
-
actual_output.should_not(match(/dependency\s+#{generator}/))
|
98
|
-
end
|
99
|
-
|
100
|
-
Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
|
101
|
-
actual_output = File.read(@stdout)
|
102
|
-
actual_output.should match(/#{opt1}/)
|
103
|
-
actual_output.should match(/#{opt2}/)
|
104
|
-
end
|
105
|
-
|
106
|
-
Then /^I should see "([^\"]*)"$/ do |text|
|
107
|
-
actual_output = File.read(@stdout)
|
108
|
-
actual_output.should contain(text)
|
109
|
-
end
|
110
|
-
|
111
|
-
Then /^I should see$/ do |text|
|
112
|
-
actual_output = File.read(@stdout)
|
113
|
-
actual_output.should contain(text)
|
114
|
-
end
|
115
|
-
|
116
|
-
Then /^I should not see$/ do |text|
|
117
|
-
actual_output = File.read(@stdout)
|
118
|
-
actual_output.should_not contain(text)
|
119
|
-
end
|
120
|
-
|
121
|
-
Then /^I should see exactly$/ do |text|
|
122
|
-
actual_output = File.read(@stdout)
|
123
|
-
actual_output.should == text
|
124
|
-
end
|
125
|
-
|
126
|
-
Then /^I should see all (\d+) tests pass/ do |expected_test_count|
|
127
|
-
expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
|
128
|
-
actual_output = File.read(@stdout)
|
129
|
-
actual_output.should match(expected)
|
130
|
-
end
|
131
|
-
|
132
|
-
Then /^I should see all (\d+) examples pass/ do |expected_test_count|
|
133
|
-
expected = %r{^#{expected_test_count} examples?, 0 failures}
|
134
|
-
actual_output = File.read(@stdout)
|
135
|
-
actual_output.should match(expected)
|
136
|
-
end
|
137
|
-
|
138
|
-
Then /^yaml file "(.*)" contains (\{.*\})/ do |file, yaml|
|
139
|
-
in_project_folder do
|
140
|
-
yaml = eval yaml
|
141
|
-
YAML.load(File.read(file)).should == yaml
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
Then /^Rakefile can display tasks successfully/ do
|
146
|
-
@stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
|
147
|
-
in_project_folder do
|
148
|
-
system "rake -T > #{@stdout} 2> #{@stdout}"
|
149
|
-
end
|
150
|
-
actual_output = File.read(@stdout)
|
151
|
-
actual_output.should match(/^rake\s+\w+\s+#\s.*/)
|
152
|
-
end
|
153
|
-
|
154
|
-
Then /^task "rake (.*)" is executed successfully/ do |task|
|
155
|
-
@stdout.should_not be_nil
|
156
|
-
actual_output = File.read(@stdout)
|
157
|
-
actual_output.should_not match(/^Don't know how to build task '#{task}'/)
|
158
|
-
actual_output.should_not match(/Error/i)
|
159
|
-
end
|
160
|
-
|
161
|
-
Then /^gem spec key "(.*)" contains \/(.*)\// do |key, regex|
|
162
|
-
in_project_folder do
|
163
|
-
gem_file = Dir["pkg/*.gem"].first
|
164
|
-
gem_spec = Gem::Specification.from_yaml(`gem spec #{gem_file}`)
|
165
|
-
spec_value = gem_spec.send(key.to_sym)
|
166
|
-
spec_value.to_s.should match(/#{regex}/)
|
167
|
-
end
|
168
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
Given /^I have a subprocess sequence with 2 subprocesses to run$/ do
|
2
|
-
@seq = Subprocess::PopenSequence.new
|
3
|
-
@seq.add_popen(Subprocess::Popen.new('echo "popen 1"'))
|
4
|
-
@seq.add_popen(Subprocess::Popen.new('echo "popen 2"'))
|
5
|
-
end
|
6
|
-
|
7
|
-
When /^I run the subprocesses sequence$/ do
|
8
|
-
@seq.perform
|
9
|
-
end
|
10
|
-
|
11
|
-
Then /^the subprocess sequence completes with success$/ do
|
12
|
-
@seq.status[:exitstatus].should == 0
|
13
|
-
@seq.completed?.should be_true
|
14
|
-
@seq.complete.length.should == 2
|
15
|
-
@seq.incomplete.length.should == 0
|
16
|
-
@seq.failed.length.should == 0
|
17
|
-
end
|
18
|
-
|
19
|
-
Then /^the subprocess sequence has stdout for each subprocess$/ do
|
20
|
-
@seq.complete.each do |popen|
|
21
|
-
popen.stdout.should_not == ""
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
Then /^the subprocess sequence has stderr for each subprocess$/ do
|
26
|
-
@seq.complete.each do |popen|
|
27
|
-
popen.stderr.should == ""
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
Then /^the subprocess sequence has status for each subprocess$/ do
|
32
|
-
@seq.complete.each do |popen|
|
33
|
-
popen.status.should be_kind_of Hash
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
Given /^I have a subprocess sequence with 2 subprocesses to run with a bad one first$/ do
|
38
|
-
@seq = Subprocess::PopenSequence.new
|
39
|
-
@seq.add_popen(Subprocess::Popen.new('exit 1'))
|
40
|
-
@seq.add_popen(Subprocess::Popen.new('echo "popen 2"'))
|
41
|
-
end
|
42
|
-
|
43
|
-
Then /^the subprocess sequence completes with failure$/ do
|
44
|
-
@seq.incomplete.length.should == 1
|
45
|
-
@seq.failed.length.should == 1
|
46
|
-
@seq.complete.length.should == 0
|
47
|
-
@seq.status[:exitstatus].should_not == 0
|
48
|
-
end
|
49
|
-
|
50
|
-
Given /^I have a subprocess sequence with 2 subprocesses sequences$/ do
|
51
|
-
seq1 = Subprocess::PopenSequence.new
|
52
|
-
seq1 << Subprocess::Popen.new('echo "seq 1 - popen 1"')
|
53
|
-
seq1 << Subprocess::Popen.new('echo "seq 1 - popen 2"')
|
54
|
-
seq2 = Subprocess::PopenSequence.new
|
55
|
-
seq2 << Subprocess::Popen.new('echo "seq 2 - popen 1"')
|
56
|
-
seq2 << Subprocess::Popen.new('echo "seq 2 - popen 2"')
|
57
|
-
@seq = Subprocess::PopenSequence.new
|
58
|
-
@seq << seq1
|
59
|
-
@seq << seq2
|
60
|
-
end
|
61
|
-
|
62
|
-
When /^I run the sequence$/ do
|
63
|
-
@seq.perform
|
64
|
-
end
|
65
|
-
|
66
|
-
Then /^the sequences run just like any other subprocess$/ do
|
67
|
-
@seq.status[:exitstatus].should == 0
|
68
|
-
@seq.completed?.should be_true
|
69
|
-
@seq.complete.length.should == 2
|
70
|
-
@seq.incomplete.length.should == 0
|
71
|
-
@seq.failed.length.should == 0
|
72
|
-
end
|
73
|
-
|
@@ -1,29 +0,0 @@
|
|
1
|
-
|
2
|
-
Given /^I have a new remote Subprocess instance initialized with "([^\"]*)"$/ do |command|
|
3
|
-
@popen_remote = Subprocess::PopenRemote.new(command, 'localhost', 'popen', 10, :password => 'popen')
|
4
|
-
end
|
5
|
-
|
6
|
-
When /^I invoke the run method of said remote subprocess$/ do
|
7
|
-
@popen_remote.run
|
8
|
-
end
|
9
|
-
|
10
|
-
When /^I invoke the wait method of said remote subprocess$/ do
|
11
|
-
@popen_remote.wait
|
12
|
-
end
|
13
|
-
|
14
|
-
Then /^the remote instances exit status is "([^\"]*)"$/ do |exitstatus|
|
15
|
-
@popen_remote.status[:exitstatus].should == exitstatus.to_i
|
16
|
-
end
|
17
|
-
|
18
|
-
Then /^the remote instances stdout matches "([^\"]*)"$/ do |stdout|
|
19
|
-
@popen_remote.stdout.should match(stdout)
|
20
|
-
end
|
21
|
-
|
22
|
-
Then /^the remote instances stderr matches "([^\"]*)"$/ do |stderr|
|
23
|
-
@popen_remote.stderr.should match(stderr)
|
24
|
-
end
|
25
|
-
|
26
|
-
Then /^the remote instance should have a numerical pid$/ do
|
27
|
-
@popen_remote.pid.should be_a_kind_of Fixnum
|
28
|
-
end
|
29
|
-
|
@@ -1,30 +0,0 @@
|
|
1
|
-
|
2
|
-
Given /^I have a new remote nonblocking subprocess that takes a long time to run$/ do
|
3
|
-
@popen = Subprocess::PopenRemote.new('sleep 3 && exit 1', 'localhost', nil, 10, 'popen', :password => 'popen')
|
4
|
-
@popen.should_not be_nil
|
5
|
-
end
|
6
|
-
|
7
|
-
When /^I invoke the run method of said nonblocking remote subprocess$/ do
|
8
|
-
start_time = Time.now.to_i
|
9
|
-
@popen.run
|
10
|
-
@total_time = Time.now.to_i - start_time
|
11
|
-
end
|
12
|
-
|
13
|
-
Then /^the remote nonblocking subprocess should not block$/ do
|
14
|
-
@total_time.should be_close(0, 2)
|
15
|
-
end
|
16
|
-
|
17
|
-
Then /^the remote nonblocking subprocess should report its run status$/ do
|
18
|
-
@popen.should respond_to(:running?)
|
19
|
-
end
|
20
|
-
|
21
|
-
Then /^the remote nonblocking subprocess should support being waited on till complete$/ do
|
22
|
-
@popen.wait
|
23
|
-
end
|
24
|
-
|
25
|
-
Then /^the remote nonblocking subprocess should have status info$/ do
|
26
|
-
@popen.status[:exitstatus].should be_kind_of Numeric
|
27
|
-
@popen.status.should be_a_kind_of Hash
|
28
|
-
end
|
29
|
-
|
30
|
-
|