The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#! /usr/bin/env perl

use strict;
use warnings;

use Cwd;
use Test::More;
use Test::MockModule;
use File::Temp qw/tempdir/;
use Log::Log4perl;

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


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

my $tempdir = tempdir( CLEANUP => 1 );
my $config = {paths =>
              {
               base_dir  => $tempdir,
               image_dir => $tempdir,
              }
             };

my $precondition = {
                    partition => '/dev/sda2',
                    mount     => '/mountpath/',
                   };

my $image_installer = Tapper::Installer::Precondition::Image->new($config);
my $retval;
SKIP:{
        skip "Can not test get_device since make dist kills symlinks", 3 unless -l "t/misc/dev/disk/by-label/testing";
        $retval = $image_installer->get_device('/dev/hda2','t/misc/');
        is($retval, "/dev/hda2", "Find device from single file without links");

        $retval = $image_installer->get_device('testing','t/misc/');
        is($retval, "/dev/hda2", "Find device from single file with links");

        $retval = $image_installer->get_device(['/dev/sda2','testing'],'t/misc/');
        is($retval, "/dev/hda2", "Find device from file list with links");
}

my $mock_image = Test::MockModule->new('Tapper::Installer::Precondition::Image');
$mock_image->mock('get_device', sub{return(0, '/dev/sda2')});
$mock_image->mock('makedir', sub{return('FAIL')});
$mock_image->mock('log_and_exec', sub{return(wantarray ? (0,0) : 0)});


$retval = $image_installer->install($precondition);
is($retval, 'FAIL', 'Test when makedir fails');


$mock_image->mock('makedir', sub{return(0)});
$mock_image->unmock('makedir');

for (my $i = 1; $i <= 3; $i++) {
        my %precondition = %$precondition;
        $precondition{mount} = "/mount$i";
        $retval = $image_installer->install(\%precondition);
        is($retval, 0, "Install one image without actual image part ($i)");
}

# get a list of images that don't have $basedir.$mount as mount value
my @wrong_mounts =  grep{$_->{mount} !~ m|/mount\d|} @{$image_installer->images};
is_deeply(\@wrong_mounts, [], 'Mounts saved in $self->images');

my @results;
$mock_image->mock('log_and_exec', sub{shift @_; push @results, \@_});
$image_installer->unmount();

for (my $i = 3; $i >= 1; $i--) {
        my $image = shift @results;
        is_deeply($image, ['umount',"$tempdir/mount$i"], "Umount directory ($i)");
}

$precondition->{image} = '/this/image/does/not/exists.tgz';

$retval = $image_installer->install($precondition);
is($retval, "Image "."/this/image/does/not/exists.tgz could not be found", 'Install nonexisting image');



done_testing();