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
|
# File 'lib/evilution/isolation/fork.rb', line 12
def call(mutation:, test_command:, timeout:)
sandbox_dir = Dir.mktmpdir("evilution-run")
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
read_io, write_io = IO.pipe
pid = ::Process.fork do
ENV["TMPDIR"] = sandbox_dir
read_io.close
suppress_child_output
result = execute_in_child(mutation, test_command)
Marshal.dump(result, write_io)
write_io.close
exit!(result[:passed] ? 0 : 1)
end
write_io.close
result = wait_for_result(pid, read_io, timeout)
duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
build_mutation_result(mutation, result, duration)
ensure
read_io&.close
write_io&.close
restore_original_source(mutation)
FileUtils.rm_rf(sandbox_dir) if sandbox_dir
end
|