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