command_exec 0.1.3 → 0.2.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.
- data/Gemfile +6 -2
- data/Gemfile.lock +42 -18
- data/README.md +707 -72
- data/RELEASE_NOTES.md +62 -0
- data/Rakefile +40 -9
- data/TODO.md +8 -2
- data/command_exec.gemspec +3 -2
- data/gemfiles/Gemfile.default +28 -0
- data/gemfiles/Gemfile.travis +16 -0
- data/gemfiles/Gemfile.travis.lock +48 -0
- data/lib/command_exec.rb +22 -2
- data/lib/command_exec/command.rb +307 -157
- data/lib/command_exec/exceptions.rb +16 -6
- data/lib/command_exec/field_helper.rb +263 -0
- data/lib/command_exec/formatter/array.rb +158 -0
- data/lib/command_exec/formatter/hash.rb +78 -0
- data/lib/command_exec/formatter/json.rb +22 -0
- data/lib/command_exec/formatter/string.rb +22 -0
- data/lib/command_exec/formatter/xml.rb +22 -0
- data/lib/command_exec/formatter/yaml.rb +22 -0
- data/lib/command_exec/logger.rb +9 -0
- data/lib/command_exec/process.rb +294 -0
- data/lib/command_exec/spec_helper_module.rb +52 -0
- data/lib/command_exec/version.rb +1 -1
- data/script/console +8 -0
- data/spec/command/command_spec.rb +413 -117
- data/spec/command/test_data/echo_test +3 -0
- data/spec/command/test_data/exit_status_test +2 -0
- data/spec/command/test_data/log_file_test +3 -0
- data/spec/command/test_data/logger_test +2 -0
- data/spec/command/test_data/not_raise_error_test +4 -0
- data/spec/command/test_data/not_throw_error_test +4 -0
- data/spec/command/test_data/output_test +6 -0
- data/spec/command/test_data/raise_error_test +6 -0
- data/spec/command/test_data/runner_open3_test +4 -0
- data/spec/command/test_data/runner_system_test +4 -0
- data/spec/command/test_data/stderr_test +4 -0
- data/spec/command/test_data/stdout_multiple_lines_test +4 -0
- data/spec/command/test_data/stdout_test +4 -0
- data/spec/command/test_data/throw_error_test +6 -0
- data/spec/command/test_data/true_test +2 -0
- data/spec/formatter/array_spec.rb +215 -0
- data/spec/formatter/hash_spec.rb +117 -0
- data/spec/formatter/json_spec.rb +21 -0
- data/spec/formatter/xml_spec.rb +33 -0
- data/spec/formatter/yaml_spec.rb +21 -0
- data/spec/process/process_spec.rb +329 -0
- data/spec/spec_helper.rb +15 -4
- metadata +79 -5
@@ -1,5 +1,12 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# Main
|
1
4
|
module CommandExec
|
5
|
+
# Helpers for specs
|
2
6
|
module SpecHelper
|
7
|
+
# Capture stderr
|
8
|
+
#
|
9
|
+
# @param [Block] block
|
3
10
|
def capture_stderr(&block)
|
4
11
|
previous_stderr, $stderr = $stderr, StringIO.new
|
5
12
|
block.call
|
@@ -8,6 +15,9 @@ module CommandExec
|
|
8
15
|
$stderr = previous_stderr
|
9
16
|
end
|
10
17
|
|
18
|
+
# Capture stdout
|
19
|
+
#
|
20
|
+
# @param [Block] block
|
11
21
|
def capture_stdout(&block)
|
12
22
|
previous_stdout, $stdout = $stdout, StringIO.new
|
13
23
|
block.call
|
@@ -15,5 +25,47 @@ module CommandExec
|
|
15
25
|
ensure
|
16
26
|
$stdout = previous_stdout
|
17
27
|
end
|
28
|
+
|
29
|
+
# Manipulate environment for the given block
|
30
|
+
#
|
31
|
+
# @param [Hash] env
|
32
|
+
# The environment for the block which should
|
33
|
+
# be merged with ENV
|
34
|
+
#
|
35
|
+
# @param [Hash] options
|
36
|
+
# Options for environment manipulation
|
37
|
+
#
|
38
|
+
# @option options [True,False] :clear
|
39
|
+
# Should the environment clear before merge?
|
40
|
+
#
|
41
|
+
# @yield Block which should be executed
|
42
|
+
def environment(env={},options={},&block)
|
43
|
+
previous_environment, environment = ENV.to_hash, env
|
44
|
+
ENV.clear if options[:clear] == true
|
45
|
+
ENV.update(environment)
|
46
|
+
block.call
|
47
|
+
ensure
|
48
|
+
ENV.clear
|
49
|
+
ENV.update previous_environment
|
50
|
+
end
|
51
|
+
|
52
|
+
# Create temporary files for testing
|
53
|
+
# (which will be deleted when the
|
54
|
+
# ruby process terminates)
|
55
|
+
#
|
56
|
+
# @param [String] base_name
|
57
|
+
# the path to the temporary file
|
58
|
+
#
|
59
|
+
# @param [String] content
|
60
|
+
# the content which should be written to the file
|
61
|
+
#
|
62
|
+
# @return [String]
|
63
|
+
# the path to the temporary file
|
64
|
+
def create_temp_file_with(base_name, content)
|
65
|
+
file = Tempfile.new(base_name)
|
66
|
+
file.write(content)
|
67
|
+
file.close
|
68
|
+
file.path
|
69
|
+
end
|
18
70
|
end
|
19
71
|
end
|
data/lib/command_exec/version.rb
CHANGED
data/script/console
ADDED
@@ -1,125 +1,421 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Command do
|
4
|
-
let(:
|
6
|
+
let(:lib_logger) {Logger.new(StringIO.new)}
|
5
7
|
#let(:logger) {Logger.new($stdout)}
|
6
|
-
let(:
|
7
|
-
let(:command) { Command.new(:echo , :
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
8
|
+
let(:lib_log_level) {:info}
|
9
|
+
let(:command) { Command.new(:echo , :lib_logger => lib_logger, :parameter => "hello world" , :error_keywords => %q[abc def], :working_directory => '/tmp' ) }
|
10
|
+
|
11
|
+
context :public_api do
|
12
|
+
test_dir = File.expand_path('test_data', File.dirname(__FILE__))
|
13
|
+
|
14
|
+
it "supports relative paths" do
|
15
|
+
Dir.chdir('spec/command') do
|
16
|
+
command = Command.new('test_data/true_test')
|
17
|
+
expect(command.path).to eq(File.join(test_dir, 'true_test'))
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir.chdir test_dir do
|
21
|
+
command = Command.new('./true_test')
|
22
|
+
expect(command.path).to eq(File.join(test_dir, 'true_test'))
|
23
|
+
end
|
24
|
+
|
25
|
+
Dir.chdir '/tmp/' do
|
26
|
+
command = Command.new('../bin/true')
|
27
|
+
expect(command.path).to eq('/bin/true')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'searches $PATH to find the command' do
|
32
|
+
environment({ 'PATH' => '/bin' }) do
|
33
|
+
command = Command.new(:true)
|
34
|
+
expect(command.path).to eq("/bin/true")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'offers an option to change $PATH for the command execution' do
|
39
|
+
command = Command.new(:echo_test, search_paths: [test_dir])
|
40
|
+
expect(command.path).to eq(File.join(test_dir, 'echo_test'))
|
41
|
+
end
|
42
|
+
|
43
|
+
it "checks if exec is executable" do
|
44
|
+
command = Command.new('/bin/true')
|
45
|
+
expect(command.executable?).to eq(true)
|
46
|
+
|
47
|
+
command = Command.new('/etc/passwd')
|
48
|
+
expect(command.executable?).to eq(false)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "checks if exec exists" do
|
52
|
+
command = Command.new('/bin/true')
|
53
|
+
expect(command.exists?).to eq(true)
|
54
|
+
|
55
|
+
command = Command.new('/usr/bin/does_not_exist')
|
56
|
+
expect(command.exists?).to eq(false)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "checks if exec is valid (exists, executable, type = file)" do
|
60
|
+
#does not exist
|
61
|
+
command = Command.new('/usr/bin/does_not_exist')
|
62
|
+
expect(command.valid?).to eq(false)
|
63
|
+
|
64
|
+
#is a directory not a file
|
65
|
+
command = Command.new('/tmp')
|
66
|
+
expect(command.valid?).to eq(false)
|
67
|
+
|
68
|
+
#exists and is executable and is a file
|
69
|
+
command = Command.new('/bin/true')
|
70
|
+
expect(command.valid?).to eq(true)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "has parameter" do
|
74
|
+
command = Command.new(:true, :parameter=>'parameter')
|
75
|
+
expect(command.parameter).to eq('parameter')
|
76
|
+
end
|
77
|
+
|
78
|
+
it "has options" do
|
79
|
+
expect(command.options).to eq('')
|
80
|
+
end
|
81
|
+
|
82
|
+
it "offers the possibility to change the working directory of the process without any side effects" do
|
83
|
+
expect(command.working_directory).to eq('/tmp')
|
84
|
+
|
85
|
+
#no side effects
|
86
|
+
lambda { command.run }
|
87
|
+
|
88
|
+
expect(Dir.pwd).to eq(File.expand_path('../..', File.dirname(__FILE__)))
|
89
|
+
end
|
90
|
+
|
91
|
+
it "can be used to construct a command string, which can be executed" do
|
92
|
+
environment('PATH' => '/bin') {
|
93
|
+
command = Command.new(:true, :parameter => "index.tex blub.tex", :options => "-a -b")
|
94
|
+
expect(command.to_s).to eq("/bin/true -a -b index.tex blub.tex")
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
it "runs programms" do
|
99
|
+
command = Command.new(:echo, :parameter => "output", :lib_log_level => :silent )
|
100
|
+
command.run
|
101
|
+
expect(command.result.status).to eq(:success)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "execute existing programs" do
|
105
|
+
command = Command.execute(:echo, :parameter => "output", :options => "-- -a -b", :lib_log_level => :silent )
|
106
|
+
expect(command.result.status).to eq(:success)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "is very verbose and returns a lot of output" do
|
110
|
+
bucket = StringIO.new
|
111
|
+
lib_logger = Logger.new(bucket)
|
112
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :debug)
|
113
|
+
|
114
|
+
expect(bucket.string['DEBUG']).to_not eq(nil)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "is silent and returns no output" do
|
118
|
+
# if you choose the system runner output of commands will be not suppressed"
|
119
|
+
bucket = StringIO.new
|
120
|
+
lib_logger = Logger.new(bucket)
|
121
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :silent)
|
122
|
+
|
123
|
+
expect(bucket.string).to eq("")
|
124
|
+
end
|
125
|
+
|
126
|
+
it "supports other log levels as well" do
|
127
|
+
bucket = StringIO.new
|
128
|
+
lib_logger = Logger.new(bucket)
|
129
|
+
|
130
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :info)
|
131
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :warn)
|
132
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :error)
|
133
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :fatal)
|
134
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :unknown)
|
135
|
+
Command.execute(:echo, :lib_logger => lib_logger ,:parameter => "output", :lib_log_level => :garbage_sasdfasf)
|
136
|
+
end
|
137
|
+
|
138
|
+
it "use a log file if given" do
|
139
|
+
application_log_file = create_temp_file_with('command_exec_test', 'TEXT IN LOG')
|
140
|
+
|
141
|
+
bucket = StringIO.new
|
142
|
+
lib_logger = Logger.new(bucket)
|
143
|
+
|
144
|
+
command = Command.new(:logger_test ,
|
145
|
+
:lib_logger => lib_logger ,
|
146
|
+
:log_file => application_log_file ,
|
147
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__))).run
|
148
|
+
end
|
149
|
+
|
150
|
+
it "outputs only warnings when told to output those" do
|
151
|
+
bucket = StringIO.new
|
152
|
+
lib_logger = Logger.new(bucket)
|
153
|
+
|
154
|
+
command = Command.new(:logger_test ,
|
155
|
+
:lib_logger => lib_logger ,
|
156
|
+
:lib_log_level => :warn,
|
157
|
+
:log_file => '/tmp/i_do_not_exist.log',
|
158
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__))).run
|
159
|
+
|
160
|
+
expect(bucket.string['WARN']).to_not eq(nil)
|
161
|
+
end
|
162
|
+
|
163
|
+
it "considers status for error handling (default 0)" do
|
164
|
+
command = Command.new(:exit_status_test,
|
165
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
166
|
+
:parameter => '1',
|
167
|
+
:lib_log_level => :silent,
|
168
|
+
:error_detection_on => [:return_code],
|
169
|
+
)
|
170
|
+
command.run
|
171
|
+
expect(command.result.status).to eq(:failed)
|
172
|
+
end
|
173
|
+
|
174
|
+
it "considers status for error handling (single value as array)" do
|
175
|
+
command = Command.new(:exit_status_test,
|
176
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
177
|
+
:parameter => '1',
|
178
|
+
:lib_log_level => :silent,
|
179
|
+
:error_detection_on => [:return_code],
|
180
|
+
:error_indicators => { :allowed_return_code => [0] })
|
181
|
+
command.run
|
182
|
+
expect(command.result.status).to eq(:failed)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "considers status for error handling (single value as symbol)" do
|
186
|
+
command = Command.new(:exit_status_test,
|
187
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
188
|
+
:parameter => '1',
|
189
|
+
:lib_log_level => :silent,
|
190
|
+
:error_detection_on => :return_code,
|
191
|
+
:error_indicators => { :allowed_return_code => [0] })
|
192
|
+
command.run
|
193
|
+
expect(command.result.status).to eq(:failed)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "considers status for error handling (single value)" do
|
197
|
+
command = Command.new(:exit_status_test,
|
198
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
199
|
+
:parameter => '0',
|
200
|
+
:lib_log_level => :silent,
|
201
|
+
:error_detection_on => [:return_code],
|
202
|
+
:error_indicators => { :allowed_return_code => [0,2] })
|
203
|
+
command.run
|
204
|
+
expect(command.result.status).to eq(:success)
|
205
|
+
|
206
|
+
command = Command.new(:exit_status_test,
|
207
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
208
|
+
:parameter => '2',
|
209
|
+
:lib_log_level => :silent,
|
210
|
+
:error_detection_on => [:return_code],
|
211
|
+
:error_indicators => { :allowed_return_code => [0,2] })
|
212
|
+
command.run
|
213
|
+
expect(command.result.status).to eq(:success)
|
214
|
+
end
|
215
|
+
|
216
|
+
it "considers stderr for error handling" do
|
217
|
+
command = Command.new(:stderr_test,
|
218
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
219
|
+
:lib_log_level => :silent,
|
220
|
+
:error_detection_on => :stderr,
|
221
|
+
:error_indicators => { :forbidden_words_in_stderr => %w{error} })
|
222
|
+
command.run
|
223
|
+
expect(command.result.status).to eq(:failed)
|
224
|
+
end
|
225
|
+
|
226
|
+
it "considers stderr for error handling but can make exceptions" do
|
227
|
+
command = Command.new(:stderr_test,
|
228
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
229
|
+
:lib_log_level => :silent,
|
230
|
+
:error_detection_on => :stderr,
|
231
|
+
:error_indicators => { :forbidden_words_in_stderr => %w{error}, :allowed_words_in_stderr => ["error. execution failed"]})
|
232
|
+
command.run
|
233
|
+
expect(command.result.status).to eq(:success)
|
234
|
+
end
|
235
|
+
|
236
|
+
it "considers stdout for error handling" do
|
237
|
+
command = Command.new(:stdout_test,
|
238
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
239
|
+
:lib_log_level => :silent,
|
240
|
+
:error_detection_on => :stdout,
|
241
|
+
:error_indicators => { :forbidden_words_in_stdout => %w{error} })
|
242
|
+
command.run
|
243
|
+
expect(command.result.status).to eq(:failed)
|
244
|
+
end
|
245
|
+
|
246
|
+
|
247
|
+
it "removes newlines from stdout" do
|
248
|
+
#same for stderr
|
249
|
+
command = Command.new(:stdout_multiple_lines_test,
|
250
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
251
|
+
:lib_log_level => :silent,
|
252
|
+
:error_detection_on => :stdout,
|
253
|
+
:error_indicators => { :forbidden_words_in_stdout => %w{error} })
|
254
|
+
command.run
|
255
|
+
expect(command.result.stdout).to eq(["error. execution failed", "error. execution failed"])
|
256
|
+
end
|
257
|
+
|
258
|
+
it "considers log file for error handling" do
|
259
|
+
temp_file = create_temp_file_with('log_file_test', 'error, huh, what goes on' )
|
260
|
+
|
261
|
+
command = Command.new(:log_file_test,
|
262
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
263
|
+
:lib_log_level => :silent,
|
264
|
+
:log_file => temp_file,
|
265
|
+
:error_detection_on => :log_file,
|
266
|
+
:error_indicators => { :forbidden_words_in_log_file => %w{error} })
|
267
|
+
command.run
|
268
|
+
expect(command.result.status).to eq(:failed)
|
269
|
+
end
|
270
|
+
|
271
|
+
it "returns the result of command execution as process object (defaults to :return_process_information)" do
|
272
|
+
command = Command.new(:output_test,
|
273
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
274
|
+
:lib_log_level => :silent,
|
275
|
+
:error_detection_on => :return_code,
|
276
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
277
|
+
command.run
|
278
|
+
expect(command.result.class).to eq(CommandExec::Process)
|
279
|
+
end
|
280
|
+
|
281
|
+
it "returns the result of command execution as process object" do
|
282
|
+
command = Command.new(:output_test,
|
283
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
284
|
+
:lib_log_level => :silent,
|
285
|
+
:on_error_do => :return_process_information,
|
286
|
+
:error_detection_on => :return_code,
|
287
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
288
|
+
command.run
|
289
|
+
expect(command.result.class).to eq(CommandExec::Process)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "does nothing on error if told so" do
|
293
|
+
command = Command.new(:raise_error_test,
|
294
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
295
|
+
:lib_log_level => :silent,
|
296
|
+
:on_error_do => :nothing,
|
297
|
+
:error_detection_on => :return_code,
|
298
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
299
|
+
expect{command.run}.to_not raise_error
|
300
|
+
expect{command.run}.to_not throw_symbol
|
301
|
+
end
|
302
|
+
|
303
|
+
it "raises an exception" do
|
304
|
+
command = Command.new(:raise_error_test,
|
305
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
306
|
+
:lib_log_level => :silent,
|
307
|
+
:on_error_do => :raise_error,
|
308
|
+
:error_detection_on => :return_code,
|
309
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
310
|
+
expect{command.run}.to raise_error(CommandExec::Exceptions::CommandExecutionFailed)
|
311
|
+
|
312
|
+
command = Command.new(:not_raise_error_test,
|
313
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
314
|
+
:lib_log_level => :silent,
|
315
|
+
:on_error_do => :raise_error,
|
316
|
+
:error_detection_on => :return_code,
|
317
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
318
|
+
expect{command.run}.to_not raise_error
|
319
|
+
end
|
320
|
+
|
321
|
+
it "throws an error" do
|
322
|
+
command = Command.new(:throw_error_test,
|
323
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
324
|
+
:lib_log_level => :silent,
|
325
|
+
:on_error_do => :throw_error,
|
326
|
+
:error_detection_on => :return_code,
|
327
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
328
|
+
expect{command.run}.to throw_symbol(:command_execution_failed)
|
329
|
+
|
330
|
+
command = Command.new(:not_throw_error_test,
|
331
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
332
|
+
:lib_log_level => :silent,
|
333
|
+
:on_error_do => :throw_error,
|
334
|
+
:error_detection_on => :return_code,
|
335
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
336
|
+
expect{command.run}.to_not throw_symbol
|
337
|
+
end
|
338
|
+
|
339
|
+
it "support open3 as runner" do
|
340
|
+
#implicit via default value (open3)
|
341
|
+
command = Command.new(:runner_open3_test,
|
342
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
343
|
+
:lib_log_level => :silent,
|
344
|
+
:error_detection_on => :return_code,
|
345
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
346
|
+
command.run
|
347
|
+
expect(command.result.status).to eq(:success)
|
348
|
+
|
349
|
+
#or explicit
|
350
|
+
command = Command.new(:runner_open3_test,
|
351
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
352
|
+
:run_via => :open3,
|
353
|
+
:lib_log_level => :silent,
|
354
|
+
:error_detection_on => :return_code,
|
355
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
356
|
+
command.run
|
357
|
+
expect(command.result.status).to eq(:success)
|
358
|
+
end
|
359
|
+
|
360
|
+
it "support system as runner" do
|
361
|
+
command = Command.new(:runner_system_test,
|
362
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
363
|
+
:run_via => :system,
|
364
|
+
:lib_log_level => :silent,
|
365
|
+
:error_detection_on => :return_code,
|
366
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
367
|
+
command.run
|
368
|
+
expect(command.result.status).to eq(:success)
|
369
|
+
end
|
370
|
+
|
371
|
+
it "has a default runner: open3" do
|
372
|
+
command = Command.new(:runner_system_test,
|
373
|
+
:search_paths => File.expand_path('test_data', File.dirname(__FILE__)),
|
374
|
+
:run_via => :unknown_runner,
|
375
|
+
:lib_log_level => :silent,
|
376
|
+
:error_detection_on => :return_code,
|
377
|
+
:error_indicators => { :allowed_return_code => [ 0 ]})
|
378
|
+
command.run
|
379
|
+
expect(command.result.status).to eq(:success)
|
380
|
+
end
|
381
|
+
|
382
|
+
it "find errors beyond newlines in the string" do
|
383
|
+
command = CommandExec::Command.new( :echo ,
|
384
|
+
:options => '-e',
|
385
|
+
:parameter => "\"wow, a test. That's great.\nBut an error occured in this line\"",
|
386
|
+
:error_detection_on => [:stdout],
|
387
|
+
:error_indicators => {
|
388
|
+
:forbidden_words_in_stdout => %w{ error }
|
389
|
+
},
|
390
|
+
)
|
391
|
+
command.run
|
392
|
+
expect(command.result.status).to eq(:failed)
|
393
|
+
end
|
83
394
|
end
|
84
395
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
396
|
+
context :private_api do
|
397
|
+
it "raises an error if command is not executable" do
|
398
|
+
command = Command.new('/etc/passwd', lib_log_level: :silent)
|
399
|
+
expect{command.send(:check_path)}.to raise_error CommandNotExecutable
|
400
|
+
end
|
401
|
+
|
402
|
+
it "raises an error if command does not exist" do
|
403
|
+
command = Command.new('/usr/bin/does_not_exist', lib_log_level: :silent)
|
404
|
+
expect{command.send(:check_path)}.to raise_error CommandNotFound
|
405
|
+
end
|
406
|
+
|
407
|
+
it "raises an error if command is not a file" do
|
408
|
+
command = Command.new('/tmp', lib_log_level: :silent)
|
409
|
+
expect{command.send(:check_path)}.to raise_error CommandIsNotAFile
|
410
|
+
end
|
411
|
+
|
412
|
+
it "finds errors in string" do
|
413
|
+
expect(command.send(:error_occured?, ['error'] , [], ['long string witherrorinside'] )).to eq(true)
|
414
|
+
expect(command.send(:error_occured?, ['error', 'inside'] , [], ['long string with error inside'] )).to eq(true)
|
415
|
+
expect(command.send(:error_occured?, ['error'] , [], ['long string with no erro"r" inside'] )).to eq(false)
|
416
|
+
|
417
|
+
expect(command.send(:error_occured?, ['error'] , ['long string with error inside but an exception defined'], ['long string with error inside but an exception defined'] )).to eq(false)
|
418
|
+
expect(command.send(:error_occured?, ['error'] , ['substring exception defined'], ['long string with error inside but a substring exception defined'] )).to eq(false)
|
419
|
+
end
|
89
420
|
end
|
90
|
-
|
91
|
-
it "output a message" do
|
92
|
-
command.send(:message, false, 'Hello_world').should == "\e[1m\e[31mFAILED\e[0m\e[0m\nHello_world"
|
93
|
-
command.send(:message, true, 'Hello_world').should == "\e[1m\e[32mOK\e[0m\e[0m"
|
94
|
-
command.send(:message, true ).should == "\e[1m\e[32mOK\e[0m\e[0m"
|
95
|
-
end
|
96
|
-
|
97
|
-
it "is very verbose and returns a lot of output" do
|
98
|
-
bucket = StringIO.new
|
99
|
-
logger = Logger.new(bucket)
|
100
|
-
Command.execute(:echo, :logger => logger ,:parameter => "index.tex blub.tex", :options => "-- -a -b" , :log_level => :debug)
|
101
|
-
|
102
|
-
bucket.string.should =~ /OK/
|
103
|
-
end
|
104
|
-
|
105
|
-
it "is silent and returns no output" do
|
106
|
-
bucket = StringIO.new
|
107
|
-
logger = Logger.new(bucket)
|
108
|
-
Command.execute(:echo, :logger => logger ,:parameter => "index.tex blub.tex", :options => "-- -a -b" , :log_level => :silent)
|
109
|
-
|
110
|
-
bucket.string.should == ""
|
111
|
-
end
|
112
|
-
|
113
|
-
# not completed
|
114
|
-
#it "use a log file if given" do
|
115
|
-
# application_log_file = Tempfile.new('command_exec_test')
|
116
|
-
# application_log_file.write "ERROR"
|
117
|
-
|
118
|
-
# binding.pry
|
119
|
-
# Command.execute(:echo, :logger => logger ,:parameter => "index.tex blub.tex", :options => "-- -a -b" , :log_level => :silent, :logfile => application_log_file, :error_keywords => %W[ERROR])
|
120
|
-
|
121
|
-
#end
|
122
|
-
|
123
|
-
|
124
|
-
|
125
421
|
end
|