fake_page_timing_sender.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright 2017 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. #include "components/page_load_metrics/renderer/fake_page_timing_sender.h"
  5. #include <algorithm>
  6. #include "testing/gmock/include/gmock/gmock-matchers.h"
  7. #include "testing/gmock/include/gmock/gmock.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. namespace page_load_metrics {
  10. FakePageTimingSender::FakePageTimingSender(PageTimingValidator* validator)
  11. : validator_(validator) {}
  12. FakePageTimingSender::~FakePageTimingSender() {}
  13. void FakePageTimingSender::SendTiming(
  14. const mojom::PageLoadTimingPtr& timing,
  15. const mojom::FrameMetadataPtr& metadata,
  16. const std::vector<blink::UseCounterFeature>& new_features,
  17. std::vector<mojom::ResourceDataUpdatePtr> resources,
  18. const mojom::FrameRenderDataUpdate& render_data,
  19. const mojom::CpuTimingPtr& cpu_timing,
  20. const mojom::InputTimingPtr new_input_timing,
  21. const absl::optional<blink::MobileFriendliness>& mobile_friendliness,
  22. uint32_t soft_navigation_count) {
  23. validator_->UpdateTiming(timing, metadata, new_features, resources,
  24. render_data, cpu_timing, new_input_timing,
  25. mobile_friendliness, soft_navigation_count);
  26. }
  27. void FakePageTimingSender::SetUpSmoothnessReporting(
  28. base::ReadOnlySharedMemoryRegion shared_memory) {}
  29. FakePageTimingSender::PageTimingValidator::PageTimingValidator()
  30. : expected_input_timing(mojom::InputTiming::New()),
  31. actual_input_timing(mojom::InputTiming::New()) {}
  32. FakePageTimingSender::PageTimingValidator::~PageTimingValidator() {
  33. VerifyExpectedTimings();
  34. }
  35. void FakePageTimingSender::PageTimingValidator::ExpectPageLoadTiming(
  36. const mojom::PageLoadTiming& timing) {
  37. VerifyExpectedTimings();
  38. expected_timings_.push_back(timing.Clone());
  39. }
  40. void FakePageTimingSender::PageTimingValidator::ExpectCpuTiming(
  41. const base::TimeDelta& timing) {
  42. VerifyExpectedCpuTimings();
  43. expected_cpu_timings_.push_back(mojom::CpuTiming(timing).Clone());
  44. }
  45. void FakePageTimingSender::PageTimingValidator::VerifyExpectedTimings() const {
  46. // Ideally we'd just call ASSERT_EQ(actual_timings_, expected_timings_) here,
  47. // but this causes the generated gtest code to fail to build on Windows. See
  48. // the comments in the header file for additional details.
  49. ASSERT_EQ(actual_timings_.size(), expected_timings_.size());
  50. for (size_t i = 0; i < actual_timings_.size(); ++i) {
  51. if (actual_timings_.at(i)->Equals(*expected_timings_.at(i)))
  52. continue;
  53. ADD_FAILURE() << "Actual timing != expected timing at index " << i;
  54. }
  55. }
  56. void FakePageTimingSender::PageTimingValidator::UpdateExpectedInputTiming(
  57. const base::TimeDelta input_delay) {
  58. expected_input_timing->num_input_events++;
  59. expected_input_timing->total_input_delay += input_delay;
  60. expected_input_timing->total_adjusted_input_delay += base::Milliseconds(
  61. std::max(int64_t(0), input_delay.InMilliseconds() - int64_t(50)));
  62. }
  63. void FakePageTimingSender::PageTimingValidator::VerifyExpectedInputTiming()
  64. const {
  65. ASSERT_EQ(expected_input_timing.is_null(), actual_input_timing.is_null());
  66. ASSERT_EQ(expected_input_timing->num_input_events,
  67. actual_input_timing->num_input_events);
  68. ASSERT_EQ(expected_input_timing->total_input_delay,
  69. actual_input_timing->total_input_delay);
  70. ASSERT_EQ(expected_input_timing->total_adjusted_input_delay,
  71. actual_input_timing->total_adjusted_input_delay);
  72. }
  73. void FakePageTimingSender::PageTimingValidator::
  74. UpdateExpectedMobileFriendliness(
  75. const blink::MobileFriendliness& mobile_friendliness) {
  76. expected_mobile_friendliness = mobile_friendliness;
  77. }
  78. void FakePageTimingSender::PageTimingValidator::
  79. VerifyExpectedMobileFriendliness() const {
  80. ASSERT_EQ(expected_mobile_friendliness, actual_mobile_friendliness);
  81. }
  82. void FakePageTimingSender::PageTimingValidator::VerifyExpectedCpuTimings()
  83. const {
  84. ASSERT_EQ(actual_cpu_timings_.size(), expected_cpu_timings_.size());
  85. for (size_t i = 0; i < actual_cpu_timings_.size(); ++i) {
  86. if (actual_cpu_timings_.at(i)->task_time ==
  87. expected_cpu_timings_.at(i)->task_time)
  88. continue;
  89. ADD_FAILURE() << "Actual cpu timing != expected cpu timing at index " << i;
  90. }
  91. }
  92. void FakePageTimingSender::PageTimingValidator::UpdateExpectPageLoadFeatures(
  93. const blink::UseCounterFeature& feature) {
  94. expected_features_.insert(feature);
  95. }
  96. void FakePageTimingSender::PageTimingValidator::VerifyExpectedFeatures() const {
  97. EXPECT_THAT(actual_features_, ::testing::ContainerEq(expected_features_));
  98. }
  99. void FakePageTimingSender::PageTimingValidator::VerifyExpectedRenderData()
  100. const {
  101. EXPECT_FLOAT_EQ(expected_render_data_.is_null()
  102. ? 0.0
  103. : expected_render_data_->layout_shift_delta,
  104. actual_render_data_.layout_shift_delta);
  105. }
  106. void FakePageTimingSender::PageTimingValidator::
  107. VerifyExpectedMainFrameIntersectionRect() const {
  108. EXPECT_EQ(expected_main_frame_intersection_rect_,
  109. actual_main_frame_intersection_rect_);
  110. }
  111. void FakePageTimingSender::PageTimingValidator::
  112. VerifyExpectedMainFrameViewportRect() const {
  113. EXPECT_EQ(expected_main_frame_viewport_rect_,
  114. actual_main_frame_viewport_rect_);
  115. }
  116. void FakePageTimingSender::PageTimingValidator::UpdateTiming(
  117. const mojom::PageLoadTimingPtr& timing,
  118. const mojom::FrameMetadataPtr& metadata,
  119. const std::vector<blink::UseCounterFeature>& new_features,
  120. const std::vector<mojom::ResourceDataUpdatePtr>& resources,
  121. const mojom::FrameRenderDataUpdate& render_data,
  122. const mojom::CpuTimingPtr& cpu_timing,
  123. const mojom::InputTimingPtr& new_input_timing,
  124. const absl::optional<blink::MobileFriendliness>& mobile_friendliness,
  125. uint32_t soft_navigation_count) {
  126. actual_timings_.push_back(timing.Clone());
  127. if (!cpu_timing->task_time.is_zero()) {
  128. actual_cpu_timings_.push_back(cpu_timing.Clone());
  129. }
  130. for (const blink::UseCounterFeature& feature : new_features) {
  131. EXPECT_EQ(actual_features_.find(feature), actual_features_.end())
  132. << "Feature " << feature.type() << ": " << feature.value()
  133. << " has been sent more than once";
  134. actual_features_.insert(feature);
  135. }
  136. actual_render_data_.layout_shift_delta = render_data.layout_shift_delta;
  137. actual_main_frame_intersection_rect_ = metadata->main_frame_intersection_rect;
  138. actual_main_frame_viewport_rect_ = metadata->main_frame_viewport_rect;
  139. actual_input_timing->num_input_events += new_input_timing->num_input_events;
  140. actual_input_timing->total_input_delay += new_input_timing->total_input_delay;
  141. actual_input_timing->total_adjusted_input_delay +=
  142. new_input_timing->total_adjusted_input_delay;
  143. if (mobile_friendliness.has_value())
  144. actual_mobile_friendliness = *mobile_friendliness;
  145. VerifyExpectedTimings();
  146. VerifyExpectedCpuTimings();
  147. VerifyExpectedFeatures();
  148. VerifyExpectedRenderData();
  149. VerifyExpectedMainFrameIntersectionRect();
  150. VerifyExpectedMainFrameViewportRect();
  151. VerifyExpectedMobileFriendliness();
  152. // TODO(yoav): Verify that soft nav count matches expectations.
  153. }
  154. } // namespace page_load_metrics