parallelized_specs 0.4.42 → 0.4.43

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/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.4.42"
15
+ gem.version = "0.4.43"
16
16
  end
17
17
  Jeweler::GemcutterTasks.new
18
18
  rescue LoadError
@@ -9,8 +9,8 @@ module RSpec
9
9
  env_test_number = ENV['TEST_ENV_NUMBER']
10
10
  env_test_number = 1 if ENV['TEST_ENV_NUMBER'].blank?
11
11
  puts "Thread #{env_test_number.to_s} has #{@example_count} specs"
12
- File.open("#{RAILS_ROOT}/tmp/parallel_log/spec_count/total_specs#{env_test_number}.txt", 'a+') { |f| f.write(@example_count) }
13
- File.open("#{RAILS_ROOT}/tmp/parallel_log/thread_started/thread_#{env_test_number}.txt", 'a+') { |f| f.write("") }
12
+ File.open("#{Rails.root}/tmp/parallel_log/spec_count/total_specs#{env_test_number}.txt", 'a+') { |f| f.write(@example_count) }
13
+ File.open("#{Rails.root}/tmp/parallel_log/thread_started/thread_#{env_test_number}.txt", 'a+') { |f| f.write("") }
14
14
  super
15
15
  end
16
16
 
@@ -18,8 +18,8 @@ module RSpec
18
18
  def dump_summary(duration, example_count, failure_count, pending_count)
19
19
  env_test_number = ENV['TEST_ENV_NUMBER']
20
20
  env_test_number = 1 if ENV['TEST_ENV_NUMBER'].blank?
21
- spec_file = "#{RAILS_ROOT}/tmp/parallel_log/spec_count/total_specs#{env_test_number}.txt"
22
- failure_file = "#{RAILS_ROOT}/tmp/parallel_log/failed_specs/failed_specs#{env_test_number}.txt"
21
+ spec_file = "#{Rails.root}/tmp/parallel_log/spec_count/total_specs#{env_test_number}.txt"
22
+ failure_file = "#{Rails.root}/tmp/parallel_log/failed_specs/failed_specs#{env_test_number}.txt"
23
23
  expected_example_count = File.open(spec_file, &:readline).to_s
24
24
  puts "Expected example count = #{expected_example_count} from rspec example count = #{example_count}"
25
25
  File.delete(spec_file) if expected_example_count.to_i - example_count.to_i < 2
@@ -84,6 +84,7 @@ class ParallelizedSpecs
84
84
  end
85
85
 
86
86
  def self.run_specs(tests, options)
87
+ formatters = formatters_used
87
88
  num_processes = options[:count] || Parallel.processor_count
88
89
  name = 'spec'
89
90
 
@@ -107,55 +108,61 @@ class ParallelizedSpecs
107
108
  test_results = Parallel.map(groups, :in_processes => num_processes) do |group|
108
109
  run_tests(group, groups.index(group), options)
109
110
  end
110
-
111
- slowest_spec_determination("#{RAILS_ROOT}/tmp/parallel_log/slowest_specs.log")
111
+ slowest_spec_determination("#{Rails.root}/tmp/parallel_log/slowest_specs.log")
112
112
 
113
113
  #parse and print results
114
114
  results = find_results(test_results.map { |result| result[:stdout] }*"")
115
- #puts ""
116
115
  puts summarize_results(results)
116
+ puts "INFO: Took #{Time.now - start} seconds"
117
117
 
118
+ #determines if any tricky conditions happened that can cause false positives and offers logging into what was the last spec to start or finishing running
119
+ false_positive_sniffer(num_processes) if formatters.any? { |formatter| formatter.match(/OutcomeBuilder/) }
120
+ failed = test_results.any? { |result| result[:exit_status] != 0 } #ruby 1.8.7 works breaks on 1.9.3
121
+ formatters.any? { |formatter| formatter.match(/FailuresFormatter/) } ? rerun_initializer(name, failed) : abort "SEVERE: #{name.capitalize}s Failed" if failed
122
+ puts "INFO: marking build as PASSED"
123
+ end
118
124
 
119
- #report total time taken
120
- puts ""
121
- puts "INFO: Took #{Time.now - start} seconds"
125
+ def self.formatters_used
126
+ File.open("#{Rails.root}/spec/spec.opts").each_line do |line|
127
+ formatters << line
128
+ end
129
+ formatters
130
+ end
131
+
132
+ def self.rerun_initializer(name, failed)
133
+ 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
134
+ puts "INFO: some specs failed, about to start the rerun process\n INFO: no more than 9 specs may be rerun and shared specs are not allowed\n...\n..\n."
135
+ ParallelizedSpecs.rerun()
136
+ else
137
+ #works on both 1.8.7\1.9.3
138
+ abort "SEVERE: #{name.capitalize}s Failed" if Dir.glob("#{Rails.root}/tmp/parallel_log/failed_specs/{*,.*}").count > 2 || failed
139
+ end
140
+ end
122
141
 
123
- 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
142
+ def self.false_positive_sniffer(num_processes)
143
+ 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
124
144
  (puts "INFO: All threads completed")
125
- elsif Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/thread_started/{*,.*}").count != num_processes + 2
126
- File.open("#{RAILS_ROOT}/tmp/parallel_log/error.log", 'a+') { |f| f.write "\n\n\n syntax issues" }
127
- File.open("#{RAILS_ROOT}/tmp/failure_cause.log", 'a+') { |f| f.write "Syntax errors" }
145
+ elsif Dir.glob("#{Rails.root}/tmp/parallel_log/thread_started/{*,.*}").count != num_processes + 2
146
+ File.open("#{Rails.root}/tmp/parallel_log/error.log", 'a+') { |f| f.write "\n\n\n syntax issues" }
147
+ File.open("#{Rails.root}/tmp/failure_cause.log", 'a+') { |f| f.write "Syntax errors" }
128
148
  abort "SEVERE: one or more threads didn't get started by rspec, this may be caused by a syntax issue in specs, check logs right before specs start running"
129
149
  else
130
- threads = Dir["#{RAILS_ROOT}/tmp/parallel_log/spec_count/*"]
150
+ threads = Dir["#{Rails.root}/tmp/parallel_log/spec_count/*"]
131
151
  threads.each do |t|
132
152
  failed_thread = t.match(/\d/).to_s
133
153
  if failed_thread == "1"
134
154
  puts "INFO: Thread 1 last spec to start running"
135
- last_spec = IO.readlines("#{RAILS_ROOT}/tmp/parallel_log/thread_.log")[-1]
136
- File.open("#{RAILS_ROOT}/tmp/parallel_log/error.log", 'a+') { |f| f.write "\n\n\n\nrspec thread #{failed_thread} failed to complete\n the last spec to try to run was #{last_spec}" }
155
+ last_spec = IO.readlines("#{Rails.root}/tmp/parallel_log/thread_.log")[-1]
156
+ File.open("#{Rails.root}/tmp/parallel_log/error.log", 'a+') { |f| f.write "\n\n\n\nrspec thread #{failed_thread} failed to complete\n the last spec to try to run was #{last_spec}" }
137
157
  else
138
158
  puts "INFO: Thread #{failed_thread} last spec to start running"
139
- last_spec = IO.readlines("#{RAILS_ROOT}/tmp/parallel_log/thread_#{failed_thread}.log")[-1]
140
- File.open("#{RAILS_ROOT}/tmp/parallel_log/error.log", 'a+') { |f| f.write "\n\n\n\nrspec thread #{failed_thread} failed to complete\n the last spec to try to run was #{last_spec}" }
159
+ last_spec = IO.readlines("#{Rails.root}/tmp/parallel_log/thread_#{failed_thread}.log")[-1]
160
+ File.open("#{Rails.root}/tmp/parallel_log/error.log", 'a+') { |f| f.write "\n\n\n\nrspec thread #{failed_thread} failed to complete\n the last spec to try to run was #{last_spec}" }
141
161
  end
142
162
  end
143
- File.open("#{RAILS_ROOT}/tmp/failure_cause.log", 'a+') { |f| f.write "rspec thread failed to complete" }
163
+ File.open("#{Rails.root}/tmp/failure_cause.log", 'a+') { |f| f.write "rspec thread failed to complete" }
144
164
  abort "SEVERE: One or more threads have failed to complete, this may be caused by a rspec runtime crashing prematurely" #works on both 1.8.7\1.9.3
145
165
  end
146
- #exit with correct status code so rake parallel:test && echo 123 works
147
-
148
- failed = test_results.any? { |result| result[:exit_status] != 0 } #ruby 1.8.7 works breaks on 1.9.3
149
- puts "INFO: this is the exit status of the rspec suites #{failed}"
150
-
151
- 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
152
- puts "INFO: some specs failed, about to start the rerun process\n INFO: no more than 9 specs may be rerun and shared specs are not allowed\n...\n..\n."
153
- ParallelizedSpecs.rerun()
154
- else
155
- #works on both 1.8.7\1.9.3
156
- abort "SEVERE: #{name.capitalize}s Failed" if Dir.glob("#{RAILS_ROOT}/tmp/parallel_log/failed_specs/{*,.*}").count > 2 || failed
157
- end
158
- puts "INFO: marking build as PASSED"
159
166
  end
160
167
 
161
168
  # parallel:spec[:count, :pattern, :options]
@@ -303,7 +310,7 @@ class ParallelizedSpecs
303
310
 
304
311
  def self.update_rerun_summary(l, outcome, stack = "")
305
312
  File.open(@failure_summary, 'a+') { |f| f.puts("Outcome #{outcome} for #{l}\n #{stack}") }
306
- File.open("#{RAILS_ROOT}/tmp/parallel_log/error.log", 'a+') { |f| f.puts("Outcome #{outcome} for #{l}\n #{stack}") } if outcome == "FAILED"
313
+ File.open("#{Rails.root}/tmp/parallel_log/error.log", 'a+') { |f| f.puts("Outcome #{outcome} for #{l}\n #{stack}") } if outcome == "FAILED"
307
314
  end
308
315
 
309
316
  def self.parse_result(result)
@@ -336,7 +343,7 @@ class ParallelizedSpecs
336
343
  def self.abort_reruns(code, result = "", l = "")
337
344
  case
338
345
  when code == 1
339
- print_failures("#{RAILS_ROOT}/tmp/parallel_log/error.log")
346
+ print_failures("#{Rails.root}/tmp/parallel_log/error.log")
340
347
  abort "SEVERE: shared specs currently are not eligiable for reruns, marking build as a failure"
341
348
  when code == 2 # <--- won't ever happen, 2 and 3 are duplicate clean up on refactor
342
349
  update_rerun_summary(l, "FAILED", result)
@@ -353,14 +360,14 @@ class ParallelizedSpecs
353
360
  when code == 5
354
361
  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"
355
362
  when code == 6
356
- print_failures("#{RAILS_ROOT}/tmp/parallel_log/error.log")
363
+ print_failures("#{Rails.root}/tmp/parallel_log/error.log")
357
364
  abort "SEVERE: #{@error_count} errors are to many to rerun, marking the build as a failure. Max errors defined for this build is #{@max_reruns}"
358
365
  when code == 7
359
366
  puts "#Total errors #{@error_count}"
360
367
  abort "SEVERE: unexpected error information, please check errors are being written to file correctly"
361
368
  when code == 8
362
369
  print_failures(@failure_summary, "RERUN")
363
- File.open("#{RAILS_ROOT}/tmp/failure_cause.log", 'a+') { |f| f.write "#{@rerun_failures.count} failures" }
370
+ File.open("#{Rails.root}/tmp/failure_cause.log", 'a+') { |f| f.write "#{@rerun_failures.count} failures" }
364
371
  abort "SEVERE: some specs failed on rerun, the build will be marked as failed"
365
372
  when code == 9
366
373
  abort "SEVERE: unexpected situation on rerun, marking build as failure"
@@ -422,7 +429,7 @@ class ParallelizedSpecs
422
429
  end
423
430
  end
424
431
  puts "INFO: failures meet rerun criteria \n INFO: rerunning #{@error_count} examples"
425
- File.open("#{RAILS_ROOT}/tmp/parallel_log/error.log", 'a+') { |f| f.puts("\n\n\n\n\n *****RERUN FAILURES*****\n") }
432
+ File.open("#{Rails.root}/tmp/parallel_log/error.log", 'a+') { |f| f.puts("\n\n\n\n\n *****RERUN FAILURES*****\n") }
426
433
  end
427
434
 
428
435
  def self.start_reruns
@@ -470,8 +477,8 @@ class ParallelizedSpecs
470
477
 
471
478
  def self.runtime_setup
472
479
  @rerun_specs = []
473
- @filename = "#{RAILS_ROOT}/tmp/parallel_log/rspec.failures"
474
- @failure_summary = "#{RAILS_ROOT}/tmp/parallel_log/rerun_failure_summary.log"
480
+ @filename = "#{Rails.root}/tmp/parallel_log/rspec.failures"
481
+ @failure_summary = "#{Rails.root}/tmp/parallel_log/rerun_failure_summary.log"
475
482
  end
476
483
 
477
484
  def self.rerun()
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "parallelized_specs"
8
- s.version = "0.4.42"
8
+ s.version = "0.4.43"
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"]
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: 91
4
+ hash: 89
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 42
10
- version: 0.4.42
9
+ - 43
10
+ version: 0.4.43
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jake Sorce, Bryan Madsen, Shawn Meredith