157 lines
5.1 KiB
Perl
157 lines
5.1 KiB
Perl
package PGSM;
|
|
|
|
use String::Util qw(trim);
|
|
use File::Basename;
|
|
use File::Compare;
|
|
use Test::More;
|
|
|
|
our @ISA= qw( Exporter );
|
|
|
|
# These CAN be exported.
|
|
our @EXPORT = qw( pgsm_init_pg pgsm_start_pg pgsm_stop_pg pgsm_psql_cmd pgsm_setup_pg_stat_monitor pgsm_create_extension pgsm_reset_pg_stat_monitor pgsm_drop_extension );
|
|
|
|
# Instance of pg server that would be spanwed by TAP testing. A new server will be created for each TAP test.
|
|
our $pg_node;
|
|
|
|
# Expected .out filename of TAP testcase being executed. These are already part of repo under t/expected/*.
|
|
our $expected_filename_with_path;
|
|
|
|
# Major version of PG Server that we are using.
|
|
our $PG_MAJOR_VERSION;
|
|
|
|
# Result .out filename of TAP testcase being executed. Where needed, a new *.out will be created for each TAP test.
|
|
our $out_filename_with_path;
|
|
|
|
# Runtime output file that is used only for debugging purposes for comparison to PGSS, blocks and timings.
|
|
our $debug_out_filename_with_path;
|
|
|
|
BEGIN {
|
|
# Get PG Server Major version from pg_config
|
|
$PG_MAJOR_VERSION = `pg_config --version | awk {'print \$2'} | cut -f1 -d"." | sed -e 's/[^0-9].*\$//g'`;
|
|
$PG_MAJOR_VERSION =~ s/^\s+|\s+$//g;
|
|
|
|
# Depending upon PG server version load the required module at runtime when pgsm.pm is loaded.
|
|
my $node_module = $PG_MAJOR_VERSION > 14 ? "PostgreSQL::Test::Cluster" : "PostgresNode";
|
|
my $node_module_file = $node_module;
|
|
$node_module_file =~ s[::][/]g;
|
|
$node_module_file .= '.pm';
|
|
require $node_module_file;
|
|
$node_module->import;
|
|
}
|
|
|
|
sub pgsm_init_pg
|
|
{
|
|
print "Postgres major version: $PG_MAJOR_VERSION \n";
|
|
|
|
# For Server version 15 & above, spawn the server using PostgreSQL::Test::Cluster
|
|
if ($PG_MAJOR_VERSION > 14) {
|
|
$pg_node = PostgreSQL::Test::Cluster->new('pgsm_regression');
|
|
}
|
|
# For Server version 14 & below, spawn the server using PostgresNode
|
|
elsif ($PG_MAJOR_VERSION < 15) {
|
|
$pg_node = PostgresNode->get_new_node('pgsm_regression');
|
|
}
|
|
|
|
$pg_node->dump_info;
|
|
$pg_node->init;
|
|
return $pg_node;
|
|
}
|
|
|
|
sub append_to_file
|
|
{
|
|
my ($str) = @_;
|
|
|
|
# For Server version 15 & above, use PostgreSQL::Test::Utils to write to files
|
|
if ($PG_MAJOR_VERSION > 14) {
|
|
PostgreSQL::Test::Utils::append_to_file($out_filename_with_path, $str . "\n");
|
|
}
|
|
# For Server version 14 & below, use PostgresNode to write to files
|
|
elsif ($PG_MAJOR_VERSION < 15) {
|
|
TestLib::append_to_file($out_filename_with_path, $str . "\n");
|
|
}
|
|
chmod(0640 , $out_filename_with_path)
|
|
or die("unable to set permissions for $out_filename_with_path");
|
|
|
|
return;
|
|
}
|
|
|
|
sub append_to_debug_file
|
|
{
|
|
my ($str) = @_;
|
|
|
|
# For Server version 15 & above, use PostgreSQL::Test::Utils to write to files
|
|
if ($PG_MAJOR_VERSION > 14) {
|
|
PostgreSQL::Test::Utils::append_to_file($debug_out_filename_with_path, $str . "\n");
|
|
}
|
|
# For Server version 14 & below, use PostgresNode to write to files
|
|
elsif ($PG_MAJOR_VERSION < 15) {
|
|
TestLib::append_to_file($debug_out_filename_with_path, $str . "\n");
|
|
}
|
|
chmod(0640 , $debug_out_filename_with_path)
|
|
or die("unable to set permissions for $debug_out_filename_with_path");
|
|
|
|
return;
|
|
}
|
|
|
|
sub setup_files_dir
|
|
{
|
|
my ($perlfilename) = @_;
|
|
|
|
# Expected folder where expected output will be present
|
|
my $expected_folder = "t/expected";
|
|
|
|
# Results/out folder where generated results files will be placed
|
|
my $results_folder = "t/results";
|
|
|
|
# Check if results folder exists or not, create if it doesn't
|
|
unless (-d $results_folder)
|
|
{
|
|
mkdir $results_folder or die "Can't create folder $results_folder: $!\n";
|
|
}
|
|
|
|
# Check if expected folder exists or not, bail out if it doesn't
|
|
unless (-d $expected_folder)
|
|
{
|
|
BAIL_OUT "Expected files folder $expected_folder doesn't exist: \n";
|
|
}
|
|
|
|
#Remove .pl from filename and store in a variable
|
|
my @split_arr = split /\./, $perlfilename;
|
|
|
|
my $filename_without_extension = $split_arr[0];
|
|
|
|
# Create expected filename with path
|
|
my $expected_filename = "${filename_without_extension}.out";
|
|
|
|
if ($PG_MAJOR_VERSION <= 12 and "$filename_without_extension" == "001_settings_default")
|
|
{
|
|
$expected_filename = "${expected_filename}.${PG_MAJOR_VERSION}";
|
|
}
|
|
|
|
if ($PG_MAJOR_VERSION >= 15 and "$filename_without_extension" == "007_settings_pgsm_query_shared_buffer")
|
|
{
|
|
$expected_filename = "${expected_filename}.${PG_MAJOR_VERSION}";
|
|
}
|
|
|
|
$expected_filename_with_path = "${expected_folder}/${expected_filename}";
|
|
|
|
# Create results filename with path
|
|
my $out_filename = "${filename_without_extension}.out";
|
|
$out_filename_with_path = "${results_folder}/${out_filename}";
|
|
|
|
# Delete already existing result out file, if it exists.
|
|
if ( -f $out_filename_with_path)
|
|
{
|
|
unlink($out_filename_with_path) or die "Can't delete already existing $out_filename_with_path: $!\n";
|
|
}
|
|
|
|
$debug_out_filename_with_path = "${results_folder}/${out_filename}.debug";
|
|
}
|
|
|
|
sub compare_results
|
|
{
|
|
# Compare expected and results files and return the result
|
|
return compare($expected_filename_with_path, $out_filename_with_path);
|
|
}
|
|
|
|
1; |