| # 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::TestHarnessPHP; |
| |
| use strict; |
| use warnings FATAL => 'all'; |
| |
| use File::Spec::Functions qw(catfile catdir); |
| use File::Find qw(finddepth); |
| use Apache::TestHarness (); |
| use Apache::TestTrace; |
| use Apache::TestConfig (); |
| |
| use vars qw(@ISA); |
| @ISA = qw(Apache::TestHarness); |
| use TAP::Formatter::Console; |
| use TAP::Harness; |
| |
| sub get_tests { |
| |
| my $self = shift; |
| my $args = shift; |
| my @tests = (); |
| |
| my $base = -d 't' ? catdir('t', '.') : '.'; |
| |
| my $ts = $args->{tests} || []; |
| |
| if (@$ts) { |
| for (@$ts) { |
| if (-d $_) { |
| push(@tests, sort <$base/$_/*.t>); |
| push(@tests, sort <$base/$_/*.php>); |
| } |
| else { |
| $_ .= ".t" unless /(\.t|\.php)$/; |
| push(@tests, $_); |
| } |
| } |
| } |
| else { |
| if ($args->{tdirs}) { |
| push @tests, map { sort <$base/$_/*.t> } @{ $args->{tdirs} }; |
| push @tests, map { sort <$base/$_/*.php> } @{ $args->{tdirs} }; |
| } |
| else { |
| finddepth(sub { |
| return unless /\.(t|php)$/; |
| return if $File::Find::dir =~ m/\b(conf|htdocs|logs|response)\b/; |
| my $t = catfile $File::Find::dir, $_; |
| my $dotslash = catfile '.', ""; |
| $t =~ s:^\Q$dotslash::; |
| push @tests, $t |
| }, $base); |
| @tests = sort @tests; |
| } |
| } |
| |
| @tests = $self->prune(@tests); |
| |
| if (my $skip = $self->skip) { |
| # Allow / \ and \\ path delimiters in SKIP file |
| $skip =~ s![/\\\\]+![/\\\\]!g; |
| |
| @tests = grep { not /(?:$skip)/ } @tests; |
| } |
| |
| Apache::TestSort->run(\@tests, $args); |
| |
| #when running 't/TEST t/dir' shell tab completion adds a / |
| #dir//foo output is annoying, fix that. |
| s:/+:/:g for @tests; |
| |
| # remove *.php tests unless we can run them with php |
| if (! Apache::TestConfig::which('php')) { |
| warning(join ' - ', 'skipping *.php tests', |
| 'make sure php is in your PATH'); |
| @tests = grep { not /\.php$/ } @tests; |
| } |
| elsif (! $phpclient) { |
| warning(join ' - ', 'skipping *.php tests', |
| 'Test::Harness 2.38 not available'); |
| @tests = grep { not /\.php$/ } @tests; |
| } |
| |
| return @tests; |
| } |
| |
| sub run { |
| my $self = shift; |
| my $args = shift || {}; |
| my $formatter = TAP::Formatter::Console->new; |
| my $agg = TAP::Parser::Aggregator->new; |
| my $verbose = $args->{verbose} && $args->{verbose}; |
| my $php_harness = TAP::Harness->new |
| ({exec => $self->command_line(), |
| verbosity => $verbose}); |
| my $perl_harness = TAP::Harness->new |
| ({verbosity => $verbose}); |
| my @tests = $self->get_tests($args, @_); |
| |
| $agg->start(); |
| $php_harness->aggregate_tests($agg, grep {m{\.php$}} @tests); |
| $perl_harness->aggregate_tests($agg, grep {m{\.t$}} @tests); |
| $agg->stop(); |
| |
| $formatter->summary($agg); |
| } |
| |
| sub command_line { |
| my $self = shift; |
| |
| my $server_root = Apache::Test::vars('serverroot'); |
| |
| my $conf = catfile($server_root, 'conf'); |
| |
| my $ini = catfile($conf, 'php.ini'); |
| |
| my $php = Apache::TestConfig::which('php') || |
| die 'no php executable found in ' . $ENV{PATH}; |
| |
| return ["env", "SERVER_ROOT=$server_root", |
| $php, "--php-ini", $ini, "--define", "include_path=$conf"]; |
| } |
| |
| 1; |