781 lines
18 KiB
Perl
781 lines
18 KiB
Perl
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
# contributor license agreements. See the NOTICE file distributed with
|
|
# this work for additional information regarding copyright ownership.
|
|
# The ASF licenses this file to You under the Apache License, Version 2.0
|
|
# (the "License"); you may not use this file except in compliance with
|
|
# the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
package Apache::TestConfigPHP;
|
|
|
|
#things specific to php
|
|
|
|
use strict;
|
|
use warnings FATAL => 'all';
|
|
use File::Spec::Functions qw(catfile splitdir abs2rel);
|
|
use File::Find qw(finddepth);
|
|
use Apache::TestTrace;
|
|
use Apache::TestRequest;
|
|
use Apache::TestConfig;
|
|
use Apache::TestConfigPerl;
|
|
use Config;
|
|
|
|
@Apache::TestConfigPHP::ISA = qw(Apache::TestConfig);
|
|
|
|
my ($php_ini, $test_more);
|
|
|
|
{
|
|
# __DATA__ contains both php.ini and test-more.php
|
|
|
|
local $/ = "END_OF_FILE\n";
|
|
|
|
$php_ini = <DATA>;
|
|
chomp $php_ini;
|
|
|
|
$test_more = <DATA>;
|
|
chomp $test_more;
|
|
}
|
|
|
|
sub new {
|
|
return shift->SUPER::new(@_);
|
|
}
|
|
|
|
my %warn_style = (
|
|
html => sub { "<!-- @_ -->" },
|
|
c => sub { "/* @_ */" },
|
|
ini => sub { join '', grep {s/^/; /gm} @_ },
|
|
php => sub { join '', "<?php\n", grep {s/^/# /gm} @_ },
|
|
default => sub { join '', grep {s/^/\# /gm} @_ },
|
|
);
|
|
|
|
my %file_ext = (
|
|
map({$_ => 'html'} qw(htm html)),
|
|
map({$_ => 'c' } qw(c h)),
|
|
map({$_ => 'ini' } qw(ini)),
|
|
map({$_ => 'php' } qw(php)),
|
|
);
|
|
|
|
sub warn_style_sub_ref {
|
|
my ($self, $filename) = @_;
|
|
my $ext = $self->filename_ext($filename);
|
|
return $warn_style{ $file_ext{$ext} || 'default' };
|
|
}
|
|
|
|
sub configure_php_tests_pick {
|
|
my($self, $entries) = @_;
|
|
|
|
for my $subdir (qw(Response)) {
|
|
my $dir = catfile $self->{vars}->{t_dir}, lc $subdir;
|
|
next unless -d $dir;
|
|
|
|
finddepth(sub {
|
|
return unless /\.php$/;
|
|
|
|
my $file = catfile $File::Find::dir, $_;
|
|
my $module = abs2rel $file, $dir;
|
|
my $status = $self->run_apache_test_config_scan($file);
|
|
push @$entries, [$file, $module, $subdir, $status];
|
|
}, $dir);
|
|
}
|
|
}
|
|
|
|
sub write_php_test {
|
|
my($self, $location, $test) = @_;
|
|
|
|
(my $path = $location) =~ s/test//i;
|
|
(my $file = $test) =~ s/php$/t/i;
|
|
|
|
my $dir = catfile $self->{vars}->{t_dir}, lc $path;
|
|
my $t = catfile $dir, $file;
|
|
my $php_t = catfile $dir, $test;
|
|
return if -e $t;
|
|
|
|
# don't write out foo.t if foo.php already exists
|
|
return if -e $php_t;
|
|
|
|
$self->gendir($dir);
|
|
my $fh = $self->genfile($t);
|
|
|
|
print $fh <<EOF;
|
|
use Apache::TestRequest 'GET_BODY_ASSERT';
|
|
print GET_BODY_ASSERT "/$location/$test";
|
|
EOF
|
|
|
|
close $fh or die "close $t: $!";
|
|
|
|
# write out an all.t file for the directory
|
|
# that will skip running all PHP test unless have_php
|
|
|
|
my $all = catfile $dir, 'all.t';
|
|
|
|
unless (-e $all) {
|
|
my $fh = $self->genfile($all);
|
|
|
|
print $fh <<EOF;
|
|
use strict;
|
|
use warnings FATAL => 'all';
|
|
|
|
use Apache::Test;
|
|
|
|
# skip all tests in this directory unless a php module is enabled
|
|
plan tests => 1, need_php;
|
|
|
|
ok 1;
|
|
EOF
|
|
}
|
|
}
|
|
|
|
sub configure_php_inc {
|
|
my $self = shift;
|
|
|
|
my $serverroot = $self->{vars}->{serverroot};
|
|
|
|
my $path = catfile $serverroot, 'conf';
|
|
|
|
# make sure that require() or include() calls can find
|
|
# the generated test-more.php without using absolute paths
|
|
my $cfg = { php_value => "include_path $path", };
|
|
$self->postamble(IfModule => $self->{vars}->{php_module}, $cfg);
|
|
|
|
# give test-more.php access to the ServerRoot directive
|
|
$self->postamble("SetEnv SERVER_ROOT $serverroot\n");
|
|
}
|
|
|
|
sub configure_php_functions {
|
|
my $self = shift;
|
|
|
|
my $dir = catfile $self->{vars}->{serverroot}, 'conf';
|
|
my $file = catfile $dir, 'test-more.php';
|
|
|
|
$self->gendir($dir);
|
|
my $fh = $self->genfile($file);
|
|
|
|
print $fh $test_more;
|
|
|
|
close $fh or die "close $file: $!";
|
|
|
|
$self->clean_add_file($file);
|
|
}
|
|
|
|
sub configure_php_ini {
|
|
my $self = shift;
|
|
|
|
my $dir = catfile $self->{vars}->{serverroot}, 'conf';
|
|
my $file = catfile $dir, 'php.ini';
|
|
|
|
return if -e $file;
|
|
|
|
my $log = catfile $self->{vars}->{t_logs}, 'error_log';
|
|
|
|
$self->gendir($dir);
|
|
my $fh = $self->genfile($file);
|
|
|
|
$php_ini =~ s/\@error_log\@/error_log $log/;
|
|
print $fh $php_ini;
|
|
|
|
close $fh or die "close $file: $!";
|
|
|
|
$self->clean_add_file($file);
|
|
}
|
|
|
|
sub configure_php_tests {
|
|
my $self = shift;
|
|
|
|
my @entries = ();
|
|
$self->configure_php_tests_pick(\@entries);
|
|
$self->configure_pm_tests_sort(\@entries);
|
|
|
|
my %seen = ();
|
|
|
|
for my $entry (@entries) {
|
|
my ($file, $module, $subdir, $status) = @$entry;
|
|
|
|
my @args = ();
|
|
|
|
my $directives = $self->add_module_config($file, \@args);
|
|
|
|
my @parts = splitdir $file;
|
|
my $test = pop @parts;
|
|
my $location = $parts[-1];
|
|
|
|
debug "configuring PHP test file $file";
|
|
|
|
if ($directives->{noautoconfig}) {
|
|
$self->postamble(""); # which adds "\n"
|
|
}
|
|
else {
|
|
unless ($seen{$location}++) {
|
|
$self->postamble(Alias => [ catfile('', $parts[-1]), catfile(@parts) ]);
|
|
|
|
my @args = (AddType => 'application/x-httpd-php .php');
|
|
|
|
$self->postamble(Location => "/$location", \@args);
|
|
}
|
|
}
|
|
|
|
$self->write_php_test($location, $test);
|
|
}
|
|
}
|
|
|
|
1;
|
|
|
|
__DATA__
|
|
; This is php.ini-recommended from php 5.0.2,
|
|
; used in place of your locally installed php.ini file
|
|
; as part of the pristine environment Apache-Test creates
|
|
; for you
|
|
; [NOTE]: cat php.ini-recommended | grep -v '^;' | sed -e '/^$/d'
|
|
;
|
|
; exceptions to php.ini-recommended are as follows:
|
|
display_startup_errors = On
|
|
html_errors = Off
|
|
@error_log@
|
|
output_buffering = Off
|
|
|
|
; the rest of php.ini-recommended, unaltered, save for
|
|
; some tidying like the removal of comments and blank lines
|
|
|
|
[PHP]
|
|
engine = On
|
|
zend.ze1_compatibility_mode = Off
|
|
short_open_tag = Off
|
|
asp_tags = Off
|
|
precision = 14
|
|
y2k_compliance = On
|
|
zlib.output_compression = Off
|
|
implicit_flush = Off
|
|
unserialize_callback_func=
|
|
serialize_precision = 100
|
|
allow_call_time_pass_reference = Off
|
|
safe_mode = Off
|
|
safe_mode_gid = Off
|
|
safe_mode_include_dir =
|
|
safe_mode_exec_dir =
|
|
safe_mode_allowed_env_vars = PHP_
|
|
safe_mode_protected_env_vars = LD_LIBRARY_PATH
|
|
disable_functions =
|
|
disable_classes =
|
|
expose_php = On
|
|
max_execution_time = 30 ; Maximum execution time of each script, in seconds
|
|
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
|
|
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)
|
|
error_reporting = E_ALL
|
|
display_errors = Off
|
|
log_errors = On
|
|
log_errors_max_len = 1024
|
|
ignore_repeated_errors = Off
|
|
ignore_repeated_source = Off
|
|
report_memleaks = On
|
|
track_errors = Off
|
|
variables_order = "GPCS"
|
|
register_globals = Off
|
|
register_long_arrays = Off
|
|
register_argc_argv = Off
|
|
auto_globals_jit = On
|
|
post_max_size = 8M
|
|
magic_quotes_gpc = Off
|
|
magic_quotes_runtime = Off
|
|
magic_quotes_sybase = Off
|
|
auto_prepend_file =
|
|
auto_append_file =
|
|
default_mimetype = "text/html"
|
|
doc_root =
|
|
user_dir =
|
|
enable_dl = On
|
|
file_uploads = On
|
|
upload_max_filesize = 2M
|
|
allow_url_fopen = On
|
|
allow_url_include = Off
|
|
default_socket_timeout = 60
|
|
[Date]
|
|
[filter]
|
|
[iconv]
|
|
[sqlite]
|
|
[xmlrpc]
|
|
[Pcre]
|
|
[Syslog]
|
|
define_syslog_variables = Off
|
|
[mail function]
|
|
SMTP = localhost
|
|
smtp_port = 25
|
|
[SQL]
|
|
sql.safe_mode = Off
|
|
[ODBC]
|
|
odbc.allow_persistent = On
|
|
odbc.check_persistent = On
|
|
odbc.max_persistent = -1
|
|
odbc.max_links = -1
|
|
odbc.defaultlrl = 4096
|
|
odbc.defaultbinmode = 1
|
|
[MySQL]
|
|
mysql.allow_persistent = On
|
|
mysql.max_persistent = -1
|
|
mysql.max_links = -1
|
|
mysql.default_port =
|
|
mysql.default_socket =
|
|
mysql.default_host =
|
|
mysql.default_user =
|
|
mysql.default_password =
|
|
mysql.connect_timeout = 60
|
|
mysql.trace_mode = Off
|
|
[MySQLi]
|
|
mysqli.max_links = -1
|
|
mysqli.default_port = 3306
|
|
mysqli.default_socket =
|
|
mysqli.default_host =
|
|
mysqli.default_user =
|
|
mysqli.default_pw =
|
|
mysqli.reconnect = Off
|
|
[mSQL]
|
|
msql.allow_persistent = On
|
|
msql.max_persistent = -1
|
|
msql.max_links = -1
|
|
[OCI8]
|
|
[PostgresSQL]
|
|
pgsql.allow_persistent = On
|
|
pgsql.auto_reset_persistent = Off
|
|
pgsql.max_persistent = -1
|
|
pgsql.max_links = -1
|
|
pgsql.ignore_notice = 0
|
|
pgsql.log_notice = 0
|
|
[Sybase]
|
|
sybase.allow_persistent = On
|
|
sybase.max_persistent = -1
|
|
sybase.max_links = -1
|
|
sybase.min_error_severity = 10
|
|
sybase.min_message_severity = 10
|
|
sybase.compatability_mode = Off
|
|
[Sybase-CT]
|
|
sybct.allow_persistent = On
|
|
sybct.max_persistent = -1
|
|
sybct.max_links = -1
|
|
sybct.min_server_severity = 10
|
|
sybct.min_client_severity = 10
|
|
[bcmath]
|
|
bcmath.scale = 0
|
|
[browscap]
|
|
[Informix]
|
|
ifx.default_host =
|
|
ifx.default_user =
|
|
ifx.default_password =
|
|
ifx.allow_persistent = On
|
|
ifx.max_persistent = -1
|
|
ifx.max_links = -1
|
|
ifx.textasvarchar = 0
|
|
ifx.byteasvarchar = 0
|
|
ifx.charasvarchar = 0
|
|
ifx.blobinfile = 0
|
|
ifx.nullformat = 0
|
|
[Session]
|
|
session.save_handler = files
|
|
session.use_cookies = 1
|
|
session.name = PHPSESSID
|
|
session.auto_start = 0
|
|
session.cookie_lifetime = 0
|
|
session.cookie_path = /
|
|
session.cookie_domain =
|
|
session.cookie_httponly =
|
|
session.serialize_handler = php
|
|
session.gc_probability = 1
|
|
session.gc_divisor = 1000
|
|
session.gc_maxlifetime = 1440
|
|
session.bug_compat_42 = 0
|
|
session.bug_compat_warn = 1
|
|
session.referer_check =
|
|
session.entropy_length = 0
|
|
session.entropy_file =
|
|
session.cache_limiter = nocache
|
|
session.cache_expire = 180
|
|
session.use_trans_sid = 0
|
|
session.hash_function = 0
|
|
session.hash_bits_per_character = 5
|
|
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
|
|
[MSSQL]
|
|
mssql.allow_persistent = On
|
|
mssql.max_persistent = -1
|
|
mssql.max_links = -1
|
|
mssql.min_error_severity = 10
|
|
mssql.min_message_severity = 10
|
|
mssql.compatability_mode = Off
|
|
mssql.secure_connection = Off
|
|
[Assertion]
|
|
[COM]
|
|
[mbstring]
|
|
[FrontBase]
|
|
[gd]
|
|
[exif]
|
|
[Tidy]
|
|
tidy.clean_output = Off
|
|
[soap]
|
|
soap.wsdl_cache_enabled=1
|
|
soap.wsdl_cache_dir="/tmp"
|
|
soap.wsdl_cache_ttl=86400
|
|
END_OF_FILE
|
|
/*******************************************************************\
|
|
* PROJECT INFORMATION *
|
|
* *
|
|
* Project: Apache-Test *
|
|
* URL: http://perl.apache.org/Apache-Test/ *
|
|
* Notice: Copyright (c) 2006 The Apache Software Foundation *
|
|
* *
|
|
*********************************************************************
|
|
* LICENSE INFORMATION *
|
|
* *
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); *
|
|
* you may not use this file except in compliance with the *
|
|
* License. You may obtain a copy of the License at: *
|
|
* *
|
|
* http://www.apache.org/licenses/LICENSE-2.0 *
|
|
* *
|
|
* Unless required by applicable law or agreed to in writing, *
|
|
* software distributed under the License is distributed on an "AS *
|
|
* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either *
|
|
* express or implied. See the License for the specific language *
|
|
* governing permissions and limitations under the License. *
|
|
* *
|
|
*********************************************************************
|
|
* MODULE INFORMATION *
|
|
* *
|
|
* This is a PHP implementation of Test::More: *
|
|
* *
|
|
* http://search.cpan.org/dist/Test-Simple/lib/Test/More.pm *
|
|
* *
|
|
*********************************************************************
|
|
* CREDITS *
|
|
* *
|
|
* Originally inspired by work from Andy Lester. Written and *
|
|
* maintained by Chris Shiflett. For contact information, see: *
|
|
* *
|
|
* http://shiflett.org/ *
|
|
* *
|
|
\*******************************************************************/
|
|
|
|
header('Content-Type: text/plain');
|
|
register_shutdown_function('_test_end');
|
|
|
|
$_no_plan = FALSE;
|
|
$_num_failures = 0;
|
|
$_num_skips = 0;
|
|
$_test_num = 0;
|
|
|
|
function plan($plan)
|
|
{
|
|
/*
|
|
plan('no_plan');
|
|
plan('skip_all');
|
|
plan(array('skip_all' => 'My reason is...'));
|
|
plan(23);
|
|
*/
|
|
|
|
global $_no_plan;
|
|
global $_skip_all;
|
|
global $_skip_reason;
|
|
|
|
switch ($plan)
|
|
{
|
|
case 'no_plan':
|
|
$_no_plan = TRUE;
|
|
break;
|
|
|
|
case 'skip_all':
|
|
echo "1..0\n";
|
|
break;
|
|
|
|
default:
|
|
if (is_array($plan))
|
|
{
|
|
echo "1..0 # Skip {$plan['skip_all']}\n";
|
|
exit;
|
|
}
|
|
|
|
echo "1..$plan\n";
|
|
break;
|
|
}
|
|
}
|
|
|
|
function ok($pass, $test_name = '')
|
|
{
|
|
global $_test_num;
|
|
global $_num_failures;
|
|
global $_num_skips;
|
|
|
|
$_test_num++;
|
|
|
|
if ($_num_skips)
|
|
{
|
|
$_num_skips--;
|
|
return TRUE;
|
|
}
|
|
|
|
if (!empty($test_name) && $test_name[0] != '#')
|
|
{
|
|
$test_name = "- $test_name";
|
|
}
|
|
|
|
if ($pass)
|
|
{
|
|
echo "ok $_test_num $test_name\n";
|
|
}
|
|
else
|
|
{
|
|
echo "not ok $_test_num $test_name\n";
|
|
|
|
$_num_failures++;
|
|
$caller = debug_backtrace();
|
|
|
|
if (strstr($caller['0']['file'], $_SERVER['PHP_SELF']))
|
|
{
|
|
$file = $caller['0']['file'];
|
|
$line = $caller['0']['line'];
|
|
}
|
|
else
|
|
{
|
|
$file = $caller['1']['file'];
|
|
$line = $caller['1']['line'];
|
|
}
|
|
|
|
$file = str_replace($_SERVER['SERVER_ROOT'], 't', $file);
|
|
|
|
diag(" Failed test ($file at line $line)");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function is($this, $that, $test_name = '')
|
|
{
|
|
$pass = ($this == $that);
|
|
|
|
ok($pass, $test_name);
|
|
|
|
if (!$pass)
|
|
{
|
|
diag(" got: '$this'");
|
|
diag(" expected: '$that'");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function isnt($this, $that, $test_name = '')
|
|
{
|
|
$pass = ($this != $that);
|
|
|
|
ok($pass, $test_name);
|
|
|
|
if (!$pass)
|
|
{
|
|
diag(" '$this'");
|
|
diag(' !=');
|
|
diag(" '$that'");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function like($string, $pattern, $test_name = '')
|
|
{
|
|
$pass = preg_match($pattern, $string);
|
|
|
|
ok($pass, $test_name);
|
|
|
|
if (!$pass)
|
|
{
|
|
diag(" '$string'");
|
|
diag(" doesn't match '$pattern'");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function unlike($string, $pattern, $test_name = '')
|
|
{
|
|
$pass = !preg_match($pattern, $string);
|
|
|
|
ok($pass, $test_name);
|
|
|
|
if (!$pass)
|
|
{
|
|
diag(" '$string'");
|
|
diag(" matches '$pattern'");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function cmp_ok($this, $operator, $that, $test_name = '')
|
|
{
|
|
eval("\$pass = (\$this $operator \$that);");
|
|
|
|
ok($pass, $test_name);
|
|
|
|
if (!$pass)
|
|
{
|
|
diag(" got: '$this'");
|
|
diag(" expected: '$that'");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function can_ok($object, $methods)
|
|
{
|
|
$pass = TRUE;
|
|
$errors = array();
|
|
|
|
foreach ($methods as $method)
|
|
{
|
|
if (!method_exists($object, $method))
|
|
{
|
|
$pass = FALSE;
|
|
$errors[] = " method_exists(\$object, $method) failed";
|
|
}
|
|
}
|
|
|
|
if ($pass)
|
|
{
|
|
ok(TRUE, "method_exists(\$object, ...)");
|
|
}
|
|
else
|
|
{
|
|
ok(FALSE, "method_exists(\$object, ...)");
|
|
diag($errors);
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function isa_ok($object, $expected_class, $object_name = 'The object')
|
|
{
|
|
$got_class = get_class($object);
|
|
|
|
if (version_compare(php_version(), '5', '>='))
|
|
{
|
|
$pass = ($got_class == $expected_class);
|
|
}
|
|
else
|
|
{
|
|
$pass = ($got_class == strtolower($expected_class));
|
|
}
|
|
|
|
if ($pass)
|
|
{
|
|
ok(TRUE, "$object_name isa $expected_class");
|
|
}
|
|
else
|
|
{
|
|
ok(FALSE, "$object_name isn't a '$expected_class' it's a '$got_class'");
|
|
}
|
|
|
|
return $pass;
|
|
}
|
|
|
|
function pass($test_name = '')
|
|
{
|
|
return ok(TRUE, $test_name);
|
|
}
|
|
|
|
function fail($test_name = '')
|
|
{
|
|
return ok(FALSE, $test_name);
|
|
}
|
|
|
|
function diag($message)
|
|
{
|
|
if (is_array($message))
|
|
{
|
|
foreach($message as $current)
|
|
{
|
|
echo "# $current\n";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
echo "# $message\n";
|
|
}
|
|
}
|
|
|
|
function include_ok($module)
|
|
{
|
|
$pass = ((include $module) == 'OK');
|
|
return ok($pass);
|
|
}
|
|
|
|
function require_ok($module)
|
|
{
|
|
$pass = ((require $module) == 'OK');
|
|
return ok($pass);
|
|
}
|
|
|
|
function skip($message, $num)
|
|
{
|
|
global $_num_skips;
|
|
|
|
if ($num < 0)
|
|
{
|
|
$num = 0;
|
|
}
|
|
|
|
for ($i = 0; $i < $num; $i++)
|
|
{
|
|
pass("# SKIP $message");
|
|
}
|
|
|
|
$_num_skips = $num;
|
|
}
|
|
|
|
/*
|
|
|
|
TODO:
|
|
|
|
function todo()
|
|
{
|
|
}
|
|
|
|
function todo_skip()
|
|
{
|
|
}
|
|
|
|
function is_deeply()
|
|
{
|
|
}
|
|
|
|
function eq_array()
|
|
{
|
|
}
|
|
|
|
function eq_hash()
|
|
{
|
|
}
|
|
|
|
function eq_set()
|
|
{
|
|
}
|
|
|
|
*/
|
|
|
|
function _test_end()
|
|
{
|
|
global $_no_plan;
|
|
global $_num_failures;
|
|
global $_test_num;
|
|
|
|
if ($_no_plan)
|
|
{
|
|
echo "1..$_test_num\n";
|
|
}
|
|
|
|
if ($_num_failures)
|
|
{
|
|
diag("Looks like you failed $_num_failures tests of $_test_num.");
|
|
}
|
|
}
|
|
|
|
?>
|