Mojolicious-Plugin-SetUserGroup
view release on metacpan or search on metacpan
xt/author/sudo_prefork.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use Mojo::IOLoop;
use Mojo::IOLoop::Server;
use Mojo::JSON 'j';
use Mojo::Server::Prefork;
use Mojo::UserAgent;
use POSIX qw(getuid getgid geteuid);
use Unix::Groups::FFI 'getgroups';
plan skip_all => 'TEST_RUN_SUDO=1' unless $ENV{TEST_RUN_SUDO};
if ((my $uid = geteuid()) != 0) {
my $user = getpwuid $uid;
my $gid = getgid();
my $group = getgrgid $gid;
my $groups = [getgroups()];
$ENV{TEST_ORIGINAL_USER} = j {user => $user, group => $group, uid => $uid, gid => $gid, groups => $groups};
my @args = ('sudo', '-nE', $^X);
push @args, '-I', $_ for @INC;
push @args, $0, @ARGV;
exec @args;
}
my $original = j($ENV{TEST_ORIGINAL_USER} || '{}');
plan skip_all => "user is missing in TEST_ORIGINAL_USER=$ENV{TEST_ORIGINAL_USER}"
unless my $user = delete $original->{user};
my $group = delete $original->{group};
my $port = Mojo::IOLoop::Server->generate_port;
defined(my $pid = fork) or die "Fork failed: $!";
unless ($pid) {
my $daemon = Mojo::Server::Prefork->new(listen => ["http://127.0.0.1:$port?single_accept=1"],
silent => 1, workers => 2, accepts => 10, multi_accept => 1);
$daemon->app->plugin(SetUserGroup => {user => $user, group => $group});
$daemon->app->routes->children([]);
$daemon->app->routes->get('/' => sub {
shift->render(json => {
uid => getuid(),
gid => getgid(),
groups => [getgroups()],
});
});
$daemon->run;
exit 0;
}
my $ua = Mojo::UserAgent->new;
my @responses;
Mojo::IOLoop->delay(sub {
Mojo::IOLoop->timer(0.2 => shift->begin);
}, sub {
my $delay = shift;
$ua->get("http://127.0.0.1:$port/", $delay->begin) for 1..5;
}, sub {
my ($delay, @txs) = @_;
push @responses, map { $_->res->body } @txs;
Mojo::IOLoop->stop;
});
my $failed;
Mojo::IOLoop->timer(1 => sub { $failed = 1; Mojo::IOLoop->stop });
Mojo::IOLoop->start;
kill 'TERM', $pid or die "Failed to stop prefork server: $!";
waitpid $pid, 0;
ok !$failed, 'Loop stopped successfully';
my $orig_groups = delete $original->{groups};
foreach my $response (@responses) {
my $r_json = j($response);
( run in 0.717 second using v1.01-cache-2.11-cpan-39bf76dae61 )