Hello David,
Please find attached v2, name is now \warn.
Patch applies cleanly, compiles, "make check ok", although there are no tests. Doc gen ok.
Code is pretty straightforward.I'd put the commands in alphabetical order (echo, qecho, warn) instead of e/w/q in the condition.
The -n trick does not appear in the help lines, ISTM that it could fit, so maybe it could be added, possibly something like:
\echo [-n] [TEXT] write string to stdout, possibly without trailing newline and same for \warn and \qecho?
How might we test this portably?
Hmmm... TAP tests are expected to be portable. Attached a simple POC, which could be extended to test many more things which are currently out of coverage (src/bin/psql stuff is covered around 40% only).
-- Fabien.
diff --git a/src/bin/psql/.gitignore b/src/bin/psql/.gitignore index c2862b12d6..d324c1c1fa 100644 --- a/src/bin/psql/.gitignore +++ b/src/bin/psql/.gitignore @@ -3,3 +3,4 @@ /sql_help.c /psql +/tmp_check diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile index 69bb297fe7..9473ab01cb 100644 --- a/src/bin/psql/Makefile +++ b/src/bin/psql/Makefile @@ -60,8 +60,15 @@ uninstall: clean distclean: rm -f psql$(X) $(OBJS) lex.backup + rm -rf tmp_check # files removed here are supposed to be in the distribution tarball, # so do not clean them in the clean/distclean rules maintainer-clean: distclean rm -f sql_help.h sql_help.c psqlscanslash.c + +check: + $(prove_check) + +installcheck: + $(prove_installcheck) diff --git a/src/bin/psql/t/001_psql.pl b/src/bin/psql/t/001_psql.pl new file mode 100644 index 0000000000..32dd43279b --- /dev/null +++ b/src/bin/psql/t/001_psql.pl @@ -0,0 +1,32 @@ +use strict; +use warnings; + +use PostgresNode; +use TestLib; +use Test::More; + +my $node = get_new_node('main'); +$node->init(); +$node->start(); + +# invoke psql +# - opts: space-separated options and arguments +# - stat: expected exit status +# - in: input stream +# - out: list of re to check on stdout +# - err: list of re to check on stderr +# - name: of the test +sub psql +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($opts, $stat, $in, $out, $err, $name) = @_; + my @cmd = ('psql', split /\s+/, $opts); + $node->command_checks_all(\@cmd, $stat, $out, $err, $name, $in); + return; +} + +psql('-c \\q', 0, '', [ qr{^$} ], [ qr{^$} ], 'psql -c'); +psql('', 0,"\\echo hello\n\\warn world\n\\q\n", [ qr{^hello$} ], [ qr{^world$} ], 'psql in/out/err'); + +$node->stop(); +done_testing(); diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index a164cdbd8c..6ad7f681ae 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -519,22 +519,24 @@ sub command_fails_like } # Run a command and check its status and outputs. -# The 5 arguments are: +# The 5 to 6 arguments are: # - cmd: ref to list for command, options and arguments to run # - ret: expected exit status # - out: ref to list of re to be checked against stdout (all must match) # - err: ref to list of re to be checked against stderr (all must match) # - test_name: name of test +# - in: standard input sub command_checks_all { local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd, $expected_ret, $out, $err, $test_name) = @_; + my ($cmd, $expected_ret, $out, $err, $test_name, $in) = @_; + $in = '' if not defined $in; # run command my ($stdout, $stderr); print("# Running: " . join(" ", @{$cmd}) . "\n"); - IPC::Run::run($cmd, '>', \$stdout, '2>', \$stderr); + IPC::Run::run($cmd, '<', \$in, '>', \$stdout, '2>', \$stderr); # See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR my $ret = $?;