tracing_browsertest.cc revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
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#include "chrome/test/base/tracing.h"
6
7#include "base/debug/trace_event.h"
8#include "base/message_loop.h"
9#include "base/run_loop.h"
10#include "chrome/browser/ui/browser.h"
11#include "chrome/browser/ui/tabs/tab_strip_model.h"
12#include "chrome/test/base/in_process_browser_test.h"
13#include "chrome/test/base/ui_test_utils.h"
14#include "content/public/browser/render_view_host.h"
15#include "content/public/browser/web_contents.h"
16#include "content/public/test/browser_test_utils.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19namespace {
20
21using tracing::BeginTracingWithWatch;
22using tracing::WaitForWatchEvent;
23using tracing::EndTracing;
24
25const char* g_category = "test_tracing";
26const char* g_event = "TheEvent";
27
28class TracingBrowserTest : public InProcessBrowserTest {
29 protected:
30  // Execute some no-op javascript on the current tab - this triggers a trace
31  // event in RenderViewImpl::OnScriptEvalRequest (from the renderer process).
32  void ExecuteJavascriptOnCurrentTab() {
33    content::RenderViewHost* rvh = browser()->tab_strip_model()->
34        GetActiveWebContents()->GetRenderViewHost();
35    ASSERT_TRUE(rvh);
36    ASSERT_TRUE(content::ExecuteScript(rvh, ";"));
37  }
38};
39
40void AddEvents(int num) {
41  for (int i = 0; i < num; ++i)
42    TRACE_EVENT_INSTANT0(g_category, g_event, TRACE_EVENT_SCOPE_THREAD);
43}
44
45IN_PROC_BROWSER_TEST_F(TracingBrowserTest, BeginTracingWithWatch) {
46  base::TimeDelta no_timeout;
47  base::TimeDelta short_timeout = base::TimeDelta::FromMilliseconds(5);
48  std::string json_events;
49
50  // One event before wait.
51  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category, g_event, 1));
52  AddEvents(1);
53  EXPECT_TRUE(WaitForWatchEvent(no_timeout));
54  ASSERT_TRUE(EndTracing(&json_events));
55
56  // One event after wait.
57  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category, g_event, 1));
58  base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&AddEvents, 1));
59  EXPECT_TRUE(WaitForWatchEvent(no_timeout));
60  ASSERT_TRUE(EndTracing(&json_events));
61
62  // Not enough events timeout.
63  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category, g_event, 2));
64  AddEvents(1);
65  EXPECT_FALSE(WaitForWatchEvent(short_timeout));
66  ASSERT_TRUE(EndTracing(&json_events));
67
68  // Multi event before wait.
69  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category, g_event, 5));
70  AddEvents(5);
71  EXPECT_TRUE(WaitForWatchEvent(no_timeout));
72  ASSERT_TRUE(EndTracing(&json_events));
73
74  // Multi event after wait.
75  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category, g_event, 5));
76  base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&AddEvents, 5));
77  EXPECT_TRUE(WaitForWatchEvent(no_timeout));
78  ASSERT_TRUE(EndTracing(&json_events));
79
80  // Child process events from same process.
81  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category,
82                                    "OnScriptEvalRequest", 2));
83  ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
84  ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
85  EXPECT_TRUE(WaitForWatchEvent(no_timeout));
86  ASSERT_TRUE(EndTracing(&json_events));
87
88  // Child process events from different processes.
89  GURL url1("chrome://tracing/");
90  GURL url2("chrome://credits/");
91  ASSERT_TRUE(BeginTracingWithWatch(g_category, g_category,
92                                    "OnScriptEvalRequest", 2));
93  // Open two tabs to different URLs to encourage two separate renderer
94  // processes. Each will fire an event that will be counted towards the total.
95  ui_test_utils::NavigateToURLWithDisposition(browser(), url1,
96      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
97  ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
98  ui_test_utils::NavigateToURLWithDisposition(browser(), url2,
99      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
100  ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
101  EXPECT_TRUE(WaitForWatchEvent(no_timeout));
102  ASSERT_TRUE(EndTracing(&json_events));
103}
104
105}  // namespace
106