right_popen 1.1.3 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,217 +0,0 @@
1
- #-- -*- mode: ruby; encoding: utf-8 -*-
2
- # Copyright: Copyright (c) 2011 RightScale, Inc.
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # 'Software'), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
- # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
- # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
- # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- #++
23
-
24
- module RightScale
25
- module RightPopen
26
- class Runner
27
- class RunnerStatus
28
- def initialize(command, options={}, &callback)
29
- options = {:repeats=>1, :force_yield=>nil, :timeout=>nil, :expect_timeout=>false}.merge(options)
30
-
31
- @command = command
32
- @output_text = ""
33
- @error_text = ""
34
- @status = nil
35
- @did_timeout = false
36
- @callback = callback
37
- @pid = nil
38
- @force_yield = options[:force_yield]
39
-
40
- @expect_timeout = options[:expect_timeout]
41
- @expect_size_limit = options[:expect_size_limit]
42
- end
43
-
44
- attr_accessor :output_text, :error_text, :status, :pid
45
- attr_accessor :did_timeout, :did_size_limit
46
-
47
- def on_read_stdout(data)
48
- sleep @force_yield if @force_yield
49
- @output_text << data
50
- end
51
-
52
- def on_read_stderr(data)
53
- sleep @force_yield if @force_yield
54
- @error_text << data
55
- end
56
-
57
- def on_pid(pid)
58
- raise "PID already set!" unless @pid.nil?
59
- @pid = pid
60
- end
61
-
62
- def on_timeout
63
- puts "\n** Failed to run #{@command.inspect}: Timeout" unless @expect_timeout
64
- @did_timeout = true
65
- @callback.call(self) if @expect_timeout
66
- end
67
-
68
- def on_size_limit
69
- puts "\n** Failed to run #{@command.inspect}: Size limit" unless @expect_size_limit
70
- @did_size_limit = true
71
- @callback.call(self) if @expect_size_limit
72
- end
73
-
74
- def on_exit(status)
75
- @status = status
76
- @callback.call(self)
77
- end
78
- end
79
-
80
- def initialize
81
- @count = 0
82
- @done = false
83
- @last_exception = nil
84
- @last_iteration = 0
85
- end
86
-
87
- def run_right_popen3(synchronicity, command, runner_options={}, &callback)
88
- runner_options = {
89
- :repeats => 1,
90
- :expect_timeout => false,
91
- :expect_size_limit => false
92
- }.merge(runner_options)
93
- popen3_options = {
94
- :input => runner_options[:input],
95
- :environment => runner_options[:env],
96
- :timeout_seconds => runner_options.has_key?(:timeout) ? runner_options[:timeout] : 2,
97
- :size_limit_bytes => runner_options[:size_limit_bytes],
98
- :watch_directory => runner_options[:watch_directory]
99
- }
100
- case synchronicity
101
- when :sync
102
- run_right_popen3_sync(command, runner_options, popen3_options, &callback)
103
- when :async
104
- run_right_popen3_async(command, runner_options, popen3_options, &callback)
105
- else
106
- raise "unknown synchronicity = #{synchronicity.inspect}"
107
- end
108
- end
109
-
110
- def run_right_popen3_sync(command, runner_options, popen3_options, &callback)
111
- begin
112
- @iterations = 0
113
- @repeats = runner_options[:repeats]
114
- @stats = []
115
- while @iterations < @repeats
116
- @iterations += 1
117
- do_right_popen3_sync(command, runner_options, popen3_options) do |runner_status|
118
- @stats << runner_status
119
- callback.call(runner_status) if callback
120
- if @repeats > 1
121
- puts if 1 == (@iterations % 64)
122
- print '+'
123
- puts if @iterations == @repeats
124
- end
125
- end
126
- end
127
- @stats.uniq!
128
- @stats.size < 2 ? @stats.first : @stats
129
- rescue Exception => e
130
- puts "\n** Failed: #{e.message} FROM\n#{e.backtrace.join("\n")}"
131
- raise e
132
- end
133
- end
134
-
135
- def run_right_popen3_async(command, runner_options, popen3_options, &callback)
136
- begin
137
- @iterations = 0
138
- @repeats = runner_options[:repeats]
139
- @stats = []
140
- EM.run do
141
- EM.defer do
142
- begin
143
- do_right_popen3_async(command, runner_options, popen3_options) do |runner_status|
144
- maybe_continue_popen3_async(runner_status, command, runner_options, popen3_options, &callback)
145
- end
146
- rescue Exception => e
147
- puts e.class, e.message, e.backtrace.join("\n")
148
- EM.stop
149
- end
150
- end
151
- end
152
- @stats.uniq!
153
- @stats.size < 2 ? @stats.first : @stats
154
- rescue Exception => e
155
- puts "\n** Failed: #{e.message} FROM\n#{e.backtrace.join("\n")}"
156
- raise e
157
- end
158
- end
159
-
160
- def do_right_popen3(synchronicity, command, runner_options, popen3_options, &callback)
161
- runner_status = RunnerStatus.new(command, runner_options, &callback)
162
- popen3_options = {
163
- :target => runner_status,
164
- :stdout_handler => :on_read_stdout,
165
- :stderr_handler => :on_read_stderr,
166
- :pid_handler => :on_pid,
167
- :timeout_handler => :on_timeout,
168
- :size_limit_handler => :on_size_limit,
169
- :exit_handler => :on_exit
170
- }.merge(popen3_options)
171
- case synchronicity
172
- when :sync
173
- result = ::RightScale::RightPopen.popen3_sync(command, popen3_options)
174
- when :async
175
- result = ::RightScale::RightPopen.popen3_async(command, popen3_options)
176
- else
177
- raise "Uknown synchronicity = #{synchronicity.inspect}"
178
- end
179
- result.should == true
180
- true
181
- end
182
-
183
- def do_right_popen3_sync(command, runner_options, popen3_options, &callback)
184
- do_right_popen3(:sync, command, runner_options, popen3_options, &callback)
185
- end
186
-
187
- def do_right_popen3_async(command, runner_options, popen3_options, &callback)
188
- do_right_popen3(:async, command, runner_options, popen3_options, &callback)
189
- end
190
-
191
- def maybe_continue_popen3_async(runner_status, command, runner_options, popen3_options, &callback)
192
- @iterations += 1
193
- @stats << runner_status
194
- callback.call(runner_status) if callback
195
- if @iterations < @repeats
196
- if @repeats > 1
197
- puts if 1 == (@iterations % 64)
198
- print '+'
199
- puts if @iterations == @repeats
200
- end
201
- EM.defer do
202
- begin
203
- do_right_popen3_async(command, runner_options, popen3_options) do |runner_status2|
204
- maybe_continue_popen3_async(runner_status2, command, runner_options, popen3_options, &callback)
205
- end
206
- rescue Exception => e
207
- puts e.class, e.message, e.backtrace.join("\n")
208
- EM.stop
209
- end
210
- end
211
- else
212
- EM.stop
213
- end
214
- end
215
- end
216
- end
217
- end
@@ -1,35 +0,0 @@
1
- #-- -*- mode: ruby; encoding: utf-8 -*-
2
- # Copyright: Copyright (c) 2011 RightScale, Inc.
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # 'Software'), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
- # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
- # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
- # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- #++
23
-
24
- REPEATS = (ARGV[0] || '4').to_i
25
-
26
- STDOUT.sync = true
27
- STDERR.sync = true
28
- REPEATS.times do |i|
29
- STDOUT.puts "To sleep... #{i}"
30
- STDERR.puts "Perchance to dream... #{i}"
31
- sleep 1
32
- end
33
- STDOUT.puts "The sleeper must awaken."
34
-
35
- exit 0
@@ -1,26 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'spec'
4
- require 'eventmachine'
5
- require 'flexmock'
6
- require File.join(File.dirname(__FILE__), '..', 'lib', 'right_popen')
7
-
8
- RUBY_CMD = 'ruby'
9
- STANDARD_MESSAGE = 'Standard message'
10
- ERROR_MESSAGE = 'Error message'
11
- EXIT_STATUS = 146
12
-
13
- # manually bump count up for more aggressive multi-processor testing, lessen
14
- # for a quick smoke test
15
- LARGE_OUTPUT_COUNTER = 1000
16
-
17
- # bump up count for most exhaustive leak detection.
18
- REPEAT_TEST_COUNTER = 256
19
-
20
- def is_windows?
21
- return RUBY_PLATFORM =~ /mswin/
22
- end
23
-
24
- Spec::Runner.configure do |config|
25
- config.mock_with :flexmock
26
- end
@@ -1,28 +0,0 @@
1
- #-- -*- mode: ruby; encoding: utf-8 -*-
2
- # Copyright: Copyright (c) 2011 RightScale, Inc.
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # 'Software'), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
- # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
- # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
- # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- #++
23
-
24
- $stderr.puts "Closing stdout"
25
- STDOUT.close
26
- sleep 15
27
- $stderr.puts "Exiting"
28
- exit 0
@@ -1,34 +0,0 @@
1
- #-- -*- mode: ruby; encoding: utf-8 -*-
2
- # Copyright: Copyright (c) 2011 RightScale, Inc.
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # 'Software'), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
- # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
- # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
- # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- #++
23
-
24
- watched_dir = ARGV[0]
25
-
26
- 10.times do |i|
27
- path = ::File.join(watched_dir, "file#{i}.txt")
28
- ::File.open(path, 'w') do |f|
29
- f.write 'x' * 100
30
- end
31
- sleep 0.2
32
- end
33
-
34
- exit 0