diff options
Diffstat (limited to 'src/test/perl/TestLib.pm')
-rw-r--r-- | src/test/perl/TestLib.pm | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm new file mode 100644 index 00000000000..7c378e0fa97 --- /dev/null +++ b/src/test/perl/TestLib.pm @@ -0,0 +1,186 @@ +package TestLib; + +use strict; +use warnings; + +use Exporter 'import'; +our @EXPORT = qw( + tempdir + start_test_server + restart_test_server + psql + system_or_bail + + command_ok + command_fails + command_exit_is + program_help_ok + program_version_ok + program_options_handling_ok + command_like + issues_sql_like +); + +use Cwd; +use File::Spec; +use File::Temp (); +use Test::More; +BEGIN { + eval { + require IPC::Run; + import IPC::Run qw(run start); + 1; + } or do { + plan skip_all => "IPC::Run not available"; + } +} + +delete $ENV{PGCONNECT_TIMEOUT}; +delete $ENV{PGDATA}; +delete $ENV{PGDATABASE}; +delete $ENV{PGHOSTADDR}; +delete $ENV{PGREQUIRESSL}; +delete $ENV{PGSERVICE}; +delete $ENV{PGSSLMODE}; +delete $ENV{PGUSER}; + +if (!$ENV{PGPORT}) { + $ENV{PGPORT} = 65432; +} + +$ENV{PGPORT} = int($ENV{PGPORT}) % 65536; + + +# +# Helper functions +# + + +sub tempdir { + return File::Temp::tempdir('testXXXX', DIR => cwd(), CLEANUP => 1); +} + +my ($test_server_datadir, $test_server_logfile); + +sub start_test_server { + my ($tempdir) = @_; + my $ret; + + system "initdb -D $tempdir/pgdata -A trust -N >/dev/null"; + $ret = system 'pg_ctl', '-D', "$tempdir/pgdata", '-s', '-w', '-l', "$tempdir/logfile", '-o', "--fsync=off -k $tempdir --listen-addresses='' --log-statement=all", 'start'; + + if ($ret != 0) { + system('cat', "$tempdir/logfile"); + BAIL_OUT("pg_ctl failed"); + } + + $ENV{PGHOST} = $tempdir; + $test_server_datadir = "$tempdir/pgdata"; + $test_server_logfile = "$tempdir/logfile"; +} + +sub restart_test_server { + system 'pg_ctl', '-s', '-D', $test_server_datadir, '-w', '-l', $test_server_logfile, 'restart'; +} + +END { + if ($test_server_datadir) { + system 'pg_ctl', '-D', $test_server_datadir, '-s', '-w', '-m', 'immediate', 'stop'; + } +} + +sub psql { + my ($dbname, $sql) = @_; + run ['psql', '-X', '-q', '-d', $dbname, '-f', '-'], '<', \$sql or die; +} + +sub system_or_bail { + system(@_) == 0 or BAIL_OUT("system @_ failed: $?"); +} + + +# +# Test functions +# + + +sub command_ok { + my ($cmd, $test_name) = @_; + my $result = run $cmd, '>', File::Spec->devnull(), '2>', File::Spec->devnull(); + ok($result, $test_name); +} + +sub command_fails { + my ($cmd, $test_name) = @_; + my $result = run $cmd, '>', File::Spec->devnull(), '2>', File::Spec->devnull(); + ok(!$result, $test_name); +} + +sub command_exit_is { + my ($cmd, $expected, $test_name) = @_; + my $h = start $cmd, '>', File::Spec->devnull(), '2>', File::Spec->devnull(); + $h->finish(); + is($h->result(0), $expected, $test_name); +} + +sub program_help_ok { + my ($cmd) = @_; + subtest "$cmd --help" => sub { + plan tests => 3; + my ($stdout, $stderr); + my $result = run [$cmd, '--help'], '>', \$stdout, '2>', \$stderr; + ok($result, "$cmd --help exit code 0"); + isnt($stdout, '', "$cmd --help goes to stdout"); + is($stderr, '', "$cmd --help nothing to stderr"); + }; +} + +sub program_version_ok { + my ($cmd) = @_; + subtest "$cmd --version" => sub { + plan tests => 3; + my ($stdout, $stderr); + my $result = run [$cmd, '--version'], '>', \$stdout, '2>', \$stderr; + ok($result, "$cmd --version exit code 0"); + isnt($stdout, '', "$cmd --version goes to stdout"); + is($stderr, '', "$cmd --version nothing to stderr"); + }; +} + +sub program_options_handling_ok { + my ($cmd) = @_; + subtest "$cmd options handling" => sub { + plan tests => 2; + my ($stdout, $stderr); + my $result = run [$cmd, '--not-a-valid-option'], '>', \$stdout, '2>', \$stderr; + ok(!$result, "$cmd with invalid option nonzero exit code"); + isnt($stderr, '', "$cmd with invalid option prints error message"); + }; +} + +sub command_like { + my ($cmd, $expected_stdout, $test_name) = @_; + subtest $test_name => sub { + plan tests => 3; + my ($stdout, $stderr); + my $result = run $cmd, '>', \$stdout, '2>', \$stderr; + ok($result, "@$cmd exit code 0"); + is($stderr, '', "@$cmd no stderr"); + like($stdout, $expected_stdout, "$test_name: matches"); + }; +} + +sub issues_sql_like { + my ($cmd, $expected_sql, $test_name) = @_; + subtest $test_name => sub { + plan tests => 2; + my ($stdout, $stderr); + truncate $test_server_logfile, 0; + my $result = run $cmd, '>', \$stdout, '2>', \$stderr; + ok($result, "@$cmd exit code 0"); + my $log = `cat $test_server_logfile`; + like($log, $expected_sql, "$test_name: SQL found in server log"); + }; +} + +1; |