$qemu_server_module = Test::MockModule->new('PVE::QemuServer');
$qemu_server_module->mock(
kvm_user_version => sub {
- return $current_test->{qemu_version} // $base_env->{real_qemu_version};
+ return $current_test->{qemu_version} // $base_env->{real_qemu_version} // '2.12';
+ },
+ kvm_version => sub {
+ return $current_test->{qemu_version} // $base_env->{real_qemu_version} // '2.12';
+ },
+ kernel_has_vhost_net => sub {
+ return 1; # TODO: make this per-test configurable?
},
get_host_arch => sub() {
return $current_test->{host_arch} // 'x86_64';
},
);
+sub diff($$) {
+ my ($a, $b) = @_;
+ return if $a eq $b;
+
+ my ($ra, $wa) = POSIX::pipe();
+ my ($rb, $wb) = POSIX::pipe();
+ my $ha = IO::Handle->new_from_fd($wa, 'w');
+ my $hb = IO::Handle->new_from_fd($wb, 'w');
+
+ open my $diffproc, '-|', 'diff', '-up', "/proc/self/fd/$ra", "/proc/self/fd/$rb"
+ or die "failed to run program 'diff': $!";
+ POSIX::close($ra);
+ POSIX::close($rb);
+
+ open my $f1, '<', \$a;
+ open my $f2, '<', \$b;
+ my ($line1, $line2);
+ do {
+ $ha->print($line1) if defined($line1 = <$f1>);
+ $hb->print($line2) if defined($line2 = <$f2>);
+ } while (defined($line1 // $line2));
+ close $f1;
+ close $f2;
+ close $ha;
+ close $hb;
+
+ local $/ = undef;
+ my $diff = <$diffproc>;
+ close $diffproc;
+ die "files differ:\n$diff";
+}
+
sub do_test($) {
my ($config_fn) = @_;
# comment out for easier debugging
#file_set_contents("$cmd_fn.tmp", $cmdline);
- is_deeply($cmd, $cmd_expected, "$testname")
+ my $exp = join("\n", @$cmd_expected);
+ my $got = join("\n", @$cmd);
+ eval { diff($exp, $got) };
+ if (my $err = $@) {
+ fail("$testname");
+ note($err);
+ } else {
+ pass("$testname");
+ }
} else {
file_set_contents($cmd_fn, $cmdline);
}