1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Tests the MetricsService stat recording to make sure that the numbers are 6// what we expect. 7 8#include "components/metrics/metrics_service.h" 9 10#include <string> 11 12#include "base/command_line.h" 13#include "base/files/file_path.h" 14#include "base/path_service.h" 15#include "base/prefs/pref_service.h" 16#include "chrome/browser/browser_process.h" 17#include "chrome/browser/ui/browser.h" 18#include "chrome/browser/ui/tabs/tab_strip_model.h" 19#include "chrome/common/chrome_paths.h" 20#include "chrome/common/chrome_switches.h" 21#include "chrome/common/pref_names.h" 22#include "chrome/common/url_constants.h" 23#include "chrome/test/base/in_process_browser_test.h" 24#include "chrome/test/base/ui_test_utils.h" 25#include "content/public/test/browser_test_utils.h" 26#include "net/base/filename_util.h" 27#include "ui/base/window_open_disposition.h" 28#include "url/gurl.h" 29 30class MetricsServiceBrowserTest : public InProcessBrowserTest { 31 public: 32 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 33 // Enable the metrics service for testing (in recording-only mode). 34 command_line->AppendSwitch(switches::kMetricsRecordingOnly); 35 } 36 37 // Open a couple of tabs of random content. 38 void OpenTabs() { 39 const int kBrowserTestFlags = 40 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB | 41 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION; 42 43 base::FilePath test_directory; 44 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_directory)); 45 46 base::FilePath page1_path = test_directory.AppendASCII("title2.html"); 47 ui_test_utils::NavigateToURLWithDisposition( 48 browser(), 49 net::FilePathToFileURL(page1_path), 50 NEW_FOREGROUND_TAB, 51 kBrowserTestFlags); 52 53 base::FilePath page2_path = test_directory.AppendASCII("iframe.html"); 54 ui_test_utils::NavigateToURLWithDisposition( 55 browser(), 56 net::FilePathToFileURL(page2_path), 57 NEW_FOREGROUND_TAB, 58 kBrowserTestFlags); 59 } 60}; 61 62IN_PROC_BROWSER_TEST_F(MetricsServiceBrowserTest, CloseRenderersNormally) { 63 OpenTabs(); 64 65 // Verify that the expected stability metrics were recorded. 66 const PrefService* prefs = g_browser_process->local_state(); 67 EXPECT_EQ(1, prefs->GetInteger(metrics::prefs::kStabilityLaunchCount)); 68 EXPECT_EQ(3, prefs->GetInteger(prefs::kStabilityPageLoadCount)); 69 EXPECT_EQ(0, prefs->GetInteger(prefs::kStabilityRendererCrashCount)); 70 // TODO(isherman): We should also verify that 71 // metrics::prefs::kStabilityExitedCleanly 72 // is set to true, but this preference isn't set until the browser 73 // exits... it's not clear to me how to test that. 74} 75 76// Flaky on Linux. See http://crbug.com/131094 77#if defined(OS_LINUX) 78#define MAYBE_CrashRenderers DISABLED_CrashRenderers 79#else 80#define MAYBE_CrashRenderers CrashRenderers 81#endif 82IN_PROC_BROWSER_TEST_F(MetricsServiceBrowserTest, MAYBE_CrashRenderers) { 83 OpenTabs(); 84 85 // Kill the process for one of the tabs. 86 content::RenderProcessHostWatcher observer( 87 browser()->tab_strip_model()->GetActiveWebContents(), 88 content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 89 ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL)); 90 observer.Wait(); 91 92 // The MetricsService listens for the same notification, so the |observer| 93 // might finish waiting before the MetricsService has a chance to process the 94 // notification. To avoid racing here, we repeatedly run the message loop 95 // until the MetricsService catches up. This should happen "real soon now", 96 // since the notification is posted to all observers essentially 97 // simultaneously... so busy waiting here shouldn't be too bad. 98 const PrefService* prefs = g_browser_process->local_state(); 99 while (!prefs->GetInteger(prefs::kStabilityRendererCrashCount)) { 100 content::RunAllPendingInMessageLoop(); 101 } 102 103 // Verify that the expected stability metrics were recorded. 104 EXPECT_EQ(1, prefs->GetInteger(metrics::prefs::kStabilityLaunchCount)); 105 EXPECT_EQ(4, prefs->GetInteger(prefs::kStabilityPageLoadCount)); 106 EXPECT_EQ(1, prefs->GetInteger(prefs::kStabilityRendererCrashCount)); 107 // TODO(isherman): We should also verify that 108 // metrics::prefs::kStabilityExitedCleanly 109 // is set to true, but this preference isn't set until the browser 110 // exits... it's not clear to me how to test that. 111} 112 113