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 )