Description:
[grader] report error when the check script crashed (i.e., when the result file is not found, while the compilation is okay) git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@117 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r30:8c0d78da1958 - - 4 files changed: 38 inserted, 19 deleted

@@ -46,39 +46,55
46 end
46 end
47
47
48 protected
48 protected
49 def read_result(test_result_dir)
49 def read_result(test_result_dir)
50 cmp_msg_fname = "#{test_result_dir}/compiler_message"
50 cmp_msg_fname = "#{test_result_dir}/compiler_message"
51 cmp_file = File.open(cmp_msg_fname)
51 cmp_file = File.open(cmp_msg_fname)
52 cmp_msg = cmp_file.read
52 cmp_msg = cmp_file.read
53 cmp_file.close
53 cmp_file.close
54
54
55 result_fname = "#{test_result_dir}/result"
55 result_fname = "#{test_result_dir}/result"
56 comment_fname = "#{test_result_dir}/comment"
56 comment_fname = "#{test_result_dir}/comment"
57 if FileTest.exist?(result_fname)
57 if FileTest.exist?(result_fname)
58 - result_file = File.open(result_fname)
58 + comment = ""
59 - result = result_file.readline.to_i
59 + begin
60 - result_file.close
60 + result_file = File.open(result_fname)
61 -
61 + result = result_file.readline.to_i
62 - comment_file = File.open(comment_fname)
62 + result_file.close
63 - comment = comment_file.readline.chomp
63 + rescue
64 - comment_file.close
64 + result = 0
65 -
65 + comment = "error reading result file."
66 + end
67 +
68 + begin
69 + comment_file = File.open(comment_fname)
70 + comment += comment_file.readline.chomp
71 + comment_file.close
72 + rescue
73 + comment += ""
74 + end
75 +
66 return {:points => result,
76 return {:points => result,
67 :comment => comment,
77 :comment => comment,
68 :cmp_msg => cmp_msg}
78 :cmp_msg => cmp_msg}
69 else
79 else
70 - return {:points => 0,
80 + if FileTest.exist?("#{test_result_dir}/a.out")
71 - :comment => 'compile error',
81 + return {:points => 0,
72 - :cmp_msg => cmp_msg}
82 + :comment => 'error during grading',
83 + :cmp_msg => cmp_msg}
84 + else
85 + return {:points => 0,
86 + :comment => 'compile error',
87 + :cmp_msg => cmp_msg}
88 + end
73 end
89 end
74 end
90 end
75
91
76 def save_result(submission,result)
92 def save_result(submission,result)
77 problem = submission.problem
93 problem = submission.problem
78 submission.graded_at = Time.now
94 submission.graded_at = Time.now
79 points = result[:points]
95 points = result[:points]
80 submission.points = points
96 submission.points = points
81 comment = @config.report_comment(result[:comment])
97 comment = @config.report_comment(result[:comment])
82 if problem == nil
98 if problem == nil
83 submission.grader_comment = 'PASSED: ' + comment + '(problem is nil)'
99 submission.grader_comment = 'PASSED: ' + comment + '(problem is nil)'
84 elsif points == problem.full_score
100 elsif points == problem.full_score
@@ -36,34 +36,35
36
36
37 all_score = 0
37 all_score = 0
38 all_comment = ''
38 all_comment = ''
39 (1..(problem.runs.length-1)).each do |k|
39 (1..(problem.runs.length-1)).each do |k|
40 log "grade run #{k}"
40 log "grade run #{k}"
41 run = problem.runs[k]
41 run = problem.runs[k]
42 run_score = 0
42 run_score = 0
43 run_comment = ''
43 run_comment = ''
44 run_comment_short = ''
44 run_comment_short = ''
45 run.tests.each do |test_num|
45 run.tests.each do |test_num|
46 result_file_name = "#{test_num}/result"
46 result_file_name = "#{test_num}/result"
47 if not File.exists?(result_file_name)
47 if not File.exists?(result_file_name)
48 + run_comment += "result file for test #{test_num} not found\n"
49 + run_comment_short += 'x'
48 log "Cannot find the file #{test_num}/result!"
50 log "Cannot find the file #{test_num}/result!"
49 - exit(127)
51 + else
52 + result_file = File.new(result_file_name, "r")
53 + result_file_lines = result_file.readlines
54 + run_score = run_score + result_file_lines[1].to_i
55 + run_comment += result_file_lines[0]
56 + run_comment_short += char_comment(result_file_lines[0])
57 + result_file.close
50 end
58 end
51 -
52 - result_file = File.new(result_file_name, "r")
53 - result_file_lines = result_file.readlines
54 - run_score = run_score + result_file_lines[1].to_i
55 - run_comment += result_file_lines[0]
56 - run_comment_short += char_comment(result_file_lines[0])
57 - result_file.close
58 end
59 end
59
60
60 run_result_file = File.new("result-#{k}", "w")
61 run_result_file = File.new("result-#{k}", "w")
61 run_result_file.write run_score
62 run_result_file.write run_score
62 run_result_file.write "\n"
63 run_result_file.write "\n"
63 run_result_file.close
64 run_result_file.close
64
65
65 run_comment_file = File.new("comment-#{k}", "w")
66 run_comment_file = File.new("comment-#{k}", "w")
66 run_comment_file.write "#{run_comment}\n"
67 run_comment_file.write "#{run_comment}\n"
67 run_comment_file.close
68 run_comment_file.close
68
69
69 all_score = all_score + run_score
70 all_score = all_score + run_score
@@ -7,24 +7,25
7 if ENV['GRADER_LOGGING']!=nil
7 if ENV['GRADER_LOGGING']!=nil
8 log_fname = ENV['GRADER_LOGGING']
8 log_fname = ENV['GRADER_LOGGING']
9 fp = File.open(log_fname,"a")
9 fp = File.open(log_fname,"a")
10 fp.puts("judge: #{Time.new.strftime("%H:%M")} #{str}")
10 fp.puts("judge: #{Time.new.strftime("%H:%M")} #{str}")
11 fp.close
11 fp.close
12 end
12 end
13 end
13 end
14
14
15 problem_home = ENV['PROBLEM_HOME']
15 problem_home = ENV['PROBLEM_HOME']
16
16
17 def execute(command, error_message="")
17 def execute(command, error_message="")
18 if not system(command)
18 if not system(command)
19 + log "ERROR: #{error_message}"
19 puts "ERROR: #{error_message}"
20 puts "ERROR: #{error_message}"
20 exit(127)
21 exit(127)
21 end
22 end
22 end
23 end
23
24
24 # ARGV[0] --- language
25 # ARGV[0] --- language
25 # ARGV[1] --- program source file
26 # ARGV[1] --- program source file
26 # ARGV[2] --- test result directory
27 # ARGV[2] --- test result directory
27 # ARGV[3] --- sandbox directory
28 # ARGV[3] --- sandbox directory
28
29
29 if ARGV.length < 2 || ARGV.length > 4
30 if ARGV.length < 2 || ARGV.length > 4
30 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
31 puts "Usage: judge <language> <program-source> [<test-result-directory>] [<sandbox-directory>]"
@@ -123,19 +123,20
123
123
124 if running_time[:user].to_f + running_time[:sys].to_f > time_limit
124 if running_time[:user].to_f + running_time[:sys].to_f > time_limit
125 log "Time limit exceeded."
125 log "Time limit exceeded."
126 report.call("Time limit exceeded", 0, "No comment.\n")
126 report.call("Time limit exceeded", 0, "No comment.\n")
127 end
127 end
128
128
129 # Run 'check' to evaluate the output.
129 # Run 'check' to evaluate the output.
130 #puts "There was no runtime error. Proceed to checking the output."
130 #puts "There was no runtime error. Proceed to checking the output."
131 check_command = "#{problem_home}/script/check #{language} #{test_num}"
131 check_command = "#{problem_home}/script/check #{language} #{test_num}"
132 log "Checking the output..."
132 log "Checking the output..."
133 log check_command
133 log check_command
134 if not system(check_command)
134 if not system(check_command)
135 + log "Problem with check script"
135 exit(127)
136 exit(127)
136 end
137 end
137
138
138 check_file = File.new("check_result", "r")
139 check_file = File.new("check_result", "r")
139 check_file_lines = check_file.readlines
140 check_file_lines = check_file.readlines
140
141
141 report.call(check_file_lines[0], check_file_lines[1], "No comment.\n")
142 report.call(check_file_lines[0], check_file_lines[1], "No comment.\n")
You need to be logged in to leave comments. Login now