Integrate mainline
[p5sagit/p5-mst-13.2.git] / lib / CGI / t / carp.t
CommitLineData
fa8e8936 1# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 2 -*-
2#!/usr/local/bin/perl -w
3
4use strict;
5use lib qw(t/lib);
6use Test::More tests => 42;
7use IO::Handle;
8
9BEGIN { use_ok('CGI::Carp') };
10
11#-----------------------------------------------------------------------------
12# Test id
13#-----------------------------------------------------------------------------
14
15# directly invoked
16my $expect_f = __FILE__;
17my $expect_l = __LINE__ + 1;
18my ($file, $line, $id) = CGI::Carp::id(0);
19is($file, $expect_f, "file");
20is($line, $expect_l, "line");
21is($id, "carp.t", "id");
22
23# one level of indirection
24sub id1 { my $level = shift; return CGI::Carp::id($level); };
25
26$expect_l = __LINE__ + 1;
27($file, $line, $id) = id1(1);
28is($file, $expect_f, "file");
29is($line, $expect_l, "line");
30is($id, "carp.t", "id");
31
32# two levels of indirection
33sub id2 { my $level = shift; return id1($level); };
34
35$expect_l = __LINE__ + 1;
36($file, $line, $id) = id2(2);
37is($file, $expect_f, "file");
38is($line, $expect_l, "line");
39is($id, "carp.t", "id");
40
41#-----------------------------------------------------------------------------
42# Test stamp
43#-----------------------------------------------------------------------------
44
45my $stamp = "/^\\[
46 ([a-z]{3}\\s){2}\\s?
47 [\\s\\d:]+
48 \\]\\s$id:/ix";
49
50like(CGI::Carp::stamp(),
51 $stamp,
52 "Time in correct format");
53
54sub stamp1 {return CGI::Carp::stamp()};
55sub stamp2 {return stamp1()};
56
57like(stamp2(), $stamp, "Time in correct format");
58
59#-----------------------------------------------------------------------------
60# Test warn and _warn
61#-----------------------------------------------------------------------------
62
63# set some variables to control what's going on.
64$CGI::Carp::WARN = 0;
65$CGI::Carp::EMIT_WARNINGS = 0;
66@CGI::Carp::WARNINGS = ();
67my $q_file = quotemeta($file);
68
69
70# Test that realwarn is called
71{
72 local $^W = 0;
73 eval "sub CGI::Carp::realwarn {return 'Called realwarn'};";
74}
75
76$expect_l = __LINE__ + 1;
77is(CGI::Carp::warn("There is a problem"),
78 "Called realwarn",
79 "CGI::Carp::warn calls CORE::warn");
80is(@CGI::Carp::WARNINGS, 0, "_warn not called");
81
82# Test that message is constructed correctly
83eval 'sub CGI::Carp::realwarn {my $mess = shift; return $mess};';
84
85$expect_l = __LINE__ + 1;
86like(CGI::Carp::warn("There is a problem"),
87 "/] $id: There is a problem at $q_file line $expect_l.".'$/',
88 "CGI::Carp::warn builds correct message");
89is(@CGI::Carp::WARNINGS, 0, "_warn not called");
90
91# Test that _warn is called at the correct time
92$CGI::Carp::WARN = 1;
93
94$expect_l = __LINE__ + 1;
95like(CGI::Carp::warn("There is a problem"),
96 "/] $id: There is a problem at $q_file line $expect_l.".'$/',
97 "CGI::Carp::warn builds correct message");
98
99is(@CGI::Carp::WARNINGS, 1, "_warn now called");
100like($CGI::Carp::WARNINGS[0],
101 "/There is a problem at $q_file line $expect_l.".'$/',
102 "CGI::Carp::WARNINGS has correct message (without stamp)");
103
104#-----------------------------------------------------------------------------
105# Test ineval
106#-----------------------------------------------------------------------------
107
108ok(!CGI::Carp::ineval, 'ineval returns false when not in eval');
109eval {ok(CGI::Carp::ineval, 'ineval returns true when in eval');};
110
111#-----------------------------------------------------------------------------
112# Test die
113#-----------------------------------------------------------------------------
114
115# set some variables to control what's going on.
116$CGI::Carp::WRAP = 0;
117
118$expect_l = __LINE__ + 1;
119eval { CGI::Carp::die('There is a problem'); };
120like($@,
121 '/^There is a problem/',
122 'CGI::Carp::die calls CORE::die without altering argument in eval');
123
124# Test that realwarn is called
125{
126 local $^W = 0;
127 eval 'sub CGI::Carp::realdie {my $mess = shift; return $mess};';
128}
129
130like(CGI::Carp::die('There is a problem'),
131 $stamp,
132 'CGI::Carp::die calls CORE::die, but adds stamp');
133
134#-----------------------------------------------------------------------------
135# Test set_message
136#-----------------------------------------------------------------------------
137
138is(CGI::Carp::set_message('My new Message'),
139 'My new Message',
140 'CGI::Carp::set_message returns new message');
141
142is($CGI::Carp::CUSTOM_MSG,
143 'My new Message',
144 'CGI::Carp::set_message message set correctly');
145
146# set the message back to the empty string so that the tests later
147# work properly.
148CGI::Carp::set_message(''),
149
150#-----------------------------------------------------------------------------
151# Test warnings_to_browser
152#-----------------------------------------------------------------------------
153
154CGI::Carp::warningsToBrowser(0);
155is($CGI::Carp::EMIT_WARNINGS, 0, "Warnings turned off");
156unless( is(@CGI::Carp::WARNINGS, 1, "_warn not called") ) {
157 print join "\n", map "'$_'", @CGI::Carp::WARNINGS;
158}
159
160# turn off STDOUT (prevents spurious warnings to screen
161tie *STDOUT, 'StoreStuff' or die "Can't tie STDOUT";
162CGI::Carp::warningsToBrowser(1);
163my $fake_out = join '', <STDOUT>;
164untie *STDOUT;
165
166open(STDOUT, ">&REAL_STDOUT");
0106e1e7 167my $fname = $0;
168$fname =~ tr/<>-/\253\273\255/; # _warn does this so we have to also
169is( $fake_out, "<!-- warning: There is a problem at $fname line 95. -->\n",
fa8e8936 170 'warningsToBrowser() on' );
171
172is($CGI::Carp::EMIT_WARNINGS, 1, "Warnings turned off");
173is(@CGI::Carp::WARNINGS, 0, "_warn is called");
174
175#-----------------------------------------------------------------------------
176# Test fatals_to_browser
177#-----------------------------------------------------------------------------
178
179package StoreStuff;
180
181sub TIEHANDLE {
182 my $class = shift;
183 bless [], $class;
184}
185
186sub PRINT {
187 my $self = shift;
188 push @$self, @_;
189}
190
191sub READLINE {
192 my $self = shift;
193 shift @$self;
194}
195
196package main;
197
198tie *STDOUT, "StoreStuff";
199
200# do tests
201my @result;
202
203CGI::Carp::fatalsToBrowser();
204$result[0] .= $_ while (<STDOUT>);
205
206CGI::Carp::fatalsToBrowser('Message to the world');
207$result[1] .= $_ while (<STDOUT>);
208
209$ENV{SERVER_ADMIN} = 'foo@bar.com';
210CGI::Carp::fatalsToBrowser();
211$result[2] .= $_ while (<STDOUT>);
212
213CGI::Carp::set_message('Override the message passed in'),
214
215CGI::Carp::fatalsToBrowser('Message to the world');
216$result[3] .= $_ while (<STDOUT>);
217CGI::Carp::set_message(''),
218delete $ENV{SERVER_ADMIN};
219
220# now restore STDOUT
221untie *STDOUT;
222
223
224like($result[0],
225 '/Content-type: text/html/',
226 "Default string has header");
227
228ok($result[0] !~ /Message to the world/, "Custom message not in default string");
229
230like($result[1],
231 '/Message to the world/',
232 "Custom Message appears in output");
233
234ok($result[0] !~ /foo\@bar.com/, "Server Admin does not appear in default message");
235
236like($result[2],
237 '/foo@bar.com/',
238 "Server Admin appears in output");
239
240like($result[3],
241 '/Message to the world/',
242 "Custom message not in result");
243
244like($result[3],
245 '/Override the message passed in/',
246 "Correct message in string");
247
248#-----------------------------------------------------------------------------
249# Test to_filehandle
250#-----------------------------------------------------------------------------
251
252sub buffer {
253 CGI::Carp::to_filehandle (@_);
254}
255
256tie *STORE, "StoreStuff";
257
258require FileHandle;
259my $fh = FileHandle->new;
260
261ok( defined buffer(\*STORE), '\*STORE returns proper filehandle');
262ok( defined buffer( $fh ), '$fh returns proper filehandle');
263ok( defined buffer('::STDOUT'), 'STDIN returns proper filehandle');
264ok( defined buffer(*main::STDOUT), 'STDIN returns proper filehandle');
265ok(!defined buffer("WIBBLE"), '"WIBBLE" doesn\'t returns proper filehandle');