class TestDiff::CoverageRunner

runs each spec and saves it to storage

Public Class Methods

new(batch_queue, pre_load, continue) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 11
def initialize(batch_queue, pre_load, continue)
  @pre_load = pre_load
  @batch_queue = batch_queue
  @storage = Storage.new
  @continue = continue
  @execution_times = ExecutionTimes.new
  @execution_times.clear
end
run(batch_queue, pre_load, continue) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 7
def self.run(batch_queue, pre_load, continue)
  new(batch_queue, pre_load, continue).run
end

Public Instance Methods

run() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 20
def run
  require 'coverage.so'

  ENV['TEST_DIFF_COVERAGE'] = 'yes'

  require_boot
  require_rspec
  require_pre_load
  pre_run_checks
  run_batch
end

Private Instance Methods

pre_run_checks() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 58
def pre_run_checks
  raise 'please disable simplecov while using test_diff. Check README.md for examples' if defined?(SimpleCov)
end
require_boot() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 34
def require_boot
  if File.exist?('config/boot.rb')
    puts 'Loading config/boot.rb'
    require File.expand_path('config/boot.rb')
  elsif File.exist?('Gemfile')
    puts 'Bundler setup'
    ENV['BUNDLE_GEMFILE'] ||= File.expand_path('Gemfile')
    require 'bundler/setup'
  end
end
require_pre_load() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 45
def require_pre_load
  return unless @pre_load
  ::Coverage.start
  puts "pre_loading #{@pre_load}"
  $LOAD_PATH << "#{Dir.getwd}/spec"
  require File.expand_path(@pre_load)
end
require_rspec() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 53
def require_rspec
  puts 'Loading rspec/core'
  require 'rspec/core'
end
run_batch() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 62
def run_batch
  TimingTracker.run(@batch_queue) { start }
  puts 'Test done, compacting db'
  @storage.compact if @storage.respond_to?(:compact)
end
run_test(main_spec_file) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 86
def run_test(main_spec_file)
  s = Time.now
  result = run_tests(main_spec_file)
  if result
    save_execution_time(main_spec_file, Time.now - s)
    save_coverage_data(main_spec_file)
  else
    $stderr.puts(@last_output.string)
    Coverage.result # disable coverage
    exit!(false) unless @continue
  end
end
run_tests(main_spec_file) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 99
def run_tests(main_spec_file)
  @last_output = StringIO.new
  ::RSpec::Core::Runner.run([main_spec_file], @last_output, @last_output).zero?
end
save_coverage_data(main_spec_file) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 104
def save_coverage_data(main_spec_file)
  @storage.set(main_spec_file, CoverageData.get)
  @storage.flush if @storage.respond_to?(:flush)
end
save_execution_time(main_spec_file, execution_time) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 109
def save_execution_time(main_spec_file, execution_time)
  @execution_times.add(main_spec_file, execution_time)
end
start() click to toggle source
# File lib/test_diff/coverage_runner.rb, line 68
def start
  until @batch_queue.empty?
    pid = start_process_fork(@batch_queue.pop(true))
    _pid, status = Process.waitpid2(pid)
    raise 'Test Failed' unless status.success?
  end
end
start_process_fork(main_spec_file) click to toggle source
# File lib/test_diff/coverage_runner.rb, line 76
def start_process_fork(main_spec_file)
  Process.fork do
    puts "running #{main_spec_file}"
    ActiveRecord::Base.connection.reconnect! if defined?(ActiveRecord::Base)
    Time.zone_default = (Time.zone = 'UTC') if Time.respond_to?(:zone_default) && Time.zone_default.nil?
    ::Coverage.start
    run_test(main_spec_file)
  end
end