diff --git a/judge/scripts/test/engine_test.rb b/judge/scripts/test/engine_test.rb new file mode 100644 --- /dev/null +++ b/judge/scripts/test/engine_test.rb @@ -0,0 +1,152 @@ +require 'test/unit' +require 'rubygems' +require 'mocha' + +require File.join(File.dirname(__FILE__),'test_helper') + +class GraderEngineTest < UnitTest.TestCase + + def setup + @@lang_c = stub(:name => 'c', :ext => 'c') + @@lang_cpp = stub(:name => 'cpp', :ext => 'cpp') + @@lang_pas = stub(:name => 'pas', :ext => 'pas') + + @config = Grader::Configuration.get_instance + + @problem_test1 = stub(:id => 1, :name => 'test1', :full_score => 135) + @user_user1 = stub(:id => 1, :login => 'user1') + + @engine = Grader::Engine.new + + init_sandbox + end + + def teardown + end + + def test_grade_oldest_task_with_no_submission + Task.expects(:get_inqueue_and_change_status).returns(nil) + assert_equal nil, @engine.grade_oldest_task, 'should return nil when there is no task' + end + + def test_normal_submission + submission = create_test1_submission_mock_from_file("test1_correct.c") + + submission.expects(:graded_at=) + submission.expects(:points=).with(135) + submission.expects(:grader_comment=).with do |value| + /^PASSED/.match(value) + end + submission.expects(:compiler_message=).with('') + submission.expects(:save) + + @engine.grade(submission) + end + + def test_compile_error_submission + submission = create_test1_submission_mock_from_file("test1_compile_error.c") + + submission.expects(:graded_at=) + submission.expects(:points=).with(0) + submission.expects(:grader_comment=).with('FAILED: compile error') + submission.expects(:compiler_message=) do |value| + /[Ee]rror/.match value + end + submission.expects(:save) + + @engine.grade(submission) + end + + def test_timeout_submission + @problem_test2 = stub(:id => 1, :name => 'test2', :full_score => 10) + @user_user1 = stub(:id => 1, :login => 'user1') + + submission = create_submission_from_file(1, @user_user1, @problem_test2, + "test2_timeout.c") + + submission.expects(:graded_at=) + submission.expects(:points=).with(0) + submission.expects(:grader_comment=).with do |value| + /^FAILED: TT$/.match value + end + submission.expects(:compiler_message=).with('') + submission.expects(:save) + + @engine.grade(submission) + end + + def test_timeout_submission_running_one_and_a_half_second + @problem_test2 = stub(:id => 1, :name => 'test2', :full_score => 20) + @user_user1 = stub(:id => 1, :login => 'user1') + + submission = create_submission_from_file(1, @user_user1, @problem_test2, + "test2_1-5sec.c") + + submission.expects(:graded_at=) + submission.expects(:points=).with(10) + submission.expects(:grader_comment=).with do |value| + /^FAILED: TP$/.match value + end + submission.expects(:compiler_message=).with('') + submission.expects(:save) + + @engine.grade(submission) + end + + def test_grade_oldest_task + # mock submission + submission = create_test1_submission_mock_from_file("test1_correct.c") + + submission.expects(:graded_at=) + submission.expects(:points=).with(135) + submission.expects(:grader_comment=).with do |value| + /^PASSED/.match(value) + end + submission.expects(:compiler_message=).with('') + submission.expects(:save) + + # mock task + task = stub(:id => 1, :submission_id => submission.id) + Task.expects(:get_inqueue_and_change_status).returns(task) + task.expects(:status_complete!) + + # mock Submission + Submission.expects(:find).with(task.submission_id).returns(submission) + + @engine.grade_oldest_task + end + + def test_grade_oldest_task_with_grader_process + grader_process = stub + grader_process.expects(:report_active) + + @engine = Grader::Engine.new(grader_process) + + test_grade_oldest_task + end + + protected + + def clear_sandbox + clear_cmd = "rm -rf #{@config.test_sandbox_dir}/*" + system(clear_cmd) + end + + def init_sandbox + clear_sandbox + Dir.mkdir @config.user_result_dir + cp_cmd = "cp -R #{@config.test_data_dir}/ev #{@config.test_sandbox_dir}" + system(cp_cmd) + end + + def create_submission_from_file(id, user, problem, source_fname, language = @@lang_c) + source = File.open(@config.test_data_dir + "/" + source_fname).read + stub(:id => id, :user => user, :problem => problem, + :source => source, :language => language) + end + + def create_test1_submission_mock_from_file(source_fname) + create_submission_from_file(1, @user_user1, @problem_test1, source_fname) + end + +end