The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Rex::Virtualization;
use Test::More tests => 6;
use Data::Dumper;
use Rex::Helper::Run;
use Rex::Commands::File;
use Rex::Commands::Fs;
use Rex::Commands::Run;

$::QUIET = 1;

my $image_format = "raw";

sub get_image_format { return $image_format; }

my $count_file = 0;
my $count_exec = 0;

no warnings 'redefine';

# TODO implement mocking

sub Rex::Commands::File::file {
  my ( $name, %params ) = @_;

  my $fmt = get_image_format();
  like $params{content}, qr|<driver name="qemu" type="$fmt"/>|,
    "Found file content for $fmt format.";
  $count_file++;
}

sub Rex::Commands::Run::can_run {
  return 1;
}

sub Rex::Commands::Fs::unlink {
  my ($file) = @_;
}

sub Rex::Helper::Run::i_run {
  my ($exec) = @_;

  if ( $exec =~ m/virsh.*capabilities/ ) {
    return eval { local (@ARGV) = ("t/issue/948/capabilities.xml"); <>; };
  }

  if ( $exec =~ m/^qemu\-img create/ ) {
    my $fmt = get_image_format();
    like $exec, qr/^qemu\-img create \-f $fmt/, "qemu-img created a raw image.";
    $count_exec++;
  }

  return "";
}

use warnings;

my $v = Rex::Virtualization->create("LibVirt");

$v->execute(
  "create", "test01",
  storage => [
    {
      file => "/mnt/data/libvirt/images/vm01.img",
      dev  => "vda",
    }
  ]
);

$image_format = "qcow2";

$v->execute(
  "create", "test01",
  storage => [
    {
      file        => "/mnt/data/libvirt/images/vm01.img",
      dev         => "vda",
      driver_type => "qcow2",
    }
  ]
);

is( $count_exec, 2, "Executed qemu-img 2 times." );
is( $count_file, 2, "Created virsh file 2 times." );