diff --git a/app/models/submission.rb b/app/models/submission.rb index 29b803d1..267811b0 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -141,33 +141,7 @@ class Submission < ApplicationRecord # If prepared_runner raises an error, no Testrun will be created. prepared_runner do |runner, waiting_duration| file_scores = collect_files.select(&:teacher_defined_assessment?).map do |file| - 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 + output = run_test_file file, runner, waiting_duration score_file(output, file) end end @@ -187,6 +161,36 @@ class Submission < ApplicationRecord durations 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 def prepared_runner