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

use Test::More tests => 2;
use IO::EventMux;
use Data::Dumper;

my $hasIOBuffered = 1;

eval 'require IO::Buffered';
if ($@) {
    $hasIOBuffered = 0;
}

SKIP: {
    skip "IO::Buffered not installed", 2 unless $hasIOBuffered;

    # FIXME: Add something where buffering would matter, ie try changing to none

    my $mux = IO::EventMux->new();

    sub string_fh {
        my $pid = open my $infh, "-|";
        die if not defined $pid;

        if ($pid == 0) {
            print @_;
            exit;
        }
        return $infh;
    }

    # Handle WSDL request
    my $data = "GET /soap.php?WSDL HTTP/1.0\x0d\x0a".
    "Host: localhost\x0d\x0a\x0d\x0a";

    my $goodfh = string_fh($data);
    $mux->add($goodfh, Buffered => new IO::Buffered(HTTP => 1));

    print "goodfh: $goodfh\n";

    my %types;
    while ($mux->handles > 0) {
        my $event = $mux->mux();
        print "type: $event->{type}\n";
        $types{$event->{fh}}{types} .= $event->{type};

        if($event->{type} eq 'read') {
            $types{$event->{fh}}{data} .= $event->{data};
        } else {
            print "$event->{type}: '".
            (defined $event->{data} ? $event->{data} : 'undef')
            ."'\n";
        }
    }

    is($types{$goodfh}{types}, join("", qw(read closing closed)),
        "Type came back in the right order");

    is($types{$goodfh}{data}, $data, "Data was correct");

};