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"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace content {
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PowerMonitorBroadcastSourceTest : public testing::Test {
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PowerMonitorBroadcastSourceTest() {
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    power_monitor_source_ = new PowerMonitorBroadcastSource();
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    power_monitor_.reset(new base::PowerMonitor(
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        scoped_ptr<base::PowerMonitorSource>(power_monitor_source_)));
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~PowerMonitorBroadcastSourceTest() {}
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PowerMonitorBroadcastSource* source() { return power_monitor_source_; }
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::PowerMonitor* monitor() { return power_monitor_.get(); }
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::MessageLoop message_loop_;
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PowerMonitorBroadcastSource* power_monitor_source_;
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<base::PowerMonitor> power_monitor_;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PowerMonitorBroadcastSourceTest);
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(PowerMonitorBroadcastSourceTest, PowerMessageReceiveBroadcast) {
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  IPC::MessageFilter* message_filter = 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