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