use
lib
"$FindBin::Bin/lib"
;
plugin
'Parallol'
;
sub
one {
my
$c
=
pop
;
Mojo::IOLoop->timer(0.1,
sub
{
$c
->(1) });
}
helper
one
=>
sub
{ one(
@_
); };
get
'/'
=>
sub
{
my
$self
=
shift
;
my
$a
= 0;
my
$b
= 0;
$self
->on_parallol(
sub
{
shift
->render(
text
=>
$a
+
$b
) } );
one
$self
->parallol(
weaken
=> 0,
sub
{
$a
=
pop
;
});
one
$self
->parallol(
sub
{
$self
->req;
$b
=
pop
;
});
};
get
'/stash'
=>
sub
{
my
$self
=
shift
;
one
$self
->parallol(
'a'
);
one
$self
->parallol(
'b'
);
};
get
'/nested'
=>
sub
{
my
$self
=
shift
;
$self
->on_parallol(
sub
{
shift
->render(
'stash'
) });
one
$self
->parallol(
sub
{
$self
->stash(
a
=>
pop
);
one
$self
->parallol(
'b'
);
});
};
get
'/instant'
=>
sub
{
my
$self
=
shift
;
$self
->on_parallol(
sub
{
shift
->render(
'stash'
) });
$self
->parallol(
'a'
)->(1);
$self
->parallol(
'b'
)->(1);
};
get
'/error'
=>
sub
{
my
$self
=
shift
;
$self
->one(
$self
->parallol(
weaken
=> 0,
sub
{
die
"oh no"
;
}));
};
get
'/error_done'
=>
sub
{
my
$self
=
shift
;
$self
->on_parallol(
sub
{
die
"oh no"
;
});
$self
->one(
$self
->parallol(
'one'
));
};
my
$r
= app->routes;
$r
->route(
'/app'
)->to(
'ParallolController#do_index'
);
$r
->route(
'/app/stash'
)->to(
'ParallolController#do_stash'
);
$r
->route(
'/app/nested'
)->to(
'ParallolController#do_nested'
);
$r
->route(
'/app/instant'
)->to(
'ParallolController#do_instant'
);
$r
->route(
'/app/error'
)->to(
'ParallolController#do_error'
);
$r
->route(
'/app/error_done'
)->to(
'ParallolController#do_error_done'
);
my
$t
= Test::Mojo->new;
my
$p
= Mojo::Server::PSGI->new;
sub
plack_body {
my
$body
=
shift
;
my
$res
=
""
;
if
(
ref
$body
eq
'ARRAY'
) {
for
my
$line
(
@$body
) {
$res
.=
$line
if
length
$line
;
}
}
else
{
local
$/ = \65536
unless
ref
$/;
while
(
defined
(
my
$line
=
$body
->getline)) {
$res
.=
$line
if
length
$line
;
}
$body
->
close
;
}
$res
;
}
sub
t {
my
(
$path
,
$content
,
$status
) =
@_
;
$status
//= 200;
$t
->get_ok(
$path
)->status_is(
$status
)->content_like(
$content
);
{
my
(
$status
,
$header
,
$body
) = @{
$p
->run({
PATH_INFO
=>
$path
})};
is
$status
,
$status
;
like plack_body(
$body
),
$content
;
};
}
t
'/'
,
qr/2/
;
t
'/stash'
,
qr/11/
;
t
'/nested'
,
qr/11/
;
t
'/instant'
,
qr/11/
;
t
'/error'
,
qr/Server error/
, 500;
t
'/error_done'
,
qr/Server error/
, 500;
t
'/app'
,
qr/2/
;
t
'/app/stash'
,
qr/11/
;
t
'/app/nested'
,
qr/11/
;
t
'/app/instant'
,
qr/11/
;
t
'/app/error'
,
qr/Server error/
, 500;
t
'/app/error_done'
,
qr/Server error/
, 500;
done_testing;