DBIO-MySQL-Async
view release on metacpan or search on metacpan
t/11-access-broker-live.t view on Meta::CPAN
my $provider = $storage->_conninfo_provider;
ok ref $provider eq 'CODE',
'storage exposes a conninfo provider coderef when broker is attached';
my $calls_before = $broker->calls;
$provider->();
is $broker->calls, $calls_before + 1,
'conninfo provider calls connect_info_for_storage on each invocation';
# ===== 2. Schema->connect($broker) path =====
{
package TestSchemaMySQL;
use base 'DBIO::Schema';
__PACKAGE__->load_components('MySQL::Async');
}
my $schema = TestSchemaMySQL->connect($broker);
isa_ok $schema->storage, 'DBIO::MySQL::Async::Storage',
'Schema->connect($broker) creates async storage';
is $schema->storage->access_broker, $broker,
'schema storage has broker attached';
is $schema->storage->access_broker_mode, 'write',
'schema storage broker mode defaults to write';
# ===== 3. Live connectivity via broker =====
my $live_storage = DBIO::MySQL::Async::Storage->new(undef);
$live_storage->connect_info([$broker]);
my $connected = 0;
my $connected_err;
{
my $f_connected = Future->new;
my $mdb;
my $conninfo = $live_storage->_conninfo_hash;
my %ev_args;
if (ref $conninfo eq 'HASH' && %$conninfo) {
%ev_args = %$conninfo;
} elsif (ref $conninfo eq 'ARRAY') {
# conninfo is an array of one hashref
%ev_args = %{$conninfo->[0]} if $conninfo->[0] && %{$conninfo->[0]};
} elsif (defined $conninfo && !ref $conninfo) {
# String DSN - need to parse it
if ($conninfo =~ /^dbi:(?:mysql|mysql\.rdbs|mariadb):(.+)/i) {
my $params = $1;
for my $pair (split /;/, $params) {
my ($k, $v) = split /=/, $pair, 2;
$k = 'database' if $k eq 'dbname';
$ev_args{$k} = $v if defined $k && defined $v;
}
# Use 127.0.0.1 for TCP if host is not set
$ev_args{host} = '127.0.0.1' unless exists $ev_args{host};
$ev_args{port} = 3306 unless exists $ev_args{port};
}
# Apply credentials from environment if not already set
$ev_args{user} = $ENV{DBIO_TEST_MYSQL_USER} if $ENV{DBIO_TEST_MYSQL_USER} && !$ev_args{user};
$ev_args{password} = $ENV{DBIO_TEST_MYSQL_PASS} if $ENV{DBIO_TEST_MYSQL_PASS} && !$ev_args{password};
}
$ev_args{on_connect} = sub { $f_connected->done(1) unless $f_connected->is_ready };
$ev_args{on_error} = sub {
$connected_err = $_[0];
$f_connected->done(0) unless $f_connected->is_ready;
};
eval {
$mdb = EV::MariaDB->new(%ev_args);
};
if ($@) {
plan skip_all => "EV::MariaDB->new failed: $@";
}
EV::run until $f_connected->is_ready;
$connected = $f_connected->get;
if (!$connected) {
plan skip_all => "Could not connect to MySQL/MariaDB via broker conninfo: $connected_err";
}
# Quick sanity query
my $done = 0;
my ($rows, $err);
$mdb->prepare('SELECT ? AS source', sub {
my ($stmt, $perr) = @_;
die "prepare failed: $perr" if $perr;
$mdb->execute($stmt, ['access_broker'], sub {
($rows, $err) = @_;
$done = 1;
});
});
EV::run until $done;
ok !$err, 'no error on broker-conninfo query';
is $rows->[0][0], 'access_broker',
'live query works with conninfo from broker';
$mdb->close_async(sub {});
}
ok $connected, 'connected to MySQL/MariaDB using broker-supplied conninfo';
# ===== 4. Broker refresh causes new conninfo fetch =====
my $calls_before_refresh = $broker->calls;
$broker->refresh;
is $broker->needs_refresh, 1, 'broker needs_refresh after ->refresh';
my $info_after_refresh = $live_storage->_current_async_connect_info('write');
ok defined $info_after_refresh, '_current_async_connect_info returns data after refresh';
is $broker->calls, $calls_before_refresh + 1,
'_current_async_connect_info fetched fresh info from broker after refresh';
ok !$broker->needs_refresh,
'needs_refresh cleared after connect_info_for_storage call';
( run in 0.435 second using v1.01-cache-2.11-cpan-f4a522933cf )