diff --git a/qemu/tests/cfg/timedrift_adjust_time.cfg b/qemu/tests/cfg/timedrift_adjust_time.cfg index 51a02090dbfc4af57bb922bc0243fbff1bbf7fd1..6e939b62a12d966209951db867079285db6e2071 100644 --- a/qemu/tests/cfg/timedrift_adjust_time.cfg +++ b/qemu/tests/cfg/timedrift_adjust_time.cfg @@ -14,7 +14,14 @@ host_epoch_time_cmd = 'epoch=$(date +%s); datetime=$(date);' host_epoch_time_cmd += 'echo "datetime: $datetime epoch: $epoch"' time_difference = 0 + hwclock_time_command = "hwclock -u" + hwclock_time_filter_re = "(\d+-\d+-\d+ \d+:\d+:\d+).*" + hwclock_time_format = "%Y-%m-%d %H:%M:%S" + RHEL.6, RHEL.7: + hwclock_time_filter_re = "(\S+ \S+\s+\d+ \d+:\d+:\d+ \d+).*" + hwclock_time_format = "%a %b %d %H:%M:%S %Y" variants: + - no_adjust_clock: - adjust_host_clock: seconds_to_forward = 1800 set_host_time_cmd = 'date -s "${seconds_to_forward} seconds"; hwclock -w' @@ -41,13 +48,16 @@ rtc_base = localtime variants: - guest_pause_resume: - only adjust_host_clock + only no_adjust_clock adjust_host_clock vm_action = pause_resume sleep_seconds = 1800 - time_difference = 3600 + time_difference = 1800 + time_difference_hwclock = 0 - guest_reboot: + no no_adjust_clock vm_action = reboot time_difference = 0 + time_difference_hwclock = 0 - guest_s3: only adjust_host_clock vm_action = suspend_resume @@ -61,10 +71,17 @@ read_clock_source_cmd += "/clocksource0/current_clocksource" timedrift_adjust_time.guest_reboot.clock_vm.adjust_host_clock: time_difference = 1800 + time_difference_hwclock = 1800 timedrift_adjust_time.guest_s3.clock_vm.adjust_host_clock: time_difference = 1800 timedrift_adjust_time.guest_s3.clock_host.adjust_host_clock: time_difference = 1800 + timedrift_adjust_time.guest_pause_resume.clock_vm.no_adjust_clock: + time_difference = 1800 + time_difference_hwclock = 1800 + timedrift_adjust_time.guest_pause_resume.clock_vm.adjust_host_clock: + time_difference = 1800 + time_difference_hwclock = 3600 RHEL.6: timedrift_adjust_time.guest_reboot..adjust_guest_clock: time_difference = 1800 @@ -85,6 +102,8 @@ time_difference = 1800 timedrift_adjust_time.guest_s3.clock_vm.adjust_host_clock: time_difference = 1800 + timedrift_adjust_time.guest_pause_resume..no_adjust_clock: + time_difference = 1800 Win7, Win2008: timedrift_adjust_time.guest_pause_resume.clock_host.adjust_host_clock: time_difference = 0 diff --git a/qemu/tests/timedrift_adjust_time.py b/qemu/tests/timedrift_adjust_time.py index 8a56a094f5ab2243cab0931e0beacbdf0d27934e..6a7719c1b8d937d2458864fb4f46a889369ddf6e 100644 --- a/qemu/tests/timedrift_adjust_time.py +++ b/qemu/tests/timedrift_adjust_time.py @@ -130,6 +130,28 @@ class TimedriftTest(object): "Guest Time: %s" % guest_timestr) return list(map(float, [epoch_host, epoch_guest])) + def get_hwtime(self, session): + """ + Get guest's hardware clock in epoch. + + :param session: VM session. + """ + hwclock_time_command = self.params.get("hwclock_time_command", + "hwclock -u") + hwclock_time_filter_re = self.params.get("hwclock_time_filter_re", + r"(\d+-\d+-\d+ \d+:\d+:\d+).*") + hwclock_time_format = self.params.get("hwclock_time_format", + "%Y-%m-%d %H:%M:%S") + output = session.cmd_output_safe(hwclock_time_command) + try: + str_time = re.findall(hwclock_time_filter_re, output)[0] + guest_time = time.mktime(time.strptime(str_time, hwclock_time_format)) + except Exception as err: + logging.debug( + "(time_format, output): (%s, %s)", hwclock_time_format, output) + raise err + return guest_time + @error_context.context_aware def verify_clock_source(self, session): """ @@ -198,14 +220,28 @@ class BackwardtimeTest(TimedriftTest): while time.time() < start_time + timeout: host_epoch_time, guest_epoch_time = self.get_epoch_seconds(session) real_difference = abs(host_epoch_time - guest_epoch_time) - if abs(real_difference - expect_difference) < tolerance: - return + if self.params["os_type"] == 'linux': + expect_difference_hwclock = float(self.params["time_difference_hwclock"]) + guest_hwtime = self.get_hwtime(session) + real_difference_hw = abs(host_epoch_time - guest_hwtime) + if abs(real_difference - expect_difference) < tolerance and \ + abs(real_difference_hw - expect_difference_hwclock) < tolerance: + return + else: + if abs(real_difference - expect_difference) < tolerance: + return logging.info("Host epoch time: %s" % host_epoch_time) logging.info("Guest epoch time: %s" % guest_epoch_time) - err_msg = "Unexcept time difference between host and guest after" - err_msg += " testing.(actual difference: %s)" % real_difference - err_msg += " except difference: %s)" % expect_difference - self.test.fail(err_msg) + if self.params["os_type"] == 'linux': + logging.info("Guest hardware time: %s" % guest_hwtime) + err_msg = "Unexpected sys and hardware time difference (%s %s)\ + between host and guest after adjusting time." \ + % (real_difference, real_difference_hw) + else: + err_msg = "Unexpected time difference between host and guest after" + err_msg += " testing.(actual difference: %s)" % real_difference + err_msg += " expected difference: %s)" % expect_difference + self.test.fail(err_msg) @error_context.context_aware def check_dirft_before_adjust_time(self, session): @@ -223,12 +259,24 @@ class BackwardtimeTest(TimedriftTest): tolerance = float(self.params.get("tolerance", 6)) host_epoch_time, guest_epoch_time = self.get_epoch_seconds(session) real_difference = abs(host_epoch_time - guest_epoch_time) - if real_difference > tolerance: - logging.info("Host epoch time: %s" % host_epoch_time) - logging.info("Guest epoch time: %s" % guest_epoch_time) - err_msg = "Unexcept time difference (%s) " % real_difference - err_msg += " between host and guest before testing." - self.test.fail(err_msg) + if self.params["os_type"] == 'linux': + guest_hwtime = self.get_hwtime(session) + real_difference_hw = abs(host_epoch_time - guest_hwtime) + if real_difference > tolerance or real_difference_hw > tolerance: + logging.info("Host epoch time: %s" % host_epoch_time) + logging.info("Guest epoch time: %s" % guest_epoch_time) + logging.info("Guest hardware time: %s" % guest_hwtime) + err_msg = "Unexpected sys and hardware time difference (%s %s) \ + between host and guest before testing."\ + % (real_difference, real_difference_hw) + self.test.fail(err_msg) + else: + if real_difference > tolerance: + logging.info("Host epoch time: %s" % host_epoch_time) + logging.info("Guest epoch time: %s" % guest_epoch_time) + err_msg = "Unexcept time difference (%s) " % real_difference + err_msg += " between host and guest before testing." + self.test.fail(err_msg) def pre_test(self): """ @@ -243,6 +291,8 @@ class BackwardtimeTest(TimedriftTest): vm = self.get_vm(create=True) if self.params["os_type"] == 'windows': utils_time.sync_timezone_win(vm) + else: + utils_time.sync_timezone_linux(vm) session = self.get_session(vm) self.check_dirft_before_adjust_time(session) if self.params.get("read_clock_source_cmd"):