#!perl
# vim:ft=perl:
#
# This script tests whether timeout actually works.

use strict;
use warnings;

use Test::More;

use Try::Tiny;
use IO::Socket;
use RT::Client::REST;
use LWP::UserAgent;

plan( skip_all => "LWP::UserAgent 6.04 does not know how to time out, "
      . "see RT #81799" )
  if $LWP::UserAgent::VERSION eq '6.04';

my $server = IO::Socket::INET->new(
    Type   => SOCK_STREAM,
    Reuse  => 1,
    Listen => 10,
) or die "Could not set up TCP server: $@";

my $port = $server->sockport;

my $pid = fork;    # Fork
die "Could not fork: $!" unless defined $pid;

if ( 0 == $pid ) {    # Child
    my $buf;
    my $client = $server->accept;
    1 while ( $client->read( $buf, 1024 ) );
    exit;
}

plan tests => 8;      # Parent
for my $timeout ( 1, 2, 5, 10 ) {
    my $rt = RT::Client::REST->new(
        server  => "http://127.0.0.1:$port",
        timeout => $timeout,
    );
    my $t1 = time;
    my ( $e, $t2 );
    try {
        $rt->login(qw(username a password b));
    }
    catch {
        die $_ unless blessed $_ && $_->can('rethrow');
        if ( $_->isa('Exception::Class::Base') ) {
            $t2 = time;
            $e  = $_;
        }
        else {
            $_->rethrow;
        }
    };

    isa_ok( $e, 'RT::Client::REST::RequestTimedOutException' );
    ok( $t2 - $t1 >= $timeout, "Timed out after $timeout seconds" );
}