use strict;
use warnings;
use Test::More;
use DBI;
use File::Temp;
use vars qw($test_dsn $test_user $test_password);
use lib 't', '.';
require 'lib.pl';
sub fatal_tmpdir_error {
my $err = $@;
$err =~ s/ at \S+ line \d+\.?\s*$//;
$err = 'unknown error' unless $err;
fatal("Cannot create temporary directory: $err");
if ( $ENV{CONNECTION_TESTING} ) {
BAIL_OUT "Cannot create temporary directory: $err";
} else {
plan skip_all => "Cannot create temporary directory: $err";
}
}
sub fatal_connection_error {
my $err = $@;
$err =~ s/ at \S+ line \d+\.?\s*$//;
$err = 'unknown error' unless $err;
if ( $ENV{CONNECTION_TESTING} ) {
BAIL_OUT "No connection to embedded server: $err";
} else {
diag "No connection to embedded server: $err";
done_testing;
exit;
}
}
sub connect_to_embedded_server {
my ($tmpdir, $database) = @_;
my $lang_arg = $ENV{DBD_MARIADB_TESTLANGDIR} ? ",--language=$ENV{DBD_MARIADB_TESTLANGDIR}" : '';
my $emb_dsn = "DBI:MariaDB:host=embedded;mariadb_embedded_options=--datadir=$tmpdir$lang_arg;";
$emb_dsn .= "database=$database" if defined $database;
return eval { DBI->connect($emb_dsn, undef, undef, { RaiseError => 1, PrintError => 0 }) };
}
sub connect_to_real_server {
my $dbh = eval { DBI->connect($test_dsn, $test_user, $test_password, { RaiseError => 1, PrintError => 0, AutoCommit => 0 }) };
if (not defined $dbh) {
my $err = $@;
$err =~ s/ at \S+ line \d+\.?\s*$//;
$err = 'unknown error' unless $err;
if ( $ENV{CONNECTION_TESTING} ) {
BAIL_OUT "No connection to real non-embedded server: $err";
} else {
diag "No connection to real non-embedded server: $err";
}
}
return $dbh;
}
my $tmpdir1 = eval { File::Temp::tempdir(CLEANUP => 1) } or fatal_tmpdir_error();
my $tmpdir2 = eval { File::Temp::tempdir(CLEANUP => 1) } or fatal_tmpdir_error();
my $dbh1 = connect_to_embedded_server($tmpdir1);
plan skip_all => $DBI::errstr if not defined $dbh1 and $DBI::errstr =~ /Embedded server is not supported/;
ok(defined $dbh1, "Connected to embedded server with datadir in $tmpdir1") or fatal_connection_error();
ok($dbh1->do('CREATE DATABASE dbd_mariadb_embedded'), 'Created database');
ok($dbh1->do('USE dbd_mariadb_embedded'), 'Switched to database');
my $dbh2 = connect_to_embedded_server($tmpdir1, 'dbd_mariadb_embedded');
ok(defined $dbh2, "Second connection to embedded server with datadir in $tmpdir1") or fatal_connection_error();
my $dbh3 = connect_to_embedded_server($tmpdir1, 'dbd_mariadb_embedded');
ok(defined $dbh3, "Third conection to embedded server with datadir in $tmpdir1") or fatal_connection_error();
ok($dbh1->do('CREATE TABLE dbd_mariadb_embedded(id INT)'), 'Created table with first connection');
ok($dbh2->do('INSERT INTO dbd_mariadb_embedded(id) VALUES(10)'), 'Inserted values into table with second connection');
is(scalar $dbh1->selectrow_array('SELECT id FROM dbd_mariadb_embedded'), 10, 'Fetched value from table with first connection is correct');
is(scalar $dbh2->selectrow_array('SELECT id FROM dbd_mariadb_embedded'), 10, 'Fetched value from table with second connection is correct');
is(scalar $dbh3->selectrow_array('SELECT id FROM dbd_mariadb_embedded'), 10, 'Fetched value from table with third connection is correct');
ok(!defined connect_to_embedded_server($tmpdir2), "Not connected to different embedded server with datadir in $tmpdir2 while previous connection to embedded server are still active");
SKIP: {
my $dbh4 = connect_to_real_server();
skip 'No connection to real non-embedded server', 3 unless defined $dbh4;
ok(defined $dbh4, 'Connected to real non-embedded server');
ok(!defined $dbh4->selectrow_array('SHOW TABLES LIKE "dbd_mariadb_embedded"'), 'Real non-embedded server does not have tables from embedded server');
ok($dbh4->disconnect(), 'Disconnected from real non-embedded server');
}
ok($dbh1->disconnect(), 'Closed first connection to embedded server');
ok($dbh2->disconnect(), 'Closed second connection to embedded server');
ok($dbh3->disconnect(), 'Closed third connection to embedded server');
done_testing;