ljr/bml/t/20_render.t

186 lines
4.7 KiB
Perl
Executable File

#!/usr/bin/perl
#
# Test script for Apache::BML -- Simple functions
# $Id: 20_render.t,v 1.3 2004/07/03 00:13:26 deveiant Exp $
#
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl 00_require.t'
#
# Please do not commit any changes you make to the module without a
# successful 'make test'!
#
package main;
use strict;
BEGIN { $| = 1; }
use lib "lib";
### Load up the test framework
use Test::SimpleUnit qw{:functions};
use Apache::BML qw{};
use Apache::FakeRequest qw{};
use Fcntl qw{O_CREAT O_TRUNC O_EXCL O_RDONLY O_WRONLY};
use File::Spec qw{};
use File::Basename qw{dirname basename};
use Text::Diff qw{diff};
#####################################################################
### G L O B A L V A R I A B L E S
#####################################################################
my (
@testSuite,
$Request,
$TestDir,
@TestSubdirs,
);
$TestDir = File::Spec->rel2abs( "test" );
# The list of directories to search for .bml files. This is hard-coded instead
# of automatic so other tests can use the test/ directory for their data, too.
@TestSubdirs = qw[ tutorial1 tutorial2 brads recursion syntax-errors
codeblocks fake_root comments info escape include
tutorial-example*
];
#####################################################################
### C U S T O M A S S E R T I O N F U N C T I O N S
#####################################################################
### FUNCTION: readFile( $file )
### Read the specified I<file> and return its contents as a single scalar.
sub readFile {
my ( $file ) = @_;
my $fh = new IO::File $file, O_RDONLY
or die "open: $file: $!";
return join '', $fh->getlines;
}
### FUNCTION: assertCorrect( $directory, $name, $output )
### Load the "I<name>.correct" file from the specified testing I<directory> and
### check that it is the same as the specified I<output> after stripping off
### trailing whitespace from both.
sub assertCorrect {
my ( $dir, $name, $output ) = @_;
my $path = File::Spec->catfile( $dir, "$name.correct" );
if ( ! -e $path ) {
print "\n>>> WARNING: No .correct file for '$name': Creating one with \n",
">>> the test output. You should verify the correctness of \n",
">>> '$path' before trusting this test.\n\n";
IO::File->new($path, O_WRONLY|O_CREAT)->print( $output );
}
my $correct = readFile( $path );
# Trim trailing whitespace off of both expected and correct
$correct =~ s{\s+$}{}; $correct .= "\n";
$output =~ s{\s+$}{}; $output .= "\n";
my $diff = diff( \$correct, \$output );
assert( $diff eq '', "Expected output from $name.correct, got:\n$diff" );
}
#####################################################################
### A P A C H E : : F A K E R E Q U E S T M U N G I N G
#####################################################################
# Overload Apache::FakeRequest's print to append output to a variable.
{
package Apache::FakeRequest;
use vars qw{%Pnotes $Output $Errout};
no warnings 'redefine';
%Pnotes = ();
$Output = $Errout = '';
sub Reset {
%Pnotes = ();
$Output = $Errout = '';
}
sub print {
my $r = shift;
$Output .= join('', @_)
}
sub log_error {
my $r - shift;
print STDERR @_, "\n"; $Errout .= join('', @_)
}
sub pnotes {
my ( $r, $key ) = @_;
$Pnotes{ $key } = shift if @_;
return $Pnotes{ $key };
}
}
#####################################################################
### T E S T S
#####################################################################
# Define tests
@testSuite = (
{
name => 'setup',
func => sub {
Apache::FakeRequest->Reset;
},
},
);
# Auto-generate tests for each test subdir
foreach my $subdir ( @TestSubdirs ) {
my $testpat = File::Spec->catdir( $TestDir, $subdir );
# Find all the .bml files, skipping those which start with underscores.
foreach my $bmlfile ( glob "$testpat/*.bml" ) {
next if $bmlfile =~ m{/_};
( my $name = $bmlfile ) =~ s{.*/(.*)\.bml$}{$1};
my $testdir = dirname( $bmlfile );
my $testname = basename( $testdir );
# Add a test to the suite for the .bml file
push @testSuite,
{
name => "$testname $name",
test => sub {
#print "Testing dir: $testdir\n";
my $request = new Apache::FakeRequest (
document_root => $TestDir,
uri => "/$name.bml",
filename => "$bmlfile",
);
my $res;
$ENV{testlookroot} = $testdir;
assertNoException {
local $SIG{ALRM} = sub { die "Timeout" };
alarm 10;
$res = Apache::BML::handler($request)
};
alarm 0;
assertEquals 0, $res;
assertCorrect( $testdir, $name, $Apache::FakeRequest::Output );
print STDERR $Apache::Request::Errout, "\n";
},
};
}
}
runTests( @testSuite );