Extract run_test_file from submission.rb
This commit is contained in:
@ -141,33 +141,7 @@ class Submission < ApplicationRecord
|
|||||||
# If prepared_runner raises an error, no Testrun will be created.
|
# If prepared_runner raises an error, no Testrun will be created.
|
||||||
prepared_runner do |runner, waiting_duration|
|
prepared_runner do |runner, waiting_duration|
|
||||||
file_scores = collect_files.select(&:teacher_defined_assessment?).map do |file|
|
file_scores = collect_files.select(&:teacher_defined_assessment?).map do |file|
|
||||||
score_command = command_for execution_environment.test_command, file.name_with_extension
|
output = run_test_file file, runner, waiting_duration
|
||||||
output = {file_role: file.role, waiting_for_container_time: waiting_duration}
|
|
||||||
stdout = +''
|
|
||||||
stderr = +''
|
|
||||||
begin
|
|
||||||
exit_code = 1 # default to error
|
|
||||||
execution_time = runner.attach_to_execution(score_command) do |socket|
|
|
||||||
socket.on :stderr do |data|
|
|
||||||
stderr << data
|
|
||||||
end
|
|
||||||
socket.on :stdout do |data|
|
|
||||||
stdout << data
|
|
||||||
end
|
|
||||||
socket.on :exit do |received_exit_code|
|
|
||||||
exit_code = received_exit_code
|
|
||||||
end
|
|
||||||
end
|
|
||||||
output.merge!(container_execution_time: execution_time, status: exit_code.zero? ? :ok : :failed)
|
|
||||||
rescue Runner::Error::ExecutionTimeout => e
|
|
||||||
Rails.logger.debug { "Running tests in #{file.name_with_extension} for submission #{id} timed out: #{e.message}" }
|
|
||||||
output.merge!(status: :timeout, container_execution_time: e.execution_duration)
|
|
||||||
rescue Runner::Error => e
|
|
||||||
Rails.logger.debug { "Running tests in #{file.name_with_extension} for submission #{id} failed: #{e.message}" }
|
|
||||||
output.merge!(status: :failed, container_execution_time: e.execution_duration)
|
|
||||||
ensure
|
|
||||||
output.merge!(stdout: stdout, stderr: stderr)
|
|
||||||
end
|
|
||||||
score_file(output, file)
|
score_file(output, file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -187,6 +161,36 @@ class Submission < ApplicationRecord
|
|||||||
durations
|
durations
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run_test_file(file, runner, waiting_duration)
|
||||||
|
score_command = command_for execution_environment.test_command, file.name_with_extension
|
||||||
|
output = {file_role: file.role, waiting_for_container_time: waiting_duration}
|
||||||
|
stdout = +''
|
||||||
|
stderr = +''
|
||||||
|
begin
|
||||||
|
exit_code = 1 # default to error
|
||||||
|
execution_time = runner.attach_to_execution(score_command) do |socket|
|
||||||
|
socket.on :stderr do |data|
|
||||||
|
stderr << data
|
||||||
|
end
|
||||||
|
socket.on :stdout do |data|
|
||||||
|
stdout << data
|
||||||
|
end
|
||||||
|
socket.on :exit do |received_exit_code|
|
||||||
|
exit_code = received_exit_code
|
||||||
|
end
|
||||||
|
end
|
||||||
|
output.merge!(container_execution_time: execution_time, status: exit_code.zero? ? :ok : :failed)
|
||||||
|
rescue Runner::Error::ExecutionTimeout => e
|
||||||
|
Rails.logger.debug { "Running tests in #{file.name_with_extension} for submission #{id} timed out: #{e.message}" }
|
||||||
|
output.merge!(status: :timeout, container_execution_time: e.execution_duration)
|
||||||
|
rescue Runner::Error => e
|
||||||
|
Rails.logger.debug { "Running tests in #{file.name_with_extension} for submission #{id} failed: #{e.message}" }
|
||||||
|
output.merge!(status: :failed, container_execution_time: e.execution_duration)
|
||||||
|
ensure
|
||||||
|
output.merge!(stdout: stdout, stderr: stderr)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def prepared_runner
|
def prepared_runner
|
||||||
|
Reference in New Issue
Block a user