@@ -94,6 +94,14 @@ variants:
- linux_s3: install setup
type = linux_s3
+ - guest_s4:
+ type = guest_s4
+ check_s4_support_cmd = grep -q disk /sys/power/state
+ test_s4_cmd = "cd /tmp/;nohup tcpdump -q -t ip host localhost"
+ check_s4_cmd = pgrep tcpdump
+ set_s4_cmd = echo disk > /sys/power/state
+ kill_test_s4_cmd = pkill tcpdump
+
- timedrift: install setup
type = timedrift
extra_params += " -rtc-td-hack"
@@ -382,6 +390,12 @@ variants:
# Alternative host load:
#host_load_command = "dd if=/dev/urandom of=/dev/null"
host_load_instances = 8
+ guest_s4:
+ check_s4_support_cmd = powercfg /hibernate on
+ test_s4_cmd = start /B ping -n 3000 localhost
+ check_s4_cmd = tasklist | find /I "ping"
+ set_s4_cmd = rundll32.exe PowrProf.dll, SetSuspendState
+ kill_test_s4_cmd = taskkill /IM ping.exe /F
variants:
- Win2000:
new file mode 100644
@@ -0,0 +1,66 @@
+import logging, time
+from autotest_lib.client.common_lib import error
+import kvm_test_utils, kvm_utils
+
+
+def run_guest_s4(test, params, env):
+ """
+ Suspend guest to disk,supports both Linux & Windows OSes.
+
+ @param test: kvm test object.
+ @param params: Dictionary with test parameters.
+ @param env: Dictionary with the test environment.
+ """
+ vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+ session = kvm_test_utils.wait_for_login(vm)
+
+ logging.info("Checking whether VM supports S4")
+ status = session.get_command_status(params.get("check_s4_support_cmd"))
+ if status is None:
+ logging.error("Failed to check if S4 exists")
+ elif status != 0:
+ raise error.TestFail("Guest does not support S4")
+
+ logging.info("Waiting for a while for X to start...")
+ time.sleep(10)
+
+ # Start up a program(tcpdump for linux OS & ping for M$ OS), as a flag.
+ # If the program died after suspend, then fails this testcase.
+ test_s4_cmd = params.get("test_s4_cmd")
+ session.sendline(test_s4_cmd)
+
+ # Get the second session to start S4
+ session2 = kvm_test_utils.wait_for_login(vm)
+
+ check_s4_cmd = params.get("check_s4_cmd")
+ if session2.get_command_status(check_s4_cmd):
+ raise error.TestError("Failed to launch %s background" % test_s4_cmd)
+ logging.info("Launched command background in guest: %s" % test_s4_cmd)
+
+ # Implement S4
+ logging.info("Start suspend to disk now...")
+ session2.sendline(params.get("set_s4_cmd"))
+
+ if not kvm_utils.wait_for(vm.is_dead, 360, 30, 2):
+ raise error.TestFail("VM refuse to go down,suspend failed")
+ logging.info("VM suspended successfully.")
+
+ logging.info("VM suspended to disk. sleep 10 seconds to have a break...")
+ time.sleep(10)
+
+ # Start vm, and check whether the program is still running
+ logging.info("Restart VM now...")
+
+ if not vm.create():
+ raise error.TestError("failed to start the vm again.")
+ if not vm.is_alive():
+ raise error.TestError("VM seems to be dead; Test requires a live VM.")
+
+ # Check whether test command still alive
+ if session2.get_command_status(check_s4_cmd):
+ raise error.TestFail("%s died, indicating that S4 failed" % test_s4_cmd)
+
+ logging.info("VM resumed after S4")
+ session2.sendline(params.get("kill_test_s4_cmd"))
+ session.close()
+ session2.close()