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 )