@@ -12,6 +12,8 @@ our @EXPORT = qw(
12
12
restart_test_server
13
13
psql
14
14
system_or_bail
15
+ system_log
16
+ run_log
15
17
16
18
command_ok
17
19
command_fails
@@ -24,11 +26,47 @@ our @EXPORT = qw(
24
26
) ;
25
27
26
28
use Cwd;
29
+ use File::Basename;
27
30
use File::Spec;
28
31
use File::Temp ();
29
32
use IPC::Run qw( run start) ;
33
+
34
+ use SimpleTee;
35
+
30
36
use Test::More;
31
37
38
+ # Open log file. For each test, the log file name uses the name of the
39
+ # file launching this module, without the .pl suffix.
40
+ my $log_path = ' tmp_check/log' ;
41
+ mkdir ' tmp_check' ;
42
+ mkdir $log_path ;
43
+ my $test_logfile = basename($0 );
44
+ $test_logfile =~ s /\. [^.]+$// ;
45
+ $test_logfile = " $log_path /regress_log_$test_logfile " ;
46
+ open TESTLOG, ' >' , $test_logfile or die " Cannot open STDOUT to logfile: $! " ;
47
+
48
+ # Hijack STDOUT and STDERR to the log file
49
+ open (ORIG_STDOUT, " >&STDOUT" );
50
+ open (ORIG_STDERR, " >&STDERR" );
51
+ open (STDOUT , " >&TESTLOG" );
52
+ open (STDERR , " >&TESTLOG" );
53
+
54
+ # The test output (ok ...) needs to be printed to the original STDOUT so
55
+ # that the 'prove' program can parse it, and display it to the user in
56
+ # real time. But also copy it to the log file, to provide more context
57
+ # in the log.
58
+ my $builder = Test::More-> builder;
59
+ my $fh = $builder -> output;
60
+ tie *$fh , " SimpleTee" , *ORIG_STDOUT, *TESTLOG;
61
+ $fh = $builder -> failure_output;
62
+ tie *$fh , " SimpleTee" , *ORIG_STDERR, *TESTLOG;
63
+
64
+ # Enable auto-flushing for all the file handles. Stderr and stdout are
65
+ # redirected to the same file, and buffering causes the lines to appear
66
+ # in the log in confusing order.
67
+ autoflush STDOUT 1;
68
+ autoflush STDERR 1;
69
+ autoflush TESTLOG 1;
32
70
33
71
# Set to untranslated messages, to be able to compare program output
34
72
# with expected strings.
@@ -73,7 +111,7 @@ sub tempdir_short
73
111
sub standard_initdb
74
112
{
75
113
my $pgdata = shift ;
76
- system_or_bail(" initdb -D ' $pgdata ' -A trust -N >/dev/null " );
114
+ system_or_bail(' initdb' , ' -D ' , " $pgdata " , ' -A ' , ' trust' , ' -N ' );
77
115
system_or_bail(" $ENV {top_builddir}/src/test/regress/pg_regress" ,
78
116
' --config-auth' , $pgdata );
79
117
}
@@ -87,14 +125,15 @@ sub start_test_server
87
125
88
126
my $tempdir_short = tempdir_short;
89
127
128
+ print (" ### Starting test server in $tempdir \n " );
90
129
standard_initdb " $tempdir /pgdata" ;
91
- $ret = system ' pg_ctl' , ' -D' , " $tempdir /pgdata" , ' -s ' , ' -w' , ' -l' ,
130
+ $ret = system_log( ' pg_ctl' , ' -D' , " $tempdir /pgdata" , ' -w' , ' -l' ,
92
131
" $tempdir /logfile" , ' -o' ,
93
- " --fsync=off -k $tempdir_short --listen-addresses='' --log-statement=all" ,
94
- ' start' ;
95
-
132
+ " --fsync=off -k \" $tempdir_short \" --listen-addresses='' --log-statement=all" ,
133
+ ' start' );
96
134
if ($ret != 0)
97
135
{
136
+ print " # pg_ctl failed; logfile:\n " ;
98
137
system (' cat' , " $tempdir /logfile" );
99
138
BAIL_OUT(" pg_ctl failed" );
100
139
}
@@ -106,28 +145,45 @@ sub start_test_server
106
145
107
146
sub restart_test_server
108
147
{
109
- system ' pg_ctl' , ' -s' , ' -D' , $test_server_datadir , ' -w' , ' -l' ,
110
- $test_server_logfile , ' restart' ;
148
+ print (" ### Restarting test server\n " );
149
+ system_log(' pg_ctl' , ' -D' , $test_server_datadir , ' -w' , ' -l' ,
150
+ $test_server_logfile , ' restart' );
111
151
}
112
152
113
153
END
114
154
{
115
155
if ($test_server_datadir )
116
156
{
117
- system ' pg_ctl' , ' -D' , $test_server_datadir , ' -s ' , ' -w ' , ' -m' ,
118
- ' immediate' , ' stop' ;
157
+ system_log( ' pg_ctl' , ' -D' , $test_server_datadir , ' -m' ,
158
+ ' immediate' , ' stop' ) ;
119
159
}
120
160
}
121
161
122
162
sub psql
123
163
{
124
164
my ($dbname , $sql ) = @_ ;
165
+ print (" # Running SQL command: $sql \n " );
125
166
run [ ' psql' , ' -X' , ' -q' , ' -d' , $dbname , ' -f' , ' -' ], ' <' , \$sql or die ;
126
167
}
127
168
128
169
sub system_or_bail
129
170
{
130
- system (@_ ) == 0 or BAIL_OUT(" system @_ failed: $? " );
171
+ if (system_log(@_ ) != 0)
172
+ {
173
+ BAIL_OUT(" system $_ [0] failed: $? " );
174
+ }
175
+ }
176
+
177
+ sub system_log
178
+ {
179
+ print (" # Running: " . join (" " , @_ ) ." \n " );
180
+ return system (@_ );
181
+ }
182
+
183
+ sub run_log
184
+ {
185
+ print (" # Running: " . join (" " , @{$_ [0]}) ." \n " );
186
+ return run (@_ );
131
187
}
132
188
133
189
@@ -139,24 +195,22 @@ sub system_or_bail
139
195
sub command_ok
140
196
{
141
197
my ($cmd , $test_name ) = @_ ;
142
- my $result = run $cmd , ' >' , File::Spec-> devnull(), ' 2>' ,
143
- File::Spec-> devnull();
198
+ my $result = run_log($cmd );
144
199
ok($result , $test_name );
145
200
}
146
201
147
202
sub command_fails
148
203
{
149
204
my ($cmd , $test_name ) = @_ ;
150
- my $result = run $cmd , ' >' , File::Spec-> devnull(), ' 2>' ,
151
- File::Spec-> devnull();
205
+ my $result = run_log($cmd );
152
206
ok(!$result , $test_name );
153
207
}
154
208
155
209
sub command_exit_is
156
210
{
157
211
my ($cmd , $expected , $test_name ) = @_ ;
158
- my $h = start $cmd , ' > ' , File::Spec -> devnull(), ' 2> ' ,
159
- File::Spec -> devnull() ;
212
+ print ( " # Running: " . join ( " " , @{ $cmd }) . " \n " );
213
+ my $h = start $cmd ;
160
214
$h -> finish();
161
215
is($h -> result(0), $expected , $test_name );
162
216
}
@@ -165,6 +219,7 @@ sub program_help_ok
165
219
{
166
220
my ($cmd ) = @_ ;
167
221
my ($stdout , $stderr );
222
+ print (" # Running: $cmd --help\n " );
168
223
my $result = run [ $cmd , ' --help' ], ' >' , \$stdout , ' 2>' , \$stderr ;
169
224
ok($result , " $cmd --help exit code 0" );
170
225
isnt($stdout , ' ' , " $cmd --help goes to stdout" );
@@ -175,6 +230,7 @@ sub program_version_ok
175
230
{
176
231
my ($cmd ) = @_ ;
177
232
my ($stdout , $stderr );
233
+ print (" # Running: $cmd --version\n " );
178
234
my $result = run [ $cmd , ' --version' ], ' >' , \$stdout , ' 2>' , \$stderr ;
179
235
ok($result , " $cmd --version exit code 0" );
180
236
isnt($stdout , ' ' , " $cmd --version goes to stdout" );
@@ -185,7 +241,9 @@ sub program_options_handling_ok
185
241
{
186
242
my ($cmd ) = @_ ;
187
243
my ($stdout , $stderr );
188
- my $result = run [ $cmd , ' --not-a-valid-option' ], ' >' , \$stdout , ' 2>' , \$stderr ;
244
+ print (" # Running: $cmd --not-a-valid-option\n " );
245
+ my $result = run [ $cmd , ' --not-a-valid-option' ], ' >' , \$stdout , ' 2>' ,
246
+ \$stderr ;
189
247
ok(!$result , " $cmd with invalid option nonzero exit code" );
190
248
isnt($stderr , ' ' , " $cmd with invalid option prints error message" );
191
249
}
@@ -194,6 +252,7 @@ sub command_like
194
252
{
195
253
my ($cmd , $expected_stdout , $test_name ) = @_ ;
196
254
my ($stdout , $stderr );
255
+ print (" # Running: " . join (" " , @{$cmd }) . " \n " );
197
256
my $result = run $cmd , ' >' , \$stdout , ' 2>' , \$stderr ;
198
257
ok($result , " @$cmd exit code 0" );
199
258
is($stderr , ' ' , " @$cmd no stderr" );
@@ -203,9 +262,8 @@ sub command_like
203
262
sub issues_sql_like
204
263
{
205
264
my ($cmd , $expected_sql , $test_name ) = @_ ;
206
- my ($stdout , $stderr );
207
265
truncate $test_server_logfile , 0;
208
- my $result = run $cmd , ' > ' , \ $stdout , ' 2> ' , \ $stderr ;
266
+ my $result = run_log( $cmd ) ;
209
267
ok($result , " @$cmd exit code 0" );
210
268
my $log = ` cat '$test_server_logfile '` ;
211
269
like($log , $expected_sql , " $test_name : SQL found in server log" );
0 commit comments