Re: Improving log capture of TAP tests with IPC::Run - Mailing list pgsql-hackers

From Heikki Linnakangas
Subject Re: Improving log capture of TAP tests with IPC::Run
Date
Msg-id 559E4CFA.5040400@iki.fi
Whole thread Raw
In response to Re: Improving log capture of TAP tests with IPC::Run  (Michael Paquier <michael.paquier@gmail.com>)
Responses Re: Improving log capture of TAP tests with IPC::Run
Re: Improving log capture of TAP tests with IPC::Run
List pgsql-hackers
On 07/09/2015 04:50 AM, Michael Paquier wrote:
> On Thu, Jul 9, 2015 at 12:49 AM, Heikki Linnakangas wrote:
>>>> Looking at the manual page of Test::More, it looks like you could change
>>>> where the perl script's STDOUT and STDERR point to, because Test::More
>>>> takes
>>>> a copy of them (when? at program startup I guess..). That would be much
>>>> more
>>>> convenient than decorating every run call with ">> logfile".
>>>
>>>
>>> Hm. There are two types of logs we want to capture:
>>> 1) stdout and stderr from the subprocesses kicked by IPC::Run::run
>>> 2) Status messages written in the log file by the process running the
>>> tests.
>>> Perhaps we could redirect the output of stdout and stderr but I think
>>> that this is going to need an fd open from the beginning of the test
>>> until the end, with something like that:
>>> open my $test_logfile_fd, '>>', $test_logfile;
>>> *STDOUT = $test_logfile_fd;
>>> *STDERR = $test_logfile_fd;
>>>
>>> While that would work on OSX and Linux for sure, I suspect that this
>>> will not on Windows where two concurrent processes cannot write to the
>>> same file.
>>
>> Hmm, as long as you make sure all the processes use the same filehandle,
>> rather than open the log file separately, I think it should work. But it's
>> Windows, so who knows..
>
> And actually your patch works even on Windows. Tests are running and
> log can be captured in the same shape as Linux and OSX!

Great!

>> I came up with the attached, which does that. It also plays some tricks with
>> perl "tie", to copy the "ok - ..." lines that go to the console, to the log.
>>
>> I tried to test that on my Windows system, but I don't have IPC::Run
>> installed. How did you get that on Windows? Can you test this?
>
> I simply downloaded them from CPAN and put them in PERL5LIB. And it
> worked. For Windows, you will also need some adjustments to make the
> tests able to run (see the other thread related to support TAP in MSVC
> http://www.postgresql.org/message-id/CAB7nPqTQwphkDfZP07w7yBnbFNDhW_JBAMyCFAkarE2VWg8irQ@mail.gmail.com)
> like using SSPI for connection, adjusting listen_addresses. The patch
> attached, which is a merge of your patch and my MSVC stuff, is able to
> do that. This is just intended for testing, so feel free to use it if
> you want to check by yourself how logs are captured. I'll repost a new
> version of it on the other thread depending on the outcome here.
>
> -    system_or_bail(
> -"pg_basebackup -D $test_standby_datadir -p $port_master -x >>$log_path 2>&1");
> +    system_or_bail('pg_basebackup', '-D', $test_standby_datadir,
> +                   '-p', $port_master, '-x';
> A parenthesis is missing here.
>
> -               my $result = run(
> -                       [   'pg_rewind',
> -                               "--source-server",
> -                               "port=$port_standby dbname=postgres",
> -                               "--target-pgdata=$test_master_datadir" ],
> -                       '>>',
> -                       $log_path,
> -                       '2>&1');
> -               ok($result, 'pg_rewind remote');
> +               command_ok(['pg_rewind',
> +                                       "--source-server",
> +                                       "port=$port_standby dbname=postgres",
> +                                       "--target-pgdata=$test_master_datadir"],
> +                                  'pg_rewind remote');
> As long as we are on it, I think that we should add --debug here to
> make the logs more useful.
>
> Except that this patch looks good to me. Thanks for the black magic on
> stdout/stderr handling.

Thanks, fixed the parenthesis and committed. The missing --debug is a 
separate issue.

- Heikki



pgsql-hackers by date:

Previous
From: Ashutosh Bapat
Date:
Subject: Re: Transactions involving multiple postgres foreign servers
Next
From: Zhaomo Yang
Date:
Subject: Re: Implementation of global temporary tables?