1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#--
#
# Author:: Tsutomu Katsube.
# Copyright:: Copyright (c) 2025 Tsutomu Katsube. All rights reserved.
# License:: Ruby license.
require "optparse"
require "socket"
parser = OptionParser.new
parser.on("--load-path=PATH") do |path|
$LOAD_PATH << path
end
base_directory = nil
parser.on("--base-directory=PATH") do |path|
base_directory = path
end
worker_id = nil
parser.on("--worker-id=ID", Integer) do |id|
worker_id = id
end
remote_ip_address = nil
parser.on("--ip-address=ADDRESS") do |address|
remote_ip_address = address
end
remote_ip_port = nil
parser.on("--ip-port=PORT", Integer) do |port|
remote_ip_port = port
end
test_paths = parser.parse!
require_relative "../unit"
require_relative "collector/load"
require_relative "process-test-result"
require_relative "worker-context"
Test::Unit::AutoRunner.need_auto_run = false
collector = Test::Unit::Collector::Load.new
collector.base = base_directory
suite = collector.collect(*test_paths)
io_open = lambda do |&block|
if Gem.win_platform?
TCPSocket.open(remote_ip_address, remote_ip_port) do |data_socket|
block.call(data_socket, data_socket)
end
else
IO.open(Test::Unit::TestSuiteProcessRunner::MAIN_TO_WORKER_INPUT_FILENO) do |data_input|
IO.open(Test::Unit::TestSuiteProcessRunner::WORKER_TO_MAIN_OUTPUT_FILENO) do |data_output|
block.call(data_input, data_output)
end
end
end
end
io_open.call do |data_input, data_output|
loop do
Marshal.dump({status: :ready}, data_output)
data_output.flush
test_name = Marshal.load(data_input)
break if test_name.nil?
test = suite.find(test_name)
result = Test::Unit::ProcessTestResult.new(data_output)
run_context = Test::Unit::TestRunContext.new(Test::Unit::TestSuiteRunner)
event_listener = lambda do |event_name, *args|
Marshal.dump({status: :event, event_name: event_name, args: args}, data_output)
data_output.flush
end
if test.is_a?(Test::Unit::TestSuite)
test_suite = test
else
test_suite = Test::Unit::TestSuite.new(test.class.name, test.class)
test_suite << test
end
runner = Test::Unit::TestSuiteRunner.new(test_suite)
worker_context = Test::Unit::WorkerContext.new(worker_id, run_context, result)
runner.run(worker_context, &event_listener)
end
Marshal.dump({status: :done}, data_output)
data_output.flush
Marshal.load(data_input)
end
|