OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/test/histogram_tester.h" | 5 #include "base/test/histogram_tester.h" |
| 6 #include "components/rappor/public/rappor_utils.h" |
| 7 #include "components/rappor/test_rappor_service.h" |
6 #include "content/browser/renderer_host/input/render_widget_host_latency_tracker
.h" | 8 #include "content/browser/renderer_host/input/render_widget_host_latency_tracker
.h" |
7 #include "content/common/input/synthetic_web_input_event_builders.h" | 9 #include "content/common/input/synthetic_web_input_event_builders.h" |
8 #include "content/public/browser/native_web_keyboard_event.h" | 10 #include "content/public/browser/native_web_keyboard_event.h" |
| 11 #include "content/test/test_content_browser_client.h" |
| 12 #include "content/test/test_render_view_host.h" |
| 13 #include "content/test/test_web_contents.h" |
9 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
11 | 16 |
12 using base::Bucket; | 17 using base::Bucket; |
13 using blink::WebInputEvent; | 18 using blink::WebInputEvent; |
14 using testing::ElementsAre; | 19 using testing::ElementsAre; |
15 | 20 |
16 namespace content { | 21 namespace content { |
17 namespace { | 22 namespace { |
18 | 23 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 57 |
53 } else { | 58 } else { |
54 latency->AddLatencyNumberWithTimestamp( | 59 latency->AddLatencyNumberWithTimestamp( |
55 ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL_COMPONENT, 0, 0, | 60 ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL_COMPONENT, 0, 0, |
56 time_stamp, 1); | 61 time_stamp, 1); |
57 } | 62 } |
58 } | 63 } |
59 | 64 |
60 } // namespace | 65 } // namespace |
61 | 66 |
62 class RenderWidgetHostLatencyTrackerTest : public testing::Test { | 67 class RenderWidgetHostLatencyTrackerTestBrowserClient |
| 68 : public TestContentBrowserClient { |
63 public: | 69 public: |
64 RenderWidgetHostLatencyTrackerTest() { | 70 RenderWidgetHostLatencyTrackerTestBrowserClient() {} |
| 71 ~RenderWidgetHostLatencyTrackerTestBrowserClient() override {} |
| 72 |
| 73 rappor::RapporService* GetRapporService() override { |
| 74 return &rappor_service_; |
| 75 } |
| 76 |
| 77 rappor::TestRapporServiceImpl* getTestRapporService() { |
| 78 return &rappor_service_; |
| 79 } |
| 80 |
| 81 private: |
| 82 rappor::TestRapporServiceImpl rappor_service_; |
| 83 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostLatencyTrackerTestBrowserClient); |
| 84 }; |
| 85 |
| 86 class RenderWidgetHostLatencyTrackerTest |
| 87 : public RenderViewHostImplTestHarness { |
| 88 public: |
| 89 RenderWidgetHostLatencyTrackerTest() : old_browser_client_(NULL) { |
65 tracker_.Initialize(kTestRoutingId, kTestProcessId); | 90 tracker_.Initialize(kTestRoutingId, kTestProcessId); |
66 ResetHistograms(); | 91 ResetHistograms(); |
67 } | 92 } |
68 | 93 |
69 ::testing::AssertionResult HistogramSizeEq(const char* histogram_name, | 94 ::testing::AssertionResult HistogramSizeEq(const char* histogram_name, |
70 int size) { | 95 int size) { |
71 uint64_t histogram_size = | 96 uint64_t histogram_size = |
72 histogram_tester_->GetAllSamples(histogram_name).size(); | 97 histogram_tester_->GetAllSamples(histogram_name).size(); |
73 if (static_cast<uint64_t>(size) == histogram_size) { | 98 if (static_cast<uint64_t>(size) == histogram_size) { |
74 return ::testing::AssertionSuccess(); | 99 return ::testing::AssertionSuccess(); |
75 } else { | 100 } else { |
76 return ::testing::AssertionFailure() << histogram_name << " expected " | 101 return ::testing::AssertionFailure() << histogram_name << " expected " |
77 << size << " entries, but had " | 102 << size << " entries, but had " |
78 << histogram_size; | 103 << histogram_size; |
79 } | 104 } |
80 } | 105 } |
81 | 106 |
82 RenderWidgetHostLatencyTracker* tracker() { return &tracker_; } | 107 RenderWidgetHostLatencyTracker* tracker() { return &tracker_; } |
83 void ResetHistograms() { | 108 void ResetHistograms() { |
84 histogram_tester_.reset(new base::HistogramTester()); | 109 histogram_tester_.reset(new base::HistogramTester()); |
85 } | 110 } |
86 | 111 |
87 const base::HistogramTester& histogram_tester() { | 112 const base::HistogramTester& histogram_tester() { |
88 return *histogram_tester_; | 113 return *histogram_tester_; |
89 } | 114 } |
90 | 115 |
91 private: | 116 void SetUp() override { |
| 117 RenderViewHostImplTestHarness::SetUp(); |
| 118 old_browser_client_ = SetBrowserClientForTesting(&test_browser_client_); |
| 119 tracker_.SetDelegate(contents()); |
| 120 } |
| 121 |
| 122 void TearDown() override { |
| 123 SetBrowserClientForTesting(old_browser_client_); |
| 124 RenderViewHostImplTestHarness::TearDown(); |
| 125 } |
| 126 |
| 127 protected: |
92 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostLatencyTrackerTest); | 128 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostLatencyTrackerTest); |
93 const int kTestRoutingId = 3; | 129 const int kTestRoutingId = 3; |
94 const int kTestProcessId = 1; | 130 const int kTestProcessId = 1; |
95 std::unique_ptr<base::HistogramTester> histogram_tester_; | 131 std::unique_ptr<base::HistogramTester> histogram_tester_; |
96 RenderWidgetHostLatencyTracker tracker_; | 132 RenderWidgetHostLatencyTracker tracker_; |
| 133 RenderWidgetHostLatencyTrackerTestBrowserClient test_browser_client_; |
| 134 ContentBrowserClient* old_browser_client_; |
97 }; | 135 }; |
98 | 136 |
99 TEST_F(RenderWidgetHostLatencyTrackerTest, TestWheelToFirstScrollHistograms) { | 137 TEST_F(RenderWidgetHostLatencyTrackerTest, TestWheelToFirstScrollHistograms) { |
100 for (bool rendering_on_main : {false, true}) { | 138 for (bool rendering_on_main : {false, true}) { |
101 for (bool is_running_navigation_hint_task : {false, true}) { | 139 for (bool is_running_navigation_hint_task : {false, true}) { |
102 ResetHistograms(); | 140 ResetHistograms(); |
103 { | 141 { |
104 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( | 142 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( |
105 blink::WebMouseWheelEvent::PhaseChanged); | 143 blink::WebMouseWheelEvent::PhaseChanged); |
106 base::TimeTicks now = base::TimeTicks::Now(); | 144 base::TimeTicks now = base::TimeTicks::Now(); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 EXPECT_TRUE(HistogramSizeEq( | 412 EXPECT_TRUE(HistogramSizeEq( |
375 "Event.Latency.ScrollUpdate.Touch.BrowserNotifiedToBeforeGpuSwap2", | 413 "Event.Latency.ScrollUpdate.Touch.BrowserNotifiedToBeforeGpuSwap2", |
376 0)); | 414 0)); |
377 EXPECT_TRUE( | 415 EXPECT_TRUE( |
378 HistogramSizeEq("Event.Latency.ScrollUpdate.Touch.GpuSwap2", 0)); | 416 HistogramSizeEq("Event.Latency.ScrollUpdate.Touch.GpuSwap2", 0)); |
379 } | 417 } |
380 } | 418 } |
381 } | 419 } |
382 | 420 |
383 TEST_F(RenderWidgetHostLatencyTrackerTest, TestTouchToScrollHistograms) { | 421 TEST_F(RenderWidgetHostLatencyTrackerTest, TestTouchToScrollHistograms) { |
| 422 const GURL url("http://www.foo.bar.com/subpage/1"); |
| 423 contents()->NavigateAndCommit(url); |
384 for (bool rendering_on_main : {false, true}) { | 424 for (bool rendering_on_main : {false, true}) { |
385 for (bool is_running_navigation_hint_task : {false, true}) { | 425 for (bool is_running_navigation_hint_task : {false, true}) { |
386 ResetHistograms(); | 426 ResetHistograms(); |
| 427 EXPECT_EQ(0, |
| 428 test_browser_client_.getTestRapporService()->GetReportsCount()); |
387 { | 429 { |
388 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollUpdate( | 430 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollUpdate( |
389 5.f, -5.f, 0, blink::WebGestureDeviceTouchscreen); | 431 5.f, -5.f, 0, blink::WebGestureDeviceTouchscreen); |
390 base::TimeTicks now = base::TimeTicks::Now(); | 432 base::TimeTicks now = base::TimeTicks::Now(); |
391 scroll.timeStampSeconds = (now - base::TimeTicks()).InSecondsF(); | 433 scroll.timeStampSeconds = (now - base::TimeTicks()).InSecondsF(); |
392 ui::LatencyInfo scroll_latency; | 434 ui::LatencyInfo scroll_latency; |
393 scroll_latency.AddLatencyNumberWithTimestamp( | 435 scroll_latency.AddLatencyNumberWithTimestamp( |
394 ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, | 436 ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, |
395 tracker()->latency_component_id(), 0, now, 1); | 437 tracker()->latency_component_id(), 0, now, 1); |
396 AddFakeComponentsWithTimeStamp(*tracker(), &scroll_latency, now); | 438 AddFakeComponentsWithTimeStamp(*tracker(), &scroll_latency, now); |
(...skipping 26 matching lines...) Expand all Loading... |
423 tracker()->latency_component_id(), nullptr)); | 465 tracker()->latency_component_id(), nullptr)); |
424 EXPECT_TRUE(touch_latency.FindLatency( | 466 EXPECT_TRUE(touch_latency.FindLatency( |
425 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); | 467 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); |
426 EXPECT_EQ(2U, touch_latency.input_coordinates_size()); | 468 EXPECT_EQ(2U, touch_latency.input_coordinates_size()); |
427 tracker()->OnInputEventAck(touch, &touch_latency, | 469 tracker()->OnInputEventAck(touch, &touch_latency, |
428 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 470 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
429 tracker()->OnFrameSwapped(touch_latency, | 471 tracker()->OnFrameSwapped(touch_latency, |
430 is_running_navigation_hint_task); | 472 is_running_navigation_hint_task); |
431 } | 473 } |
432 | 474 |
| 475 // Rappor metrics |
| 476 rappor::TestSample::Shadow* sample_obj = |
| 477 test_browser_client_.getTestRapporService() |
| 478 ->GetRecordedSampleForMetric( |
| 479 "Event.Latency.ScrollUpdate.Touch." |
| 480 "TimeToScrollUpdateSwapBegin2"); |
| 481 EXPECT_NE(nullptr, sample_obj); |
| 482 const auto& domain_it = sample_obj->string_fields.find("Domain"); |
| 483 EXPECT_NE(domain_it, sample_obj->string_fields.end()); |
| 484 EXPECT_EQ("bar.com", domain_it->second); |
| 485 const auto& latency_it = sample_obj->uint64_fields.find("Latency"); |
| 486 EXPECT_NE(latency_it, sample_obj->uint64_fields.end()); |
| 487 EXPECT_EQ(rappor::NO_NOISE, latency_it->second.second); |
| 488 |
| 489 EXPECT_EQ(2, |
| 490 test_browser_client_.getTestRapporService()->GetReportsCount()); |
| 491 |
| 492 // UMA histograms |
433 EXPECT_TRUE(HistogramSizeEq( | 493 EXPECT_TRUE(HistogramSizeEq( |
434 "Event.Latency.ScrollBegin.Touch.TimeToScrollUpdateSwapBegin2", 0)); | 494 "Event.Latency.ScrollBegin.Touch.TimeToScrollUpdateSwapBegin2", 0)); |
435 EXPECT_TRUE(HistogramSizeEq( | 495 EXPECT_TRUE(HistogramSizeEq( |
436 "Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin2", 1)); | 496 "Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin2", 1)); |
437 EXPECT_TRUE(HistogramSizeEq( | 497 EXPECT_TRUE(HistogramSizeEq( |
438 "Event.Latency.ScrollBegin.Touch.TimeToHandled2_Main", 0)); | 498 "Event.Latency.ScrollBegin.Touch.TimeToHandled2_Main", 0)); |
439 EXPECT_TRUE(HistogramSizeEq( | 499 EXPECT_TRUE(HistogramSizeEq( |
440 "Event.Latency.ScrollBegin.Touch.TimeToHandled2_Impl", 0)); | 500 "Event.Latency.ScrollBegin.Touch.TimeToHandled2_Impl", 0)); |
441 EXPECT_TRUE(HistogramSizeEq( | 501 EXPECT_TRUE(HistogramSizeEq( |
442 "Event.Latency.ScrollBegin.Touch.HandledToRendererSwap2_Main", 0)); | 502 "Event.Latency.ScrollBegin.Touch.HandledToRendererSwap2_Main", 0)); |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 "Event.Latency.BlockingTime.TouchEndDefaultPrevented"), | 921 "Event.Latency.BlockingTime.TouchEndDefaultPrevented"), |
862 ElementsAre(Bucket( | 922 ElementsAre(Bucket( |
863 touchend_timestamps_ms[2] - touchend_timestamps_ms[1], 1))); | 923 touchend_timestamps_ms[2] - touchend_timestamps_ms[1], 1))); |
864 EXPECT_THAT(histogram_tester().GetAllSamples( | 924 EXPECT_THAT(histogram_tester().GetAllSamples( |
865 "Event.Latency.BlockingTime.TouchEndDefaultAllowed"), | 925 "Event.Latency.BlockingTime.TouchEndDefaultAllowed"), |
866 ElementsAre(Bucket( | 926 ElementsAre(Bucket( |
867 touchend_timestamps_ms[2] - touchend_timestamps_ms[1], 1))); | 927 touchend_timestamps_ms[2] - touchend_timestamps_ms[1], 1))); |
868 } | 928 } |
869 | 929 |
870 } // namespace content | 930 } // namespace content |
OLD | NEW |