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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/performance_monitor/constants.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/performance_monitor/database.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/performance_monitor/metric.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/performance_monitor/performance_monitor.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/session_startup_pref.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_test_helper.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace performance_monitor { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::TimeDelta kMaxStartupTime = base::TimeDelta::FromMinutes(3); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper struct to store the information of an extension; this is needed if the 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointer to the extension ever becomes invalid (e.g., if we uninstall the 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension). 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionBasicInfo { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty constructor for stl-container-happiness. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionBasicInfo() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ExtensionBasicInfo(const Extension* extension) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : description(extension->description()), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id(extension->id()), 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name(extension->name()), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url(extension->url().spec()), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version(extension->VersionString()), 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location(extension->location()) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string description; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string version; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location location; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compare the fields of |extension| to those in |value|; this is a check to 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// make sure the extension data was recorded properly in the event. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ValidateExtensionInfo(const ExtensionBasicInfo extension, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* value) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_description; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_id; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_name; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_url; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_version; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int extension_location; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("extensionDescription", 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &extension_description)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(extension.description, extension_description); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("extensionId", &extension_id)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(extension.id, extension_id); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("extensionName", &extension_name)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(extension.name, extension_name); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("extensionUrl", &extension_url)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(extension.url, extension_url); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("extensionVersion", &extension_version)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(extension.version, extension_version); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetInteger("extensionLocation", &extension_location)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(extension.location, extension_location); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that a particular event has the proper type. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckEventType(int expected_event_type, const linked_ptr<Event>& event) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_type = -1; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(event->data()->GetInteger("eventType", &event_type)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_event_type, event_type); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_event_type, event->type()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we received the proper number of events, checking the type of 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each one. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckEventTypes(const std::vector<int> expected_event_types, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Database::EventVector& events) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_event_types.size(), events.size()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < expected_event_types.size(); ++i) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckEventType(expected_event_types[i], events[i]); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that we received the proper number of events, that each event is of the 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// proper type, and that each event recorded the proper information about the 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckExtensionEvents( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int>& expected_event_types, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Database::EventVector& events, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ExtensionBasicInfo>& extension_infos) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckEventTypes(expected_event_types, events); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < expected_event_types.size(); ++i) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateExtensionInfo(extension_infos[i], events[i]->data()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_type; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[i]->data()->GetInteger("eventType", &event_type)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_event_types[i], event_type); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PerformanceMonitorBrowserTest : public ExtensionBrowserTest { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(db_dir_.CreateUniqueTempDir()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor_ = PerformanceMonitor::GetInstance(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor_->SetDatabasePath(db_dir_.path()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PerformanceMonitor's initialization process involves a significant 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // amount of thread-hopping between the UI thread and the background thread. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we begin the tests prior to full initialization, we cannot predict 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the behavior or mock synchronicity as we must. Wait for initialization 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to complete fully before proceeding with the test. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver windowed_observer( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PERFORMANCE_MONITOR_INITIALIZED, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor_->Start(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowed_observer.Wait(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We stop the timer in charge of doing timed collections so that we can 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enforce when, and how many times, we do these collections. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor_->timer_.Stop(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A handle for gathering statistics from the database, which must be done on 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the background thread. Since we are testing, we can mock synchronicity with 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FlushForTesting(). 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GatherStatistics() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostBlockingPoolSequencedTask( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::kDatabaseSequenceToken, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PerformanceMonitor::GatherStatisticsOnBackgroundThread, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(performance_monitor()))); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetEventsOnBackgroundThread(Database::EventVector* events) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base::Time is potentially flaky in that there is no guarantee that it 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't actually decrease between successive calls. If we call GetEvents 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the Database uses base::Time::Now() and gets a lesser time, then it 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will return 0 events. Thus, we use a time that is guaranteed to be in the 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // future (for at least the next couple hundred thousand years). 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *events = performance_monitor_->database()->GetEvents( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time(), base::Time::FromInternalValue(kint64max)); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A handle for getting the events from the database, which must be done on 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the background thread. Since we are testing, we can mock synchronicity 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with FlushForTesting(). 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector GetEvents() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that any event insertions happen prior to getting events in order 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to avoid race conditions. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostBlockingPoolSequencedTask( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::kDatabaseSequenceToken, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PerformanceMonitorBrowserTest::GetEventsOnBackgroundThread, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &events)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetStatsOnBackgroundThread(Database::MetricVector* metrics, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetricType type) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *metrics = *performance_monitor_->database()->GetStatsForActivityAndMetric( 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, base::Time(), base::Time::FromInternalValue(kint64max)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A handle for getting statistics from the database (see previous comments on 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetEvents() and GetEventsOnBackgroundThread). 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector GetStats(MetricType type) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector metrics; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostBlockingPoolSequencedTask( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::kDatabaseSequenceToken, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PerformanceMonitorBrowserTest::GetStatsOnBackgroundThread, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &metrics, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return metrics; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A handle for inserting a state value into the database, which must be done 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on the background thread. This is useful for mocking up a scenario in which 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the database has prior data stored. We mock synchronicity with 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FlushForTesting(). 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddStateValue(const std::string& key, const std::string& value) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostBlockingPoolSequencedTask( 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::kDatabaseSequenceToken, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(base::IgnoreResult(&Database::AddStateValue), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(performance_monitor()->database()), 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A handle for PerformanceMonitor::CheckForVersionUpdateOnBackgroundThread(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we mock synchronicity with FlushForTesting(). 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckForVersionUpdate() { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostBlockingPoolSequencedTask( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::kDatabaseSequenceToken, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PerformanceMonitor::CheckForVersionUpdateOnBackgroundThread, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(performance_monitor()))); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PerformanceMonitor* performance_monitor() const { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return performance_monitor_; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir db_dir_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PerformanceMonitor* performance_monitor_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PerformanceMonitorUncleanExitBrowserTest 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public PerformanceMonitorBrowserTest { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetUpUserDataDirectory() OVERRIDE { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_directory; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_USER_DATA, &user_data_directory); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On CrOS, if we are "logged in" with the --login-profile switch, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the default profile will be different. We check if we are logged in, and, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if we are, we use that profile name instead. (Note: trybots will 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // typically be logged in with 'user'.) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine command_line = *CommandLine::ForCurrentProcess(); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_line.HasSwitch(chromeos::switches::kLoginProfile)) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_profile_name_ = 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line.GetSwitchValueASCII(chromeos::switches::kLoginProfile); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_profile_name_ = chrome::kInitialProfile; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_profile_name_ = chrome::kInitialProfile; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath first_profile = 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_data_directory.AppendASCII(first_profile_name_); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(file_util::CreateDirectory(first_profile)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath stock_prefs_file; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &stock_prefs_file); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stock_prefs_file = stock_prefs_file.AppendASCII("performance_monitor") 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("unclean_exit_prefs"); 3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(base::PathExists(stock_prefs_file)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath first_profile_prefs_file = 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_profile.Append(chrome::kPreferencesFilename); 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(base::CopyFile(stock_prefs_file, first_profile_prefs_file)); 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(base::PathExists(first_profile_prefs_file)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_profile_name_ = 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(chrome::kMultiProfileDirPrefix) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .append(base::IntToString(1)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath second_profile = 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_data_directory.AppendASCII(second_profile_name_); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(file_util::CreateDirectory(second_profile)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath second_profile_prefs_file = 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_profile.Append(chrome::kPreferencesFilename); 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(base::CopyFile(stock_prefs_file, second_profile_prefs_file)); 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(base::PathExists(second_profile_prefs_file)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first_profile_name_; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second_profile_name_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PerformanceMonitorSessionRestoreBrowserTest 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public PerformanceMonitorBrowserTest { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStartupPref pref(SessionStartupPref::LAST); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStartupPref::SetStartupPref(browser()->profile(), pref); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined (OS_MACOSX) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undo the effect of kBrowserAliveWithNoWindows in defaults.cc so that we 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can get these test to work without quitting. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceTestHelper helper( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(browser()->profile())); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helper.SetForceBrowserNotAliveWithNoWindows(true); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helper.ReleaseService(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PerformanceMonitorBrowserTest::SetUpOnMainThread(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* QuitBrowserAndRestore(Browser* browser, int expected_tab_count) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = browser->profile(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the browser. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->AddRefModule(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->window()->Close(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserWindowController depends on the auto release pool being recycled 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the message loop to delete itself, which frees the Browser object 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which fires this event. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoreleasePool()->Recycle(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new window, which should trigger session restore. 374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestNavigationObserver restore_observer(NULL, expected_tab_count); 375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) restore_observer.StartWatchingNewWebContents(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BrowserAddedObserver window_observer; 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::NewEmptyWindow(profile, chrome::GetActiveDesktop()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* new_browser = window_observer.WaitForSingleNewBrowser(); 379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) restore_observer.Wait(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->ReleaseModule(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_browser; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that PerformanceMonitor will correctly record an extension installation 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, InstallExtensionEvent) { 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_path; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &extension_path); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_path = extension_path.AppendASCII("performance_monitor") 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("extensions") 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("simple_extension_v1"); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extension_path); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ExtensionBasicInfo> extension_infos; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos.push_back(ExtensionBasicInfo(extension)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> expected_event_types; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_INSTALL); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionEvents(expected_event_types, events, extension_infos); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that PerformanceMonitor will correctly record events as an extension is 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disabled and enabled. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test is falky, see http://crbug.com/157980 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_DisableAndEnableExtensionEvent) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEvents = 3; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_path; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &extension_path); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_path = extension_path.AppendASCII("performance_monitor") 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("extensions") 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("simple_extension_v1"); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extension_path); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableExtension(extension->id()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnableExtension(extension->id()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ExtensionBasicInfo> extension_infos; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There will be three events in all, each pertaining to the same extension: 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Install 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Disable 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Enable 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEvents; ++i) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos.push_back(ExtensionBasicInfo(extension)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> expected_event_types; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_INSTALL); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_DISABLE); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_ENABLE); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionEvents(expected_event_types, events, extension_infos); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that PerformanceMonitor correctly records an extension update event. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, UpdateExtensionEvent) { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir = test_data_dir.AppendASCII("performance_monitor") 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("extensions"); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need two versions of the same extension. 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pem_path = test_data_dir.AppendASCII("simple_extension.pem"); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path_v1_ = PackExtensionWithOptions( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir.AppendASCII("simple_extension_v1"), 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("simple_extension1.crx"), 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_path, 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath()); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path_v2_ = PackExtensionWithOptions( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir.AppendASCII("simple_extension_v2"), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().AppendASCII("simple_extension2.crx"), 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_path, 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension = InstallExtension(path_v1_, 1); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ExtensionBasicInfo> extension_infos; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos.push_back(ExtensionBasicInfo(extension)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* extension_service = 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetExtensionService(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CrxInstaller* crx_installer = NULL; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an observer to wait for the update to finish. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver windowed_observer( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_CRX_INSTALLER_DONE, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<extensions::CrxInstaller>(crx_installer)); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_service-> 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(extension->id(), path_v2_, GURL(), &crx_installer)); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowed_observer.Wait(); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = extension_service->GetExtensionById( 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos[0].id, false); // don't include disabled extensions. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The total series of events for this process will be: 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Install - install version 1 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Install - install version 2 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Update - signal the udate to version 2 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We push back the corresponding ExtensionBasicInfos. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos.push_back(ExtensionBasicInfo(extension)); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos.push_back(extension_infos[1]); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> expected_event_types; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_INSTALL); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_INSTALL); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_UPDATE); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionEvents(expected_event_types, events, extension_infos); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, UninstallExtensionEvent) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEvents = 2; 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_path; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &extension_path); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_path = extension_path.AppendASCII("performance_monitor") 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("extensions") 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("simple_extension_v1"); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extension_path); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ExtensionBasicInfo> extension_infos; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There will be two events, both pertaining to the same extension: 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Install 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension Uninstall 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEvents; ++i) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_infos.push_back(ExtensionBasicInfo(extension)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(extension->id()); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> expected_event_types; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_INSTALL); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_event_types.push_back(EVENT_EXTENSION_UNINSTALL); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionEvents(expected_event_types, events, extension_infos); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, NewVersionEvent) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kOldVersion[] = "0.0"; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The version in the database right now will be the current version of chrome 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (gathered at initialization of PerformanceMonitor). Replace this with an 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // older version so an event is generated. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddStateValue(kStateChromeVersion, kOldVersion); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckForVersionUpdate(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo version; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(version.is_valid()); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string version_string = version.Version(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, events.size()); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(EVENT_CHROME_UPDATE, events[0]->type()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* value; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[0]->data()->GetAsDictionary(&value)); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string previous_version; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_version; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("previousVersion", &previous_version)); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kOldVersion, previous_version); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value->GetString("currentVersion", ¤t_version)); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(version_string, current_version); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crbug.com/160502 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_GatherStatistics) { 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GatherStatistics(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No stats should be recorded for this CPUUsage because this was the first 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call to GatherStatistics. 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector stats = GetStats(METRIC_CPU_USAGE); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, stats.size()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stats = GetStats(METRIC_PRIVATE_MEMORY_USAGE); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, stats.size()); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(stats[0].value, 0); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stats = GetStats(METRIC_SHARED_MEMORY_USAGE); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, stats.size()); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(stats[0].value, 0); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open new tabs to incur CPU usage. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NavigateParams params( 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), ui_test_utils::GetTestUrl( 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(base::FilePath::kCurrentDirectory), 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("title1.html"))), 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.disposition = NEW_BACKGROUND_TAB; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(¶ms); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GatherStatistics(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One CPUUsage stat should exist now. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stats = GetStats(METRIC_CPU_USAGE); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, stats.size()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(stats[0].value, 0); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stats = GetStats(METRIC_PRIVATE_MEMORY_USAGE); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, stats.size()); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(stats[1].value, 0); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stats = GetStats(METRIC_SHARED_MEMORY_USAGE); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, stats.size()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(stats[1].value, 0); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled on other platforms because of flakiness: http://crbug.com/159172. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled on Windows due to a bug where Windows will return a normal exit 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code in the testing environment, even if the process died (this is not the 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case when hand-testing). This code can be traced to MSDN functions in 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::GetTerminationStatus(), so there's not much we can do. 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_RendererKilledEvent) { 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::CrashTab(browser()->tab_strip_model()->GetActiveWebContents()); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, events.size()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckEventType(EVENT_RENDERER_KILLED, events[0]); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the url - since we never went anywhere, this should be about:blank. 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[0]->data()->GetString("url", &url)); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("about:blank", url); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_WIN) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, RendererCrashEvent) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver windowed_observer( 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDERER_PROCESS_CLOSED, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL)); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windowed_observer.Wait(); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, events.size()); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckEventType(EVENT_RENDERER_CRASH, events[0]); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[0]->data()->GetString("url", &url)); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("chrome://crash/", url); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorUncleanExitBrowserTest, 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneProfileUncleanExit) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the database value (if there's no value in the database, it 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can't determine the last active time of the profile, and doesn't insert 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the event). 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string time = "12985807272597591"; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddStateValue(kStateProfilePrefix + first_profile_name_, time); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor()->CheckForUncleanExits(); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kNumEvents = 1; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kNumEvents, events.size()); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckEventType(EVENT_UNCLEAN_EXIT, events[0]); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_profile; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[0]->data()->GetString("profileName", &event_profile)); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(first_profile_name_, event_profile); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorUncleanExitBrowserTest, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TwoProfileUncleanExit) { 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath second_profile_path; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_USER_DATA, &second_profile_path); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_profile_path = second_profile_path.AppendASCII(second_profile_name_); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string time1 = "12985807272597591"; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string time2 = "12985807272599918"; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the database. 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddStateValue(kStateProfilePrefix + first_profile_name_, time1); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddStateValue(kStateProfilePrefix + second_profile_name_, time2); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor()->CheckForUncleanExits(); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Load the second profile, which has also exited uncleanly. Note that since 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the second profile is new, component extensions will be installed as part 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the browser startup for that profile, generating extra events. 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->profile_manager()->GetProfile(second_profile_path); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::EventVector events = GetEvents(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t kNumUncleanExitEvents = 2; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_unclean_exit_events = 0; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < events.size(); ++i) { 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_type = -1; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (events[i]->data()->GetInteger("eventType", &event_type) && 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_type == EVENT_EXTENSION_INSTALL) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventType(EVENT_UNCLEAN_EXIT, events[i]); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_unclean_exit_events; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(kNumUncleanExitEvents, num_unclean_exit_events); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_profile; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[0]->data()->GetString("profileName", &event_profile)); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(first_profile_name_, event_profile); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(events[1]->data()->GetString("profileName", &event_profile)); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(second_profile_name_, event_profile); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, StartupTime) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector metrics = GetStats(METRIC_TEST_STARTUP_TIME); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, metrics.size()); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(metrics[0].value, kMaxStartupTime.ToInternalValue()); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorSessionRestoreBrowserTest, 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartupWithSessionRestore) { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), ui_test_utils::GetTestUrl( 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(base::FilePath::kCurrentDirectory), 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("title1.html")))); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitBrowserAndRestore(browser(), 1); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector metrics = GetStats(METRIC_TEST_STARTUP_TIME); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, metrics.size()); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(metrics[0].value, kMaxStartupTime.ToInternalValue()); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metrics = GetStats(METRIC_SESSION_RESTORE_TIME); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, metrics.size()); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(metrics[0].value, kMaxStartupTime.ToInternalValue()); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, PageLoadTime) { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta kMaxLoadTime = base::TimeDelta::FromSeconds(30); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), ui_test_utils::GetTestUrl( 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(base::FilePath::kCurrentDirectory), 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("title1.html")))); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), ui_test_utils::GetTestUrl( 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(base::FilePath::kCurrentDirectory), 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("title1.html")))); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector metrics = GetStats(METRIC_PAGE_LOAD_TIME); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, metrics.size()); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(metrics[0].value, kMaxLoadTime.ToInternalValue()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(metrics[1].value, kMaxLoadTime.ToInternalValue()); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PerformanceMonitorBrowserTest, NetworkBytesRead) { 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_dir; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_dir); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 page1_size = 0; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::GetFileSize(test_dir.AppendASCII("title1.html"), 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &page1_size)); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 page2_size = 0; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::GetFileSize(test_dir.AppendASCII("title2.html"), 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &page2_size)); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL(std::string("files/").append("title1.html"))); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor()->DoTimedCollections(); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since network bytes are read and set on the IO thread, we must flush this 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // additional thread to be sure that all messages are run. 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(content::BrowserThread::IO); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Database::MetricVector metrics = GetStats(METRIC_NETWORK_BYTES_READ); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, metrics.size()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since these pages are read over the "network" (actually the test_server), 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // some extraneous information is carried along, and the best check we can do 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is for greater than or equal to. 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(metrics[0].value, page1_size); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL(std::string("files/").append("title2.html"))); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) performance_monitor()->DoTimedCollections(); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metrics = GetStats(METRIC_NETWORK_BYTES_READ); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, metrics.size()); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(metrics[1].value, page1_size + page2_size); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace performance_monitor 800