Test-Unix-User
view release on metacpan or search on metacpan
lib/Test/Unix/User.pm view on Meta::CPAN
being concerned about the numeric UID. Use both of these together to
ensure that the UID and the owner name match.
C<gid> is to C<group> as C<uid> is to C<owner>.
=cut
sub homedir_ok {
return unless _check_spec(@_);
my($spec, $test_name) = @_;
if(! defined $test_name) {
$test_name = "Home directory for user '$spec->{name}'";
$test_name .= ' (' . join(', ', sort keys %$spec) . ')';
}
my @diag;
foreach my $field (keys %$spec) {
if(! exists $HDIR_FIELDS{$field}) {
push @diag, " Invalid field '$field' given";
delete $spec->{$field};
next;
}
if(! defined $spec->{$field} or $spec->{$field} =~ /^\s*$/) {
push @diag, " Empty field '$field' given";
delete $spec->{$field};
next;
}
}
my $u = getpwnam($spec->{name});
if(! defined $u) {
my $ok = $Test->ok(0, $test_name);
$Test->diag(" User '$spec->{name}' does not exist");
return $ok;
}
if(! -d $u->dir) {
my $ok = $Test->ok(0, $test_name);
$Test->diag(" Home directory '" . $u->dir . "' for '$spec->{name}' is not a directory");
return $ok;
}
my $sb = stat($u->dir);
foreach my $field (qw(uid gid)) {
if(exists $spec->{$field}) {
if($sb->$field != $spec->{$field}) {
push @diag, " Field: $field\n";
push @diag, " expected: $spec->{$field}\n";
push @diag, " got: " . $sb->$field . "\n";
}
}
}
if(exists $spec->{owner}) {
my $owner = getpwuid($sb->uid)->name();
if($spec->{owner} ne $owner) {
push @diag, " Field: owner\n";
push @diag, " expected: $spec->{owner}\n";
push @diag, " got: $owner\n";
}
}
if(exists $spec->{group}) {
my $group = getgrgid($sb->gid);
if($spec->{group} ne $group) {
push @diag, " Field: group\n";
push @diag, " expected: $spec->{group}\n";
push @diag, " got: $group\n";
}
}
if(exists $spec->{perm}) {
if(($sb->mode & 07777) != $spec->{perm}) {
push @diag, " Field: perm\n";
push @diag, sprintf(" expected: %04o\n", $spec->{perm});
push @diag, sprintf(" got: %04o\n", $sb->mode & 07777);
}
}
if(@diag) {
my $ok = $Test->ok(0, $test_name);
$Test->diag(@diag);
return $ok;
}
return $Test->ok(1, $test_name);
}
sub _check_spec {
my($spec, $test_name) = @_;
my $sub = (caller(1))[3];
$sub =~ s/Test::Unix::User:://;
if(! defined $spec) {
my $ok = $Test->ok(0, "$sub()");
$Test->diag(" $sub() called with no arguments");
return $ok;
}
if(ref($spec) ne 'HASH') {
my $t = $test_name;
$t = "$sub(...)" unless defined $t;
my $ok = $Test->ok(0, $t);
$Test->diag(" First argument to $sub() must be a hash ref");
return $ok;
}
if(! exists $spec->{name} or
! defined $spec->{name} or
$spec->{name} =~ /^\s*$/) {
my $t = $test_name;
$t = "$sub(...)" unless defined $t;
my $ok = $Test->ok(0, $t);
$Test->diag(" $sub() called with no user name");
( run in 0.807 second using v1.01-cache-2.11-cpan-39bf76dae61 )