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", &current_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(&params);
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