X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=t%2Flib%2FDebbugsTest.pm;h=3689f7f40ebc942a7a03a8ae4ad404955efa1b61;hb=a8fb2ce4794a33cc942bc127529e3474ff6c1803;hp=6e33399d4e0f6ce0bfefd04a7dbdf586c62bd744;hpb=0c2305d4c89d165140bc955a50f3248c9c9ba7ad;p=debbugs.git diff --git a/t/lib/DebbugsTest.pm b/t/lib/DebbugsTest.pm index 6e33399..3689f7f 100644 --- a/t/lib/DebbugsTest.pm +++ b/t/lib/DebbugsTest.pm @@ -24,6 +24,8 @@ use strict; use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT); use base qw(Exporter); +use v5.10; + use IO::File; use File::Temp qw(tempdir); use Cwd qw(getcwd); @@ -32,6 +34,7 @@ use File::Basename qw(dirname basename); use IPC::Open3; use IO::Handle; use Test::More; +use Test::PostgreSQL; use Params::Validate qw(validate_with :types); @@ -40,11 +43,14 @@ BEGIN{ $DEBUG = 0 unless defined $DEBUG; @EXPORT = (); - %EXPORT_TAGS = (configuration => [qw(dirsize create_debbugs_configuration send_message)], + %EXPORT_TAGS = (configuration => [qw(dirsize create_debbugs_configuration send_message), + qw(submit_bug run_processall)], mail => [qw(num_messages_sent)], + control => [qw(test_control_commands)], + database => [qw(create_postgresql_database update_postgresql_database)] ); @EXPORT_OK = (); - Exporter::export_ok_tags(qw(configuration mail)); + Exporter::export_ok_tags(keys %EXPORT_TAGS); $EXPORT_TAGS{all} = [@EXPORT_OK]; } @@ -72,7 +78,7 @@ sub create_debbugs_configuration { $ENV{DEBBUGS_CONFIG_FILE} ="$config_dir/debbugs_config"; - $ENV{PERL5LIB} = getcwd(); + $ENV{PERL5LIB} = getcwd().'/lib/'; $ENV{SENDMAIL_TESTDIR} = $sendmail_dir; eval { my $sendmail_tester = getcwd().'/t/sendmail_tester'; @@ -121,6 +127,9 @@ END } system('mkdir','-p',"$spool_dir/incoming"); system('mkdir','-p',"$spool_dir/lock"); + # generate the maintainers index files + system('scripts/maintainer-indices') == 0 + or die "Unable to generate maintainer index files"; eval ' END{ if ($ENV{DEBUG}) { @@ -201,11 +210,131 @@ sub send_message{ } # now we should run processall to see if the message gets processed if ($param{run_processall}) { - system('scripts/processall') == 0 or die "processall failed"; - } + run_processall(); + } + return 1; +} + +sub run_processall { + system('scripts/processall') == 0 or die "processall failed"; +} + +=item test_control_commands + + test_control_commands(\%config, + forcemerge => {command => 'forcemerge', + value => '1 2', + status_key => 'mergedwith', + status_value => '2', + expect_error => 0, + }); + +Test a set of control commands to see if they will fail or not. Takes +SCALAR/HASHREF pairs, where the scalar should be unique, and the HASHREF +contains the following keys: + +=over + +=item command -- control command to issue + +=item value -- value to pass to control command + +=item status_key -- bug status key to check + +=item status_value -- value of status key + +=item expect_error -- whether to expect the control command to error or not + +=back + +=cut + +sub test_control_commands { + my ($config,@commands) = @_; + + # now we need to check to make sure that the control message actually did anything + # This is an eval because $ENV{DEBBUGS_CONFIG_FILE} isn't set at BEGIN{} time + eval "use Debbugs::Status qw(read_bug writebug);"; + while (my ($command,$control_command) = splice(@commands,0,2)) { + # just check to see that control doesn't explode + $control_command->{value} = " $control_command->{value}" if length $control_command->{value} + and $control_command->{value} !~ /^\s/; + send_message(to => 'control@bugs.something', + headers => [To => 'control@bugs.something', + From => 'foo@bugs.something', + Subject => "Munging a bug with $command", + ], + body => <{command} $control_command->{value} +thanks +EOF + ; + # now we need to check to make sure the control message was processed without errors + if (not ($control_command->{expect_error} // 0)) { + ok(system('sh','-c','find '.$config->{sendmail_dir}. + q( -type f | xargs grep -q "Subject: Processed: Munging a bug with $command") + ) == 0, + 'control@bugs.something'. "$command message was parsed without errors"); + } + # now we need to check to make sure that the control message actually did anything + my $status; + $status = read_bug(exists $control_command->{bug}?(bug => $control_command->{bug}):(bug=>1), + exists $control_command->{location}?(location => $control_command->{location}):(), + ); + is_deeply($status->{$control_command->{status_key}}, + $control_command->{status_value}, + "bug " . + (exists $control_command->{bug}?$control_command->{bug}:1). + " $command" + ) + or fail(Data::Dumper->Dump([$status],[qw(status)])); + } +} + +sub submit_bug { + state $spec = + {subject => {type => SCALAR, + default => 'Submitting a bug', + }, + body => {type => SCALAR, + default => 'This is a silly bug', + }, + submitter => {type => SCALAR, + default => 'foo@bugs.something', + }, + pseudoheaders => {type => HASHREF, + default => sub {{}}, + }, + package => {type => SCALAR, + default => 'foo', + }, + run_processall => {type => SCALAR, + default => 0, + }, + }; + my %param = + validate_with(params => \@_, + spec => $spec); + my $body = 'Package: '.$param{package}."\n"; + foreach my $key (keys %{$param{pseudoheaders}}) { + for my $val (ref($param{pseudoheaders}{$key}) ? + @{$param{pseudoheaders}{$key}} : + $param{pseudoheaders}{$key}) { + $body .= $key. ': '.$val."\n"; + } + } + $body .="\n".$param{body}; + send_message(to => 'submit@bugs.something', + headers => [To => 'submit@bugs.something', + From => $param{submitter}, + Subject => $param{subject}, + ], + run_processall => $param{run_processall}, + body => $body + ); } -$SIG{CHLD} = sub {}; { package DebbugsTest::HTTPServer; @@ -277,6 +406,98 @@ sub num_messages_sent { return $cur_size; } +=head2 create_postgresql_database + +C + +Create a postgresql database for testing; when the L object it +returns is destroyed (or goes out of scope) the database will be removed. + +=cut + +sub create_postgresql_database { + my $pgsql = Test::PostgreSQL->new(use_socket => 1) or + return undef; + my $base_dir = File::Spec->rel2abs(dirname(__FILE__).'/../..'); + my $installsql = + $base_dir . + '/bin/debbugs-installsql'; + # create the debversion extension + my $dbh = DBI->connect($pgsql->dsn); + $dbh->do(<dsn, + '--install', + '--deployment-dir',$base_dir.'/sql'); + + initialize_postgresql_database($pgsql,@_); + return $pgsql; +} + +=item iniitalize_postgresql_database + +C + +Initialize postgresql database by calling debbugs-loadsql appropriately. + +=cut + +sub initialize_postgresql_database { + my ($pgsql,@options) = @_; + my $loadsql = + File::Spec->rel2abs(dirname(__FILE__).'/../..'). + '/bin/debbugs-loadsql'; + + my $ftpdists = + File::Spec->rel2abs(dirname(__FILE__).'/../debian/dist'); + my $debinfo_dir = + File::Spec->rel2abs(dirname(__FILE__).'/../debian/debinfo'); + my %loadsql_commands = + (configuration => [], + suites => ['--ftpdists',$ftpdists], + debinfo => ['--debinfo-dir',$debinfo_dir], + packages => ['--ftpdists',$ftpdists], + maintainers => [], + ); + for my $command (keys %loadsql_commands) { + system($loadsql,$command, + '--dsn',$pgsql->dsn, + @options, + @{$loadsql_commands{$command}}) == 0 or + die "Unable to load $command"; + } +} + + +=item update_postgresql_database + +C + +Update the postgresql database by calling debbugs-loadsql appropriately. + +=cut +sub update_postgresql_database { + my ($pgsql,@options) = @_; + my $loadsql = + File::Spec->rel2abs(dirname(__FILE__).'/../..'). + '/bin/debbugs-loadsql'; + + my %loadsql_commands = + (bugs_and_logs => [], + ); + for my $command (keys %loadsql_commands) { + system($loadsql,$command, + '--dsn',$pgsql->dsn, + @options, + @{$loadsql_commands{$command}}) == 0 or + die "Unable to load $command"; + } +} + + 1;