15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/hi_res_timer_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/power_monitor/power_monitor.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/power_monitor/power_monitor_device_source.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HiResTimerManagerTest, ToggleOnOff) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The power monitor creates Window to receive power notifications from
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Windows, which makes this test flaky if you run while the machine
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // goes in or out of AC power.
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoop loop(base::MessageLoop::TYPE_UI);
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<base::PowerMonitorSource> power_monitor_source(
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      new base::PowerMonitorDeviceSource());
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<base::PowerMonitor> power_monitor(
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      new base::PowerMonitor(power_monitor_source.Pass()));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HighResolutionTimerManager manager;
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate a on-AC power event to get to a known initial state.
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager.OnPowerStateChange(false);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop a few times to test power toggling.
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int times = 0; times != 3; ++times) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The manager has the high resolution clock enabled now.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(manager.hi_res_clock_available());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But the Time class has it off, because it hasn't been activated.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Activate the high resolution timer.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time::ActivateHighResolutionTimer(true);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::Time::IsHighResolutionTimerInUse());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simulate a on-battery power event.
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manager.OnPowerStateChange(true);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(manager.hi_res_clock_available());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Back to on-AC power.
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manager.OnPowerStateChange(false);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(manager.hi_res_clock_available());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(base::Time::IsHighResolutionTimerInUse());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // De-activate the high resolution timer.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time::ActivateHighResolutionTimer(false);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace base
59