#!/usr/local/bin/perl use strict; use warnings; use Carp; use SVN::Class; use FindBin; use JSON::XS; use Email::Stuff; use Sys::Hostname; my $config = { src => Path::Class::Dir->new( $FindBin::Bin, '../../' )->absolute->stringify, verbose => 0, email_to => undef, email_from => getpwuid($<) . '@' . hostname(), email_subject => 'KinoSearch Smoke Test Report ' . localtime(), test_target => 'test', # could also be 'test_valgrind' if on Linux }; if (@ARGV) { my $config_file = Path::Class::File->new( shift @ARGV ); my $supplied_conf = decode_json( $config_file->slurp ); $config = { %$config, %$supplied_conf }; } if (!$config->{src}) { croak "no 'src' in config -- check your syntax"; } if (! -d $config->{src}) { croak "no such dir: $config->{src}"; } my $test_target = $config->{test_target}; my $dir = svn_dir($config->{src}); my $perl_info = get_out("$^X -V"); my $sys_info = get_out('uname -a'); $dir->update or croak "can't svn update $dir:\n" . $dir->errstr; chdir "$dir" or croak "can't chdir to $dir: $!"; chdir 'perl' or croak "can't chdir to perl: $!"; run_quiet("./Build clean") if -f 'Build'; run_quiet("$^X Build.PL"); run_quiet("$^X Build"); my $test_info = get_out("./Build $test_target"); if (should_send_smoke_signal($test_info)) { my $msg =<info->dump; if ($ENV{SMOKE_TEST}) { print $msg . "\n"; } elsif ( $config->{email_to} ) { Email::Stuff->from ( $config->{email_from} ) ->to ( $config->{email_to} ) ->subject ( $config->{email_subject} ) ->text_body( $msg ) ->send; } } elsif ($config->{verbose}) { print "All tests pass.\n"; print $dir->info->dump; } exit; sub should_send_smoke_signal { return 1 if $_[0] =~ m/fail/i; return 1 if $? != 0; } sub run_quiet { my $cmd = shift; system("$cmd 2>/dev/null 1>/dev/null") and croak "$cmd failed: $!"; } sub get_out { my $cmd = shift; return join('', `$cmd 2>&1`); } __END__ =head1 NAME smoke.pl - KinoSearch smoke test script =head1 SYNOPSIS perl devel/bin/smoke.pl [path/to/config_file] =head1 DESCRIPTION By default, smoke.pl updates to the latest SVN version of the branch within which it resides and runs a clean build and test suite. If there are any test failures, a full system and test summary is printed to stdout. You may specify an alternate path to test in a JSON-formatted config file. Use the 'src' config option to specify a path. Example: { 'src' : '/path/to/checked/out/kinosearch/branch' } By default, smoke.pl will only print output if there are errors. To see output if all tests pass, specify a true 'verbose' flag in your config file. { 'verbose' : 1 } =head1 REQUIREMENTS SVN::Class, JSON::XS, FindBin, Carp =head1 AUTHOR Peter Karman < perl at peknet dot com > =head1 LICENSE Copyright 2008 by Peter Karman. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut