The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestPerl::api;

# some perl APIs that we need to test that they work alright under mod_perl

use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestUtil;
use Apache::TestTrace;

use Apache2::Build;

use Apache2::Const -compile => 'OK';

sub handler {
    my $r = shift;

    # - XXX: with perl 5.6.1 this test works fine on its own, but if
    # run in the same interpreter after a test that involves a complex die
    # call, as in the case of t/filter/in_error, which dies inside a
    # filter, perl gets messed up here. this can be reproduced by
    # running:
    # t/TEST -maxclients 1 t/filter/in_error.t t/perl/api.t
    # so skip that test for now on 5.6
    #
    # - win32 is an unrelated issue
    plan $r, tests => 2,
        need { "getppid() is not implemented on Win32"
                   => !Apache2::Build::WIN32(),
               "getppid() is having problems with perl 5.6"
                   => !($] < 5.008),
               };

    {
        # 5.8.1 w/ ithreads has a bug where it caches ppid in PL_ppid,
        # but updates the record only if perl's fork is called, which
        # is not the case with mod_perl. This results in getppid()
        # returning 1. A local workaround in the mod_perl source at
        # the child_init phase fixes the problem.
        my $ppid = getppid();
        t_debug "ppid $ppid";
        ok $ppid > 1;

        # verify that $pid != $ppid
        t_debug "pid $$";
        ok $ppid != $$;
    }

    Apache2::Const::OK;
}

1;