1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/message_loop/message_loop.h" 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/test/power_monitor_test_base.h" 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/child/power_monitor_broadcast_source.h" 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/common/power_monitor_messages.h" 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace content { 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PowerMonitorBroadcastSourceTest : public testing::Test { 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorBroadcastSourceTest() { 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) power_monitor_source_ = new PowerMonitorBroadcastSource(); 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) power_monitor_.reset(new base::PowerMonitor( 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::PowerMonitorSource>(power_monitor_source_))); 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~PowerMonitorBroadcastSourceTest() {} 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorBroadcastSource* source() { return power_monitor_source_; } 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::PowerMonitor* monitor() { return power_monitor_.get(); } 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoop message_loop_; 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorBroadcastSource* power_monitor_source_; 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::PowerMonitor> power_monitor_; 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PowerMonitorBroadcastSourceTest); 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(PowerMonitorBroadcastSourceTest, PowerMessageReceiveBroadcast) { 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC::ChannelProxy::MessageFilter* message_filter = 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) source()->GetMessageFilter(); 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::PowerMonitorTestObserver observer; 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) monitor()->AddObserver(&observer); 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorMsg_Suspend suspend_msg; 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorMsg_Resume resume_msg; 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sending resume when not suspended should have no effect. 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(resume_msg); 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.resumes(), 0); 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Pretend we suspended. 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(suspend_msg); 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.suspends(), 1); 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Send a second suspend notification. This should be suppressed. 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(suspend_msg); 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.suspends(), 1); 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Pretend we were awakened. 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(resume_msg); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.resumes(), 1); 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Send a duplicate resume notification. This should be suppressed. 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(resume_msg); 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.resumes(), 1); 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorMsg_PowerStateChange on_battery_msg(true); 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PowerMonitorMsg_PowerStateChange off_battery_msg(false); 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Pretend the device has gone on battery power 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(on_battery_msg); 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.power_state_changes(), 1); 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.last_power_state(), true); 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Repeated indications the device is on battery power should be suppressed. 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(on_battery_msg); 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.power_state_changes(), 1); 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Pretend the device has gone off battery power 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(off_battery_msg); 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.power_state_changes(), 2); 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.last_power_state(), false); 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Repeated indications the device is off battery power should be suppressed. 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_filter->OnMessageReceived(off_battery_msg); 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(observer.power_state_changes(), 2); 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace base 96