]> git.proxmox.com Git - pve-container.git/blobdiff - src/test/snapshot-test.pm
add vm_stop helper
[pve-container.git] / src / test / snapshot-test.pm
index c0504f65911bd8f3c978f057d35f5db6fcfedb5e..796b6b477c80fe1fc0fe6de215faf149d4c65bae 100644 (file)
@@ -1,4 +1,4 @@
-package PVE::LXC;
+package PVE::LXC::Test;
 
 use strict;
 use warnings;
@@ -8,7 +8,9 @@ use lib qw(..);
 use PVE::Storage;
 use PVE::Storage::Plugin;
 use PVE::LXC;
+use PVE::LXC::Config;
 use PVE::Tools;
+use PVE::ReplicationConfig;
 
 use Test::MockModule;
 use Test::More;
@@ -28,6 +30,15 @@ my $kill_possible;
 
 # Mocked methods
 
+sub mocked_has_feature {
+    my ($feature, $conf, $storecfg, $snapname) = @_;
+    return $snapshot_possible;
+}
+
+sub mocked_check_running {
+    return $running;
+}
+
 sub mocked_volume_snapshot {
     my ($storecfg, $volid, $snapname) = @_;
     die "Storage config not mocked! aborting\n"
@@ -101,6 +112,15 @@ sub mocked_volume_rollback_is_possible {
     die "volume_rollback_is_possible failed\n";
 }
 
+sub mocked_vm_stop {
+    if ($kill_possible) {
+       $running = 0;
+       return 1;
+    } else {
+       return 0;
+    }
+}
+
 sub mocked_run_command {
     my ($cmd, %param) = @_;
     my $cmdstring;
@@ -111,12 +131,7 @@ sub mocked_run_command {
            die "lxc-[un]freeze disabled\n";
        }
        if ($cmdstring =~ m/.*\/lxc-stop.*--kill.*/) {
-           if ($kill_possible) {
-               $running = 0;
-               return 1;
-           } else {
-               return 0;
-           }
+           mocked_vm_stop();
        }
     }
     die "unexpected run_command call: '$cmdstring', aborting\n";
@@ -140,7 +155,7 @@ sub testcase_prepare {
        plan tests => 2;
        $@ = undef;
        eval {
-           PVE::LXC::snapshot_prepare($vmid, $snapname, $save_vmstate, $comment);
+           PVE::LXC::Config->__snapshot_prepare($vmid, $snapname, $save_vmstate, $comment);
        };
        is($@, $exp_err, "\$@ correct");
        ok(test_file("snapshot-expected/prepare/lxc/$vmid.conf", "snapshot-working/prepare/lxc/$vmid.conf"), "config file correct");
@@ -153,7 +168,7 @@ sub testcase_commit {
        plan tests => 2;
        $@ = undef;
        eval {
-           PVE::LXC::snapshot_commit($vmid, $snapname);
+           PVE::LXC::Config->__snapshot_commit($vmid, $snapname);
        };
        is($@, $exp_err, "\$@ correct");
        ok(test_file("snapshot-expected/commit/lxc/$vmid.conf", "snapshot-working/commit/lxc/$vmid.conf"), "config file correct");
@@ -170,7 +185,7 @@ sub testcase_create {
        $exp_vol_snap_delete = {} if !defined($exp_vol_snap_delete);
        $@ = undef;
        eval {
-           PVE::LXC::snapshot_create($vmid, $snapname, $save_vmstate, $comment);
+           PVE::LXC::Config->snapshot_create($vmid, $snapname, $save_vmstate, $comment);
        };
        is($@, $exp_err, "\$@ correct");
        is_deeply($vol_snapshot, $exp_vol_snap, "created correct volume snapshots");
@@ -187,7 +202,7 @@ sub testcase_delete {
        $exp_vol_snap_delete = {} if !defined($exp_vol_snap_delete);
        $@ = undef;
        eval {
-           PVE::LXC::snapshot_delete($vmid, $snapname, $force);
+           PVE::LXC::Config->snapshot_delete($vmid, $snapname, $force);
        };
        is($@, $exp_err, "\$@ correct");
        is_deeply($vol_snapshot_delete, $exp_vol_snap_delete, "deleted correct volume snapshots");
@@ -204,7 +219,7 @@ sub testcase_rollback {
        $exp_vol_snap_rollback = {} if !defined($exp_vol_snap_rollback);
        $@ = undef;
        eval {
-           PVE::LXC::snapshot_rollback($vmid, $snapname);
+           PVE::LXC::Config->snapshot_rollback($vmid, $snapname);
        };
        is($@, $exp_err, "\$@ correct");
        is_deeply($vol_snapshot_rollback, $exp_vol_snap_rollback, "rolled back to correct volume snapshots");
@@ -212,33 +227,33 @@ sub testcase_rollback {
     };
 }
 
-# BEGIN redefine PVE::LXC methods 
-sub config_file_lock {
+# BEGIN mocked PVE::LXC::Config methods
+sub mocked_config_file_lock {
     return "snapshot-working/pve-test.lock";
 }
 
-sub cfs_config_path {
-    my ($vmid, $node) = @_;
+sub mocked_cfs_config_path {
+    my ($class, $vmid, $node) = @_;
 
     $node = $nodename if !$node;
     return "snapshot-working/$node/lxc/$vmid.conf";
 }
 
-sub load_config {
-    my ($vmid, $node) = @_;
+sub mocked_load_config {
+    my ($class, $vmid, $node) = @_;
 
-    my $filename = cfs_config_path($vmid, $node);
+    my $filename = PVE::LXC::Config->cfs_config_path($vmid, $node);
 
     my $raw = PVE::Tools::file_get_contents($filename);
 
-    my $conf = PVE::LXC::parse_pct_config($filename, $raw);
+    my $conf = PVE::LXC::Config::parse_pct_config($filename, $raw);
     return $conf;
 }
 
-sub write_config {
-    my ($vmid, $conf) = @_;
+sub mocked_write_config {
+    my ($class, $vmid, $conf) = @_;
 
-    my $filename = cfs_config_path($vmid);
+    my $filename = PVE::LXC::Config->cfs_config_path($vmid);
 
     if ($conf->{snapshots}) {
        foreach my $snapname (keys %{$conf->{snapshots}}) {
@@ -247,29 +262,35 @@ sub write_config {
        }
     }
 
-    my $raw = PVE::LXC::write_pct_config($filename, $conf);
+    my $raw = PVE::LXC::Config::write_pct_config($filename, $conf);
 
     PVE::Tools::file_set_contents($filename, $raw);
 }
 
-sub has_feature {
-    my ($feature, $conf, $storecfg, $snapname) = @_;
-    return $snapshot_possible;
-}
+# END mocked PVE::LXC methods
 
-sub check_running {
-    return $running;
-}
-
-sub sync_container_namespace {
-    return;
-}
-
-# END redefine PVE::LXC methods
 
 PVE::Tools::run_command("rm -rf snapshot-working");
 PVE::Tools::run_command("cp -a snapshot-input snapshot-working");
 
+printf("\n");
+printf("Setting up Mocking for PVE::LXC and PVE::LXC::Config\n");
+my $lxc_module = new Test::MockModule('PVE::LXC');
+$lxc_module->mock('sync_container_namespace', sub { return; });
+$lxc_module->mock('check_running', \&mocked_check_running);
+$lxc_module->mock('vm_stop', \&mocked_vm_stop);
+
+my $lxc_config_module = new Test::MockModule('PVE::LXC::Config');
+$lxc_config_module->mock('config_file_lock', sub { return "snapshot-working/pve-test.lock"; });
+$lxc_config_module->mock('cfs_config_path', \&mocked_cfs_config_path);
+$lxc_config_module->mock('load_config', \&mocked_load_config);
+$lxc_config_module->mock('write_config', \&mocked_write_config);
+$lxc_config_module->mock('has_feature', \&mocked_has_feature);
+
+# ignore existing replication config
+my $repl_config_module = new Test::MockModule('PVE::ReplicationConfig');
+$repl_config_module->mock('check_for_existing_jobs' => sub { return undef });
+
 $running = 1;
 $freeze_possible = 1;
 
@@ -290,7 +311,7 @@ printf("Successful snapshot_prepare with one existing snapshot\n");
 testcase_prepare("102", "test2", 0, "test comment", "");
 
 printf("Expected error for snapshot_prepare on locked container\n");
-testcase_prepare("200", "test", 0, "test comment", "VM is locked (snapshot)\n");
+testcase_prepare("200", "test", 0, "test comment", "CT is locked (snapshot)\n");
 
 printf("Expected error for snapshot_prepare with duplicate snapshot name\n");
 testcase_prepare("201", "test", 0, "test comment", "snapshot name 'test' already used\n");
@@ -416,7 +437,7 @@ printf("Expected error when snapshot_delete fails with broken mp volume_snapshot
 testcase_delete("203", "test", 0, "volume snapshot delete disabled\n", { "local:snapshotable-disk-1" => "test" });
 
 printf("Expected error for snapshot_delete with locked config\n");
-testcase_delete("202", "test", 0, "VM is locked (backup)\n");
+testcase_delete("202", "test", 0, "CT is locked (backup)\n");
 
 $nodename = "rollback";
 printf("\n");
@@ -450,7 +471,7 @@ printf("Expected error for snapshot_rollback with incomplete snapshot\n");
 testcase_rollback("203", "test", "unable to rollback to incomplete snapshot (snapstate = delete)\n");
 
 printf("Expected error for snapshot_rollback with lock\n");
-testcase_rollback("204", "test", "VM is locked (backup)\n");
+testcase_rollback("204", "test", "CT is locked (backup)\n");
 
 printf("Expected error for snapshot_rollback with saved vmstate\n");
 testcase_rollback("205", "test", "implement me - save vmstate\n", { "local:snapshotable-disk-1" => "test" });