Koha/t/database_dependent.pl
Galen Charlton aad276c3cd test framework - two improvements
[1] When running the database-dependent tests (cd t, make test),
    all tables in the test database are dropped prior to running
    the installer and test cases.  This means that the test
    database will start with a clean slate.
[2] It is now possible to specify a single test class to run,
    to avoid having to run all of them:

    cd t
    make test TEST_CLASS=Search

    To run all DB-dependent tests, just do the usual

    cd t
    make test

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
2008-04-30 21:58:32 -05:00

237 lines
6 KiB
Perl

#!/usr/bin/perl
use warnings;
use strict;
=head2
=cut
use C4::Context;
use C4::Installer;
use C4::Languages;
use Data::Dumper;
use Test::More;
use Test::Class::Load qw ( . ); # run from the t directory
clear_test_database();
create_test_database();
start_zebrasrv();
start_zebraqueue_daemon();
if ($ENV{'TEST_CLASS'}) {
# assume only one test class is specified;
# should extend to allow multiples, but that will
# mean changing how test classes are loaded.
eval "KohaTest::$ENV{'TEST_CLASS'}->runtests";
} else {
Test::Class->runtests;
}
stop_zebraqueue_daemon();
stop_zebrasrv();
# stop_zebrasrv();
=head3 clear_test_database
removes all tables from test database so that install starts with a clean slate
=cut
sub clear_test_database {
diag "removing tables from test database";
my $dbh = C4::Context->dbh;
my $schema = C4::Context->config("database");
my @tables = get_all_tables($dbh, $schema);
foreach my $table (@tables) {
drop_all_foreign_keys($dbh, $table);
}
foreach my $table (@tables) {
drop_table($dbh, $table);
}
}
sub get_all_tables {
my ($dbh, $schema) = @_;
my $sth = $dbh->prepare("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ?");
my @tables = ();
$sth->execute($schema);
while (my ($table) = $sth->fetchrow_array) {
push @tables, $table;
}
$sth->finish;
return @tables;
}
sub drop_all_foreign_keys {
my ($dbh, $table) = @_;
# get the table description
my $sth = $dbh->prepare("SHOW CREATE TABLE $table");
$sth->execute;
my $vsc_structure = $sth->fetchrow;
# split on CONSTRAINT keyword
my @fks = split /CONSTRAINT /,$vsc_structure;
# parse each entry
foreach (@fks) {
# isolate what is before FOREIGN KEY, if there is something, it's a foreign key to drop
$_ = /(.*) FOREIGN KEY.*/;
my $id = $1;
if ($id) {
# we have found 1 foreign, drop it
$dbh->do("ALTER TABLE $table DROP FOREIGN KEY $id");
$id="";
}
}
}
sub drop_table {
my ($dbh, $table) = @_;
$dbh->do("DROP TABLE $table");
}
=head3 create_test_database
sets up the test database.
=cut
sub create_test_database {
diag 'creating testing database...';
my $installer = C4::Installer->new() or die 'unable to create new installer';
# warn Data::Dumper->Dump( [ $installer ], [ 'installer' ] );
my $all_languages = getAllLanguages();
my $error = $installer->load_db_schema();
die "unable to load_db_schema: $error" if ( $error );
my $list = $installer->sql_file_list('en', 'marc21', { optional => 1,
mandatory => 1 } );
my ($fwk_language, $installed_list) = $installer->load_sql_in_order($all_languages, @$list);
$installer->set_version_syspref();
$installer->set_marcflavour_syspref('MARC21');
$installer->set_indexing_engine(0);
diag 'database created.'
}
=head3 start_zebrasrv
This method deletes and reinitializes the zebra database directory,
and then spans off a zebra server.
=cut
sub start_zebrasrv {
stop_zebrasrv();
diag 'cleaning zebrasrv...';
foreach my $zebra_server ( qw( biblioserver authorityserver ) ) {
my $zebra_config = C4::Context->zebraconfig($zebra_server)->{'config'};
my $zebra_db_dir = C4::Context->zebraconfig($zebra_server)->{'directory'};
foreach my $zebra_db_name ( qw( biblios authorities ) ) {
my $command = "zebraidx -c $zebra_config -d $zebra_db_name init";
my $return = system( $command . ' > /dev/null 2>&1' );
if ( $return != 0 ) {
diag( "command '$command' died with value: " . $? >> 8 );
}
$command = "zebraidx -c $zebra_config -d $zebra_db_name create $zebra_db_name";
diag $command;
$return = system( $command . ' > /dev/null 2>&1' );
if ( $return != 0 ) {
diag( "command '$command' died with value: " . $? >> 8 );
}
}
}
diag 'starting zebrasrv...';
my $pidfile = File::Spec->catdir( C4::Context->config("logdir"), 'zebra.pid' );
my $command = sprintf( 'zebrasrv -f %s -D -l %s -p %s',
$ENV{'KOHA_CONF'},
File::Spec->catdir( C4::Context->config("logdir"), 'zebra.log' ),
$pidfile,
);
diag $command;
my $output = qx( $command );
if ( $output ) {
diag $output;
}
if ( -e $pidfile, 'pidfile exists' ) {
diag 'zebrasrv started.';
} else {
die 'unable to start zebrasrv';
}
return $output;
}
=head3 stop_zebrasrv
using the PID file for the zebra server, send it a TERM signal with
"kill". We can't tell if the process actually dies or not.
=cut
sub stop_zebrasrv {
my $pidfile = File::Spec->catdir( C4::Context->config("logdir"), 'zebra.pid' );
if ( -e $pidfile ) {
open( my $pidh, '<', $pidfile )
or return;
if ( defined $pidh ) {
my ( $pid ) = <$pidh> or return;
close $pidh;
my $killed = kill 15, $pid; # 15 is TERM
if ( $killed != 1 ) {
warn "unable to kill zebrasrv with pid: $pid";
}
}
}
}
=head3 start_zebraqueue_daemon
kick off a zebraqueue_daemon.pl process.
=cut
sub start_zebraqueue_daemon {
my $command = q(run/bin/koha-zebraqueue-ctl.sh start);
diag $command;
my $started = system( $command );
diag "started: $started";
# my $command = sprintf( 'KOHA_CONF=%s ../misc/bin/zebraqueue_daemon.pl > %s 2>&1 &',
# $ENV{'KOHA_CONF'},
# 'zebra.log',
# );
# diag $command;
# my $queue = system( $command );
# diag "queue: $queue";
}
=head3 stop_zebraqueue_daemon
=cut
sub stop_zebraqueue_daemon {
my $command = q(run/bin/koha-zebraqueue-ctl.sh stop);
diag $command;
my $started = system( $command );
diag "started: $started";
}