Also avoids end_time race condition between while loop and final if statement.

Signed-off-by: Chris Evich <[email protected]>
---
 client/tests/kvm/subtests.cfg.sample  |    9 ++++++++-
 client/tests/kvm/tests/boot_savevm.py |   25 +++++++++++++++++++------
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/client/tests/kvm/subtests.cfg.sample 
b/client/tests/kvm/subtests.cfg.sample
index 844b67f..95147ff 100644
--- a/client/tests/kvm/subtests.cfg.sample
+++ b/client/tests/kvm/subtests.cfg.sample
@@ -285,9 +285,16 @@ variants:
 
     - boot_savevm: install setup image_copy unattended_install.cdrom
         type = boot_savevm
+        # Time in seconds to sleep between cycles
         savevm_delay = 0.3
+        # Time limit in seconds to login after vm restored
         savevm_login_timeout = 120
-        savevm_timeout = 2000
+        # Total number of stop/save/reset/load/cont cycles to perform.
+        savevm_cycles = 10
+        # Maximum percentage time variance allowed after first cycle.
+        # e.g. if threshold is 10%, first cycle + savevm_delay takes 55s, 
+        # no subsequent cycle permitted to take more than (about) 1 minute.
+        cycle_duration_threshold = 10
         kill_vm_on_error = yes
         kill_vm_gracefully = yes
         kill_vm = yes
diff --git a/client/tests/kvm/tests/boot_savevm.py 
b/client/tests/kvm/tests/boot_savevm.py
index 7bbc98c..6730447 100644
--- a/client/tests/kvm/tests/boot_savevm.py
+++ b/client/tests/kvm/tests/boot_savevm.py
@@ -19,9 +19,13 @@ def run_boot_savevm(test, params, env):
     vm.verify_alive()
     savevm_delay = float(params.get("savevm_delay"))
     savevm_login_timeout = float(params.get("savevm_login_timeout"))
-    end_time = time.time() + float(params.get("savevm_timeout"))
+    max_duration = -1 # check value. set after first cycle.
+    cycle_duration_threshold = float(params.get("cycle_duration_threshold"))
+    savevm_cycles = int(params.get("savevm_cycles"))
+    assert cycle_duration_threshold > 0.5
+    assert savevm_cycles > 1
 
-    while time.time() < end_time:
+    def _do_cycle(cycle_number):
         time.sleep(savevm_delay)
         try:
             vm.monitor.cmd("stop")
@@ -43,13 +47,22 @@ def run_boot_savevm(test, params, env):
             vm.monitor.cmd("cont")
         except kvm_monitor.MonitorError, e:
             logging.error(e)
-
         try:
             vm.wait_for_login(timeout=savevm_login_timeout)
             break
         except Exception, detail:
             logging.debug(detail)
 
-    if (time.time() > end_time):
-        raise error.TestFail("Not possible to log onto the vm after %s s" %
-                             params.get("savevm_timeout"))
+
+    for cycle_number in xrange(0,savevm_cycles):
+        start_time = time.time()
+        _do_cycle(cycle_number)
+        end_time = time.time()
+        duration = end_time - start_time
+        if cycle_number == 0: # simplify outer for loop
+            max_duration = duration * (1.0 + cycle_duration_threshold)
+        else:
+            if duration > max_duration:
+                overrun = max_duration - duration;
+                raise error.TestFail("savevm cycle %d took %0.4f seconds 
longer than %0.4f." %
+                    (cycle_number, overrun, max_duration))
-- 
1.7.1

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to