sskirby-hydra 0.21.0 → 0.23.3
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/LICENSE +1 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/hydra/master.rb +8 -6
- data/lib/hydra/messaging_io.rb +11 -9
- data/lib/hydra/runner.rb +26 -21
- data/lib/hydra/tasks.rb +17 -15
- data/lib/hydra/tmpdir.rb +11 -0
- data/lib/hydra/trace.rb +1 -6
- data/lib/hydra/worker.rb +11 -3
- data/sskirby-hydra.gemspec +136 -0
- data/test/fixtures/features/step_definitions.rb +2 -2
- data/test/fixtures/many_outputs_to_console.rb +9 -0
- data/test/fixtures/task_test_config.yml +6 -0
- data/test/fixtures/write_file.rb +1 -1
- data/test/fixtures/write_file_alternate_spec.rb +2 -2
- data/test/fixtures/write_file_spec.rb +2 -2
- data/test/fixtures/write_file_with_pending_spec.rb +1 -1
- data/test/master_test.rb +3 -3
- data/test/runner_test.rb +0 -3
- data/test/ssh_test.rb +11 -0
- data/test/sync_test.rb +5 -5
- data/test/task_test.rb +21 -0
- data/test/test_helper.rb +4 -2
- metadata +31 -38
- data/bin/warmsnake.rb +0 -76
- data/test/trace_test.rb +0 -72
data/LICENSE
CHANGED
data/Rakefile
CHANGED
@@ -9,10 +9,10 @@ begin
|
|
9
9
|
gem.description = %Q{Spread your tests over multiple machines to test your code faster.}
|
10
10
|
gem.email = "nick@smartlogicsolutions.com"
|
11
11
|
gem.homepage = "http://github.com/ngauthier/hydra"
|
12
|
-
gem.authors = ["Nick Gauthier"]
|
12
|
+
gem.authors = ["Nick Gauthier", "Sean Kirby", "Arturo Pie"]
|
13
13
|
gem.add_development_dependency "shoulda", "= 2.10.3"
|
14
14
|
gem.add_development_dependency "rspec", "= 2.0.0.beta.19"
|
15
|
-
gem.add_development_dependency "cucumber", "= 0.
|
15
|
+
gem.add_development_dependency "cucumber", "= 0.9.2"
|
16
16
|
gem.add_development_dependency "therubyracer", "= 0.7.4"
|
17
17
|
end
|
18
18
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.23.3
|
data/lib/hydra/master.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'hydra/hash'
|
2
2
|
require 'open3'
|
3
|
-
require 'tmpdir'
|
3
|
+
require 'hydra/tmpdir'
|
4
4
|
require 'erb'
|
5
5
|
require 'yaml'
|
6
6
|
|
@@ -14,6 +14,7 @@ module Hydra #:nodoc:
|
|
14
14
|
include Hydra::Messages::Master
|
15
15
|
include Open3
|
16
16
|
traceable('MASTER')
|
17
|
+
attr_reader :failed_files
|
17
18
|
|
18
19
|
# Create a new Master
|
19
20
|
#
|
@@ -54,6 +55,7 @@ module Hydra #:nodoc:
|
|
54
55
|
@files = Array(opts.fetch('files') { nil })
|
55
56
|
raise "No files, nothing to do" if @files.empty?
|
56
57
|
@incomplete_files = @files.dup
|
58
|
+
@failed_files = []
|
57
59
|
@workers = []
|
58
60
|
@listeners = []
|
59
61
|
@event_listeners = Array(opts.fetch('listeners') { nil } )
|
@@ -66,7 +68,6 @@ module Hydra #:nodoc:
|
|
66
68
|
@autosort = opts.fetch('autosort') { true }
|
67
69
|
@sync = opts.fetch('sync') { nil }
|
68
70
|
@environment = opts.fetch('environment') { 'test' }
|
69
|
-
@remote_require = opts.fetch('remote_require') {[]}
|
70
71
|
|
71
72
|
if @autosort
|
72
73
|
sort_files_from_report
|
@@ -117,6 +118,9 @@ module Hydra #:nodoc:
|
|
117
118
|
@incomplete_files.delete_at(@incomplete_files.index(message.file))
|
118
119
|
trace "#{@incomplete_files.size} Files Remaining"
|
119
120
|
@event_listeners.each{|l| l.file_end(message.file, message.output) }
|
121
|
+
unless message.output == '.'
|
122
|
+
@failed_files << message.file
|
123
|
+
end
|
120
124
|
if @incomplete_files.empty?
|
121
125
|
@workers.each do |worker|
|
122
126
|
@event_listeners.each{|l| l.worker_end(worker) }
|
@@ -166,11 +170,9 @@ module Hydra #:nodoc:
|
|
166
170
|
def boot_ssh_worker(worker)
|
167
171
|
sync = Sync.new(worker, @sync, @verbose)
|
168
172
|
|
169
|
-
custom_require = @remote_require.map {|r| " require '#{r}';"}.join(' ')
|
170
|
-
|
171
173
|
runners = worker.fetch('runners') { raise "You must specify the number of runners" }
|
172
174
|
command = worker.fetch('command') {
|
173
|
-
"RAILS_ENV=#{@environment} ruby -e \"require 'rubygems'; require 'hydra'
|
175
|
+
"RAILS_ENV=#{@environment} ruby -e \"require 'rubygems'; require 'hydra'; Hydra::Worker.new(:io => Hydra::Stdio.new, :runners => #{runners}, :verbose => #{@verbose});\""
|
174
176
|
}
|
175
177
|
|
176
178
|
trace "Booting SSH worker"
|
@@ -235,7 +237,7 @@ module Hydra #:nodoc:
|
|
235
237
|
end
|
236
238
|
|
237
239
|
def heuristic_file
|
238
|
-
@heuristic_file ||= File.join(Dir.
|
240
|
+
@heuristic_file ||= File.join(Dir.consistent_tmpdir, 'hydra_heuristics.yml')
|
239
241
|
end
|
240
242
|
end
|
241
243
|
end
|
data/lib/hydra/messaging_io.rb
CHANGED
@@ -8,15 +8,17 @@ module Hydra #:nodoc:
|
|
8
8
|
# IO.gets
|
9
9
|
# => Hydra::Message # or subclass
|
10
10
|
def gets
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
while true
|
12
|
+
begin
|
13
|
+
raise IOError unless @reader
|
14
|
+
message = @reader.gets
|
15
|
+
return nil unless message
|
16
|
+
return Message.build(eval(message.chomp))
|
17
|
+
rescue SyntaxError, NameError
|
18
|
+
# uncomment to help catch remote errors by seeing all traffic
|
19
|
+
#$stderr.write "Not a message: [#{message.inspect}]\n"
|
20
|
+
end
|
21
|
+
end
|
20
22
|
end
|
21
23
|
|
22
24
|
# Write a Message to the output IO object. It will automatically
|
data/lib/hydra/runner.rb
CHANGED
@@ -18,7 +18,6 @@ module Hydra #:nodoc:
|
|
18
18
|
def initialize(opts = {})
|
19
19
|
@io = opts.fetch(:io) { raise "No IO Object" }
|
20
20
|
@verbose = opts.fetch(:verbose) { false }
|
21
|
-
@remote = opts.fetch(:remote) { false }
|
22
21
|
$stdout.sync = true
|
23
22
|
trace 'Booted. Sending Request for file'
|
24
23
|
|
@@ -57,14 +56,6 @@ module Hydra #:nodoc:
|
|
57
56
|
@running = false
|
58
57
|
end
|
59
58
|
|
60
|
-
def format_ex_in_file(file, ex)
|
61
|
-
"Error in #{file}:\n #{format_exception(ex)}"
|
62
|
-
end
|
63
|
-
|
64
|
-
def format_exception(ex)
|
65
|
-
"#{ex.class.name}: #{ex.message}\n #{ex.backtrace.join("\n ")}"
|
66
|
-
end
|
67
|
-
|
68
59
|
private
|
69
60
|
|
70
61
|
# The runner will continually read messages and handle them.
|
@@ -88,6 +79,14 @@ module Hydra #:nodoc:
|
|
88
79
|
end
|
89
80
|
end
|
90
81
|
|
82
|
+
def format_ex_in_file(file, ex)
|
83
|
+
"Error in #{file}:\n #{format_exception(ex)}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def format_exception(ex)
|
87
|
+
"#{ex.class.name}: #{ex.message}\n #{ex.backtrace.join("\n ")}"
|
88
|
+
end
|
89
|
+
|
91
90
|
# Run all the Test::Unit Suites in a ruby file
|
92
91
|
def run_test_unit_file(file)
|
93
92
|
begin
|
@@ -122,7 +121,7 @@ module Hydra #:nodoc:
|
|
122
121
|
require 'rspec'
|
123
122
|
require 'hydra/spec/hydra_formatter'
|
124
123
|
# Ensure we override rspec's at_exit
|
125
|
-
|
124
|
+
RSpec::Core::Runner.disable_autorun!
|
126
125
|
rescue LoadError => ex
|
127
126
|
return ex.to_s
|
128
127
|
end
|
@@ -150,29 +149,35 @@ module Hydra #:nodoc:
|
|
150
149
|
dev_null = StringIO.new
|
151
150
|
hydra_response = StringIO.new
|
152
151
|
|
153
|
-
unless @
|
152
|
+
unless @cuke_runtime
|
154
153
|
require 'cucumber'
|
155
154
|
require 'hydra/cucumber/formatter'
|
156
|
-
|
155
|
+
Cucumber.logger.level = Logger::INFO
|
156
|
+
@cuke_runtime = Cucumber::Runtime.new
|
157
157
|
@cuke_configuration = Cucumber::Cli::Configuration.new(dev_null, dev_null)
|
158
158
|
@cuke_configuration.parse!(['features']+files)
|
159
159
|
|
160
|
-
|
161
|
-
@
|
162
|
-
|
163
|
-
|
164
|
-
@
|
160
|
+
support_code = Cucumber::Runtime::SupportCode.new(@cuke_runtime, @cuke_configuration.guess?)
|
161
|
+
support_code.load_files!(@cuke_configuration.support_to_load + @cuke_configuration.step_defs_to_load)
|
162
|
+
support_code.fire_hook(:after_configuration, @cuke_configuration)
|
163
|
+
# i don't like this, but there no access to set the instance of SupportCode in Runtime
|
164
|
+
@cuke_runtime.instance_variable_set('@support_code',support_code)
|
165
165
|
end
|
166
166
|
cuke_formatter = Cucumber::Formatter::Hydra.new(
|
167
|
-
@
|
167
|
+
@cuke_runtime, hydra_response, @cuke_configuration.options
|
168
168
|
)
|
169
169
|
|
170
170
|
cuke_runner ||= Cucumber::Ast::TreeWalker.new(
|
171
|
-
@
|
171
|
+
@cuke_runtime, [cuke_formatter], @cuke_configuration
|
172
172
|
)
|
173
|
-
@
|
173
|
+
@cuke_runtime.visitor = cuke_runner
|
174
174
|
|
175
|
-
|
175
|
+
loader = Cucumber::Runtime::FeaturesLoader.new(
|
176
|
+
files,
|
177
|
+
@cuke_configuration.filters,
|
178
|
+
@cuke_configuration.tag_expression
|
179
|
+
)
|
180
|
+
features = loader.features
|
176
181
|
tag_excess = tag_excess(features, @cuke_configuration.options[:tag_expression].limits)
|
177
182
|
@cuke_configuration.options[:tag_excess] = tag_excess
|
178
183
|
|
data/lib/hydra/tasks.rb
CHANGED
@@ -36,10 +36,7 @@ module Hydra #:nodoc:
|
|
36
36
|
# files that may not play nice with others.
|
37
37
|
attr_accessor :serial
|
38
38
|
|
39
|
-
|
40
|
-
# custom messages), you will need to make those extensions
|
41
|
-
# available to the remote workers by specifying them here.
|
42
|
-
attr_accessor :remote_require
|
39
|
+
attr_accessor :environment
|
43
40
|
|
44
41
|
#
|
45
42
|
# Search for the hydra config file
|
@@ -69,7 +66,6 @@ module Hydra #:nodoc:
|
|
69
66
|
# t.add_files 'test/integration/**/*_test.rb'
|
70
67
|
# t.verbose = false # optionally set to true for lots of debug messages
|
71
68
|
# t.autosort = false # disable automatic sorting based on runtime of tests
|
72
|
-
# t.remote_require << 'hydra_extensions'
|
73
69
|
# end
|
74
70
|
class TestTask < Hydra::Task
|
75
71
|
|
@@ -81,12 +77,13 @@ module Hydra #:nodoc:
|
|
81
77
|
@autosort = true
|
82
78
|
@serial = false
|
83
79
|
@listeners = [Hydra::Listener::ProgressBar.new]
|
84
|
-
@remote_require = []
|
85
80
|
|
86
81
|
yield self if block_given?
|
87
82
|
|
88
83
|
# Ensure we override rspec's at_exit
|
89
|
-
|
84
|
+
if defined?(RSpec)
|
85
|
+
RSpec::Core::Runner.disable_autorun!
|
86
|
+
end
|
90
87
|
|
91
88
|
unless @serial
|
92
89
|
@config = find_config_file
|
@@ -97,7 +94,7 @@ module Hydra #:nodoc:
|
|
97
94
|
:autosort => @autosort,
|
98
95
|
:files => @files,
|
99
96
|
:listeners => @listeners,
|
100
|
-
:
|
97
|
+
:environment => @environment
|
101
98
|
}
|
102
99
|
if @config
|
103
100
|
@opts.merge!(:config => @config)
|
@@ -113,11 +110,14 @@ module Hydra #:nodoc:
|
|
113
110
|
def define
|
114
111
|
desc "Hydra Tests" + (@name == :hydra ? "" : " for #{@name}")
|
115
112
|
task @name do
|
116
|
-
if Object.const_defined?('
|
117
|
-
$stderr.puts %{WARNING:
|
113
|
+
if Object.const_defined?('Rails') && Rails.env == 'development'
|
114
|
+
$stderr.puts %{WARNING: Rails Environment is "development". Make sure to set it properly (ex: "RAILS_ENV=test rake hydra")}
|
118
115
|
end
|
119
116
|
|
120
|
-
Hydra::Master.new(@opts)
|
117
|
+
master = Hydra::Master.new(@opts)
|
118
|
+
unless master.failed_files.empty?
|
119
|
+
raise "Hydra: Not all tests passes"
|
120
|
+
end
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
@@ -243,8 +243,9 @@ module Hydra #:nodoc:
|
|
243
243
|
include Open3
|
244
244
|
# Create a new hydra remote task with the given name.
|
245
245
|
# The task will be named hydra:remote:<name>
|
246
|
-
def initialize(name)
|
246
|
+
def initialize(name, command=nil)
|
247
247
|
@name = name
|
248
|
+
@command = command
|
248
249
|
yield self if block_given?
|
249
250
|
@config = find_config_file
|
250
251
|
if @config
|
@@ -262,6 +263,7 @@ module Hydra #:nodoc:
|
|
262
263
|
environment = config.fetch('environment') { 'test' }
|
263
264
|
workers = config.fetch('workers') { [] }
|
264
265
|
workers = workers.select{|w| w['type'] == 'ssh'}
|
266
|
+
@command = "RAILS_ENV=#{environment} rake #{@name}" unless @command
|
265
267
|
|
266
268
|
$stdout.write "==== Hydra Running #{@name} ====\n"
|
267
269
|
Thread.abort_on_exception = true
|
@@ -270,7 +272,7 @@ module Hydra #:nodoc:
|
|
270
272
|
workers.each do |worker|
|
271
273
|
@listeners << Thread.new do
|
272
274
|
begin
|
273
|
-
@results[worker] = if
|
275
|
+
@results[worker] = if run_command(worker, @command)
|
274
276
|
"==== #{@name} passed on #{worker['connect']} ====\n"
|
275
277
|
else
|
276
278
|
"==== #{@name} failed on #{worker['connect']} ====\nPlease see above for more details.\n"
|
@@ -286,13 +288,13 @@ module Hydra #:nodoc:
|
|
286
288
|
end
|
287
289
|
end
|
288
290
|
|
289
|
-
def
|
291
|
+
def run_command worker, command
|
290
292
|
$stdout.write "==== Hydra Running #{@name} on #{worker['connect']} ====\n"
|
291
293
|
ssh_opts = worker.fetch('ssh_opts') { '' }
|
292
294
|
writer, reader, error = popen3("ssh -tt #{ssh_opts} #{worker['connect']} ")
|
293
295
|
writer.write("cd #{worker['directory']}\n")
|
294
296
|
writer.write "echo BEGIN HYDRA\n"
|
295
|
-
writer.write(
|
297
|
+
writer.write(command + "\r")
|
296
298
|
writer.write "echo END HYDRA\n"
|
297
299
|
writer.write("exit\n")
|
298
300
|
writer.close
|
data/lib/hydra/tmpdir.rb
ADDED
data/lib/hydra/trace.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Hydra #:nodoc:
|
2
2
|
# Trace output when in verbose mode.
|
3
3
|
module Trace
|
4
|
-
REMOTE_IDENTIFIER = 'REMOTE'
|
5
|
-
|
6
4
|
module ClassMethods
|
7
5
|
# Make a class traceable. Takes one parameter,
|
8
6
|
# which is the prefix for the trace to identify this class
|
@@ -18,10 +16,7 @@ module Hydra #:nodoc:
|
|
18
16
|
# Trace some output with the class's prefix and a newline.
|
19
17
|
# Checks to ensure we're running verbosely.
|
20
18
|
def trace(str)
|
21
|
-
|
22
|
-
remote_info = @remote ? "#{REMOTE_IDENTIFIER} #{@remote} " : ''
|
23
|
-
str = str.gsub /\n/, "\n#{remote_info}"
|
24
|
-
$stdout.write "#{Time.now.to_f} #{remote_info}#{self.class._traceable_prefix}| #{str}\n"
|
19
|
+
$stdout.write "#{Time.now.to_f} #{self.class._traceable_prefix}| #{str}\n" if @verbose
|
25
20
|
end
|
26
21
|
end
|
27
22
|
end
|
data/lib/hydra/worker.rb
CHANGED
@@ -16,11 +16,11 @@ module Hydra #:nodoc:
|
|
16
16
|
# * num_runners: The number of runners to launch
|
17
17
|
def initialize(opts = {})
|
18
18
|
@verbose = opts.fetch(:verbose) { false }
|
19
|
-
@remote = opts.fetch(:remote) { false }
|
20
19
|
@io = opts.fetch(:io) { raise "No IO Object" }
|
21
20
|
@runners = []
|
22
21
|
@listeners = []
|
23
22
|
|
23
|
+
load_worker_initializer
|
24
24
|
boot_runners(opts.fetch(:runners) { 1 })
|
25
25
|
@io.write(Hydra::Messages::Worker::WorkerBegin.new)
|
26
26
|
|
@@ -29,7 +29,15 @@ module Hydra #:nodoc:
|
|
29
29
|
@runners.each{|r| Process.wait r[:pid] }
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
def load_worker_initializer
|
33
|
+
if File.exist?('./hydra_worker_init.rb')
|
34
|
+
trace('Requiring hydra_worker_init.rb')
|
35
|
+
require 'hydra_worker_init'
|
36
|
+
else
|
37
|
+
trace('hydra_worker_init.rb not present')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
33
41
|
# message handling methods
|
34
42
|
|
35
43
|
# When a runner wants a file, it hits this method with a message.
|
@@ -75,7 +83,7 @@ module Hydra #:nodoc:
|
|
75
83
|
pipe = Hydra::Pipe.new
|
76
84
|
child = SafeFork.fork do
|
77
85
|
pipe.identify_as_child
|
78
|
-
Hydra::Runner.new(:io => pipe, :verbose => @verbose
|
86
|
+
Hydra::Runner.new(:io => pipe, :verbose => @verbose)
|
79
87
|
end
|
80
88
|
pipe.identify_as_parent
|
81
89
|
@runners << { :pid => child, :io => pipe, :idle => false }
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{sskirby-hydra}
|
8
|
+
s.version = "0.23.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Nick Gauthier", "Sean Kirby", "Arturo Pie"]
|
12
|
+
s.date = %q{2011-04-26}
|
13
|
+
s.description = %q{Spread your tests over multiple machines to test your code faster.}
|
14
|
+
s.email = %q{nick@smartlogicsolutions.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc",
|
18
|
+
"TODO"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
".gitignore",
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"TODO",
|
27
|
+
"VERSION",
|
28
|
+
"caliper.yml",
|
29
|
+
"hydra-icon-64x64.png",
|
30
|
+
"hydra_gray.png",
|
31
|
+
"lib/hydra.rb",
|
32
|
+
"lib/hydra/cucumber/formatter.rb",
|
33
|
+
"lib/hydra/hash.rb",
|
34
|
+
"lib/hydra/js/lint.js",
|
35
|
+
"lib/hydra/listener/abstract.rb",
|
36
|
+
"lib/hydra/listener/minimal_output.rb",
|
37
|
+
"lib/hydra/listener/notifier.rb",
|
38
|
+
"lib/hydra/listener/progress_bar.rb",
|
39
|
+
"lib/hydra/listener/report_generator.rb",
|
40
|
+
"lib/hydra/master.rb",
|
41
|
+
"lib/hydra/message.rb",
|
42
|
+
"lib/hydra/message/master_messages.rb",
|
43
|
+
"lib/hydra/message/runner_messages.rb",
|
44
|
+
"lib/hydra/message/worker_messages.rb",
|
45
|
+
"lib/hydra/messaging_io.rb",
|
46
|
+
"lib/hydra/pipe.rb",
|
47
|
+
"lib/hydra/runner.rb",
|
48
|
+
"lib/hydra/safe_fork.rb",
|
49
|
+
"lib/hydra/spec/autorun_override.rb",
|
50
|
+
"lib/hydra/spec/hydra_formatter.rb",
|
51
|
+
"lib/hydra/ssh.rb",
|
52
|
+
"lib/hydra/stdio.rb",
|
53
|
+
"lib/hydra/sync.rb",
|
54
|
+
"lib/hydra/tasks.rb",
|
55
|
+
"lib/hydra/tmpdir.rb",
|
56
|
+
"lib/hydra/trace.rb",
|
57
|
+
"lib/hydra/worker.rb",
|
58
|
+
"sskirby-hydra.gemspec",
|
59
|
+
"test/fixtures/assert_true.rb",
|
60
|
+
"test/fixtures/config.yml",
|
61
|
+
"test/fixtures/conflicting.rb",
|
62
|
+
"test/fixtures/features/step_definitions.rb",
|
63
|
+
"test/fixtures/features/write_alternate_file.feature",
|
64
|
+
"test/fixtures/features/write_file.feature",
|
65
|
+
"test/fixtures/hello_world.rb",
|
66
|
+
"test/fixtures/js_file.js",
|
67
|
+
"test/fixtures/json_data.json",
|
68
|
+
"test/fixtures/many_outputs_to_console.rb",
|
69
|
+
"test/fixtures/slow.rb",
|
70
|
+
"test/fixtures/sync_test.rb",
|
71
|
+
"test/fixtures/task_test_config.yml",
|
72
|
+
"test/fixtures/write_file.rb",
|
73
|
+
"test/fixtures/write_file_alternate_spec.rb",
|
74
|
+
"test/fixtures/write_file_spec.rb",
|
75
|
+
"test/fixtures/write_file_with_pending_spec.rb",
|
76
|
+
"test/master_test.rb",
|
77
|
+
"test/message_test.rb",
|
78
|
+
"test/pipe_test.rb",
|
79
|
+
"test/runner_test.rb",
|
80
|
+
"test/ssh_test.rb",
|
81
|
+
"test/sync_test.rb",
|
82
|
+
"test/task_test.rb",
|
83
|
+
"test/test_helper.rb",
|
84
|
+
"test/worker_test.rb"
|
85
|
+
]
|
86
|
+
s.homepage = %q{http://github.com/ngauthier/hydra}
|
87
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
88
|
+
s.require_paths = ["lib"]
|
89
|
+
s.rubygems_version = %q{1.3.6}
|
90
|
+
s.summary = %q{Distributed testing toolkit}
|
91
|
+
s.test_files = [
|
92
|
+
"test/sync_test.rb",
|
93
|
+
"test/test_helper.rb",
|
94
|
+
"test/message_test.rb",
|
95
|
+
"test/runner_test.rb",
|
96
|
+
"test/fixtures/write_file.rb",
|
97
|
+
"test/fixtures/sync_test.rb",
|
98
|
+
"test/fixtures/hello_world.rb",
|
99
|
+
"test/fixtures/write_file_alternate_spec.rb",
|
100
|
+
"test/fixtures/write_file_with_pending_spec.rb",
|
101
|
+
"test/fixtures/slow.rb",
|
102
|
+
"test/fixtures/assert_true.rb",
|
103
|
+
"test/fixtures/write_file_spec.rb",
|
104
|
+
"test/fixtures/many_outputs_to_console.rb",
|
105
|
+
"test/fixtures/features/step_definitions.rb",
|
106
|
+
"test/fixtures/conflicting.rb",
|
107
|
+
"test/ssh_test.rb",
|
108
|
+
"test/pipe_test.rb",
|
109
|
+
"test/task_test.rb",
|
110
|
+
"test/master_test.rb",
|
111
|
+
"test/worker_test.rb"
|
112
|
+
]
|
113
|
+
|
114
|
+
if s.respond_to? :specification_version then
|
115
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
116
|
+
s.specification_version = 3
|
117
|
+
|
118
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
119
|
+
s.add_development_dependency(%q<shoulda>, ["= 2.10.3"])
|
120
|
+
s.add_development_dependency(%q<rspec>, ["= 2.0.0.beta.19"])
|
121
|
+
s.add_development_dependency(%q<cucumber>, ["= 0.9.2"])
|
122
|
+
s.add_development_dependency(%q<therubyracer>, ["= 0.7.4"])
|
123
|
+
else
|
124
|
+
s.add_dependency(%q<shoulda>, ["= 2.10.3"])
|
125
|
+
s.add_dependency(%q<rspec>, ["= 2.0.0.beta.19"])
|
126
|
+
s.add_dependency(%q<cucumber>, ["= 0.9.2"])
|
127
|
+
s.add_dependency(%q<therubyracer>, ["= 0.7.4"])
|
128
|
+
end
|
129
|
+
else
|
130
|
+
s.add_dependency(%q<shoulda>, ["= 2.10.3"])
|
131
|
+
s.add_dependency(%q<rspec>, ["= 2.0.0.beta.19"])
|
132
|
+
s.add_dependency(%q<cucumber>, ["= 0.9.2"])
|
133
|
+
s.add_dependency(%q<therubyracer>, ["= 0.7.4"])
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Given /^a target file$/ do
|
2
|
-
@target_file = File.expand_path(File.join(Dir.
|
2
|
+
@target_file = File.expand_path(File.join(Dir.consistent_tmpdir, 'hydra_test.txt'))
|
3
3
|
end
|
4
4
|
|
5
5
|
Given /^an alternate target file$/ do
|
6
|
-
@target_file = File.expand_path(File.join(Dir.
|
6
|
+
@target_file = File.expand_path(File.join(Dir.consistent_tmpdir, 'alternate_hydra_test.txt'))
|
7
7
|
end
|
8
8
|
|
9
9
|
When /^I write "([^\"]*)" to the file$/ do |text|
|
data/test/fixtures/write_file.rb
CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
2
|
|
3
3
|
class WriteFileTest < Test::Unit::TestCase
|
4
4
|
def test_write_a_file
|
5
|
-
File.open(File.join(Dir.
|
5
|
+
File.open(File.join(Dir.consistent_tmpdir, 'hydra_test.txt'), 'a') do |f|
|
6
6
|
f.write "HYDRA"
|
7
7
|
end
|
8
8
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'tmpdir'
|
2
1
|
require 'rspec'
|
2
|
+
require 'hydra/tmpdir'
|
3
3
|
context "file writing" do
|
4
4
|
it "writes to a file" do
|
5
|
-
File.open(File.join(Dir.
|
5
|
+
File.open(File.join(Dir.consistent_tmpdir, 'alternate_hydra_test.txt'), 'a') do |f|
|
6
6
|
f.write "HYDRA"
|
7
7
|
end
|
8
8
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'tmpdir'
|
2
1
|
require 'rspec'
|
2
|
+
require 'hydra/tmpdir'
|
3
3
|
context "file writing" do
|
4
4
|
it "writes to a file" do
|
5
|
-
File.open(File.join(Dir.
|
5
|
+
File.open(File.join(Dir.consistent_tmpdir, 'hydra_test.txt'), 'a') do |f|
|
6
6
|
f.write "HYDRA"
|
7
7
|
end
|
8
8
|
end
|
data/test/master_test.rb
CHANGED
@@ -64,7 +64,7 @@ class MasterTest < Test::Unit::TestCase
|
|
64
64
|
Hydra::Master.new(:files => [test_file])
|
65
65
|
assert File.exists?(target_file)
|
66
66
|
assert_equal "HYDRA", File.read(target_file)
|
67
|
-
report_file = File.join(Dir.
|
67
|
+
report_file = File.join(Dir.consistent_tmpdir, 'hydra_heuristics.yml')
|
68
68
|
assert File.exists?(report_file)
|
69
69
|
assert report = YAML.load_file(report_file)
|
70
70
|
assert_not_nil report[test_file]
|
@@ -133,8 +133,8 @@ class MasterTest < Test::Unit::TestCase
|
|
133
133
|
end
|
134
134
|
|
135
135
|
should "synchronize a test file over ssh with rsync" do
|
136
|
-
local = File.join(Dir.
|
137
|
-
remote = File.join(Dir.
|
136
|
+
local = File.join(Dir.consistent_tmpdir, 'hydra', 'local')
|
137
|
+
remote = File.join(Dir.consistent_tmpdir, 'hydra', 'remote')
|
138
138
|
sync_test = File.join(File.dirname(__FILE__), 'fixtures', 'sync_test.rb')
|
139
139
|
[local, remote].each{|f| FileUtils.rm_rf f; FileUtils.mkdir_p f}
|
140
140
|
|
data/test/runner_test.rb
CHANGED
@@ -80,9 +80,6 @@ class RunnerTest < Test::Unit::TestCase
|
|
80
80
|
# we run this in a fork to not contaminate
|
81
81
|
# the main test environment
|
82
82
|
pid = Process.fork do
|
83
|
-
# need to get into the fixtures directory so cucumber doesn't load up the whole project
|
84
|
-
Dir.chdir(File.join(File.dirname(__FILE__), 'fixtures'))
|
85
|
-
|
86
83
|
runner = Hydra::Runner.new(:io => File.new('/dev/null', 'w'))
|
87
84
|
runner.run_file(cucumber_feature_file)
|
88
85
|
assert File.exists?(target_file)
|
data/test/ssh_test.rb
CHANGED
@@ -11,4 +11,15 @@ class SSHTest < Test::Unit::TestCase
|
|
11
11
|
assert_equal "Hello World", response.text
|
12
12
|
ssh.close
|
13
13
|
end
|
14
|
+
|
15
|
+
should "be able to handle a large number of non-Hydra console output" do
|
16
|
+
ssh = Hydra::SSH.new(
|
17
|
+
'localhost', # connect to this machine
|
18
|
+
File.expand_path(File.join(File.dirname(__FILE__))), # move to the test directory
|
19
|
+
"ruby fixtures/many_outputs_to_console.rb"
|
20
|
+
)
|
21
|
+
response = ssh.gets
|
22
|
+
assert_equal "My message", response.text
|
23
|
+
ssh.close
|
24
|
+
end
|
14
25
|
end
|
data/test/sync_test.rb
CHANGED
@@ -13,8 +13,8 @@ class SyncTest < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
should "synchronize a test file over ssh with rsync" do
|
16
|
-
local = File.join(Dir.
|
17
|
-
remote = File.join(Dir.
|
16
|
+
local = File.join(Dir.consistent_tmpdir, 'hydra', 'local')
|
17
|
+
remote = File.join(Dir.consistent_tmpdir, 'hydra', 'remote')
|
18
18
|
sync_test = File.join(File.dirname(__FILE__), 'fixtures', 'sync_test.rb')
|
19
19
|
[local, remote].each{|f| FileUtils.rm_rf f; FileUtils.mkdir_p f}
|
20
20
|
|
@@ -58,9 +58,9 @@ class SyncTest < Test::Unit::TestCase
|
|
58
58
|
end
|
59
59
|
|
60
60
|
should "synchronize a test file over ssh with rsync to multiple workers" do
|
61
|
-
local = File.join(Dir.
|
62
|
-
remote_a = File.join(Dir.
|
63
|
-
remote_b = File.join(Dir.
|
61
|
+
local = File.join(Dir.consistent_tmpdir, 'hydra', 'local')
|
62
|
+
remote_a = File.join(Dir.consistent_tmpdir, 'hydra', 'remote_a')
|
63
|
+
remote_b = File.join(Dir.consistent_tmpdir, 'hydra', 'remote_b')
|
64
64
|
sync_test = File.join(File.dirname(__FILE__), 'fixtures', 'sync_test.rb')
|
65
65
|
[local, remote_a, remote_b].each{|f| FileUtils.rm_rf f; FileUtils.mkdir_p f}
|
66
66
|
|
data/test/task_test.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
require 'hydra/tasks'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
class TaskTest < Test::Unit::TestCase
|
6
|
+
context "a task" do
|
7
|
+
should "execute the command in a remote machine" do
|
8
|
+
|
9
|
+
File.delete( "/tmp/new_file" ) if File.exists? "/tmp/new_file"
|
10
|
+
|
11
|
+
Hydra::RemoteTask.new('cat:text_file', 'touch new_file') do |t|
|
12
|
+
t.config = "test/fixtures/task_test_config.yml"
|
13
|
+
end
|
14
|
+
|
15
|
+
Rake.application['hydra:remote:cat:text_file'].invoke
|
16
|
+
|
17
|
+
assert( File.exists? "/tmp/new_file" )
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'test/unit'
|
3
|
+
gem 'shoulda', '2.10.3'
|
4
|
+
gem 'rspec', '2.0.0.beta.19'
|
3
5
|
require 'shoulda'
|
4
6
|
require 'tmpdir'
|
5
7
|
|
@@ -12,11 +14,11 @@ Test::Unit.run = false
|
|
12
14
|
|
13
15
|
class Test::Unit::TestCase
|
14
16
|
def target_file
|
15
|
-
File.expand_path(File.join(Dir.
|
17
|
+
File.expand_path(File.join(Dir.consistent_tmpdir, 'hydra_test.txt'))
|
16
18
|
end
|
17
19
|
|
18
20
|
def alternate_target_file
|
19
|
-
File.expand_path(File.join(Dir.
|
21
|
+
File.expand_path(File.join(Dir.consistent_tmpdir, 'alternate_hydra_test.txt'))
|
20
22
|
end
|
21
23
|
|
22
24
|
def test_file
|
metadata
CHANGED
@@ -1,32 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sskirby-hydra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 75
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 23
|
8
|
+
- 3
|
9
|
+
version: 0.23.3
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Nick Gauthier
|
13
|
+
- Sean Kirby
|
14
|
+
- Arturo Pie
|
14
15
|
autorequire:
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
19
|
+
date: 2011-04-26 00:00:00 -04:00
|
20
|
+
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
23
|
name: shoulda
|
23
24
|
prerelease: false
|
24
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
26
|
requirements:
|
27
27
|
- - "="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 33
|
30
29
|
segments:
|
31
30
|
- 2
|
32
31
|
- 10
|
@@ -38,11 +37,9 @@ dependencies:
|
|
38
37
|
name: rspec
|
39
38
|
prerelease: false
|
40
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
40
|
requirements:
|
43
41
|
- - "="
|
44
42
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 62196421
|
46
43
|
segments:
|
47
44
|
- 2
|
48
45
|
- 0
|
@@ -56,27 +53,23 @@ dependencies:
|
|
56
53
|
name: cucumber
|
57
54
|
prerelease: false
|
58
55
|
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
56
|
requirements:
|
61
57
|
- - "="
|
62
58
|
- !ruby/object:Gem::Version
|
63
|
-
hash: 53
|
64
59
|
segments:
|
65
60
|
- 0
|
66
|
-
-
|
67
|
-
-
|
68
|
-
version: 0.
|
61
|
+
- 9
|
62
|
+
- 2
|
63
|
+
version: 0.9.2
|
69
64
|
type: :development
|
70
65
|
version_requirements: *id003
|
71
66
|
- !ruby/object:Gem::Dependency
|
72
67
|
name: therubyracer
|
73
68
|
prerelease: false
|
74
69
|
requirement: &id004 !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
70
|
requirements:
|
77
71
|
- - "="
|
78
72
|
- !ruby/object:Gem::Version
|
79
|
-
hash: 11
|
80
73
|
segments:
|
81
74
|
- 0
|
82
75
|
- 7
|
@@ -86,8 +79,8 @@ dependencies:
|
|
86
79
|
version_requirements: *id004
|
87
80
|
description: Spread your tests over multiple machines to test your code faster.
|
88
81
|
email: nick@smartlogicsolutions.com
|
89
|
-
executables:
|
90
|
-
|
82
|
+
executables: []
|
83
|
+
|
91
84
|
extensions: []
|
92
85
|
|
93
86
|
extra_rdoc_files:
|
@@ -102,7 +95,6 @@ files:
|
|
102
95
|
- Rakefile
|
103
96
|
- TODO
|
104
97
|
- VERSION
|
105
|
-
- bin/warmsnake.rb
|
106
98
|
- caliper.yml
|
107
99
|
- hydra-icon-64x64.png
|
108
100
|
- hydra_gray.png
|
@@ -130,8 +122,10 @@ files:
|
|
130
122
|
- lib/hydra/stdio.rb
|
131
123
|
- lib/hydra/sync.rb
|
132
124
|
- lib/hydra/tasks.rb
|
125
|
+
- lib/hydra/tmpdir.rb
|
133
126
|
- lib/hydra/trace.rb
|
134
127
|
- lib/hydra/worker.rb
|
128
|
+
- sskirby-hydra.gemspec
|
135
129
|
- test/fixtures/assert_true.rb
|
136
130
|
- test/fixtures/config.yml
|
137
131
|
- test/fixtures/conflicting.rb
|
@@ -141,8 +135,10 @@ files:
|
|
141
135
|
- test/fixtures/hello_world.rb
|
142
136
|
- test/fixtures/js_file.js
|
143
137
|
- test/fixtures/json_data.json
|
138
|
+
- test/fixtures/many_outputs_to_console.rb
|
144
139
|
- test/fixtures/slow.rb
|
145
140
|
- test/fixtures/sync_test.rb
|
141
|
+
- test/fixtures/task_test_config.yml
|
146
142
|
- test/fixtures/write_file.rb
|
147
143
|
- test/fixtures/write_file_alternate_spec.rb
|
148
144
|
- test/fixtures/write_file_spec.rb
|
@@ -153,8 +149,8 @@ files:
|
|
153
149
|
- test/runner_test.rb
|
154
150
|
- test/ssh_test.rb
|
155
151
|
- test/sync_test.rb
|
152
|
+
- test/task_test.rb
|
156
153
|
- test/test_helper.rb
|
157
|
-
- test/trace_test.rb
|
158
154
|
- test/worker_test.rb
|
159
155
|
has_rdoc: true
|
160
156
|
homepage: http://github.com/ngauthier/hydra
|
@@ -166,47 +162,44 @@ rdoc_options:
|
|
166
162
|
require_paths:
|
167
163
|
- lib
|
168
164
|
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
165
|
requirements:
|
171
166
|
- - ">="
|
172
167
|
- !ruby/object:Gem::Version
|
173
|
-
hash: 3
|
174
168
|
segments:
|
175
169
|
- 0
|
176
170
|
version: "0"
|
177
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
|
-
none: false
|
179
172
|
requirements:
|
180
173
|
- - ">="
|
181
174
|
- !ruby/object:Gem::Version
|
182
|
-
hash: 3
|
183
175
|
segments:
|
184
176
|
- 0
|
185
177
|
version: "0"
|
186
178
|
requirements: []
|
187
179
|
|
188
180
|
rubyforge_project:
|
189
|
-
rubygems_version: 1.3.
|
181
|
+
rubygems_version: 1.3.6
|
190
182
|
signing_key:
|
191
183
|
specification_version: 3
|
192
184
|
summary: Distributed testing toolkit
|
193
185
|
test_files:
|
186
|
+
- test/sync_test.rb
|
187
|
+
- test/test_helper.rb
|
194
188
|
- test/message_test.rb
|
195
|
-
- test/
|
196
|
-
- test/
|
197
|
-
- test/fixtures/
|
198
|
-
- test/fixtures/slow.rb
|
199
|
-
- test/fixtures/write_file_alternate_spec.rb
|
189
|
+
- test/runner_test.rb
|
190
|
+
- test/fixtures/write_file.rb
|
191
|
+
- test/fixtures/sync_test.rb
|
200
192
|
- test/fixtures/hello_world.rb
|
193
|
+
- test/fixtures/write_file_alternate_spec.rb
|
201
194
|
- test/fixtures/write_file_with_pending_spec.rb
|
202
|
-
- test/fixtures/
|
203
|
-
- test/fixtures/
|
195
|
+
- test/fixtures/slow.rb
|
196
|
+
- test/fixtures/assert_true.rb
|
204
197
|
- test/fixtures/write_file_spec.rb
|
198
|
+
- test/fixtures/many_outputs_to_console.rb
|
205
199
|
- test/fixtures/features/step_definitions.rb
|
206
|
-
- test/fixtures/
|
207
|
-
- test/
|
208
|
-
- test/runner_test.rb
|
209
|
-
- test/trace_test.rb
|
210
|
-
- test/sync_test.rb
|
200
|
+
- test/fixtures/conflicting.rb
|
201
|
+
- test/ssh_test.rb
|
211
202
|
- test/pipe_test.rb
|
203
|
+
- test/task_test.rb
|
204
|
+
- test/master_test.rb
|
212
205
|
- test/worker_test.rb
|
data/bin/warmsnake.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# warmsnake.rb
|
4
|
-
#
|
5
|
-
# This is a first attempt at making a hydra binary.
|
6
|
-
#
|
7
|
-
# Currently, all it does is run the files you pass into it. When you
|
8
|
-
# press Enter it will run them again, maintaining your rails environment.
|
9
|
-
# When you type 'r' and hit Enter it will reboot the rails environment.
|
10
|
-
#
|
11
|
-
# It is extremely specific about its behavior and only works in rails.
|
12
|
-
#
|
13
|
-
# It is not really ready for any kind of release, but it is useful, so
|
14
|
-
# it's included.
|
15
|
-
#
|
16
|
-
require 'rubygems'
|
17
|
-
require 'hydra'
|
18
|
-
|
19
|
-
@files = ARGV.inject([]){|memo,f| memo += Dir.glob f}
|
20
|
-
|
21
|
-
if @files.empty?
|
22
|
-
puts "You must specify a list of files to run"
|
23
|
-
puts "If you specify a pattern, it must be in quotes"
|
24
|
-
puts %{USAGE: #{$0} test/unit/my_test.rb "test/functional/**/*_test.rb"}
|
25
|
-
exit(1)
|
26
|
-
end
|
27
|
-
|
28
|
-
Signal.trap("TERM", "KILL") do
|
29
|
-
puts "Warm Snake says bye bye"
|
30
|
-
exit(0)
|
31
|
-
end
|
32
|
-
|
33
|
-
bold_yellow = "\033[1;33m"
|
34
|
-
reset = "\033[0m"
|
35
|
-
|
36
|
-
|
37
|
-
loop do
|
38
|
-
env_proc = Process.fork do
|
39
|
-
puts "#{bold_yellow}Booting Environment#{reset}"
|
40
|
-
start = Time.now
|
41
|
-
ENV['RAILS_ENV']='test'
|
42
|
-
require 'config/environment'
|
43
|
-
require 'test/test_helper'
|
44
|
-
finish = Time.now
|
45
|
-
puts "#{bold_yellow}Environment Booted (#{finish-start})#{reset}"
|
46
|
-
|
47
|
-
loop do
|
48
|
-
puts "#{bold_yellow}Running#{reset} [#{@files.inspect}]"
|
49
|
-
start = Time.now
|
50
|
-
Hydra::Master.new(
|
51
|
-
:files => @files.dup,
|
52
|
-
:listeners => Hydra::Listener::ProgressBar.new(STDOUT),
|
53
|
-
:workers => [{:type => :local, :runners => 4}]
|
54
|
-
)
|
55
|
-
finish = Time.now
|
56
|
-
puts "#{bold_yellow}Tests finished#{reset} (#{finish-start})"
|
57
|
-
|
58
|
-
puts ""
|
59
|
-
|
60
|
-
$stdout.write "Press #{bold_yellow}ENTER#{reset} to retest. Type #{bold_yellow}r#{reset} then hit enter to reboot environment. #{bold_yellow}CTRL-C#{reset} to quit\n> "
|
61
|
-
begin
|
62
|
-
command = $stdin.gets
|
63
|
-
rescue Interrupt
|
64
|
-
exit(0)
|
65
|
-
end
|
66
|
-
break if !command.nil? and command.chomp == "r"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
begin
|
70
|
-
Process.wait env_proc
|
71
|
-
rescue Interrupt
|
72
|
-
puts "\n#{bold_yellow}SSsssSsssSSssSs#{reset}"
|
73
|
-
break
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
data/test/trace_test.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
-
|
3
|
-
class TraceTester
|
4
|
-
traceable("TEST")
|
5
|
-
attr_accessor :verbose, :remote
|
6
|
-
def initialize verbose, remote
|
7
|
-
self.verbose, self.remote = verbose, remote
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class TraceTest < Test::Unit::TestCase
|
12
|
-
def setup
|
13
|
-
@result = StringIO.new("")
|
14
|
-
end
|
15
|
-
|
16
|
-
def run_trace object, str
|
17
|
-
old_stdout = $stdout
|
18
|
-
$stdout = @result
|
19
|
-
object.trace str
|
20
|
-
return @result.string
|
21
|
-
ensure
|
22
|
-
$stdout = old_stdout
|
23
|
-
end
|
24
|
-
|
25
|
-
context "with no tracing enabled" do
|
26
|
-
setup do
|
27
|
-
@tracer = TraceTester.new false, false
|
28
|
-
end
|
29
|
-
|
30
|
-
should "not output" do
|
31
|
-
result = run_trace @tracer, "testing"
|
32
|
-
assert_equal '', result
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "with a local object" do
|
37
|
-
setup do
|
38
|
-
@tracer = TraceTester.new true, false
|
39
|
-
end
|
40
|
-
|
41
|
-
should "output" do
|
42
|
-
result = run_trace @tracer, 'testing'
|
43
|
-
assert_match /TEST/, result
|
44
|
-
assert_match /testing/, result
|
45
|
-
assert_no_match /#{Hydra::Trace::REMOTE_IDENTIFIER}/, result
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "with a remote object" do
|
50
|
-
setup do
|
51
|
-
@tracer = TraceTester.new true, 'localhost'
|
52
|
-
end
|
53
|
-
|
54
|
-
should "output" do
|
55
|
-
result = run_trace @tracer, 'testing'
|
56
|
-
assert_match /TEST/, result
|
57
|
-
assert_match /testing/, result
|
58
|
-
assert_equal "\n"[0], result[-1]
|
59
|
-
assert_match /#{Hydra::Trace::REMOTE_IDENTIFIER} localhost/, result
|
60
|
-
end
|
61
|
-
|
62
|
-
should "output a multiline message" do
|
63
|
-
result = run_trace @tracer, "testing\ntrace line #1\ntrace line #2"
|
64
|
-
assert_match /TEST/, result
|
65
|
-
assert_match /testing/, result
|
66
|
-
assert_match /#{Hydra::Trace::REMOTE_IDENTIFIER} localhost TEST/, result
|
67
|
-
assert_match /\n#{Hydra::Trace::REMOTE_IDENTIFIER} localhost trace line #1/, result
|
68
|
-
assert_match /\n#{Hydra::Trace::REMOTE_IDENTIFIER} localhost trace line #2/, result
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|