# 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 = ; chomp $php_ini; $test_more = ; 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 '', " 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 <genfile($all); print $fh < '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."); } } ?>