The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use lib 't/lib';

use IO::Select;
use Perlbal::Test;
use Perlbal::Test::WebClient;

use Test::More tests => 12;

my $perlbal_port = new_port();
my $syslog_port = new_port();

$SIG{CHLD} = 'IGNORE';

use IO::Socket::INET;
my $syslogd = IO::Socket::INET->new(
    Proto       => 'udp',
    Type        => SOCK_DGRAM,
    LocalHost   => 'localhost',
    LocalPort   => $syslog_port,
    Blocking    => 0,
    Reuse       => 1,
) or die "failed to listen on udp $syslog_port: $!";
my $select = IO::Select->new($syslogd);

my $conf = qq{
LOAD Syslogger
LOAD TestPlugin

CREATE SERVICE fakeproxy
    SET role            = reverse_proxy
    SET listen          = 127.0.0.1:$perlbal_port

    SET syslog_host     = localhost
    SET syslog_port     = $syslog_port
    SET syslog_source   = localhost
    SET syslog_name     = explicit
    SET syslog_facility = 21
    SET syslog_severity = 5

    SET plugins         = Syslogger, TestPlugin
ENABLE fakeproxy
};

my $msock = start_server($conf);
ok($msock, 'perlbal started');

my $mgmt_port = mgmt_port();

my $wc = Perlbal::Test::WebClient->new;
$wc->server("127.0.0.1:$perlbal_port");
$wc->keepalive(1);
$wc->http_version('1.0');

my $resp = $wc->request({ host => "example.com", }, "foo/bar.txt");
ok($resp, "got a response");

is($resp->code, 200, "response code correct");

my @readable = $select->can_read(0.1);
if (ok(scalar(@readable), 'syslog got messages')) {
    my @msgs = <$syslogd>;
    if (is(scalar(@msgs), 7, 'syslog got right number of messages')) {
        like($msgs[0], qr/^<173>.*localhost explicit\[\d+\]: registering TestPlugin$/, 'logged Registering');
        like($msgs[1], qr/^<174>.*localhost explicit\[\d+\]: info message in plugin$/, 'logged info message');
        like($msgs[2], qr/^<171>.*localhost explicit\[\d+\]: error message in plugin$/, 'logged error message');
        like($msgs[3], qr/^<173>.*localhost explicit\[\d+\]: printing to stdout$/, 'logged via STDOUT');
        like($msgs[4], qr/^<173>.*localhost explicit\[\d+\]: printing to stderr$/, 'logged via STDERR');
        like($msgs[5], qr/^<174>.*localhost explicit\[\d+\]: beginning run$/, 'captured internal message');
        like($msgs[6], qr/^<173>.*localhost explicit\[\d+\]: handling request in TestPlugin$/, 'logged in request');
    }
}

1;