EV-Pg
view release on metacpan or search on metacpan
t/01_connect.t view on Meta::CPAN
);
my $t = EV::timer(5, 0, sub { EV::break });
EV::run;
ok(defined $err_msg, 'bad dbname: on_error fired');
like($err_msg, qr/database|does not exist/i,
'bad dbname: error mentions database');
}
# Default on_error (die) is caught and demoted to warn; the process survives
{
my $warned = '';
local $SIG{__WARN__} = sub { $warned .= $_[0] };
my $pg = EV::Pg->new(
conninfo => "$conninfo dbname=this_db_does_not_exist_xyz",
);
my $t = EV::timer(5, 0, sub { EV::break });
my $w = EV::timer(0.05, 0.05, sub { EV::break if $warned });
EV::run;
ok(1, 'default on_error: process survived failed connect');
like($warned, qr/exception in error handler/,
'default on_error: die demoted to warn');
}
# Unusable connection string croaks synchronously from connect
{
eval { EV::Pg->new(
conninfo => 'host=/tmp/ev_pg_nonexistent_socket_dir dbname=postgres',
on_error => sub {},
) };
like($@, qr/connection failed/,
'bad socket dir: connect croaks synchronously');
}
# Test 3: reset while connecting (connecting == 1)
{
my $connected = 0;
my $pg;
$pg = EV::Pg->new(
conninfo => $conninfo,
on_connect => sub {
if (!$connected) {
$connected = 1;
# immediately reset â starts a new connect while just finished
$pg->on_connect(sub {
ok($pg->is_connected, 'reset during connect: reconnected');
EV::break;
});
$pg->reset;
return;
}
},
on_error => sub { diag "Error: $_[0]"; EV::break },
);
my $t = EV::timer(5, 0, sub { EV::break });
EV::run;
ok($connected, 'reset during connect: first connect succeeded');
$pg->finish if $pg && $pg->is_connected;
}
# connect() from inside on_error croaks: the failed conn is still installed
# while the handler runs. Timer-deferred connect (endpoint switching) works.
{
my ($croak, $switched);
my $pg;
$pg = EV::Pg->new(
conninfo => "$conninfo dbname=this_db_does_not_exist_xyz",
on_connect => sub {
$switched = 1;
EV::break;
},
on_error => sub {
return if $croak;
$croak = eval { $pg->connect($conninfo); 'NO-CROAK' };
$croak = "CROAK:$@" if $@;
my $t; $t = EV::timer(0.1, 0, sub {
undef $t;
$pg->finish;
$pg->connect($conninfo);
});
},
);
my $t = EV::timer(10, 0, sub { EV::break });
EV::run;
$pg->finish if $pg && $pg->is_connected;
like($croak, qr/previous connection failed/,
'connect in on_error: actionable croak (not "already connected")');
ok($switched, 'connect in on_error: timer-deferred connect switches endpoints');
}
( run in 0.601 second using v1.01-cache-2.11-cpan-cb04b646d8c )