App-LXC-Container
view release on metacpan or search on metacpan
t/08-data.t view on Meta::CPAN
}
sub check_comment_only_output($$@)
{
my $function = shift;
my $n = shift;
local $_ = @_;
is($_, $n, $function . ' returned correct number of output lines: ' . $_);
$n = 0;
like($_, qr{^#}, $function . ' returned a comment as line ' . ++$n)
foreach @_;
}
#########################################################################
# identical parts of messages:
my $re_msg_tail = qr/ at $0 line \d{2,}\.?$/;
my $re_eval = qr{ at \(eval \d+\)(\[t/\d+-[a-z]+\.t:\d+\])? line 1\.$};
my $re__e = qr{ at -e line \d\.};
my $re_data_tail = qr{ at .+/Data\.pm line \d+\.$};
#########################################################################
# All tests here trigger code paths in Data.pm not triggered by the other
# tests:
my $path = $ENV{PATH};
$ENV{PATH} = '';
output_like
{ eval 'App::LXC::Container::Data::groups_of("root");'; }
qr{^$},
qr{^Can't exec "id": No such file or directory$re_data_tail},
'id with empty PATH fails (STDERR)';
like($@,
qr{^can't open 'id --groups root': No such file or directory$re_eval},
'id with empty PATH fails ($@)');
eval { App::LXC::Container::Data::find_executable('a/b'); };
like($@,
qr{^INTERNAL ERROR .*: a/b may not contain directory$re_msg_tail},
'executable with directory fails');
$ENV{PATH} = '.:/non-existent:/etc:' . $path;
$_ = App::LXC::Container::Data::find_executable('fstab');
is($_, undef, 'non-executable files are not found in PATH');
$ENV{PATH} = $path;
check_singleton('os-release-like', 'Debian');
check_singleton('os-release-not-found',
qr{^can't open '.*/os-release-not-found': .+$re__e});
check_singleton('os-release-no-id',
qr{^Can't determine OS \(distribution\)! .+$re__e});
my $re1a = qr{aborting after the following error\(s\):\n};
my $re1b = qr{Can't locate App/LXC/Container/Data/Nonexistingdistribution.+\n};
my $re1c = qr{$re__e\n};
my $re2 = qr{unknown OS: Non-existing-distribution - .+$re__e};
check_singleton('os-release-unknown', qr{^$re1a$re1b$re1c$re2$});
$ENV{PATH} = T_PATH . '/mockup:' . $ENV{PATH};
# libraries_used:
chmod 0755, T_PATH . '/mockup/ldd'
or die "can't chmod 0755 ", T_PATH . '/mockup/ldd';
eval { App::LXC::Container::Data::libraries_used('/'); };
like($@,
qr{^INTERNAL ERROR .*: not a file: /$re_data_tail},
'libraries_used on / fails');
_setup_file('/home/no-executable');
stderr_like
{
eval {
App::LXC::Container::Data::libraries_used(TMP_PATH .
'/home/no-executable');
};
}
qr{^bad interpreter .* use ld-linux.so for dynamic linkage$re_data_tail},
'libraries_used on simple file fails';
_remove_file('/home/no-executable');
_setup_file('/home/fake-lib');
my @libs = ();
eval {
@libs =
App::LXC::Container::Data::libraries_used(TMP_PATH . '/home/fake-lib');
};
like(join(' - ', $@, @libs), qr{^$},
'libraries_used on fake library runs as excepted');
_remove_file('/home/fake-lib');
# switch back to real ldd:
chmod 0644, T_PATH . '/mockup/ldd'
or die "can't chmod 0644 ", T_PATH . '/mockup/ldd';
#########################################################################
# All tests here trigger code paths in Data/Debian.pm not triggered by the
# other tests:
reset_dpkg_status(T_PATH . '/mockup-files/dpkg.status');
my $singleton = App::LXC::Container::Data::_singleton;
defined $singleton->{STATUS} and die '$singleton->{STATUS} already set';
my @list =
App::LXC::Container::Data::depends_on('non-existing-package', 0);
$_ = @list;
is($_, 0, 'non-existing package has no dependencies');
@list = App::LXC::Container::Data::depends_on('libasound2-data', 0);
$_ = @list;
is($_, 0, 'libasound2-data package has no mandatory dependencies');
@list = App::LXC::Container::Data::depends_on('libasound2-data', 1);
is_deeply(\@list, [qw(alsa-ucm-conf alsa-topology-conf)],
'libasound2-data package recommends 2 packages');
@list = App::LXC::Container::Data::depends_on('libasound2-data', 2);
is_deeply(\@list, [qw(alsa-ucm-conf alsa-topology-conf alsa-utils)],
'libasound2-data package suggests 1 additional package');
# mockup-1 test depends on 06-update.t (+ indirectly 02-init.t & 03-setup.t):
@list = App::LXC::Container::Data::paths_of('mockup-1');
like(join(' ', '', @list), qr{^( [^ ]+/usr/bin/1chromium){3}$},
'paths_of mockup-1 returns 3 identical entries');
eval { App::LXC::Container::Data::paths_of('mockup-2'); };
like($@,
qr{^INTERNAL ERROR .* dpkg-query --listfiles mockup-2: bad entry: fatal},
'paths_of fails correctly for bad entry');
eval { App::LXC::Container::Data::paths_of('mockup-3'); };
like($@,
qr{^INTERNAL ERROR .* --listfiles failed to find anything for mockup-3},
'paths_of fails correctly for empty package');
reset_dpkg_status(T_PATH . '/mockup-files/dpkg.status.missing');
eval { App::LXC::Container::Data::depends_on('dummy', 0); };
like($@,
qr{^can't open '.*/mockup-files/dpkg\.status\.missing': No such file or},
'non-existing dpkg.status fails correctly');
reset_dpkg_status(T_PATH . '/mockup-files/dpkg.status.bad-arch');
eval { App::LXC::Container::Data::depends_on('dummy', 0); };
like($@,
qr{^can't determine package in .*/mockup-files/dpkg\.status\.bad-arch. },
'Architecture entry without package fails correctly');
reset_dpkg_status(T_PATH . '/mockup-files/dpkg.status.bad-dep');
eval { App::LXC::Container::Data::depends_on('dummy', 0); };
like($@,
qr{^can't determine package in .*/mockup-files/dpkg\.status\.bad-dep. },
'Dependency entry without package fails correctly');
#########################################################################
# All tests here trigger code paths in Data/common.pm not triggered by the
# other tests:
$_ = App::LXC::Container::Data::common::new();
is($_, $singleton, 'call to common::new returned correct singleton');
$ENV{ALC_MINIMAL_SEARCH}='on';
( run in 1.141 second using v1.01-cache-2.11-cpan-99c4e6809bf )