Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(737)

Side by Side Diff: chrome/browser/power/process_power_collector_unittest.cc

Issue 472383002: Add ProcessPowerCollector to audit power information. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Audit power in chrome_browser. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/power/process_power_collector.h"
6
7 #include "apps/app_window_contents.h"
8 #include "apps/app_window_registry.h"
9 #include "chrome/browser/profiles/profile_manager.h"
10 #include "chrome/browser/ui/apps/chrome_app_delegate.h"
11 #include "chrome/browser/ui/browser_commands.h"
12 #include "chrome/browser/ui/tabs/tab_strip_model.h"
13 #include "chrome/test/base/browser_with_test_window_test.h"
14 #include "chrome/test/base/testing_browser_process.h"
15 #include "chrome/test/base/testing_profile_manager.h"
16 #include "components/power/origin_power_map.h"
17 #include "components/power/origin_power_map_factory.h"
18 #include "content/public/browser/site_instance.h"
19 #include "content/public/test/mock_render_process_host.h"
20 #include "extensions/common/extension.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22 #include "url/gurl.h"
23
24 #if defined(OS_CHROMEOS)
25 #include "chrome/browser/chromeos/power/power_data_collector.h"
26 #include "chromeos/dbus/dbus_thread_manager.h"
27 #include "chromeos/dbus/fake_dbus_thread_manager.h"
28 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
29 #endif
30
31 using power::OriginPowerMap;
32 using power::OriginPowerMapFactory;
33
34 class BrowserProcessPowerTest : public BrowserWithTestWindowTest {
35 public:
36 BrowserProcessPowerTest() {}
37 virtual ~BrowserProcessPowerTest() {}
38
39 virtual void SetUp() OVERRIDE {
40 BrowserWithTestWindowTest::SetUp();
41 #if defined(OS_CHROMEOS)
42 chromeos::DBusThreadManager::Shutdown();
43 chromeos::FakeDBusThreadManager* fake_dbus_thread_manager =
44 new chromeos::FakeDBusThreadManager;
45 fake_dbus_thread_manager->SetFakeClients();
46 chromeos::DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager);
47 chromeos::PowerDataCollector::InitializeForTesting();
48
49 power_manager::PowerSupplyProperties prop1;
50 prop1.set_external_power(
51 power_manager::PowerSupplyProperties::DISCONNECTED);
52 prop1.set_battery_percent(20.00);
53 prop1.set_battery_discharge_rate(1);
54 chromeos::PowerDataCollector::Get()->PowerChanged(prop1);
55 #endif
56
57 profile_manager_.reset(
58 new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
59 ASSERT_TRUE(profile_manager_->SetUp());
60 }
61
62 virtual void TearDown() OVERRIDE {
63 #if defined(OS_CHROMEOS)
64 chromeos::PowerDataCollector::Shutdown();
65 #endif
66 BrowserWithTestWindowTest::TearDown();
67 }
68
69 protected:
70 scoped_ptr<TestingProfileManager> profile_manager_;
71
72 content::MockRenderProcessHost* process(Browser* browser) {
73 return static_cast<content::MockRenderProcessHost*>(
74 browser->tab_strip_model()
75 ->GetActiveWebContents()
76 ->GetRenderViewHost()
77 ->GetProcess());
78 }
79 };
80
81 class TestAppWindowContents : public apps::AppWindowContents {
82 public:
83 explicit TestAppWindowContents(content::WebContents* web_contents) {
84 web_contents_.reset(web_contents);
85 }
86 // apps:AppWindowContents
87 virtual void Initialize(content::BrowserContext* context,
88 const GURL& url) OVERRIDE{};
89 virtual void LoadContents(int32 creator_process_id) OVERRIDE{};
90 virtual void NativeWindowChanged(
91 apps::NativeAppWindow* native_app_window) OVERRIDE{};
92 virtual void NativeWindowClosed() OVERRIDE{};
93 virtual void DispatchWindowShownForTests() const OVERRIDE{};
94 virtual content::WebContents* GetWebContents() const OVERRIDE {
95 return web_contents_.get();
96 }
97
98 private:
99 scoped_ptr<content::WebContents> web_contents_;
100 };
101
102 TEST_F(BrowserProcessPowerTest, NoSite) {
103 ProcessPowerCollector collector;
104 collector.UpdateMetricsMap();
105 collector.PopulateCpuUsageByOrigin();
106 EXPECT_EQ(size_t(0), collector.GetMetricsMapForTesting()->size());
107 }
108
109 TEST_F(BrowserProcessPowerTest, OneSite) {
110 GURL url("http://www.google.com");
111 AddTab(browser(), url);
112 ProcessPowerCollector collector;
113 collector.UpdateMetricsMap();
114 collector.PopulateCpuUsageByOrigin();
115 ProcessPowerCollector::ProcessMetricsMap* metrics_map =
116 collector.GetMetricsMapForTesting();
117 EXPECT_EQ(size_t(1), metrics_map->size());
118 collector.RecordCpuUsageByOrigin(0);
119
120 OriginPowerMap* origin_power_map =
121 OriginPowerMapFactory::GetForBrowserContext(profile());
122 EXPECT_EQ(0, origin_power_map->GetPowerForOrigin(url));
123
124 collector.UpdateMetricsMap();
125 collector.PopulateCpuUsageByOrigin();
126 // Manually update the map to make the CPU usage work.
127 for (ProcessPowerCollector::ProcessMetricsMap::iterator it =
128 metrics_map->begin();
129 it != metrics_map->end();
130 ++it) {
131 it->second.last_cpu = 5;
132 }
133 collector.RecordCpuUsageByOrigin(5);
134 EXPECT_EQ(100, origin_power_map->GetPowerForOrigin(url));
135 }
136
137 TEST_F(BrowserProcessPowerTest, MultipleSites) {
138 Browser::CreateParams native_params(profile(),
139 chrome::HOST_DESKTOP_TYPE_NATIVE);
140 GURL url1("http://www.google.com");
141 GURL url2("http://www.example.com");
142 GURL url3("https://www.google.com");
143 scoped_ptr<Browser> browser2(
144 chrome::CreateBrowserWithTestWindowForParams(&native_params));
145 scoped_ptr<Browser> browser3(
146 chrome::CreateBrowserWithTestWindowForParams(&native_params));
147 AddTab(browser(), url1);
148 AddTab(browser2.get(), url2);
149 AddTab(browser3.get(), url3);
150
151 // Create fake process numbers.
152 content::MockRenderProcessHost* rph = process(browser());
153 rph->SetProcessHandle(1);
154 rph = process(browser2.get());
155 rph->SetProcessHandle(2);
156 rph = process(browser3.get());
157 rph->SetProcessHandle(3);
158
159 ProcessPowerCollector collector;
160 collector.UpdateMetricsMap();
161 ProcessPowerCollector::ProcessMetricsMap* metrics_map =
162 collector.GetMetricsMapForTesting();
163 EXPECT_EQ(size_t(3), metrics_map->size());
164
165 // Since all handlers are uninitialized, this should be 0.
166 EXPECT_EQ(0, collector.PopulateCpuUsageByOrigin());
167 collector.RecordCpuUsageByOrigin(0);
168 OriginPowerMap* origin_power_map =
169 OriginPowerMapFactory::GetForBrowserContext(profile());
170 EXPECT_EQ(0, origin_power_map->GetPowerForOrigin(url1));
171 EXPECT_EQ(0, origin_power_map->GetPowerForOrigin(url2));
172 EXPECT_EQ(0, origin_power_map->GetPowerForOrigin(url3));
173
174 collector.UpdateMetricsMap();
175 collector.PopulateCpuUsageByOrigin();
176 // Manually update the map to make the CPU usage work.
177 for (ProcessPowerCollector::ProcessMetricsMap::iterator it =
178 metrics_map->begin();
179 it != metrics_map->end();
180 ++it) {
181 it->second.last_cpu = 5;
182 }
183 collector.RecordCpuUsageByOrigin(15);
184 EXPECT_EQ(33, origin_power_map->GetPowerForOrigin(url1));
185 EXPECT_EQ(33, origin_power_map->GetPowerForOrigin(url2));
186 EXPECT_EQ(33, origin_power_map->GetPowerForOrigin(url3));
187
188 // Close some tabs and verify that they are removed from the metrics map.
189 chrome::CloseTab(browser2.get());
190 chrome::CloseTab(browser3.get());
191
192 collector.UpdateMetricsMap();
193 collector.PopulateCpuUsageByOrigin();
194 collector.RecordCpuUsageByOrigin(0);
195 EXPECT_EQ(size_t(1), metrics_map->size());
196 }
197
198 TEST_F(BrowserProcessPowerTest, IncognitoDoesntRecordPowerUsage) {
199 Browser::CreateParams native_params(profile()->GetOffTheRecordProfile(),
200 chrome::HOST_DESKTOP_TYPE_NATIVE);
201 scoped_ptr<Browser> incognito_browser(
202 chrome::CreateBrowserWithTestWindowForParams(&native_params));
203 GURL url("http://www.google.com");
204 AddTab(browser(), url);
205
206 GURL hidden_url("http://foo.com");
207 AddTab(incognito_browser.get(), hidden_url);
208
209 ProcessPowerCollector collector;
210 collector.UpdateMetricsMap();
211 collector.PopulateCpuUsageByOrigin();
212 ProcessPowerCollector::ProcessMetricsMap* metrics_map =
213 collector.GetMetricsMapForTesting();
214 EXPECT_EQ(size_t(1), metrics_map->size());
215 collector.RecordCpuUsageByOrigin(0);
216
217 OriginPowerMap* origin_power_map =
218 OriginPowerMapFactory::GetForBrowserContext(profile());
219 EXPECT_EQ(0, origin_power_map->GetPowerForOrigin(url));
220
221 collector.UpdateMetricsMap();
222 collector.PopulateCpuUsageByOrigin();
223 // Manually update the map to make the CPU usage work.
224 for (ProcessPowerCollector::ProcessMetricsMap::iterator it =
225 metrics_map->begin();
226 it != metrics_map->end();
227 ++it) {
228 it->second.last_cpu = 5;
229 }
230 collector.RecordCpuUsageByOrigin(5);
231
232 // Verify that the incognito data was not stored.
233 EXPECT_EQ(100, origin_power_map->GetPowerForOrigin(url));
234 EXPECT_EQ(0, origin_power_map->GetPowerForOrigin(hidden_url));
235
236 chrome::CloseTab(incognito_browser.get());
237 }
238
239 TEST_F(BrowserProcessPowerTest, MultipleProfilesRecordSeparately) {
240 scoped_ptr<Profile> other_profile(CreateProfile());
241 Browser::CreateParams native_params(other_profile.get(),
242 chrome::HOST_DESKTOP_TYPE_NATIVE);
243 scoped_ptr<Browser> other_user(
244 chrome::CreateBrowserWithTestWindowForParams(&native_params));
245
246 GURL url("http://www.google.com");
247 AddTab(browser(), url);
248
249 GURL hidden_url("http://foo.com");
250 AddTab(other_user.get(), hidden_url);
251
252 // Create fake process numbers.
253 content::MockRenderProcessHost* rph = process(browser());
254 rph->SetProcessHandle(1);
255 rph = process(other_user.get());
256 rph->SetProcessHandle(2);
257
258 ProcessPowerCollector collector;
259 collector.UpdateMetricsMap();
260 collector.PopulateCpuUsageByOrigin();
261
262 EXPECT_EQ(size_t(2), collector.GetMetricsMapForTesting()->size());
263 collector.RecordCpuUsageByOrigin(0);
264
265 // Manually update the map to make the CPU usage work.
266 ProcessPowerCollector::ProcessMetricsMap* metrics_map =
267 collector.GetMetricsMapForTesting();
268 for (ProcessPowerCollector::ProcessMetricsMap::iterator it =
269 metrics_map->begin();
270 it != metrics_map->end();
271 ++it) {
272 it->second.last_cpu = 5;
273 }
274 collector.RecordCpuUsageByOrigin(5);
275
276 // profile() should have an entry for |url| but not |hidden_url|.
277 OriginPowerMap* origin_power_map_first =
278 OriginPowerMapFactory::GetForBrowserContext(profile());
279 EXPECT_EQ(100, origin_power_map_first->GetPowerForOrigin(url));
280 EXPECT_EQ(0, origin_power_map_first->GetPowerForOrigin(hidden_url));
281
282 // |other_profile| should have an entry for |hidden_url| but not |url|.
283 OriginPowerMap* origin_power_map_second =
284 OriginPowerMapFactory::GetForBrowserContext(other_profile.get());
285 EXPECT_EQ(0, origin_power_map_second->GetPowerForOrigin(url));
286 EXPECT_EQ(100, origin_power_map_second->GetPowerForOrigin(hidden_url));
287
288 // Clean up
289 chrome::CloseTab(other_user.get());
290 }
291
292 const char kTestAppId[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
293
294 TEST_F(BrowserProcessPowerTest, AppsRecordPowerUsage) {
295 Profile* current_profile =
296 profile_manager_->CreateTestingProfile("Test user");
297
298 // Install an app (an extension*).
299 #if defined(OS_WIN)
300 base::FilePath extension_path(FILE_PATH_LITERAL("c:\\foo"));
301 #elif defined(OS_POSIX)
302 base::FilePath extension_path(FILE_PATH_LITERAL("/foo"));
303 #endif
304 base::DictionaryValue manifest;
305 manifest.SetString("name", "Fake Name");
306 manifest.SetString("version", "1");
307 std::string error;
308 scoped_refptr<extensions::Extension> extension(
309 extensions::Extension::Create(extension_path,
310 extensions::Manifest::INTERNAL,
311 manifest,
312 extensions::Extension::NO_FLAGS,
313 kTestAppId,
314 &error));
315 EXPECT_TRUE(extension.get()) << error;
316
317 GURL url("chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
318 // Use that to create a new AppWindow -- hopefully that can avoid
319 // dependencies.
320 apps::AppWindow* window =
321 new apps::AppWindow(current_profile, new ChromeAppDelegate(), extension);
322 content::WebContents* web_contents =
323 content::WebContents::Create(content::WebContents::CreateParams(
324 current_profile,
325 content::SiteInstance::CreateForURL(current_profile, url)));
326 // scoped
327 TestAppWindowContents contents(web_contents);
328 window->SetAppWindowContentsForTesting(&contents);
329 apps::AppWindowRegistry* app_registry =
330 apps::AppWindowRegistry::Get(current_profile);
331 app_registry->AddAppWindow(window);
332
333 ProcessPowerCollector collector;
334 collector.UpdateMetricsMap();
335 collector.PopulateCpuUsageByOrigin();
336 EXPECT_EQ(size_t(1), collector.GetMetricsMapForTesting()->size());
337 collector.RecordCpuUsageByOrigin(0);
338
339 app_registry->RemoveAppWindow(window);
340 collector.UpdateMetricsMap();
341 collector.PopulateCpuUsageByOrigin();
342 EXPECT_EQ(size_t(0), collector.GetMetricsMapForTesting()->size());
343 collector.RecordCpuUsageByOrigin(0);
344 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698