package TestModperl::pnotes; use strict; use warnings FATAL => 'all'; use Apache2::RequestUtil (); use Apache2::ConnectionUtil (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; # make it ok to call ok() here while plan()ing elsewhere Apache::Test::init_test_pm($r); Test::_reset_globals() if Test->can('_reset_globals'); $Test::ntest = 1 + (26 * ($r->args - 1)); $Test::planned = 26; my $c = $r->connection; # we call this handler 3 times. # $r->pnotes('request') should be unset each time # $c->pnotes('connection') should be unset the first # time but set the second time due to the keepalive # request. the second request then cleans up after # itself, leaving $c->pnotes again unset at the # start of the third request if ($r->args == 2) { ok t_cmp($c->pnotes('connection'), 'CSET', '$c->pnotes() persists across keepalive requests'); } else { t_debug('testing $c->pnotes is empty'); ok (! $c->pnotes('connection')); } # $r->pnotes should be reset each time t_debug('testing $r->pnotes is empty'); ok (! $r->pnotes('request')); foreach my $map ({type => 'r', object => $r}, {type => 'c', object => $c}) { my $type = $map->{type}; my $o = $map->{object}; t_debug("testing $type->pnotes call"); ok $o->pnotes; ok t_cmp($o->pnotes('pnotes_foo', 'pnotes_bar'), 'pnotes_bar', "$type->pnotes(key,val)"); ok t_cmp($o->pnotes('pnotes_foo'), 'pnotes_bar', "$type->pnotes(key)"); ok t_cmp(ref($o->pnotes), 'HASH', "ref($type->pnotes)"); ok t_cmp($o->pnotes()->{'pnotes_foo'}, 'pnotes_bar', "$type->pnotes()->{}"); # unset the entry (but the entry remains with undef value) $o->pnotes('pnotes_foo', undef); ok t_cmp($o->pnotes('pnotes_foo'), undef, "unset $type contents"); my $exists = exists $o->pnotes->{'pnotes_foo'}; $exists = 1 if $] < 5.008001; # changed in perl 5.8.1 ok $exists; # now delete completely (possible only via the hash inteface) delete $o->pnotes()->{'pnotes_foo'}; ok t_cmp($o->pnotes('pnotes_foo'), undef, "deleted $type contents"); ok !exists $o->pnotes->{'pnotes_foo'}; # test blessed references, like DBI # DBD::DBM ships with DBI... if (have_module(qw(DBI DBD::DBM))) { my $dbh = DBI->connect('dbi:DBM:'); $o->pnotes(DBH => $dbh); my $pdbh = $o->pnotes('DBH'); ok t_cmp(ref($pdbh), 'DBI::db', "ref($type->pnotes('DBH'))"); my $quote = $pdbh->quote("quoth'me"); # see the DBI manpage for why quote() returns the string # wrapped in ' marks ok t_cmp($quote, "'quoth\\'me'", '$pdbh->quote() works'); } else { skip ('skipping $dbh retrival test - no DBI or DBD::DBM'); skip ('skipping $dbh->quote() test - no DBI or DBD::DBM'); } } # set pnotes so we can test unset on later connections $r->pnotes(request => 'RSET'); $c->pnotes(connection => 'CSET'); ok t_cmp($r->pnotes('request'), 'RSET', '$r->pnotes() set'); ok t_cmp($c->pnotes('connection'), 'CSET', '$c->pnotes() set'); Apache2::Const::OK; } 1; __END__