#!/usr/bin/perl
use strict;
use warnings;
use parent qw(Test::Class);
use Test::More;
use Time::HiRes qw(sleep);
if ($^O eq 'darwin') {
plan skip_all => 'Group tests are broken on MacOSX';
}
use lib 'lib';
use lib '.';
use t::Utils;
use Ubic;
sub setup :Test(setup) {
rebuild_tfiles();
local_ubic( service_dirs => ['root_t/service'] );
xsystem('chmod -R 1777 tfiles');
}
sub file_not_ok {
my $daemon = shift;
my $file = "tfiles/$daemon.result";
ok(-z $file);
}
sub file_ok {
my $daemon = shift;
my $file = "tfiles/$daemon.result";
open my $fh, "<", $file or die "open failed: $!";
my $line = <$fh>;
is($line, "abc\n");
}
sub prepare_file($$$$) {
my ($daemon, $user, $group, $chmod) = @_;
my $file = "tfiles/$daemon.result";
my $gid = getgrnam $group;
my $uid = getpwnam $user;
open my $fh, ">>", $file or die "open failed: $!";
close $fh or die "close failed: $!";
chown $uid, $gid, $file or die "chown failed: $!";
chmod $chmod, $file or die "chmod failed: $!";
}
sub execute_daemon($) {
my $name = shift;
Ubic->start($name);
sleep 0.1;
Ubic->stop($name);
}
sub group_ok :Test(1) {
my $daemon = 'daemongroup-daemon'; # nobody/daemon
prepare_file($daemon, 'root', 'daemon', 0664);
execute_daemon($daemon);
file_ok($daemon);
}
sub group_reset :Test(1) {
my $daemon = 'daemongroup-daemon'; # nobody/daemon
prepare_file($daemon, 'root', 'root', 0664);
eval { execute_daemon($daemon) };
file_not_ok($daemon); # root group got reset when forking to daemon
}
sub supplementary_group :Test(1) {
my $daemon = 'daemongroup2-daemon'; # nobody/daemon+root
prepare_file($daemon, 'root', 'root', 0664);
execute_daemon($daemon);
file_ok($daemon);
}
__PACKAGE__->new->runtests;