/[suikacvs]/webroot/gate/test-results/list.cgi
Suika

Contents of /webroot/gate/test-results/list.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (show annotations) (download)
Sun Jan 15 05:20:52 2012 UTC (12 years, 4 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +3 -3 lines
Byte order

1 #!/usr/bin/perl
2 use strict;
3
4 use lib qw[/home/httpd/html/www/markup/html/whatpm
5 /home/wakaba/work/manakai2/lib];
6 use CGI::Carp qw[fatalsToBrowser];
7
8 my $data_dir_name = 'data/';
9
10 use Message::CGI::HTTP;
11 my $cgi = Message::CGI::HTTP->new;
12
13 use Message::DOM::DOMImplementation;
14 my $dom = Message::DOM::DOMImplementation->new;
15
16 binmode STDOUT, ':utf8';
17
18 my $path = $cgi->path_info;
19 $path = '' unless defined $path;
20
21 my @path = split m#/#, percent_decode ($path), -1;
22
23 if (@path == 3 and $path[0] eq '' and $path[1] =~ /\A[0-9a-z-]+\z/) {
24 my $table_id = $path[1];
25
26 if ($path[2] eq 'all') {
27 my $table = get_table ($table_id);
28
29 if ($table) {
30 my $envs = get_envs ();
31 my $tests = $table->{tests} || {};
32
33 print qq[Content-Type: text/html; charset=utf-8
34
35 <!DOCTYPE HTML>
36 <title>Results for @{[htescape ($table->{info}->{label} || $table_id)]}</title>
37 <link rel=stylesheet href="../../style">
38 <h1>Results for
39 <a href=info>@{[htescape ($table->{info}->{label} || $table_id)]}</a></h1>
40
41 <table><thead><tr><th scope=col>Test];
42
43 ## NOTE: Ummm... We need two-pass process...
44 my @envs;
45 my %has_env;
46 for my $test_id (keys %{$tests}) {
47 for my $env_id (keys %{$tests->{$test_id}->{result} or {}}) {
48 push @envs, $env_id unless $has_env{$env_id};
49 $has_env{$env_id} = 1;
50 }
51 }
52 @envs = sort {$a <=> $b} @envs;
53
54 for my $env_id (@envs) {
55 print q[<th scope=col>], htescape ($envs->{$env_id}->{label} ||
56 $envs->{$env_id}->{name});
57 }
58
59 my $stat;
60 print q[<tbody>];
61
62 for my $test_id (sort {$a cmp $b} keys %{$tests}) {
63 print q[<tr><th scope=row>];
64
65 print q[<a href="], htescape ($table->{info}->{url_prefix} || ''),
66 htescape ($tests->{$test_id}->{name}), q[">];
67 my $label = htescape ($tests->{$test_id}->{label} ||
68 $tests->{$test_id}->{name});
69 $label =~ s/\n/<br>/g;
70 print $label;
71 print q[</a>];
72
73 for my $env_id (@envs) {
74 my $result = $tests->{$test_id}->{result}->{$env_id};
75
76 unless ($result->{class}) {
77 print q[<td>];
78 next;
79 }
80
81 my $env_label = htescape ($envs->{$env_id}->{label} ||
82 $envs->{$env_id}->{name});
83 my $test_label = htescape ($tests->{$test_id}->{label} ||
84 $tests->{$test_id}->{name});
85 $test_label =~ s/\n/ \n/g;
86
87 print q[<td class="];
88 print scalar htescape ($result->{class} || '');
89 print qq[" title="$env_label \n$test_label">];
90 print scalar htescape ($result->{text} || '');
91
92 $stat->{$env_id}->{'class_' . ($result->{class} || '')}++;
93 $stat->{$env_id}->{count}++;
94 }
95 }
96
97 print q[<tfoot>];
98
99 for my $bbb (['class_PASS', 'Passed'],
100 ['class_FAIL', 'Failed'],
101 ['class_SKIPPED', 'Skipped'],
102 ['class_has', 'Has'],
103 ['count', 'Total']) {
104 print q[<tr><th scope=row>], htescape ($bbb->[1]);
105
106 for my $env_id (@envs) {
107 print q[<td>], (0+$stat->{$env_id}->{$bbb->[0]});
108 print ' (', get_percentage ($stat->{$env_id}->{$bbb->[0]},
109 $stat->{$env_id}->{count}), '%)'
110 unless $bbb->[0] eq 'count';
111 }
112 }
113
114 print q[</table>
115
116 <footer>[<a href=info>Info</a>]
117 [<a href=all>All results</a>]</footer>];
118
119 exit;
120 }
121 } elsif ($path[2] eq 'info') {
122 if ($cgi->request_method eq 'POST') {
123 my $table = get_table ($table_id, lock => 1, create => 1);
124
125 $table->{info}->{label} = get_string_parameter ('label');
126 $table->{info}->{url_prefix} = get_string_parameter ('url-prefix');
127
128 set_table ($table_id, $table);
129
130 print qq[Status: 204 Done.\n\n];
131
132 exit;
133 } else {
134 my $table = get_table ($table_id);
135
136 print qq[Content-Type: text/html; charset=utf-8
137
138 <!DOCTYPE HTML>
139 <title>Information on
140 @{[htescape (($table ? $table->{info}->{label} : undef) || $table_id)]}</title>
141 <link rel=stylesheet href="../../style">
142 <h1>Information on
143 @{[htescape (($table ? $table->{info}->{label} : undef) || $table_id)]}</h1>
144 ];
145
146 unless ($table) {
147 print q[<p>This testset is not created yet.];
148 }
149
150 print qq[<form action=info accept-charset=utf-8 method=post>
151
152 <dl>
153
154 <dt>Testset ID
155 <dd><input type=text readonly value="@{[htescape ($table_id)]}">
156
157 <dt>Human-readable label
158 <dd><input type=text name=label
159 value="@{[htescape ($table->{info}->{label} || '')]}">
160
161 <dt>Testcase URL prefix
162 <dd><input type=url name=url-prefix
163 value="@{[htescape ($table->{info}->{url_prefix} || '')]}">
164
165 </dl>
166
167 <p><input type=submit value="Save">
168
169 </form>
170
171 <footer>[<a href=info>Info</a>]
172 [<a href=all>All results</a>]</footer>];
173
174 exit;
175 }
176 }
177 } elsif (@path == 2 and $path[0] eq '' and $path[1] =~ /\A[0-9a-z-]+\z/) {
178 if ($cgi->request_method eq 'POST') {
179 my $table_id = $path[1];
180 my $table = get_table ($table_id, lock => 1);
181 if ($table) {
182 my $envs = get_envs (lock => 1);
183
184 my $env_name = get_string_parameter ('env-name');
185
186 my $env;
187 my $env_id;
188 for (keys %$envs) {
189 if ($envs->{$_}->{name} eq $env_name) {
190 $env = $envs->{$_};
191 $env_id = $_;
192 last;
193 }
194 }
195 unless ($env) {
196 $env = {name => $env_name};
197 $env_id = (time + rand (1)) . '';
198 $envs->{$env_id} = $env;
199 }
200
201 my @test_name = $cgi->get_parameter ('test-name');
202 my @test_label = $cgi->get_parameter ('test-label');
203 my @test_class = $cgi->get_parameter ('test-class');
204 my @test_result = $cgi->get_parameter ('test-result');
205
206 for my $i (0..$#test_name) {
207 my $test = $table->{tests}->{$test_name[$i]} ||= {};
208 $test->{name} = $test_name[$i] || $test->{name};
209 $test->{label} = $test_label[$i] || $test->{label};
210
211 my $result = {class => $test_class[$i],
212 text => Encode::decode ('utf-8', $test_result[$i])};
213 $test->{result}->{$env_id} = $result;
214 }
215
216 set_table ($table_id, $table);
217 set_envs ($envs);
218
219 print qq[Status: 204 Done\n\n];
220
221 exit;
222 }
223 } else {
224 print q[Content-Type: text/html; charset=utf-8
225
226 <!DOCTYPE HTML>
227 <title>List</title>
228 <ul>
229 <li><a href=all>all</a>
230 <li><a href=info>info</a>
231 </ul>];
232 exit;
233 }
234 } elsif (@path == 2 and $path[0] eq '' and $path[1] eq '_dummy_') {
235 print "Content-Type: text/plain; charset=utf-8\n\n200";
236 exit;
237 }
238
239 print "Status: 404 Not Found\nContent-Type: text/plain\n\n404";
240 exit;
241
242 sub percent_decode ($) {
243 return $dom->create_uri_reference ($_[0])
244 ->get_iri_reference
245 ->uri_reference;
246 } # percent_decode
247
248 sub get_string_parameter ($) {
249 my $value = $cgi->get_parameter ($_[0]);
250 if (defined $value) {
251 require Encode;
252 return Encode::decode ('utf-8', $value);
253 } else {
254 return '';
255 }
256 } # get_string_parameter
257
258 sub htescape ($) {
259 my $s = shift;
260 $s =~ s/&/&amp;/g;
261 $s =~ s/</&lt;/g;
262 $s =~ s/>/&gt;/g;
263 $s =~ s/"/&quot;/g;
264 return $s;
265 } # htescape
266
267 sub get_percentage ($$) {
268 my ($a, $b) = @_;
269 $b ||= 1;
270
271 return int (100 * $a / $b);
272 } # get_percentage
273
274 use Storable qw/nstore retrieve/;
275
276 sub get_table ($%) {
277 my $table_id = shift;
278 my %opt = @_;
279
280 my $table_file_name = $data_dir_name . $table_id . '.dat';
281
282 if ($opt{lock}) {
283 ## NOTE: This does not allow multiple files locked in the same process.
284 our $table_lock;
285 my $lock_file_name = $table_file_name . '.lock';
286 open $table_lock, '>', $lock_file_name or die "$0: $lock_file_name: $!";
287 use Fcntl ':flock';
288 flock $table_lock, LOCK_EX;
289 }
290
291 if (-f $table_file_name) {
292 return retrieve $table_file_name or die "$0: $table_file_name: $!";
293 } else {
294 if ($opt{create}) {
295 return {};
296 } else {
297 return undef;
298 }
299 }
300 } # get_table
301
302 sub set_table ($$) {
303 my $table_id = shift;
304 my $table = shift;
305
306 my $table_file_name = $data_dir_name . $table_id . '.dat';
307
308 nstore $table, $table_file_name or die "$0: $table_file_name: $!";
309
310 system '/usr/bin/cvs', 'add', '-kb', $table_file_name;
311 system '/usr/bin/cvs', 'commit', '-m', '', $table_file_name;
312 } # set_table
313
314 sub get_envs (%) {
315 my %opt = @_;
316
317 ## NOTE: |get_envs| must be invoked after |get_table|, to avoid
318 ## deadlocks.
319
320 my $envs_file_name = $data_dir_name . '_test-envs.dat';
321
322 if ($opt{lock}) {
323 our $envs_lock;
324 my $lock_file_name = $envs_file_name . '.lock';
325 open $envs_lock, '>', $lock_file_name or die "$0: $lock_file_name: $!";
326 use Fcntl ':flock';
327 flock $envs_lock, LOCK_EX;
328 }
329
330 if (-f $envs_file_name) {
331 return retrieve $envs_file_name or die "$0: $envs_file_name: $!";
332 } else {
333 return {};
334 }
335 } # get_envs
336
337 sub set_envs ($) {
338 my $envs = shift;
339
340 my $envs_file_name = $data_dir_name . '_test-envs.dat';
341
342 nstore $envs, $envs_file_name or die "$0: $envs_file_name: $!";
343
344 system '/usr/bin/cvs', 'add', '-kb', $envs_file_name;
345 system '/usr/bin/cvs', 'commit', '-m', '', $envs_file_name;
346 } # set_envs

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24