use Cwd qw(getcwd);
use Debbugs::MIME qw(create_mime_message);
use File::Basename qw(dirname basename);
+use IPC::Open3;
+use IO::Handle;
use Params::Validate qw(validate_with :types);
"$config_dir/indices/sources" => <<END,
foo main foo
END
+ "$config_dir/pseudo-packages.description" => '',
);
while (my ($file,$contents) = each %files_to_create) {
system('mkdir','-p',dirname($file));
}
);
$ENV{LOCAL_PART} = $param{to};
- my $receive = new IO::File ('|scripts/receive.in') or die "Unable to start receive.in: $!";
-
- print {$receive} create_mime_message($param{headers},
- $param{body}) or die "Unable to to print to receive.in";
- close($receive) or die "Unable to close receive.in";
- $? == 0 or die "receive.in failed";
+ my ($rfd,$wfd);
+ my $output='';
+ local $SIG{PIPE} = 'IGNORE';
+ local $SIG{CHLD} = sub {};
+ my $pid = open3($wfd,$rfd,$rfd,'scripts/receive.in')
+ or die "Unable to start receive.in: $!";
+ print {$wfd} create_mime_message($param{headers},
+ $param{body}) or die "Unable to to print to receive.in";
+ close($wfd) or die "Unable to close receive.in";
+ my $err = $? >> 8;
+ my $childpid = waitpid($pid,0);
+ if ($childpid != -1) {
+ $err = $? >> 8;
+ print STDERR "receive.in pid: $pid doesn't match childpid: $childpid\n" if $childpid != $pid;
+ }
+ if ($err != 0 ) {
+ my $rfh = IO::Handle->new_from_fd($rfd,'r') or die "Unable to create filehandle: $!";
+ $rfh->blocking(0);
+ my $rv;
+ while ($rv = $rfh->sysread($output,1000,length($output))) {}
+ if (not defined $rv) {
+ print STDERR "Reading from STDOUT/STDERR would have blocked.";
+ }
+ print STDERR $output,qq(\n);
+ die "receive.in failed with exit status $err";
+ }
# now we should run processall to see if the message gets processed
if ($param{run_processall}) {
system('scripts/processall.in') == 0 or die "processall.in failed";
}
}
+{
+ package DebbugsTest::HTTPServer;
+ use base qw(HTTP::Server::Simple::CGI);
+
+ our $child_pid = undef;
+ our $webserver = undef;
+ our $server_handler = undef;
+
+ END {
+ if (defined $child_pid) {
+ # stop the child
+ kill(15,$child_pid);
+ waitpid(-1,0);
+ }
+ }
+
+ sub fork_and_create_webserver {
+ my ($handler,$port) = @_;
+ $port ||= 8080;
+ if (defined $child_pid) {
+ die "We appear to have already forked once";
+ }
+ $server_handler = $handler;
+ my $pid = fork;
+ return 0 if not defined $pid;
+ if ($pid) {
+ $child_pid = $pid;
+ # Wait here for a second to let the child start up
+ sleep 1;
+ return $pid;
+ }
+ else {
+ $webserver = DebbugsTest::HTTPServer->new($port);
+ $webserver->run;
+ }
+
+ }
+
+ sub handle_request {
+ if (defined $server_handler) {
+ $server_handler->(@_);
+ }
+ else {
+ warn "No handler defined\n";
+ print "No handler defined\n";
+ }
+ }
+}
+
1;