On Wed, Oct 13, 2021 at 09:04:11PM -0700, Peter Geoghegan wrote:
> On Wed, Oct 13, 2021 at 9:00 PM Michael Paquier <[email protected]> wrote:
>> It does not change the fact that the test needs to be fixed.  TAP
>> tests should be designed to not be influenced by the external world.
> 
> Right.

Hearing nothing, I have just poked at this problem.  And I'd rather
make all the tests go through PostgresNode::psql from which it is
possible to grab stdout, stderr and the result code, as we could miss
local changes in this test if we need a centralized fix, for problems
like the one with SIGPIPE where we don't use -c in a psql command.
Peter, does it take care of your problem?
--
Michael
diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl
index 685744744a..eb9041d1f3 100644
--- a/src/bin/psql/t/001_basic.pl
+++ b/src/bin/psql/t/001_basic.pl
@@ -15,10 +15,46 @@ program_options_handling_ok('psql');
 my ($stdout, $stderr);
 my $result;
 
+# Execute a psql command and check its result patterns.
+sub psql_like
+{
+	local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+	my $node            = shift;
+	my $test_name       = shift;
+	my $query           = shift;
+	my $expected_stdout = shift;
+	my $expected_stderr = shift;
+
+	die "cannot specify both expected stdout and stderr here"
+	  if (defined($expected_stdout) && defined($expected_stderr));
+
+	# Use the context of a WAL sender, some of the tests rely on that.
+	my ($ret, $stdout, $stderr) = $node->psql(
+		'postgres', $query,
+		on_error_die => 0,
+		replication  => 'database');
+
+	if (defined($expected_stdout))
+	{
+		is($ret,    0,  "$test_name: expected result code");
+		is($stderr, '', "$test_name: no stderr");
+		like($stdout, $expected_stdout, "$test_name: stdout matches");
+	}
+	if (defined($expected_stderr))
+	{
+		isnt($ret, 0, "$test_name: expected result code");
+		like($stderr, $expected_stderr, "$test_name: stderr matches");
+	}
+
+	return;
+}
+
 # test --help=foo, analogous to program_help_ok()
 foreach my $arg (qw(commands variables))
 {
-	$result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>', \$stderr;
+	$result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>',
+	  \$stderr;
 	ok($result, "psql --help=$arg exit code 0");
 	isnt($stdout, '', "psql --help=$arg goes to stdout");
 	is($stderr, '', "psql --help=$arg nothing to stderr");
@@ -34,11 +70,13 @@ max_wal_senders = 4
 });
 $node->start;
 
-$node->command_like([ 'psql', '-c', '\copyright' ], qr/Copyright/, '\copyright');
-$node->command_like([ 'psql', '-c', '\help' ], qr/ALTER/, '\help without arguments');
-$node->command_like([ 'psql', '-c', '\help SELECT' ], qr/SELECT/, '\help');
-
+psql_like($node, '\copyright', '\copyright', qr/Copyright/, undef);
+psql_like($node, '\help without arguments', '\help', qr/ALTER/, undef);
+psql_like($node, '\help with argument', '\help SELECT', qr/SELECT/, undef);
 
 # Test clean handling of unsupported replication command responses
-$node->command_fails_like([ 'psql', '-d', 'replication=database', '-c', 'START_REPLICATION 0/0' ],
-	qr/^unexpected PQresultStatus: 8$/, 'handling of unexpected PQresultStatus');
+psql_like(
+	$node,
+	'handling of unexpected PQresultStatus',
+	'START_REPLICATION 0/0',
+	undef, qr/unexpected PQresultStatus: 8$/);

Attachment: signature.asc
Description: PGP signature

Reply via email to