parallelized_specs 0.3.98 → 0.3.99
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/parallelized_specs.rb +43 -38
- data/parallelized_specs.gemspec +2 -2
- metadata +4 -4
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ begin
|
|
12
12
|
gem.email = "jake@instructure.com"
|
13
13
|
gem.homepage = "http://github.com/jakesorce/#{gem.name}"
|
14
14
|
gem.authors = "Jake Sorce, Bryan Madsen, Shawn Meredith"
|
15
|
-
gem.version = "0.3.
|
15
|
+
gem.version = "0.3.99"
|
16
16
|
end
|
17
17
|
Jeweler::GemcutterTasks.new
|
18
18
|
rescue LoadError
|
data/lib/parallelized_specs.rb
CHANGED
@@ -98,10 +98,10 @@ class ParallelizedSpecs
|
|
98
98
|
num_processes = groups.size
|
99
99
|
|
100
100
|
#adjust processes to groups
|
101
|
-
abort "no #{name}s found!" if groups.size == 0
|
101
|
+
abort "SEVERE: no #{name}s found!" if groups.size == 0
|
102
102
|
|
103
103
|
num_tests = groups.inject(0) { |sum, item| sum + item.size }
|
104
|
-
puts "#{num_processes} processes for #{num_tests} #{name}s, ~ #{num_tests / groups.size} #{name}s per process"
|
104
|
+
puts "INFO: #{num_processes} processes for #{num_tests} #{name}s, ~ #{num_tests / groups.size} #{name}s per process"
|
105
105
|
|
106
106
|
test_results = Parallel.map(groups, :in_processes => num_processes) do |group|
|
107
107
|
run_tests(group, groups.index(group), options)
|
@@ -109,8 +109,8 @@ class ParallelizedSpecs
|
|
109
109
|
|
110
110
|
#parse and print results
|
111
111
|
results = find_results(test_results.map { |result| result[:stdout] }*"")
|
112
|
-
puts ""
|
113
|
-
puts summarize_results(results)
|
112
|
+
#puts ""
|
113
|
+
#puts summarize_results(results)
|
114
114
|
|
115
115
|
|
116
116
|
#report total time taken
|
@@ -118,9 +118,9 @@ class ParallelizedSpecs
|
|
118
118
|
puts "Took #{Time.now - start} seconds"
|
119
119
|
|
120
120
|
if Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/spec_count/{*,.*}").count == 2 && Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/thread_started/{*,.*}").count == num_processes + 2
|
121
|
-
(puts "All threads completed")
|
121
|
+
(puts "INFO: All threads completed")
|
122
122
|
elsif Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/thread_started/{*,.*}").count != num_processes + 2
|
123
|
-
abort "one or more threads didn't get started by rspec"
|
123
|
+
abort "SEVERE: one or more threads didn't get started by rspec"
|
124
124
|
else
|
125
125
|
threads = Dir["#{RAILS_ROOT}/tmp/parallel_log/spec_count/*"]
|
126
126
|
threads.each do |t|
|
@@ -133,21 +133,21 @@ class ParallelizedSpecs
|
|
133
133
|
puts IO.readlines("#{RAILS_ROOT}/tmp/parallel_log/thread_#{failed_thread}.log")[-1]
|
134
134
|
end
|
135
135
|
end
|
136
|
-
abort "One or more threads have failed, see above logging information for details" #works on both 1.8.7\1.9.3
|
136
|
+
abort "SEVERE: One or more threads have failed to complete, see above logging information for details" #works on both 1.8.7\1.9.3
|
137
137
|
end
|
138
138
|
#exit with correct status code so rake parallel:test && echo 123 works
|
139
139
|
|
140
140
|
failed = test_results.any? { |result| result[:exit_status] != 0 } #ruby 1.8.7 works breaks on 1.9.3
|
141
|
-
puts "this is the exit status of the rspec suites #{failed}"
|
141
|
+
puts "INFO: this is the exit status of the rspec suites #{failed}"
|
142
142
|
|
143
143
|
if Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/failed_specs/{*,.*}").count > 2 && !File.zero?("#{RAILS_ROOT}/tmp/parallel_log/rspec.failures") # works on both 1.8.7\1.9.3
|
144
|
-
puts "some specs failed, about to start the rerun process\n no more than 9 specs may be rerun and shared specs are not allowed\n...\n..\n."
|
144
|
+
puts "INFO: some specs failed, about to start the rerun process\n no more than 9 specs may be rerun and shared specs are not allowed\n...\n..\n."
|
145
145
|
ParallelizedSpecs.rerun()
|
146
146
|
else
|
147
147
|
#works on both 1.8.7\1.9.3
|
148
|
-
abort "#{name.capitalize}s Failed" if Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/failed_specs/{*,.*}").count > 2 || failed
|
148
|
+
abort "SEVERE: #{name.capitalize}s Failed" if Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/failed_specs/{*,.*}").count > 2 || failed
|
149
149
|
end
|
150
|
-
puts "marking build as PASSED"
|
150
|
+
puts "INFO: marking build as PASSED"
|
151
151
|
end
|
152
152
|
|
153
153
|
# parallel:spec[:count, :pattern, :options]
|
@@ -293,35 +293,37 @@ class ParallelizedSpecs
|
|
293
293
|
end
|
294
294
|
end
|
295
295
|
|
296
|
-
def self.update_rerun_summary(
|
297
|
-
File.open(file, 'a+') { |f| f.puts(
|
296
|
+
def self.update_rerun_summary(l, file, outcome)
|
297
|
+
File.open(file, 'a+') { |f| f.puts("Outcome #{outcome} for #{l}") }
|
298
298
|
end
|
299
299
|
|
300
300
|
def self.parse_result(result)
|
301
|
-
puts "this is the result\n#{result}"
|
301
|
+
puts "INFO: this is the result\n#{result}"
|
302
302
|
#can't just use exit code, if specs fail to start it will pass or if a spec isn't found, and sometimes rspec 1 exit codes aren't right
|
303
303
|
rerun_status = result.scan(/\d*[^\D]\d*/).to_a
|
304
|
-
puts "this is the rerun_status\n#{rerun_status}"
|
304
|
+
puts "INFO: this is the rerun_status\n#{rerun_status}"
|
305
305
|
example_index = rerun_status.length - 2
|
306
306
|
@examples = rerun_status[example_index].to_i
|
307
307
|
@failures = rerun_status.last.to_i
|
308
308
|
end
|
309
309
|
|
310
310
|
def self.rerun_spec(spec)
|
311
|
-
puts "#{spec} will be ran and marked as a success if it passes"
|
311
|
+
puts "INFO: #{spec} will be ran and marked as a success if it passes"
|
312
312
|
result = %x[DISPLAY=:99 bundle exec rake spec #{spec}]
|
313
313
|
parse_result(result)
|
314
314
|
result
|
315
315
|
end
|
316
316
|
|
317
|
-
def self.print_failures(failure_summary)
|
317
|
+
def self.print_failures(failure_summary, state = "")
|
318
|
+
puts "*****************INFO: #{state} SUMMARY*****************\n"
|
319
|
+
state == "RERUN" ? puts "INFO: outcomes of the specs that were rerun" : puts "INFO: summary of build failures"
|
318
320
|
file = File.open(failure_summary, "r")
|
319
321
|
content = file.read
|
320
322
|
puts content
|
321
323
|
end
|
322
324
|
|
323
325
|
def self.rerun()
|
324
|
-
puts "beginning the failed specs rerun process"
|
326
|
+
puts "INFO: beginning the failed specs rerun process"
|
325
327
|
rerun_failed_examples = false
|
326
328
|
rerun_specs = []
|
327
329
|
filename = "#{RAILS_ROOT}/tmp/parallel_log/rspec.failures"
|
@@ -335,60 +337,63 @@ class ParallelizedSpecs
|
|
335
337
|
File.open(filename).each_line do |line|
|
336
338
|
if line =~ /spec\/selenium\/helpers/ || line =~ /spec\/selenium\/shared_examples/
|
337
339
|
print_failures("#{RAILS_ROOT}/tmp/parallel_log/error.log")
|
338
|
-
abort "shared specs currently are not eligiable for reruns, marking build as a failure"
|
340
|
+
abort "SEVERE: shared specs currently are not eligiable for reruns, marking build as a failure"
|
339
341
|
else
|
340
342
|
rerun_specs.push line
|
341
343
|
end
|
342
344
|
end
|
343
345
|
|
344
346
|
rerun_failed_examples = true
|
345
|
-
puts "
|
347
|
+
puts "INFO: failures meet rerun criteria \n INFO: rerunning #{@error_count} examples"
|
346
348
|
@rerun_failures ||= []
|
347
349
|
@rerun_passes ||= []
|
348
350
|
|
349
351
|
rerun_specs.each do |l|
|
350
|
-
|
352
|
+
result = rerun_spec(l)
|
351
353
|
|
352
354
|
if @examples == 0 and @failures == 0
|
353
|
-
update_rerun_summary(
|
354
|
-
print_failures(failure_summary)
|
355
|
-
abort "spec didn't actually run, ending rerun process early"
|
355
|
+
update_rerun_summary(l, failure_summary, "FAILED")
|
356
|
+
print_failures(failure_summary, "RERUN")
|
357
|
+
abort "SEVERE: spec didn't actually run, ending rerun process early"
|
356
358
|
end
|
357
359
|
|
358
360
|
if @examples == 0 #when specs fail to run it exits with 0 examples, 0 failures and won't be matched by the previous regex
|
359
|
-
update_rerun_summary(
|
360
|
-
print_failures(failure_summary)
|
361
|
-
abort "the spec failed to run on the rerun try, marking build as failed"
|
361
|
+
update_rerun_summary(l, failure_summary, "FAILED")
|
362
|
+
print_failures(failure_summary, "RERUN")
|
363
|
+
abort "SEVERE: the spec failed to run on the rerun try, marking build as failed"
|
362
364
|
elsif @failures > 0
|
363
|
-
puts "the example failed again"
|
364
|
-
update_rerun_summary(
|
365
|
+
puts "WARNING: the example failed again"
|
366
|
+
update_rerun_summary(l, failure_summary, "FAILED")
|
365
367
|
@rerun_failures << l
|
366
368
|
elsif @examples > 0 && @failures == 0
|
367
|
-
|
369
|
+
update_rerun_summary(l, failure_summary, "PASSED")
|
370
|
+
puts "INFO: the example passed and is being marked as a success"
|
368
371
|
@rerun_passes << l
|
369
372
|
else
|
370
|
-
abort "unexpected outcome on the rerun, marking build as a failure"
|
373
|
+
abort "SEVERE: unexpected outcome on the rerun, marking build as a failure"
|
371
374
|
end
|
372
375
|
end #end file loop
|
373
376
|
|
374
377
|
when @error_count == 0
|
375
|
-
abort "#{@error_count} errors, but the build failed, errors were not written to the file or there is something else wrong, marking build as a failure"
|
378
|
+
abort "SEVERE: #{@error_count} errors, but the build failed, errors were not written to the file or there is something else wrong, marking build as a failure"
|
376
379
|
when @error_count > 9
|
377
380
|
print_failures("#{RAILS_ROOT}/tmp/parallel_log/error.log")
|
378
|
-
abort "#{@error_count} errors are to many to rerun, marking the build as a failure"
|
381
|
+
abort "SEVERE: #{@error_count} errors are to many to rerun, marking the build as a failure"
|
379
382
|
else
|
380
383
|
puts "#Total errors #{@error_count}"
|
381
|
-
abort "unexpected error information, please check errors are being written to file correctly"
|
384
|
+
abort "SEVERE: unexpected error information, please check errors are being written to file correctly"
|
382
385
|
end
|
383
386
|
|
384
387
|
if rerun_failed_examples
|
385
388
|
if @rerun_failures.count > 0
|
386
|
-
print_failures(failure_summary)
|
387
|
-
abort "some specs failed on rerun, the build will be marked as failed"
|
389
|
+
print_failures(failure_summary, "RERUN")
|
390
|
+
abort "SEVERE: some specs failed on rerun, the build will be marked as failed"
|
388
391
|
elsif @rerun_passes.count >= @error_count
|
389
|
-
|
392
|
+
print_failures("#{RAILS_ROOT}/tmp/parallel_log/error.log")
|
393
|
+
print_failures(failure_summary, "RERUN")
|
394
|
+
puts "INFO: rerun summary all rerun examples passed, rspec will mark this build as passed"
|
390
395
|
else
|
391
|
-
abort "unexpected situation on rerun, marking build as failure"
|
396
|
+
abort "SEVERE: unexpected situation on rerun, marking build as failure"
|
392
397
|
end
|
393
398
|
end
|
394
399
|
end
|
data/parallelized_specs.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "parallelized_specs"
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.99"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jake Sorce, Bryan Madsen, Shawn Meredith"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-02-03"
|
13
13
|
s.email = "jake@instructure.com"
|
14
14
|
s.files = [
|
15
15
|
"Gemfile",
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallelized_specs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 213
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 99
|
10
|
+
version: 0.3.99
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jake Sorce, Bryan Madsen, Shawn Meredith
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-
|
18
|
+
date: 2013-02-03 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: parallel
|