new file mode 100644
@@ -0,0 +1,66 @@
+import logging, time, select, os, difflib
+from autotest_lib.client.common_lib import error
+import kvm_subprocess, kvm_test_utils, kvm_utils
+
+
+def run_unittest(test, params, env):
+ """
+ KVM RHEL-6 style unit test:
+ 1) Resume a stopped VM
+ 2) Wait for VM to terminate
+ 3) Compare output with reference output
+
+ @param test: kvm test object
+ @param params: Dictionary with the test parameters
+ @param env: Dictionary with test environment.
+ """
+ # Get params
+ ref_output_filename = params.get("reference_output")
+ if not ref_output_filename:
+ raise error.TestError("reference_output not specified")
+ ref_output_filename = kvm_utils.get_path(test.bindir, ref_output_filename)
+ if not os.path.exists(ref_output_filename):
+ raise error.TestError("Reference file not found: %s" %
+ ref_output_filename)
+ timeout = float(params.get("unittest_timeout", 60))
+
+ # Get VM
+ vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+ # Resume VM if stopped
+ vm.send_monitor_cmd("cont")
+
+ if params.get("log_output") == "yes":
+ # Log test output
+ f = open(vm.testlog_file_name)
+ logging.info("-------- Test output --------")
+ try:
+ end_time = time.time() + timeout
+ while time.time() < end_time:
+ dead = vm.is_dead()
+ line = f.readline()
+ if line:
+ logging.info(line.rstrip())
+ elif dead:
+ break
+ else:
+ time.sleep(1)
+ else:
+ raise error.TestFail("Timeout elapsed (%ss)" % timeout)
+ finally:
+ logging.info("-------- End of test output --------")
+ f.close()
+ else:
+ # Just wait for the VM to terminate
+ logging.info("Waiting for VM to terminate...")
+ if not kvm_utils.wait_for(vm.is_dead, 0, 1, timeout):
+ raise error.TestFail("Timeout elapsed (%ss)" % timeout)
+
+ # Compare output with reference_output
+ logging.info("Comparing test output with reference output")
+ test_output = open(vm.testlog_file_name, "U").readlines()
+ ref_output = open(ref_output_filename, "U").readlines()
+ if test_output != ref_output:
+ logging.error("Difference between reference output and test output:")
+ for line in difflib.unified_diff(ref_output, test_output):
+ logging.error(line.rstrip())
+ raise error.TestFail("Test output differs from reference output")