our
$VERSION
=
'0.35'
;
use
5.008000;
{
package
Test::SharedFork::Contextual;
sub
call {
my
$code
=
shift
;
my
$wantarray
= [
caller
(1)]->[5];
if
(
$wantarray
) {
my
@result
=
$code
->();
bless
{
result
=> \
@result
,
wantarray
=>
$wantarray
}, __PACKAGE__;
}
elsif
(
defined
$wantarray
) {
my
$result
=
$code
->();
bless
{
result
=>
$result
,
wantarray
=>
$wantarray
}, __PACKAGE__;
}
else
{
{ ;
$code
->(); }
bless
{
wantarray
=>
$wantarray
}, __PACKAGE__;
}
}
sub
result {
my
$self
=
shift
;
if
(
$self
->{
wantarray
}) {
return
@{
$self
->{result} };
}
elsif
(
defined
$self
->{
wantarray
}) {
return
$self
->{result};
}
else
{
return
;
}
}
}
my
$STORE
;
sub
_mangle_builder {
my
$builder
=
shift
;
if
( $] >= 5.008001 &&
$Config
{useithreads} &&
$INC
{
'threads.pm'
} ) {
die
"# Current version of Test::SharedFork does not supports ithreads."
;
}
if
(
$builder
->can(
"coordinate_forks"
)) {
$builder
->new->coordinate_forks(1);
}
elsif
(
$INC
{
'Test2/Global.pm'
} ||
$INC
{
'Test2/API.pm'
} ||
$INC
{
'Test2/Context.pm'
}) {
Test2::Global::test2_ipc_enable_polling();
my
$stack
=
$builder
->{Stack};
return
if
$stack
->top->ipc;
my
(
$driver
) = Test2::Global::test2_ipc_drivers();
unless
(
$driver
) {
$driver
=
'Test2::IPC::Driver::Files'
;
}
my
$ipc
=
$driver
->new();
for
my
$hub
(
@$stack
) {
$hub
->set_ipc(
$ipc
);
$ipc
->add_hub(
$hub
->hid);
}
}
elsif
(
$INC
{
'Test/Stream/Sync.pm'
}) {
Test::Stream::IPC->
import
(
'poll'
);
Test::Stream::IPC->enable_polling
if
Test::Stream::IPC->can(
'enable_polling'
);
my
$stack
=
$builder
->{Stack};
return
if
$stack
->top->ipc;
my
(
$driver
) = Test::Stream::IPC->drivers;
my
$ipc
=
$driver
->new();
for
my
$hub
(
@$stack
) {
$hub
->set_ipc(
$ipc
);
$ipc
->add_hub(
$hub
->hid);
}
}
else
{
$STORE
= Test::SharedFork::Store->new(
cb
=>
sub
{
my
$store
=
shift
;
tie
$builder
->{Curr_Test},
'Test::SharedFork::Scalar'
,
$store
,
'Curr_Test'
;
tie
$builder
->{Is_Passing},
'Test::SharedFork::Scalar'
,
$store
,
'Is_Passing'
;
tie
@{
$builder
->{Test_Results} },
'Test::SharedFork::Array'
,
$store
,
'Test_Results'
;
},
init
=> +{
Test_Results
=>
$builder
->{Test_Results},
Curr_Test
=>
$builder
->{Curr_Test},
Is_Passing
=> 1,
},
);
no
strict
'refs'
;
no
warnings
'redefine'
;
no
warnings
'uninitialized'
;
for
my
$name
(
qw/ok skip todo_skip current_test is_passing/
) {
my
$orig
= *{
"Test::Builder::${name}"
}{CODE};
*{
"Test::Builder::${name}"
} =
sub
{
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
local
$Test::Builder::BLevel
=
$Test::Builder::BLevel
+ 1;
my
$lock
=
$STORE
->get_lock();
$orig
->(
@_
);
};
};
}
}
BEGIN {
my
$builder
= __PACKAGE__->builder;
_mangle_builder(
$builder
);
}
{
sub
parent { }
sub
child { }
sub
fork
{
fork
() }
}
1;