Description:
[grader] formatting output of test_request git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@140 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

r38:53204d348092 - - 1 file changed: 1 inserted, 1 deleted

@@ -1,190 +1,190
1 #
1 #
2 # This part contains various test_request helpers for interfacing
2 # This part contains various test_request helpers for interfacing
3 # with Grader::Engine. There are TestRequestRoomMaker and
3 # with Grader::Engine. There are TestRequestRoomMaker and
4 # TestRequestReporter.
4 # TestRequestReporter.
5
5
6 module Grader
6 module Grader
7
7
8 #
8 #
9 # A TestRequestRoomMaker is a helper object for Engine
9 # A TestRequestRoomMaker is a helper object for Engine
10 # - finds grading room: in user_result_dir/(user)/test_request/ ...
10 # - finds grading room: in user_result_dir/(user)/test_request/ ...
11 # - prepare problem configuration for grading --- basically it copy
11 # - prepare problem configuration for grading --- basically it copy
12 # all config files, and copy user's input into the testcase
12 # all config files, and copy user's input into the testcase
13 # directory. First, it finds the template from problem template
13 # directory. First, it finds the template from problem template
14 # directory; if it can't find a template, it'll use the template
14 # directory; if it can't find a template, it'll use the template
15 # from default template.
15 # from default template.
16 class TestRequestRoomMaker
16 class TestRequestRoomMaker
17 def initialize
17 def initialize
18 @config = Grader::Configuration.get_instance
18 @config = Grader::Configuration.get_instance
19 end
19 end
20
20
21 def produce_grading_room(test_request)
21 def produce_grading_room(test_request)
22 grading_room = grading_room_dir(test_request)
22 grading_room = grading_room_dir(test_request)
23 FileUtils.mkdir_p(grading_room)
23 FileUtils.mkdir_p(grading_room)
24 grading_room
24 grading_room
25 end
25 end
26
26
27 def find_problem_home(test_request)
27 def find_problem_home(test_request)
28 problem_name = test_request.problem_name
28 problem_name = test_request.problem_name
29
29
30 template_dir = "#{@config.test_request_problem_templates_dir}/" + problem_name
30 template_dir = "#{@config.test_request_problem_templates_dir}/" + problem_name
31
31
32 raise "Test Request: error template not found" if !File.exists?(template_dir)
32 raise "Test Request: error template not found" if !File.exists?(template_dir)
33
33
34 problem_home = problem_home_dir(test_request)
34 problem_home = problem_home_dir(test_request)
35 FileUtils.mkdir_p(problem_home)
35 FileUtils.mkdir_p(problem_home)
36
36
37 copy_problem_template(template_dir,problem_home)
37 copy_problem_template(template_dir,problem_home)
38 link_input_file(test_request,problem_home)
38 link_input_file(test_request,problem_home)
39
39
40 problem_home
40 problem_home
41 end
41 end
42
42
43 def save_source(test_request,source_name)
43 def save_source(test_request,source_name)
44 dir = self.produce_grading_room(test_request)
44 dir = self.produce_grading_room(test_request)
45 submission = test_request.submission
45 submission = test_request.submission
46 f = File.open("#{dir}/#{source_name}","w")
46 f = File.open("#{dir}/#{source_name}","w")
47 f.write(submission.source)
47 f.write(submission.source)
48 f.close
48 f.close
49 end
49 end
50
50
51 def clean_up(test_request)
51 def clean_up(test_request)
52 problem_home = problem_home_dir(test_request)
52 problem_home = problem_home_dir(test_request)
53 remove_data_files(problem_home)
53 remove_data_files(problem_home)
54 end
54 end
55
55
56 protected
56 protected
57 def grading_room_dir(test_request)
57 def grading_room_dir(test_request)
58 problem_name = test_request.problem_name
58 problem_name = test_request.problem_name
59 user = test_request.user
59 user = test_request.user
60 "#{@config.user_result_dir}" +
60 "#{@config.user_result_dir}" +
61 "/#{user.login}/test_request" +
61 "/#{user.login}/test_request" +
62 "/#{problem_name}/#{test_request.id}"
62 "/#{problem_name}/#{test_request.id}"
63 end
63 end
64
64
65 def problem_home_dir(test_request)
65 def problem_home_dir(test_request)
66 problem_name = test_request.problem_name
66 problem_name = test_request.problem_name
67 user = test_request.user
67 user = test_request.user
68 "#{@config.user_result_dir}" +
68 "#{@config.user_result_dir}" +
69 "/#{user.login}/test_request/#{problem_name}"
69 "/#{user.login}/test_request/#{problem_name}"
70 end
70 end
71
71
72 def copy_problem_template(template_dir,problem_home)
72 def copy_problem_template(template_dir,problem_home)
73 cmd = "cp -R #{template_dir}/* #{problem_home}"
73 cmd = "cp -R #{template_dir}/* #{problem_home}"
74 system_and_raise_when_fail(cmd,"Test Request: cannot copy problem template")
74 system_and_raise_when_fail(cmd,"Test Request: cannot copy problem template")
75 end
75 end
76
76
77 def link_input_file(test_request,problem_home)
77 def link_input_file(test_request,problem_home)
78 cmd = "ln -s #{test_request.input_file_name} #{problem_home}/test_cases/1/input-1.txt"
78 cmd = "ln -s #{test_request.input_file_name} #{problem_home}/test_cases/1/input-1.txt"
79 system_and_raise_when_fail(cmd,"Test Request: cannot link input file")
79 system_and_raise_when_fail(cmd,"Test Request: cannot link input file")
80 end
80 end
81
81
82 def remove_data_files(problem_home)
82 def remove_data_files(problem_home)
83 if File.exists?("#{problem_home}/test_cases/1/input-1.txt")
83 if File.exists?("#{problem_home}/test_cases/1/input-1.txt")
84 cmd = "rm #{problem_home}/test_cases/1/*"
84 cmd = "rm #{problem_home}/test_cases/1/*"
85 system_and_raise_when_fail(cmd,"Test Request: cannot remove data files")
85 system_and_raise_when_fail(cmd,"Test Request: cannot remove data files")
86 end
86 end
87 end
87 end
88
88
89 def system_and_raise_when_fail(cmd,msg)
89 def system_and_raise_when_fail(cmd,msg)
90 if !system(cmd)
90 if !system(cmd)
91 raise msg
91 raise msg
92 end
92 end
93 end
93 end
94
94
95 end
95 end
96
96
97 class TestRequestReporter
97 class TestRequestReporter
98 def initialize
98 def initialize
99 @config = Grader::Configuration.get_instance
99 @config = Grader::Configuration.get_instance
100 end
100 end
101
101
102 def report(test_request,test_result_dir)
102 def report(test_request,test_result_dir)
103 save_result(test_request,read_result(test_result_dir))
103 save_result(test_request,read_result(test_result_dir))
104 end
104 end
105
105
106 def report_error(test_request, msg)
106 def report_error(test_request, msg)
107 save_result(test_request, {:running_stat => "#{msg}"})
107 save_result(test_request, {:running_stat => "#{msg}"})
108 end
108 end
109
109
110 protected
110 protected
111 def read_result(test_result_dir)
111 def read_result(test_result_dir)
112 # TODO:
112 # TODO:
113 cmp_msg_fname = "#{test_result_dir}/compiler_message"
113 cmp_msg_fname = "#{test_result_dir}/compiler_message"
114 cmp_file = File.open(cmp_msg_fname)
114 cmp_file = File.open(cmp_msg_fname)
115 cmp_msg = cmp_file.read
115 cmp_msg = cmp_file.read
116 cmp_file.close
116 cmp_file.close
117
117
118 result_file_name = "#{test_result_dir}/1/result"
118 result_file_name = "#{test_result_dir}/1/result"
119
119
120 if File.exists?(result_file_name)
120 if File.exists?(result_file_name)
121 output_file_name = "#{test_result_dir}/1/output.txt"
121 output_file_name = "#{test_result_dir}/1/output.txt"
122 results = File.open("#{test_result_dir}/1/result").readlines
122 results = File.open("#{test_result_dir}/1/result").readlines
123 stat = format_running_stat(results)
123 stat = format_running_stat(results)
124
124
125 return {
125 return {
126 :output_file_name => output_file_name,
126 :output_file_name => output_file_name,
127 :running_stat => stat,
127 :running_stat => stat,
128 :comment => "",
128 :comment => "",
129 :cmp_msg => cmp_msg}
129 :cmp_msg => cmp_msg}
130 else
130 else
131 return {
131 return {
132 :running_stat => "",
132 :running_stat => "",
133 :comment => "Compilation error",
133 :comment => "Compilation error",
134 :cmp_msg => cmp_msg}
134 :cmp_msg => cmp_msg}
135 end
135 end
136 end
136 end
137
137
138 def format_running_stat(results)
138 def format_running_stat(results)
139 running_time_line = results[-1]
139 running_time_line = results[-1]
140
140
141 run_stat = ""
141 run_stat = ""
142 if !(/[Cc]orrect/.match(results[0]))
142 if !(/[Cc]orrect/.match(results[0]))
143 run_stat = results[0].chomp
143 run_stat = results[0].chomp
144 end
144 end
145
145
146 if res = /r(.*)u(.*)s/.match(running_time_line)
146 if res = /r(.*)u(.*)s/.match(running_time_line)
147 seconds = (res[1].to_f + res[2].to_f)
147 seconds = (res[1].to_f + res[2].to_f)
148 time_stat = "Time used: #{seconds} sec."
148 time_stat = "Time used: #{seconds} sec."
149 else
149 else
150 time_stat = "Time used: n/a sec."
150 time_stat = "Time used: n/a sec."
151 end
151 end
152 - return "#{run_stat}#{time_stat}"
152 + return "#{run_stat}\n#{time_stat}"
153 end
153 end
154
154
155 def save_result(test_request,result)
155 def save_result(test_request,result)
156 if result[:output_file_name]!=nil
156 if result[:output_file_name]!=nil
157 test_request.output_file_name = link_output_file(test_request,
157 test_request.output_file_name = link_output_file(test_request,
158 result[:output_file_name])
158 result[:output_file_name])
159 end
159 end
160 test_request.graded_at = Time.now
160 test_request.graded_at = Time.now
161 test_request.compiler_message = (result[:cmp_msg] or '')
161 test_request.compiler_message = (result[:cmp_msg] or '')
162 test_request.grader_comment = (result[:comment] or '')
162 test_request.grader_comment = (result[:comment] or '')
163 test_request.running_stat = (result[:running_stat] or '')
163 test_request.running_stat = (result[:running_stat] or '')
164 test_request.save
164 test_request.save
165 end
165 end
166
166
167 protected
167 protected
168 def link_output_file(test_request, fname)
168 def link_output_file(test_request, fname)
169 target_file_name = random_output_file_name(test_request.user,
169 target_file_name = random_output_file_name(test_request.user,
170 test_request.problem)
170 test_request.problem)
171 FileUtils.mkdir_p(File.dirname(target_file_name))
171 FileUtils.mkdir_p(File.dirname(target_file_name))
172 cmd = "ln -s #{fname} #{target_file_name}"
172 cmd = "ln -s #{fname} #{target_file_name}"
173 if !system(cmd)
173 if !system(cmd)
174 raise "TestRequestReporter: cannot move output file"
174 raise "TestRequestReporter: cannot move output file"
175 end
175 end
176 return target_file_name
176 return target_file_name
177 end
177 end
178
178
179 def random_output_file_name(user,problem)
179 def random_output_file_name(user,problem)
180 problem_name = TestRequest.name_of(problem)
180 problem_name = TestRequest.name_of(problem)
181 begin
181 begin
182 tmpname = "#{@config.test_request_output_base_dir}" +
182 tmpname = "#{@config.test_request_output_base_dir}" +
183 "/#{user.login}/#{problem_name}/#{rand(10000)}"
183 "/#{user.login}/#{problem_name}/#{rand(10000)}"
184 end while File.exists?(tmpname)
184 end while File.exists?(tmpname)
185 tmpname
185 tmpname
186 end
186 end
187
187
188 end
188 end
189
189
190 end
190 end
You need to be logged in to leave comments. Login now