On Sun, Aug 9, 2015 at 11:19 PM, Andrew Dunstan <[email protected]> wrote:
>
>
> On 08/09/2015 08:41 AM, Michael Paquier wrote:
>>
>> On Sun, Aug 9, 2015 at 1:40 AM, Andrew Dunstan <[email protected]>
>> wrote:
>>>
>>> On 08/08/2015 09:31 AM, Robert Haas wrote:
>>>>
>>>> On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <[email protected]>
>>>> wrote:
>>>>>
>>>>> That certainly isn't what happens, and given the way this is done in
>>>>> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir()
>>>>> function,
>>>>> it's not clear how we could do that easily.
>>>>
>>>> <shot-in-the-dark>
>>>>
>>>> Set cleanup to false and manually remove the directory later in the
>>>> code, so that stuff runs only if we haven't died sooner?
>>>>
>>>> </shot-in-the-dark>
>>>>
>>> Yeah, maybe. I'm thinking of trying to do it more globally, like in
>>> src/Makefile.global.in. That way we wouldn't have to add new code to
>>> every
>>> test file.
>>
>> If we rely on END to clean up the temporary data folder, there is no
>> need to impact each test file, just the test functions called in
>> TestLib.pm that could switch a flag to not perform any cleanup at the
>> end of the run should an unexpected result be found. Now I am as well
>> curious to see what you have in mind with manipulating
>> Makefile.global.
>
> See attached. If you have a better idea please post your patch.
Sure. Attached is what I have in mind. Contrary to your version we
keep around temp paths should a run succeed after one that has failed
when running make check multiple times in a row. Perhaps it does not
matter much in practice as log files get removed at each new run but I
think that this allows a finer control in case of failure. Feel free
to have a look.
--
Michael
diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
index 4927d45..11f774e 100644
--- a/src/test/perl/TestLib.pm
+++ b/src/test/perl/TestLib.pm
@@ -35,6 +35,7 @@ our @EXPORT = qw(
use Cwd;
use File::Basename;
+use File::Path qw(rmtree);
use File::Spec;
use File::Temp ();
use IPC::Run qw(run start);
@@ -107,21 +108,24 @@ $ENV{PGPORT} = int($ENV{PGPORT}) % 65536;
# Helper functions
#
+my $temp_cleanup = 1;
+my @temp_dirs = ();
sub tempdir
{
- return File::Temp::tempdir(
+ my $path = File::Temp::tempdir(
'tmp_testXXXX',
DIR => $ENV{TESTDIR} || cwd(),
- CLEANUP => 1);
+ CLEANUP => 0);
+ push(@temp_dirs, $path);
+ return $path;
}
sub tempdir_short
{
-
# Use a separate temp dir outside the build tree for the
# Unix-domain socket, to avoid file name length issues.
- return File::Temp::tempdir(CLEANUP => 1);
+ return File::Temp::tempdir(CLEANUP => 0);
}
# Initialize a new cluster for testing.
@@ -217,6 +221,13 @@ END
system_log('pg_ctl', '-D', $test_server_datadir, '-m',
'immediate', 'stop');
}
+
+ # Cleanup any temporary directory created
+ return if (!$temp_cleanup);
+ foreach my $temp_dir (@temp_dirs)
+ {
+ rmtree($temp_dir);
+ }
}
sub psql
@@ -278,14 +289,16 @@ sub command_ok
{
my ($cmd, $test_name) = @_;
my $result = run_log($cmd);
- ok($result, $test_name);
+ my $err_num = ok($result, $test_name);
+ $temp_cleanup = 0 if (!$err_num);
}
sub command_fails
{
my ($cmd, $test_name) = @_;
my $result = run_log($cmd);
- ok(!$result, $test_name);
+ my $err_num = ok(!$result, $test_name);
+ $temp_cleanup = 0 if (!$err_num);
}
sub command_exit_is
@@ -304,7 +317,8 @@ sub command_exit_is
# that, use $h->full_result on Windows instead.
my $result = ($Config{osname} eq "MSWin32") ?
($h->full_results)[0] : $h->result(0);
- is($result, $expected, $test_name);
+ my $err_num = is($result, $expected, $test_name);
+ $temp_cleanup = 0 if (!$err_num);
}
sub program_help_ok
@@ -313,9 +327,13 @@ sub program_help_ok
my ($stdout, $stderr);
print("# Running: $cmd --help\n");
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");
+ my $err_num;
+ $err_num = ok($result, "$cmd --help exit code 0");
+ $temp_cleanup = 0 if (!$err_num);
+ $err_num = isnt($stdout, '', "$cmd --help goes to stdout");
+ $temp_cleanup = 0 if (!$err_num);
+ $err_num = is($stderr, '', "$cmd --help nothing to stderr");
+ $temp_cleanup = 0 if (!$err_num);
}
sub program_version_ok
@@ -324,9 +342,13 @@ sub program_version_ok
my ($stdout, $stderr);
print("# Running: $cmd --version\n");
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");
+ my $err_num;
+ $err_num = ok($result, "$cmd --version exit code 0");
+ $temp_cleanup = 0 if (!$err_num);
+ $err_num = isnt($stdout, '', "$cmd --version goes to stdout");
+ $temp_cleanup = 0 if (!$err_num);
+ $err_num = is($stderr, '', "$cmd --version nothing to stderr");
+ $temp_cleanup = 0 if (!$err_num);
}
sub program_options_handling_ok
@@ -335,20 +357,27 @@ sub program_options_handling_ok
my ($stdout, $stderr);
print("# Running: $cmd --not-a-valid-option\n");
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");
+ \$stderr;
+ my $err_num;
+ $err_num = ok(!$result, "$cmd with invalid option nonzero exit code");
+ $temp_cleanup = 0 if (!$err_num);
+ $err_num = isnt($stderr, '', "$cmd with invalid option prints error message");
+ $temp_cleanup = 0 if (!$err_num);
}
sub command_like
{
my ($cmd, $expected_stdout, $test_name) = @_;
my ($stdout, $stderr);
+ my $err_num;
print("# Running: " . join(" ", @{$cmd}) . "\n");
my $result = run $cmd, '>', \$stdout, '2>', \$stderr;
- ok($result, "@$cmd exit code 0");
+ $err_num = ok($result, "@$cmd exit code 0");
+ $temp_cleanup = 0 if (!$err_num);
is($stderr, '', "@$cmd no stderr");
- like($stdout, $expected_stdout, "$test_name: matches");
+ $temp_cleanup = 0 if (!$err_num);
+ $err_num = like($stdout, $expected_stdout, "$test_name: matches");
+ $temp_cleanup = 0 if (!$err_num);
}
sub issues_sql_like
@@ -356,9 +385,12 @@ sub issues_sql_like
my ($cmd, $expected_sql, $test_name) = @_;
truncate $test_server_logfile, 0;
my $result = run_log($cmd);
- ok($result, "@$cmd exit code 0");
+ my $err_num;
+ $err_num = ok($result, "@$cmd exit code 0");
+ $temp_cleanup = 0 if (!$err_num);
my $log = slurp_file($test_server_logfile);
- like($log, $expected_sql, "$test_name: SQL found in server log");
+ $err_num = like($log, $expected_sql, "$test_name: SQL found in server log");
+ $temp_cleanup = 0 if (!$err_num);
}
1;
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers