2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-11-02 06:57:50 +08:00
|
|
|
require "autospec/rspec_runner"
|
|
|
|
|
2013-10-24 07:06:05 +08:00
|
|
|
module Autospec
|
2013-11-02 06:57:50 +08:00
|
|
|
|
|
|
|
class SimpleRunner < RspecRunner
|
2018-06-18 11:20:23 +08:00
|
|
|
def initialize
|
|
|
|
@mutex = Mutex.new
|
|
|
|
end
|
2013-11-02 06:57:50 +08:00
|
|
|
|
|
|
|
def run(specs)
|
2019-05-03 06:17:27 +08:00
|
|
|
puts "Running Rspec: #{specs}"
|
2013-11-02 06:57:50 +08:00
|
|
|
# kill previous rspec instance
|
2018-06-18 11:20:23 +08:00
|
|
|
@mutex.synchronize do
|
|
|
|
self.abort
|
|
|
|
end
|
2013-11-02 06:57:50 +08:00
|
|
|
# we use our custom rspec formatter
|
2019-04-02 22:33:26 +08:00
|
|
|
args = ["-r", "#{File.dirname(__FILE__)}/formatter.rb"]
|
2019-04-01 20:03:51 +08:00
|
|
|
|
|
|
|
command = begin
|
|
|
|
if ENV["PARALLEL_SPEC"] &&
|
|
|
|
!specs.split.any? { |s| puts s; s =~ /\:/ } # Parallel spec can't run specific groups
|
2019-04-02 22:33:26 +08:00
|
|
|
|
|
|
|
args += ["-f", "progress", "-f", "Autospec::ParallelFormatter", "-o", "./tmp/rspec_result"]
|
|
|
|
args += ["-f", "ParallelTests::RSpec::RuntimeLogger", "-o", "./tmp/parallel_runtime_rspec.log"] if specs == "spec"
|
|
|
|
|
2019-04-01 20:03:51 +08:00
|
|
|
"parallel_rspec -- #{args.join(" ")} -- #{specs.split.join(" ")}"
|
|
|
|
else
|
2019-04-02 22:33:26 +08:00
|
|
|
args += ["-f", "Autospec::Formatter"]
|
2019-04-01 20:03:51 +08:00
|
|
|
"bin/rspec #{args.join(" ")} #{specs.split.join(" ")}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-11-02 06:57:50 +08:00
|
|
|
# launch rspec
|
2017-04-14 05:24:58 +08:00
|
|
|
Dir.chdir(Rails.root) do
|
2017-07-28 09:20:09 +08:00
|
|
|
env = { "RAILS_ENV" => "test" }
|
|
|
|
if specs.split(' ').any? { |s| s =~ /^(.\/)?plugins/ }
|
2017-06-09 06:02:30 +08:00
|
|
|
env["LOAD_PLUGINS"] = "1"
|
|
|
|
puts "Loading plugins while running specs"
|
|
|
|
end
|
2018-06-18 11:20:23 +08:00
|
|
|
pid =
|
|
|
|
@mutex.synchronize do
|
2019-04-01 20:03:51 +08:00
|
|
|
@pid = Process.spawn(env, command)
|
2018-06-18 11:20:23 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
_, status = Process.wait2(pid)
|
|
|
|
|
2017-04-14 05:24:58 +08:00
|
|
|
status.exitstatus
|
|
|
|
end
|
2013-11-02 06:57:50 +08:00
|
|
|
end
|
2013-10-24 07:06:05 +08:00
|
|
|
|
|
|
|
def abort
|
2018-06-18 11:20:23 +08:00
|
|
|
if pid = @pid
|
|
|
|
Process.kill("TERM", pid) rescue nil
|
|
|
|
wait_for_done(pid)
|
|
|
|
pid = nil
|
2013-10-24 07:06:05 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def stop
|
2018-06-18 11:20:23 +08:00
|
|
|
# assume sigint on child will take care of this?
|
|
|
|
if pid = @pid
|
|
|
|
wait_for_done(pid)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def wait_for_done(pid)
|
|
|
|
i = 3000
|
|
|
|
while (i > 0 && Process.getpgid(pid) rescue nil)
|
|
|
|
sleep 0.001
|
|
|
|
i -= 1
|
|
|
|
end
|
|
|
|
if (Process.getpgid(pid) rescue nil)
|
|
|
|
STDERR.puts "Terminating rspec #{pid} by force cause it refused graceful termination"
|
|
|
|
Process.kill("KILL", pid)
|
|
|
|
end
|
2013-10-24 07:06:05 +08:00
|
|
|
end
|
2013-11-02 06:57:50 +08:00
|
|
|
|
2013-10-24 07:06:05 +08:00
|
|
|
end
|
2013-11-02 06:57:50 +08:00
|
|
|
|
2013-10-24 07:06:05 +08:00
|
|
|
end
|