Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc

Issue 2893943004: Refactor UKM interface for mojo-ification (Closed)
Patch Set: Fixed contextualsearch Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 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 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 "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_obser ver.h" 5 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_obser ver.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/metrics/metrics_hashes.h" 8 #include "base/metrics/metrics_hashes.h"
9 #include "base/optional.h" 9 #include "base/optional.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
11 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_ test_harness.h" 11 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_ test_harness.h"
12 #include "chrome/test/base/testing_browser_process.h" 12 #include "chrome/test/base/testing_browser_process.h"
13 #include "components/metrics/proto/ukm/entry.pb.h" 13 #include "components/ukm/test_ukm_recorder.h"
14 #include "components/ukm/test_ukm_service.h"
15 #include "components/ukm/ukm_entry.h"
16 #include "components/ukm/ukm_source.h" 14 #include "components/ukm/ukm_source.h"
17 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
18 16
19 using testing::AnyNumber; 17 using testing::AnyNumber;
20 using testing::Mock; 18 using testing::Mock;
21 using testing::Return; 19 using testing::Return;
22 20
23 namespace { 21 namespace {
24 22
25 const char kTestUrl1[] = "https://www.google.com/"; 23 const char kTestUrl1[] = "https://www.google.com/";
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 .WillRepeatedly(Return(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN)); 62 .WillRepeatedly(Return(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN));
65 63
66 EXPECT_CALL(mock_network_quality_provider_, GetHttpRTT()) 64 EXPECT_CALL(mock_network_quality_provider_, GetHttpRTT())
67 .Times(AnyNumber()) 65 .Times(AnyNumber())
68 .WillRepeatedly(Return(base::Optional<base::TimeDelta>())); 66 .WillRepeatedly(Return(base::Optional<base::TimeDelta>()));
69 67
70 EXPECT_CALL(mock_network_quality_provider_, GetTransportRTT()) 68 EXPECT_CALL(mock_network_quality_provider_, GetTransportRTT())
71 .Times(AnyNumber()) 69 .Times(AnyNumber())
72 .WillRepeatedly(Return(base::Optional<base::TimeDelta>())); 70 .WillRepeatedly(Return(base::Optional<base::TimeDelta>()));
73 71
74 TestingBrowserProcess::GetGlobal()->SetUkmService( 72 TestingBrowserProcess::GetGlobal()->SetUkmRecorder(&test_ukm_recorder_);
75 ukm_service_test_harness_.test_ukm_service());
76 } 73 }
77 74
78 size_t ukm_source_count() { 75 size_t ukm_source_count() { return test_ukm_recorder_.sources_count(); }
79 return ukm_service_test_harness_.test_ukm_service()->sources_count();
80 }
81 76
82 size_t ukm_entry_count() { 77 size_t ukm_entry_count() { return test_ukm_recorder_.entries_count(); }
83 return ukm_service_test_harness_.test_ukm_service()->entries_count();
84 }
85 78
86 MockNetworkQualityProvider& mock_network_quality_provider() { 79 MockNetworkQualityProvider& mock_network_quality_provider() {
87 return mock_network_quality_provider_; 80 return mock_network_quality_provider_;
88 } 81 }
89 82
90 const ukm::UkmSource* GetUkmSourceForUrl(const char* url) { 83 const ukm::UkmSource* GetUkmSourceForUrl(const char* url) {
91 return ukm_service_test_harness_.test_ukm_service()->GetSourceForUrl(url); 84 return test_ukm_recorder_.GetSourceForUrl(url);
92 } 85 }
93 86
94 const ukm::UkmEntry* GetUkmEntry(size_t entry_index) { 87 const ukm::mojom::UkmEntry* GetUkmEntry(size_t entry_index) {
95 return ukm_service_test_harness_.test_ukm_service()->GetEntry(entry_index); 88 return test_ukm_recorder_.GetEntry(entry_index);
96 } 89 }
97 90
98 std::vector<const ukm::UkmEntry*> GetUkmEntriesForSourceID( 91 std::vector<const ukm::mojom::UkmEntry*> GetUkmEntriesForSourceID(
99 int32_t source_id) { 92 ukm::SourceId source_id) {
100 std::vector<const ukm::UkmEntry*> entries; 93 std::vector<const ukm::mojom::UkmEntry*> entries;
101 for (size_t i = 0; i < ukm_entry_count(); ++i) { 94 for (size_t i = 0; i < ukm_entry_count(); ++i) {
102 const ukm::UkmEntry* entry = GetUkmEntry(i); 95 const ukm::mojom::UkmEntry* entry = GetUkmEntry(i);
103 if (entry->source_id() == source_id) 96 if (entry->source_id == source_id)
104 entries.push_back(entry); 97 entries.push_back(entry);
105 } 98 }
106 return entries; 99 return entries;
107 } 100 }
108 101
109 // Provides a single merged ukm::Entry proto that contains all metrics from 102 // Provides a single merged ukm::mojom::UkmEntry proto that contains all
110 // the given |entries|. |entries| must be non-empty, and all |entries| must 103 // metrics from the given |entries|. |entries| must be non-empty, and all
111 // have the same |source_id| and |event_hash|. 104 // |entries| must have the same |source_id| and |event_hash|.
112 ukm::Entry GetMergedEntryProto( 105 ukm::mojom::UkmEntryPtr GetMergedEntry(
113 const std::vector<const ukm::UkmEntry*>& entries) { 106 const std::vector<const ukm::mojom::UkmEntry*>& entries) {
114 EXPECT_FALSE(entries.empty()); 107 EXPECT_FALSE(entries.empty());
115 ukm::Entry merged_entry; 108 ukm::mojom::UkmEntryPtr merged_entry = ukm::mojom::UkmEntry::New();
116 for (auto* entry : entries) { 109 for (const auto* entry : entries) {
117 ukm::Entry entry_proto; 110 if (merged_entry->event_hash) {
118 entry->PopulateProto(&entry_proto); 111 EXPECT_EQ(merged_entry->source_id, entry->source_id);
119 EXPECT_TRUE(entry_proto.has_source_id()); 112 EXPECT_EQ(merged_entry->event_hash, entry->event_hash);
120 EXPECT_TRUE(entry_proto.has_event_hash()); 113 } else {
121 if (merged_entry.has_source_id()) { 114 merged_entry->event_hash = entry->event_hash;
122 EXPECT_EQ(merged_entry.source_id(), entry_proto.source_id()); 115 merged_entry->source_id = entry->source_id;
123 EXPECT_EQ(merged_entry.event_hash(), entry_proto.event_hash());
124 } 116 }
125 merged_entry.MergeFrom(entry_proto); 117 for (const auto& metric : entry->metrics) {
118 merged_entry->metrics.emplace_back(metric->Clone());
119 }
126 } 120 }
127 return merged_entry; 121 return merged_entry;
128 } 122 }
129 123
130 ukm::Entry GetMergedEntryProtoForSourceID(int32_t source_id) { 124 ukm::mojom::UkmEntryPtr GetMergedEntryForSourceID(ukm::SourceId source_id) {
131 ukm::Entry entry = GetMergedEntryProto(GetUkmEntriesForSourceID(source_id)); 125 ukm::mojom::UkmEntryPtr entry =
132 EXPECT_EQ(source_id, entry.source_id()); 126 GetMergedEntry(GetUkmEntriesForSourceID(source_id));
133 EXPECT_TRUE(entry.has_event_hash()); 127 EXPECT_EQ(source_id, entry->source_id);
128 EXPECT_NE(0UL, entry->event_hash);
134 return entry; 129 return entry;
135 } 130 }
136 131
137 static const ukm::Entry_Metric* FindMetric( 132 static bool HasMetric(const char* name,
138 const char* name, 133 const ukm::mojom::UkmEntry* entry) WARN_UNUSED_RESULT {
139 const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics) 134 return ukm::TestUkmRecorder::FindMetric(entry, name) != nullptr;
140 WARN_UNUSED_RESULT {
141 for (const auto& metric : metrics) {
142 if (metric.metric_hash() == base::HashMetricName(name))
143 return &metric;
144 }
145 return nullptr;
146 } 135 }
147 136
148 static bool HasMetric( 137 static void ExpectMetric(const char* name,
149 const char* name, 138 int64_t expected_value,
150 const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics) 139 const ukm::mojom::UkmEntry* entry) {
151 WARN_UNUSED_RESULT { 140 const ukm::mojom::UkmMetric* metric =
152 return FindMetric(name, metrics) != nullptr; 141 ukm::TestUkmRecorder::FindMetric(entry, name);
153 }
154
155 static void ExpectMetric(
156 const char* name,
157 int64_t expected_value,
158 const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics) {
159 const ukm::Entry_Metric* metric = FindMetric(name, metrics);
160 EXPECT_NE(nullptr, metric) << "Failed to find metric: " << name; 142 EXPECT_NE(nullptr, metric) << "Failed to find metric: " << name;
161 EXPECT_EQ(expected_value, metric->value()); 143 EXPECT_EQ(expected_value, metric->value);
162 } 144 }
163 145
164 private: 146 private:
165 MockNetworkQualityProvider mock_network_quality_provider_; 147 MockNetworkQualityProvider mock_network_quality_provider_;
166 ukm::UkmServiceTestingHarness ukm_service_test_harness_; 148 ukm::TestUkmRecorder test_ukm_recorder_;
167 }; 149 };
168 150
169 TEST_F(UkmPageLoadMetricsObserverTest, NoMetrics) { 151 TEST_F(UkmPageLoadMetricsObserverTest, NoMetrics) {
170 EXPECT_EQ(0ul, ukm_source_count()); 152 EXPECT_EQ(0ul, ukm_source_count());
171 EXPECT_EQ(0ul, ukm_entry_count()); 153 EXPECT_EQ(0ul, ukm_entry_count());
172 } 154 }
173 155
174 TEST_F(UkmPageLoadMetricsObserverTest, Basic) { 156 TEST_F(UkmPageLoadMetricsObserverTest, Basic) {
175 // PageLoadTiming with all recorded metrics other than FMP. This allows us to 157 // PageLoadTiming with all recorded metrics other than FMP. This allows us to
176 // verify both that all metrics are logged, and that we don't log metrics that 158 // verify both that all metrics are logged, and that we don't log metrics that
(...skipping 15 matching lines...) Expand all
192 SimulateTimingUpdate(timing); 174 SimulateTimingUpdate(timing);
193 175
194 // Simulate closing the tab. 176 // Simulate closing the tab.
195 DeleteContents(); 177 DeleteContents();
196 178
197 EXPECT_EQ(1ul, ukm_source_count()); 179 EXPECT_EQ(1ul, ukm_source_count());
198 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1); 180 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
199 EXPECT_EQ(GURL(kTestUrl1), source->url()); 181 EXPECT_EQ(GURL(kTestUrl1), source->url());
200 182
201 EXPECT_GE(ukm_entry_count(), 1ul); 183 EXPECT_GE(ukm_entry_count(), 1ul);
202 ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id()); 184 ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
203 EXPECT_EQ(entry_proto.source_id(), source->id()); 185 EXPECT_EQ(entry->source_id, source->id());
204 EXPECT_EQ(entry_proto.event_hash(), 186 EXPECT_EQ(entry->event_hash,
205 base::HashMetricName(internal::kUkmPageLoadEventName)); 187 base::HashMetricName(internal::kUkmPageLoadEventName));
206 EXPECT_FALSE(entry_proto.metrics().empty()); 188 EXPECT_FALSE(entry->metrics.empty());
207 ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK, 189 ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK,
208 entry_proto.metrics()); 190 entry.get());
209 ExpectMetric(internal::kUkmParseStartName, 100, entry_proto.metrics()); 191 ExpectMetric(internal::kUkmParseStartName, 100, entry.get());
210 ExpectMetric(internal::kUkmDomContentLoadedName, 200, entry_proto.metrics()); 192 ExpectMetric(internal::kUkmDomContentLoadedName, 200, entry.get());
211 ExpectMetric(internal::kUkmFirstContentfulPaintName, 300, 193 ExpectMetric(internal::kUkmFirstContentfulPaintName, 300, entry.get());
212 entry_proto.metrics()); 194 ExpectMetric(internal::kUkmLoadEventName, 500, entry.get());
213 ExpectMetric(internal::kUkmLoadEventName, 500, entry_proto.metrics()); 195 EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, entry.get()));
214 EXPECT_FALSE( 196 EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
215 HasMetric(internal::kUkmFirstMeaningfulPaintName, entry_proto.metrics()));
216 EXPECT_TRUE(
217 HasMetric(internal::kUkmForegroundDurationName, entry_proto.metrics()));
218 } 197 }
219 198
220 TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) { 199 TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) {
221 EXPECT_CALL(mock_network_quality_provider(), GetEffectiveConnectionType()) 200 EXPECT_CALL(mock_network_quality_provider(), GetEffectiveConnectionType())
222 .WillRepeatedly(Return(net::EFFECTIVE_CONNECTION_TYPE_2G)); 201 .WillRepeatedly(Return(net::EFFECTIVE_CONNECTION_TYPE_2G));
223 202
224 GURL url(kTestUrl1); 203 GURL url(kTestUrl1);
225 content::RenderFrameHostTester* rfh_tester = 204 content::RenderFrameHostTester* rfh_tester =
226 content::RenderFrameHostTester::For(main_rfh()); 205 content::RenderFrameHostTester::For(main_rfh());
227 rfh_tester->SimulateNavigationStart(url); 206 rfh_tester->SimulateNavigationStart(url);
228 rfh_tester->SimulateNavigationError(url, net::ERR_TIMED_OUT); 207 rfh_tester->SimulateNavigationError(url, net::ERR_TIMED_OUT);
229 rfh_tester->SimulateNavigationStop(); 208 rfh_tester->SimulateNavigationStop();
230 209
231 // Simulate closing the tab. 210 // Simulate closing the tab.
232 DeleteContents(); 211 DeleteContents();
233 212
234 EXPECT_EQ(1ul, ukm_source_count()); 213 EXPECT_EQ(1ul, ukm_source_count());
235 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1); 214 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
236 EXPECT_EQ(GURL(kTestUrl1), source->url()); 215 EXPECT_EQ(GURL(kTestUrl1), source->url());
237 216
238 EXPECT_GE(ukm_entry_count(), 1ul); 217 EXPECT_GE(ukm_entry_count(), 1ul);
239 ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id()); 218 ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
240 EXPECT_EQ(entry_proto.source_id(), source->id()); 219 EXPECT_EQ(entry->source_id, source->id());
241 EXPECT_EQ(entry_proto.event_hash(), 220 EXPECT_EQ(entry->event_hash,
242 base::HashMetricName(internal::kUkmPageLoadEventName)); 221 base::HashMetricName(internal::kUkmPageLoadEventName));
243 222
244 // Make sure that only the following metrics are logged. In particular, no 223 // Make sure that only the following metrics are logged. In particular, no
245 // paint/document/etc timing metrics should be logged for failed provisional 224 // paint/document/etc timing metrics should be logged for failed provisional
246 // loads. 225 // loads.
247 EXPECT_EQ(5, entry_proto.metrics().size()); 226 EXPECT_EQ(5ul, entry->metrics.size());
248 ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK, 227 ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK,
249 entry_proto.metrics()); 228 entry.get());
250 ExpectMetric(internal::kUkmEffectiveConnectionType, 229 ExpectMetric(internal::kUkmEffectiveConnectionType,
251 net::EFFECTIVE_CONNECTION_TYPE_2G, entry_proto.metrics()); 230 net::EFFECTIVE_CONNECTION_TYPE_2G, entry.get());
252 ExpectMetric(internal::kUkmNetErrorCode, 231 ExpectMetric(internal::kUkmNetErrorCode,
253 static_cast<int64_t>(net::ERR_TIMED_OUT) * -1, 232 static_cast<int64_t>(net::ERR_TIMED_OUT) * -1, entry.get());
254 entry_proto.metrics()); 233 EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
255 EXPECT_TRUE( 234 EXPECT_TRUE(HasMetric(internal::kUkmFailedProvisionaLoadName, entry.get()));
256 HasMetric(internal::kUkmForegroundDurationName, entry_proto.metrics()));
257 EXPECT_TRUE(
258 HasMetric(internal::kUkmFailedProvisionaLoadName, entry_proto.metrics()));
259 } 235 }
260 236
261 TEST_F(UkmPageLoadMetricsObserverTest, FirstMeaningfulPaint) { 237 TEST_F(UkmPageLoadMetricsObserverTest, FirstMeaningfulPaint) {
262 page_load_metrics::mojom::PageLoadTiming timing; 238 page_load_metrics::mojom::PageLoadTiming timing;
263 page_load_metrics::InitPageLoadTimingForTest(&timing); 239 page_load_metrics::InitPageLoadTimingForTest(&timing);
264 timing.navigation_start = base::Time::FromDoubleT(1); 240 timing.navigation_start = base::Time::FromDoubleT(1);
265 timing.paint_timing->first_meaningful_paint = 241 timing.paint_timing->first_meaningful_paint =
266 base::TimeDelta::FromMilliseconds(600); 242 base::TimeDelta::FromMilliseconds(600);
267 PopulateRequiredTimingFields(&timing); 243 PopulateRequiredTimingFields(&timing);
268 244
269 NavigateAndCommit(GURL(kTestUrl1)); 245 NavigateAndCommit(GURL(kTestUrl1));
270 SimulateTimingUpdate(timing); 246 SimulateTimingUpdate(timing);
271 247
272 // Simulate closing the tab. 248 // Simulate closing the tab.
273 DeleteContents(); 249 DeleteContents();
274 250
275 EXPECT_EQ(1ul, ukm_source_count()); 251 EXPECT_EQ(1ul, ukm_source_count());
276 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1); 252 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
277 EXPECT_EQ(GURL(kTestUrl1), source->url()); 253 EXPECT_EQ(GURL(kTestUrl1), source->url());
278 254
279 EXPECT_GE(ukm_entry_count(), 1ul); 255 EXPECT_GE(ukm_entry_count(), 1ul);
280 ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id()); 256 ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
281 EXPECT_EQ(entry_proto.source_id(), source->id()); 257 EXPECT_EQ(entry->source_id, source->id());
282 EXPECT_EQ(entry_proto.event_hash(), 258 EXPECT_EQ(entry->event_hash,
283 base::HashMetricName(internal::kUkmPageLoadEventName)); 259 base::HashMetricName(internal::kUkmPageLoadEventName));
284 EXPECT_FALSE(entry_proto.metrics().empty()); 260 EXPECT_FALSE(entry->metrics.empty());
285 ExpectMetric(internal::kUkmFirstMeaningfulPaintName, 600, 261 ExpectMetric(internal::kUkmFirstMeaningfulPaintName, 600, entry.get());
286 entry_proto.metrics()); 262 EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
287 EXPECT_TRUE(
288 HasMetric(internal::kUkmForegroundDurationName, entry_proto.metrics()));
289 } 263 }
290 264
291 TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) { 265 TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) {
292 page_load_metrics::mojom::PageLoadTiming timing1; 266 page_load_metrics::mojom::PageLoadTiming timing1;
293 page_load_metrics::InitPageLoadTimingForTest(&timing1); 267 page_load_metrics::InitPageLoadTimingForTest(&timing1);
294 timing1.navigation_start = base::Time::FromDoubleT(1); 268 timing1.navigation_start = base::Time::FromDoubleT(1);
295 timing1.paint_timing->first_contentful_paint = 269 timing1.paint_timing->first_contentful_paint =
296 base::TimeDelta::FromMilliseconds(200); 270 base::TimeDelta::FromMilliseconds(200);
297 PopulateRequiredTimingFields(&timing1); 271 PopulateRequiredTimingFields(&timing1);
298 272
(...skipping 13 matching lines...) Expand all
312 DeleteContents(); 286 DeleteContents();
313 287
314 EXPECT_EQ(2ul, ukm_source_count()); 288 EXPECT_EQ(2ul, ukm_source_count());
315 const ukm::UkmSource* source1 = GetUkmSourceForUrl(kTestUrl1); 289 const ukm::UkmSource* source1 = GetUkmSourceForUrl(kTestUrl1);
316 const ukm::UkmSource* source2 = GetUkmSourceForUrl(kTestUrl2); 290 const ukm::UkmSource* source2 = GetUkmSourceForUrl(kTestUrl2);
317 EXPECT_EQ(GURL(kTestUrl1), source1->url()); 291 EXPECT_EQ(GURL(kTestUrl1), source1->url());
318 EXPECT_EQ(GURL(kTestUrl2), source2->url()); 292 EXPECT_EQ(GURL(kTestUrl2), source2->url());
319 EXPECT_NE(source1->id(), source2->id()); 293 EXPECT_NE(source1->id(), source2->id());
320 294
321 EXPECT_GE(ukm_entry_count(), 2ul); 295 EXPECT_GE(ukm_entry_count(), 2ul);
322 ukm::Entry entry1_proto = GetMergedEntryProtoForSourceID(source1->id()); 296 ukm::mojom::UkmEntryPtr entry1 = GetMergedEntryForSourceID(source1->id());
323 ukm::Entry entry2_proto = GetMergedEntryProtoForSourceID(source2->id()); 297 ukm::mojom::UkmEntryPtr entry2 = GetMergedEntryForSourceID(source2->id());
324 EXPECT_NE(entry1_proto.source_id(), entry2_proto.source_id()); 298 EXPECT_NE(entry1->source_id, entry2->source_id);
325 299
326 EXPECT_EQ(entry1_proto.source_id(), source1->id()); 300 EXPECT_EQ(entry1->source_id, source1->id());
327 EXPECT_EQ(entry1_proto.event_hash(), 301 EXPECT_EQ(entry1->event_hash,
328 base::HashMetricName(internal::kUkmPageLoadEventName)); 302 base::HashMetricName(internal::kUkmPageLoadEventName));
329 EXPECT_FALSE(entry1_proto.metrics().empty()); 303 EXPECT_FALSE(entry1->metrics.empty());
330 ExpectMetric(internal::kUkmFirstContentfulPaintName, 200, 304 ExpectMetric(internal::kUkmFirstContentfulPaintName, 200, entry1.get());
331 entry1_proto.metrics()); 305 EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, entry2.get()));
332 EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, 306 EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry1.get()));
333 entry2_proto.metrics()));
334 EXPECT_TRUE(
335 HasMetric(internal::kUkmForegroundDurationName, entry1_proto.metrics()));
336 307
337 EXPECT_EQ(entry2_proto.source_id(), source2->id()); 308 EXPECT_EQ(entry2->source_id, source2->id());
338 EXPECT_EQ(entry2_proto.event_hash(), 309 EXPECT_EQ(entry2->event_hash,
339 base::HashMetricName(internal::kUkmPageLoadEventName)); 310 base::HashMetricName(internal::kUkmPageLoadEventName));
340 EXPECT_FALSE(entry2_proto.metrics().empty()); 311 EXPECT_FALSE(entry2->metrics.empty());
341 EXPECT_FALSE(HasMetric(internal::kUkmParseStartName, entry2_proto.metrics())); 312 EXPECT_FALSE(HasMetric(internal::kUkmParseStartName, entry2.get()));
342 EXPECT_FALSE(HasMetric(internal::kUkmFirstContentfulPaintName, 313 EXPECT_FALSE(HasMetric(internal::kUkmFirstContentfulPaintName, entry2.get()));
343 entry2_proto.metrics())); 314 EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, entry2.get()));
344 EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, 315 EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry2.get()));
345 entry2_proto.metrics()));
346 EXPECT_TRUE(
347 HasMetric(internal::kUkmForegroundDurationName, entry2_proto.metrics()));
348 } 316 }
349 317
350 TEST_F(UkmPageLoadMetricsObserverTest, NetworkQualityEstimates) { 318 TEST_F(UkmPageLoadMetricsObserverTest, NetworkQualityEstimates) {
351 EXPECT_CALL(mock_network_quality_provider(), GetEffectiveConnectionType()) 319 EXPECT_CALL(mock_network_quality_provider(), GetEffectiveConnectionType())
352 .WillRepeatedly(Return(net::EFFECTIVE_CONNECTION_TYPE_3G)); 320 .WillRepeatedly(Return(net::EFFECTIVE_CONNECTION_TYPE_3G));
353 EXPECT_CALL(mock_network_quality_provider(), GetHttpRTT()) 321 EXPECT_CALL(mock_network_quality_provider(), GetHttpRTT())
354 .WillRepeatedly(Return(base::TimeDelta::FromMilliseconds(100))); 322 .WillRepeatedly(Return(base::TimeDelta::FromMilliseconds(100)));
355 EXPECT_CALL(mock_network_quality_provider(), GetTransportRTT()) 323 EXPECT_CALL(mock_network_quality_provider(), GetTransportRTT())
356 .WillRepeatedly(Return(base::TimeDelta::FromMilliseconds(200))); 324 .WillRepeatedly(Return(base::TimeDelta::FromMilliseconds(200)));
357 325
358 NavigateAndCommit(GURL(kTestUrl1)); 326 NavigateAndCommit(GURL(kTestUrl1));
359 327
360 // Simulate closing the tab. 328 // Simulate closing the tab.
361 DeleteContents(); 329 DeleteContents();
362 330
363 EXPECT_EQ(1ul, ukm_source_count()); 331 EXPECT_EQ(1ul, ukm_source_count());
364 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1); 332 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
365 EXPECT_EQ(GURL(kTestUrl1), source->url()); 333 EXPECT_EQ(GURL(kTestUrl1), source->url());
366 334
367 EXPECT_GE(ukm_entry_count(), 1ul); 335 EXPECT_GE(ukm_entry_count(), 1ul);
368 ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id()); 336 ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
369 EXPECT_EQ(entry_proto.source_id(), source->id()); 337 EXPECT_EQ(entry->source_id, source->id());
370 EXPECT_EQ(entry_proto.event_hash(), 338 EXPECT_EQ(entry->event_hash,
371 base::HashMetricName(internal::kUkmPageLoadEventName)); 339 base::HashMetricName(internal::kUkmPageLoadEventName));
372 EXPECT_FALSE(entry_proto.metrics().empty()); 340 EXPECT_FALSE(entry->metrics.empty());
373 ExpectMetric(internal::kUkmEffectiveConnectionType, 341 ExpectMetric(internal::kUkmEffectiveConnectionType,
374 net::EFFECTIVE_CONNECTION_TYPE_3G, entry_proto.metrics()); 342 net::EFFECTIVE_CONNECTION_TYPE_3G, entry.get());
375 ExpectMetric(internal::kUkmHttpRttEstimate, 100, entry_proto.metrics()); 343 ExpectMetric(internal::kUkmHttpRttEstimate, 100, entry.get());
376 ExpectMetric(internal::kUkmTransportRttEstimate, 200, entry_proto.metrics()); 344 ExpectMetric(internal::kUkmTransportRttEstimate, 200, entry.get());
377 } 345 }
378 346
379 TEST_F(UkmPageLoadMetricsObserverTest, PageTransitionReload) { 347 TEST_F(UkmPageLoadMetricsObserverTest, PageTransitionReload) {
380 GURL url(kTestUrl1); 348 GURL url(kTestUrl1);
381 NavigateWithPageTransitionAndCommit(GURL(kTestUrl1), 349 NavigateWithPageTransitionAndCommit(GURL(kTestUrl1),
382 ui::PAGE_TRANSITION_RELOAD); 350 ui::PAGE_TRANSITION_RELOAD);
383 351
384 // Simulate closing the tab. 352 // Simulate closing the tab.
385 DeleteContents(); 353 DeleteContents();
386 354
387 EXPECT_EQ(1ul, ukm_source_count()); 355 EXPECT_EQ(1ul, ukm_source_count());
388 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1); 356 const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
389 EXPECT_EQ(GURL(kTestUrl1), source->url()); 357 EXPECT_EQ(GURL(kTestUrl1), source->url());
390 358
391 EXPECT_GE(ukm_entry_count(), 1ul); 359 EXPECT_GE(ukm_entry_count(), 1ul);
392 ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id()); 360 ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
393 EXPECT_EQ(entry_proto.source_id(), source->id()); 361 EXPECT_EQ(entry->source_id, source->id());
394 EXPECT_EQ(entry_proto.event_hash(), 362 EXPECT_EQ(entry->event_hash,
395 base::HashMetricName(internal::kUkmPageLoadEventName)); 363 base::HashMetricName(internal::kUkmPageLoadEventName));
396 EXPECT_FALSE(entry_proto.metrics().empty()); 364 EXPECT_FALSE(entry->metrics.empty());
397 ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_RELOAD, 365 ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_RELOAD,
398 entry_proto.metrics()); 366 entry.get());
399 } 367 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698