The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! /usr/bin/env perl

use strict;
use warnings;

use Test::More;
use Test::MockModule;
use File::Temp qw/tempdir/;
use Data::Dumper;


BEGIN {
        use_ok('Tapper::Installer::Base');
        use_ok('Tapper::Installer::Precondition');
}

# setup l4p
use Log::Log4perl;
my $string = "
log4perl.rootLogger           = INFO, root
log4perl.appender.root        = Log::Log4perl::Appender::Screen
log4perl.appender.root.stderr = 1
log4perl.appender.root.layout = SimpleLayout";
Log::Log4perl->init(\$string);

my $tempdir_base  = tempdir( CLEANUP => 1 );
my $tempdir_guest = tempdir( CLEANUP => 1 );


my @commands;
my $mock_base = Test::MockModule->new('Tapper::Base');
$mock_base->mock('log_and_exec', sub{ shift @_;push @commands, \@_; return 0});


my $base         = Tapper::Installer::Base->new;
my $package_file = 't/misc/packages/debian_package_test.deb';
my $destfile     = '/somefile';
my $config       = {paths => {
                              guest_mount_dir => $tempdir_guest,
                              base_dir        => $tempdir_base,
                             }};
my $precondition = {precondition_type => 'copyfile',
                    name => $package_file,
                    dest => $destfile,
                    protocol => 'local',
                    mountfile => '/tmp/directory/'};



my $copyfile=Tapper::Installer::Precondition::Copyfile->new($config);
my $retval = $copyfile->precondition_install($precondition);
is($retval, 0, 'Installation into flat image without errors');

is_deeply(\@commands, [
                       ["mount -o loop $tempdir_base/tmp/directory/ $tempdir_guest"],
                       ["cp", "--sparse=always", "-r", "-L", $package_file, "$tempdir_guest$destfile"],
                       ["umount $tempdir_guest"],
                       ["kpartx -d /dev/loop0"],
                       ["losetup -d /dev/loop0"],
                      ], "Guest install into flat image");

@commands = ();
# last installation may have changed precondition so we need to set it again
$precondition = {
                 precondition_type => 'copyfile',
                 name => $package_file,
                 dest => $destfile,
                 protocol => 'local',
                 mountfile => '/tmp/directory/',
                 mountpartition => 'p1'
                };
$retval = $copyfile->precondition_install($precondition);
is($retval, 0, 'Installation into image partition without errors');
is_deeply(\@commands,
          [
           ["losetup -d /dev/loop0"],
           ["losetup /dev/loop0 $tempdir_base/tmp/directory/"],
           ["kpartx -a /dev/loop0"],
           ["mount /dev/mapper/loop0p1 $tempdir_guest"],
           ["cp","--sparse=always","-r","-L","t/misc/packages/debian_package_test.deb","$tempdir_guest/somefile"],
           ["umount /dev/mapper/loop0p1"],
           ["kpartx -d /dev/loop0"],
           ["losetup -d /dev/loop0"],
          ], "Guest install into image partition"
         );


@commands = ();
# last installation may have changed precondition so we need to set it again
$precondition = {
                 precondition_type => 'copyfile',
                 name => $package_file,
                 dest => $destfile,
                 protocol => 'local',
                 mountpartition => '/does/not/exist',
                };
$retval = $copyfile->precondition_install($precondition);
is($retval, 0, 'Installation into partition without errors');
is_deeply(\@commands,
          [
           ["mount /does/not/exist $tempdir_guest"],
           ["cp","--sparse=always","-r","-L","t/misc/packages/debian_package_test.deb","$tempdir_guest/somefile"],
           ["umount $tempdir_guest"],
          ], "Guest install into partition"
         );

@commands = ();
# last installation may have changed precondition so we need to set it again
$precondition = {
                 precondition_type => 'copyfile',
                 name => $package_file,
                 dest => $destfile,
                 protocol => 'local',
                 mountdir => '/non/exist',
                };
$retval = $copyfile->precondition_install($precondition);
is($retval, 0, 'Installation into partition without errors');
is_deeply(\@commands,
          [
           ["cp","--sparse=always","-r","-L",$package_file,"$tempdir_base/non/exist$destfile"],
          ], "Guest install into directory"
         );

@commands = ();
# last installation may have changed precondition so we need to set it again
$precondition = {
                 precondition_type => 'copyfile',
                 name => $package_file,
                 dest => $destfile,
                 protocol => 'local',
                };

$retval = $copyfile->precondition_install($precondition);
is($retval, 0, 'Installation into partition without errors');
is_deeply(\@commands,
          [
           ["cp","--sparse=always","-r","-L",$package_file,"$tempdir_base$destfile"],
          ], "Normal install without guest"
         );

my $package=Tapper::Installer::Precondition::Package->new($config);
@commands = ();
# last installation may have changed precondition so we need to set it again
$precondition = {
                 precondition_type => 'package',
                 source_url        => 'nfs://osko:/exports/images/image.tgz',
                };

$retval = $package->precondition_install($precondition);
is($retval, 0, 'Installation of package from NFS without errors');
my $nfs_tempdir = $commands[0][3]; # if we succeed it will ;-)
is_deeply(\@commands,
          [
           [ 'mount', '-t nfs', 'osko:/exports/images/', $nfs_tempdir, ],
           [ "tar --no-same-owner -C $tempdir_base -xzf $nfs_tempdir/image.tgz" ],
           [ 'umount', $nfs_tempdir,]
          ],
          "Installation of package from NFS without errors"
         );

done_testing();