Bug 312042: Testing suite (runtests.pl) need to check error tags - Patch by Dennis Melentyev <dennis.melentyev@infopulse.com.ua> r=LpSolit a=justdave

This commit is contained in:
lpsolit%gmail.com 2006-03-01 21:38:45 +00:00
Родитель dc094dc429
Коммит 48d53aaaa8
1 изменённых файлов: 203 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,203 @@
# -*- Mode: perl; indent-tabs-mode: nil -*-
# vim: ts=4 sw=4 et tw=80
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code are the Bugzilla Tests.
#
# The Initial Developer of the Original Code is Zach Lipton
# Portions created by Zach Lipton are
# Copyright (C) 2001 Zach Lipton. All
# Rights Reserved.
#
# Contributor(s): Dennis Melentyev <dennis.melentyev@infopulse.com.ua>
##################
#Bugzilla Test 12#
######Errors######
use strict;
use lib 't';
use File::Spec;
use Support::Files;
use Support::Templates;
use Test::More;
my %Errors = ();
# Just a workaround for template errors handling. Define it as used.
push @{$Errors{code}{template_error}{used_in}{'Bugzilla/Error.pm'}}, 0;
# Define files to test. Each file would have a list of error messages, if any.
my %test_templates = ();
my %test_modules = ();
# Find all modules
foreach my $module (@Support::Files::testitems) {
$test_modules{$module} = ();
}
# Find all error templates
# Process all files since otherwise handling template hooks would became too
# hairy. But let us do it only once.
foreach my $include_path (@include_paths) {
foreach my $path (@{$actual_files{$include_path}}) {
my $file = File::Spec->catfile($include_path, $path);
$file =~ s/\s.*$//; # nuke everything after the first space
$file =~ s|\\|/|g if $^O eq 'MSWin32'; # convert \ to / in path if on windows
$test_templates{$file} = ()
if $path =~ m#global/(code|user)-error\.html\.tmpl#;
}
}
# Count the tests
my $tests = (scalar keys %test_modules) + (scalar keys %test_templates);
exit 0 if !$tests;
# Set requested tests counter.
plan tests => $tests;
# Collect all errors defined in templates
foreach my $file (keys %test_templates) {
$file =~ m|template/([^/]+).*/global/([^/]+)-error\.html\.tmpl|;
my $lang = $1;
my $errtype = $2;
if (! open (TMPL, $file)) {
Register(\%test_templates, $file, "could not open file --WARNING");
next;
}
my $lineno=0;
while (my $line = <TMPL>) {
$lineno++;
if ($line =~ /\[%\s[A-Z]+\s*error\s*==\s*"(.+)"\s*%\]/) {
my $errtag = $1;
if ($errtag =~ /\s/) {
Register(\%test_templates, $file,
"has an error definition \"$errtag\" at line $lineno with"
. "space(s) embedded --ERROR");
}
else {
push @{$Errors{$errtype}{$errtag}{defined_in}{$lang}{$file}}, $lineno;
}
}
}
close(TMPL);
}
# Collect all used errors from cgi/pm files
foreach my $file (keys %test_modules) {
$file =~ s/\s.*$//; # nuke everything after the first space (#comment)
next if (!$file); # skip null entries
if (! open (TMPL, $file)) {
Register(\%test_modules, $file, "could not open file --WARNING");
next;
}
my $lineno = 0;
while (my $line = <TMPL>) {
last if $line =~ /^__END__/; # skip the POD (at least in
# Bugzilla/Error.pm)
$lineno++;
if ($line =~ /^[^#]*Throw(Code|User)Error\s*\(\s*["'](.*?)['"]/) {
my $errtype = lc($1);
my $errtag = $2;
push @{$Errors{$errtype}{$errtag}{used_in}{$file}}, $lineno;
}
}
close(TMPL);
}
# Now let us start the checks
foreach my $errtype (keys %Errors) {
foreach my $errtag (keys %{$Errors{$errtype}}) {
# Check for undefined tags
if (!defined $Errors{$errtype}{$errtag}{defined_in}) {
UsedIn($errtype, $errtag, "any");
}
else {
# Check for all languages!!!
my @langs = ();
foreach my $lang (@languages) {
if (!defined $Errors{$errtype}{$errtag}{defined_in}{$lang}) {
push @langs, $lang;
}
}
if (scalar @langs) {
UsedIn($errtype, $errtag, join(', ',@langs));
}
# Now check for tag usage in all DEFINED languages
foreach my $lang (keys %{$Errors{$errtype}{$errtag}{defined_in}}) {
if (!defined $Errors{$errtype}{$errtag}{used_in}) {
DefinedIn($errtype, $errtag, $lang);
}
}
}
}
}
# Now report modules results
foreach my $file (sort keys %test_modules) {
Report($file, @{$test_modules{$file}});
}
# Now report templates results
foreach my $file (sort keys %test_templates) {
Report($file, @{$test_templates{$file}});
}
sub Register {
my ($hash, $file, $message) = @_;
push @{$hash->{$file}}, $message;
}
sub Report {
my ($file, @errors) = @_;
if (scalar @errors) {
ok(0, "$file has ". scalar @errors ." error(s):\n" . join("\n", @errors));
}
else {
# This is used for both code and template files, so let's use
# file-independent phrase
ok(1, "$file uses error tags correctly");
}
}
sub UsedIn {
my ($errtype, $errtag, $lang) = @_;
$lang = $lang || "any";
foreach my $file (keys %{$Errors{$errtype}{$errtag}{used_in}}) {
Register(\%test_modules, $file,
"$errtype error tag '$errtag' is used at line(s) ("
. join (',', @{$Errors{$errtype}{$errtag}{used_in}{$file}})
. ") but not defined for language(s): $lang");
}
}
sub DefinedIn {
my ($errtype, $errtag, $lang) = @_;
foreach my $file (keys %{$Errors{$errtype}{$errtag}{defined_in}{$lang}}) {
Register(\%test_templates, $file,
"$errtype error tag '$errtag' is defined at line(s) ("
. join (',', @{$Errors{$errtype}{$errtag}{defined_in}{$lang}{$file}})
. ") but is not used anywhere");
}
}
exit 0;