blob: 495677fbcf2fee59d59e9b3453eb5774c8b16dd4 [file] [log] [blame]
Iman Saboori6a245ec2023-02-22 20:03:201// Copyright 2023 The Chromium Authors
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 "content/browser/preloading/preloading_data_impl.h"
6
Kevin McNee8efb8f72024-05-27 19:58:247#include <algorithm>
8
Iman Saboori6a245ec2023-02-22 20:03:209#include "base/strings/strcat.h"
Lei Zhang0a85e65a2025-05-23 19:22:0610#include "base/strings/string_number_conversions.h"
Iman Saboori6a245ec2023-02-22 20:03:2011#include "base/test/metrics/histogram_tester.h"
Kevin McNee8efb8f72024-05-27 19:58:2412#include "components/ukm/test_ukm_recorder.h"
Iman Saboori6a245ec2023-02-22 20:03:2013#include "content/browser/preloading/preloading.h"
Kevin McNee842eb0a2024-04-11 20:14:1614#include "content/browser/preloading/preloading_confidence.h"
Iman Saboori6a245ec2023-02-22 20:03:2015#include "content/public/browser/navigation_handle.h"
16#include "content/public/test/mock_navigation_handle.h"
Kevin McNee806cf67a2023-04-03 21:29:4817#include "content/public/test/navigation_simulator.h"
Iman Saboori6a245ec2023-02-22 20:03:2018#include "content/public/test/test_browser_context.h"
19#include "content/public/test/test_renderer_host.h"
20#include "content/test/test_web_contents.h"
Kevin McNee8efb8f72024-05-27 19:58:2421#include "services/metrics/public/cpp/metrics_utils.h"
22#include "services/metrics/public/cpp/ukm_builders.h"
Iman Saboori6a245ec2023-02-22 20:03:2023
24namespace content {
25
26class PreloadingDataImplTest : public RenderViewHostTestHarness {
27 public:
28 PreloadingDataImplTest() = default;
29
30 PreloadingDataImplTest(const PreloadingDataImplTest&) = delete;
31 PreloadingDataImplTest& operator=(const PreloadingDataImplTest&) = delete;
32
33 void SetUp() override {
34 RenderViewHostTestHarness::SetUp();
35
36 browser_context_ = std::make_unique<TestBrowserContext>();
37 web_contents_ = TestWebContents::Create(
38 browser_context_.get(),
39 SiteInstanceImpl::Create(browser_context_.get()));
40 }
41
42 void TearDown() override {
43 web_contents_.reset();
44 browser_context_.reset();
45 RenderViewHostTestHarness::TearDown();
46 }
47
48 WebContents* GetWebContents() { return web_contents_.get(); }
49
Kevin McNee806cf67a2023-04-03 21:29:4850 std::string UmaPredictorPrecision(const PreloadingPredictor& predictor) {
51 return base::StrCat(
52 {"Preloading.Predictor.", predictor.name(), ".Precision"});
53 }
54
55 std::string UmaPredictorRecall(const PreloadingPredictor& predictor) {
56 return base::StrCat({"Preloading.Predictor.", predictor.name(), ".Recall"});
57 }
58
59 std::string UmaAttemptPrecision(const PreloadingPredictor& predictor,
60 PreloadingType preloading_type) {
61 return base::StrCat({"Preloading.", PreloadingTypeToString(preloading_type),
62 ".Attempt.", predictor.name(), ".Precision"});
63 }
64
65 std::string UmaAttemptRecall(const PreloadingPredictor& predictor,
66 PreloadingType preloading_type) {
67 return base::StrCat({"Preloading.", PreloadingTypeToString(preloading_type),
68 ".Attempt.", predictor.name(), ".Recall"});
69 }
70
Iman Saboori6a245ec2023-02-22 20:03:2071 private:
72 std::unique_ptr<TestBrowserContext> browser_context_;
73 std::unique_ptr<TestWebContents> web_contents_;
74};
75
Iman Saboori41d9b352023-03-09 20:52:1176TEST_F(PreloadingDataImplTest, PredictorPrecisionAndRecall) {
Iman Saboori6a245ec2023-02-22 20:03:2077 base::HistogramTester histogram_tester;
78 auto* preloading_data =
79 PreloadingDataImpl::GetOrCreateForWebContents(GetWebContents());
80
Iman Saboori41d9b352023-03-09 20:52:1181 preloading_data->SetIsNavigationInDomainCallback(
82 preloading_predictor::kUrlPointerDownOnAnchor,
83 base::BindRepeating(
84 [](NavigationHandle* /*navigation_handle*/) { return true; }));
85 preloading_data->SetIsNavigationInDomainCallback(
86 preloading_predictor::kUrlPointerHoverOnAnchor,
87 base::BindRepeating(
88 [](NavigationHandle* /*navigation_handle*/) { return true; }));
89 preloading_data->SetIsNavigationInDomainCallback(
90 preloading_predictor::kLinkRel,
91 base::BindRepeating(
92 [](NavigationHandle* /*navigation_handle*/) { return true; }));
93
Iman Saboori6a245ec2023-02-22 20:03:2094 // Add preloading predictions.
Kevin McNee806cf67a2023-04-03 21:29:4895 GURL url_1{"https://www.example.com/page1.html"};
96 GURL url_2{"https://www.example.com/page2.html"};
97 GURL url_3{"https://www.example.com/page3.html"};
Iman Saboori6a245ec2023-02-22 20:03:2098 const auto target = url_1;
99 PreloadingPredictor predictor_1{
100 preloading_predictor::kUrlPointerDownOnAnchor};
101 PreloadingPredictor predictor_2{
102 preloading_predictor::kUrlPointerHoverOnAnchor};
Iman Saboori41d9b352023-03-09 20:52:11103 PreloadingPredictor predictor_3{preloading_predictor::kLinkRel};
HuanPo Lin12ce3b5fb42024-03-04 09:01:14104 ukm::SourceId triggered_primary_page_source_id =
105 GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId();
Iman Saboori6a245ec2023-02-22 20:03:20106 preloading_data->AddPreloadingPrediction(
Kevin McNee842eb0a2024-04-11 20:14:16107 predictor_1, PreloadingConfidence{100},
108 PreloadingData::GetSameURLMatcher(url_1),
HuanPo Lin12ce3b5fb42024-03-04 09:01:14109 triggered_primary_page_source_id);
Iman Saboori6a245ec2023-02-22 20:03:20110 preloading_data->AddPreloadingPrediction(
Kevin McNee842eb0a2024-04-11 20:14:16111 predictor_1, PreloadingConfidence{100},
112 PreloadingData::GetSameURLMatcher(url_1),
HuanPo Lin12ce3b5fb42024-03-04 09:01:14113 triggered_primary_page_source_id);
Iman Saboori6a245ec2023-02-22 20:03:20114 preloading_data->AddPreloadingPrediction(
Kevin McNee842eb0a2024-04-11 20:14:16115 predictor_1, PreloadingConfidence{100},
116 PreloadingData::GetSameURLMatcher(url_2),
HuanPo Lin12ce3b5fb42024-03-04 09:01:14117 triggered_primary_page_source_id);
Iman Saboori6a245ec2023-02-22 20:03:20118
119 preloading_data->AddPreloadingPrediction(
Kevin McNee842eb0a2024-04-11 20:14:16120 predictor_2, PreloadingConfidence{100},
121 PreloadingData::GetSameURLMatcher(url_2),
HuanPo Lin12ce3b5fb42024-03-04 09:01:14122 triggered_primary_page_source_id);
Iman Saboori6a245ec2023-02-22 20:03:20123 preloading_data->AddPreloadingPrediction(
Kevin McNee842eb0a2024-04-11 20:14:16124 predictor_2, PreloadingConfidence{100},
125 PreloadingData::GetSameURLMatcher(url_3),
HuanPo Lin12ce3b5fb42024-03-04 09:01:14126 triggered_primary_page_source_id);
Iman Saboori6a245ec2023-02-22 20:03:20127
Kevin McNee806cf67a2023-04-03 21:29:48128 NavigationSimulator::NavigateAndCommitFromBrowser(GetWebContents(), target);
Iman Saboori6a245ec2023-02-22 20:03:20129
130 // Check precision UKM records.
Iman Saboori6a245ec2023-02-22 20:03:20131 // Since, we added the predictor twice, it should count the true positives
132 // twice as well.
Kevin McNee806cf67a2023-04-03 21:29:48133 histogram_tester.ExpectBucketCount(UmaPredictorPrecision(predictor_1),
Iman Saboori6a245ec2023-02-22 20:03:20134 PredictorConfusionMatrix::kTruePositive,
135 2);
Kevin McNee806cf67a2023-04-03 21:29:48136 histogram_tester.ExpectBucketCount(UmaPredictorPrecision(predictor_1),
Iman Saboori6a245ec2023-02-22 20:03:20137 PredictorConfusionMatrix::kFalsePositive,
138 1);
139
Kevin McNee806cf67a2023-04-03 21:29:48140 histogram_tester.ExpectBucketCount(UmaPredictorPrecision(predictor_2),
Iman Saboori6a245ec2023-02-22 20:03:20141 PredictorConfusionMatrix::kTruePositive,
142 0);
Kevin McNee806cf67a2023-04-03 21:29:48143 histogram_tester.ExpectBucketCount(UmaPredictorPrecision(predictor_2),
Iman Saboori6a245ec2023-02-22 20:03:20144 PredictorConfusionMatrix::kFalsePositive,
145 2);
Iman Saboori41d9b352023-03-09 20:52:11146
Kevin McNee806cf67a2023-04-03 21:29:48147 histogram_tester.ExpectTotalCount(UmaPredictorPrecision(predictor_3), 0);
148
Iman Saboori41d9b352023-03-09 20:52:11149 // Check recall UKM records.
Iman Saboori41d9b352023-03-09 20:52:11150 // It should only record 1 TP and not 2, and also no FN.
Kevin McNee806cf67a2023-04-03 21:29:48151 histogram_tester.ExpectBucketCount(UmaPredictorRecall(predictor_1),
Iman Saboori41d9b352023-03-09 20:52:11152 PredictorConfusionMatrix::kTruePositive,
153 1);
Kevin McNee806cf67a2023-04-03 21:29:48154 histogram_tester.ExpectBucketCount(UmaPredictorRecall(predictor_1),
Iman Saboori41d9b352023-03-09 20:52:11155 PredictorConfusionMatrix::kFalseNegative,
156 0);
157 // It should only record 1 FN.
Kevin McNee806cf67a2023-04-03 21:29:48158 histogram_tester.ExpectBucketCount(UmaPredictorRecall(predictor_2),
Iman Saboori41d9b352023-03-09 20:52:11159 PredictorConfusionMatrix::kTruePositive,
160 0);
Kevin McNee806cf67a2023-04-03 21:29:48161 histogram_tester.ExpectBucketCount(UmaPredictorRecall(predictor_2),
Iman Saboori41d9b352023-03-09 20:52:11162 PredictorConfusionMatrix::kFalseNegative,
163 1);
164 // For the missing predictor we should record 1 FN.
Kevin McNee806cf67a2023-04-03 21:29:48165 histogram_tester.ExpectBucketCount(UmaPredictorRecall(predictor_3),
Iman Saboori41d9b352023-03-09 20:52:11166 PredictorConfusionMatrix::kTruePositive,
167 0);
Kevin McNee806cf67a2023-04-03 21:29:48168 histogram_tester.ExpectBucketCount(UmaPredictorRecall(predictor_3),
Iman Saboori41d9b352023-03-09 20:52:11169 PredictorConfusionMatrix::kFalseNegative,
170 1);
Iman Saboori6a245ec2023-02-22 20:03:20171}
Iman Saboori41d9b352023-03-09 20:52:11172
Kevin McNee806cf67a2023-04-03 21:29:48173TEST_F(PreloadingDataImplTest, PageLoadWithoutAttemptIsFalseNegative) {
174 base::HistogramTester histogram_tester;
175 auto* preloading_data =
176 PreloadingDataImpl::GetOrCreateForWebContents(GetWebContents());
177
178 const PreloadingPredictor predictor{
179 preloading_predictor::kUrlPointerDownOnAnchor};
180 preloading_data->SetIsNavigationInDomainCallback(
181 predictor,
182 base::BindRepeating(
183 [](NavigationHandle* /*navigation_handle*/) { return true; }));
184
185 const GURL target{"https://www.example.com/page1.html"};
186
187 NavigationSimulator::NavigateAndCommitFromBrowser(GetWebContents(), target);
188
189 // The lack of an attempt represents a false negative.
190 histogram_tester.ExpectUniqueSample(
191 UmaAttemptRecall(predictor, PreloadingType::kPrefetch),
192 PredictorConfusionMatrix::kFalseNegative, 1);
193 histogram_tester.ExpectUniqueSample(
194 UmaAttemptRecall(predictor, PreloadingType::kPrerender),
195 PredictorConfusionMatrix::kFalseNegative, 1);
196}
197
Iman Saboori41d9b352023-03-09 20:52:11198TEST_F(PreloadingDataImplTest, PreloadingAttemptPrecisionAndRecall) {
Iman Saboori6a245ec2023-02-22 20:03:20199 base::HistogramTester histogram_tester;
200 auto* preloading_data =
201 PreloadingDataImpl::GetOrCreateForWebContents(GetWebContents());
202
Iman Saboori41d9b352023-03-09 20:52:11203 preloading_data->SetIsNavigationInDomainCallback(
204 preloading_predictor::kUrlPointerDownOnAnchor,
205 base::BindRepeating(
206 [](NavigationHandle* /*navigation_handle*/) { return true; }));
207 preloading_data->SetIsNavigationInDomainCallback(
208 preloading_predictor::kUrlPointerHoverOnAnchor,
209 base::BindRepeating(
210 [](NavigationHandle* /*navigation_handle*/) { return true; }));
211 preloading_data->SetIsNavigationInDomainCallback(
212 preloading_predictor::kLinkRel,
213 base::BindRepeating(
214 [](NavigationHandle* /*navigation_handle*/) { return false; }));
215
Iman Saboori6a245ec2023-02-22 20:03:20216 // Add preloading predictions.
Kevin McNee806cf67a2023-04-03 21:29:48217 GURL url_1{"https://www.example.com/page1.html"};
218 GURL url_2{"https://www.example.com/page2.html"};
219 GURL url_3{"https://www.example.com/page3.html"};
Iman Saboori6a245ec2023-02-22 20:03:20220 const auto target = url_1;
221 PreloadingPredictor predictor_1{
222 preloading_predictor::kUrlPointerDownOnAnchor};
223 PreloadingPredictor predictor_2{
224 preloading_predictor::kUrlPointerHoverOnAnchor};
Iman Saboori41d9b352023-03-09 20:52:11225 PreloadingPredictor predictor_3{preloading_predictor::kLinkRel};
226
Iman Saboori6a245ec2023-02-22 20:03:20227 std::vector<std::tuple<PreloadingPredictor, PreloadingType, GURL>> attempts{
228 {predictor_1, PreloadingType::kPrerender, url_1},
229 {predictor_2, PreloadingType::kPrefetch, url_2},
230 {predictor_2, PreloadingType::kPrerender, url_1},
231 {predictor_2, PreloadingType::kPrerender, url_2},
232 {predictor_2, PreloadingType::kPrerender, url_3},
233 };
234
235 for (const auto& [predictor, preloading_type, url] : attempts) {
236 preloading_data->AddPreloadingAttempt(
Hiroki Nakagawaf93776b2023-09-12 22:04:27237 predictor, preloading_type, PreloadingData::GetSameURLMatcher(url),
238 GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId());
Iman Saboori6a245ec2023-02-22 20:03:20239 }
240
Kevin McNee806cf67a2023-04-03 21:29:48241 NavigationSimulator::NavigateAndCommitFromBrowser(GetWebContents(), target);
Iman Saboori6a245ec2023-02-22 20:03:20242
243 // Check precision UKM records.
Iman Saboori6a245ec2023-02-22 20:03:20244 // There should be no UMA records for predictor_1, prefetch attempt.
245 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48246 UmaAttemptPrecision(predictor_1, PreloadingType::kPrefetch),
Iman Saboori6a245ec2023-02-22 20:03:20247 PredictorConfusionMatrix::kTruePositive, 0);
248 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48249 UmaAttemptPrecision(predictor_1, PreloadingType::kPrefetch),
Iman Saboori6a245ec2023-02-22 20:03:20250 PredictorConfusionMatrix::kFalsePositive, 0);
251 // There should 1 TP and 0 FP for predictor_1, prerender attempt.
252 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48253 UmaAttemptPrecision(predictor_1, PreloadingType::kPrerender),
Iman Saboori6a245ec2023-02-22 20:03:20254 PredictorConfusionMatrix::kTruePositive, 1);
255 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48256 UmaAttemptPrecision(predictor_1, PreloadingType::kPrerender),
Iman Saboori6a245ec2023-02-22 20:03:20257 PredictorConfusionMatrix::kFalsePositive, 0);
258 // There should 0 TP and 1 FP for predictor_2, prefetch attempt.
259 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48260 UmaAttemptPrecision(predictor_2, PreloadingType::kPrefetch),
Iman Saboori6a245ec2023-02-22 20:03:20261 PredictorConfusionMatrix::kTruePositive, 0);
262 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48263 UmaAttemptPrecision(predictor_2, PreloadingType::kPrefetch),
Iman Saboori6a245ec2023-02-22 20:03:20264 PredictorConfusionMatrix::kFalsePositive, 1);
265 // There should 1 TP and 2 FP for predictor_2, prerender attempt.
266 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48267 UmaAttemptPrecision(predictor_2, PreloadingType::kPrerender),
Iman Saboori6a245ec2023-02-22 20:03:20268 PredictorConfusionMatrix::kTruePositive, 1);
269 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48270 UmaAttemptPrecision(predictor_2, PreloadingType::kPrerender),
Iman Saboori6a245ec2023-02-22 20:03:20271 PredictorConfusionMatrix::kFalsePositive, 2);
Iman Saboori41d9b352023-03-09 20:52:11272
273 // Check recall UKM records.
Iman Saboori41d9b352023-03-09 20:52:11274 // predictor_1, prerender should be TP
275 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48276 UmaAttemptRecall(predictor_1, PreloadingType::kPrerender),
Iman Saboori41d9b352023-03-09 20:52:11277 PredictorConfusionMatrix::kTruePositive, 1);
278 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48279 UmaAttemptRecall(predictor_1, PreloadingType::kPrerender),
Iman Saboori41d9b352023-03-09 20:52:11280 PredictorConfusionMatrix::kFalseNegative, 0);
281 // predictor_1, prefetch should be FN
282 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48283 UmaAttemptRecall(predictor_1, PreloadingType::kPrefetch),
Iman Saboori41d9b352023-03-09 20:52:11284 PredictorConfusionMatrix::kTruePositive, 0);
285 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48286 UmaAttemptRecall(predictor_1, PreloadingType::kPrefetch),
Iman Saboori41d9b352023-03-09 20:52:11287 PredictorConfusionMatrix::kFalseNegative, 1);
288 // predictor_2, prerender should be TP
289 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48290 UmaAttemptRecall(predictor_2, PreloadingType::kPrerender),
Iman Saboori41d9b352023-03-09 20:52:11291 PredictorConfusionMatrix::kTruePositive, 1);
292 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48293 UmaAttemptRecall(predictor_2, PreloadingType::kPrerender),
Iman Saboori41d9b352023-03-09 20:52:11294 PredictorConfusionMatrix::kFalseNegative, 0);
295 // predictor_2, prefetch should be FN
296 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48297 UmaAttemptRecall(predictor_2, PreloadingType::kPrefetch),
Iman Saboori41d9b352023-03-09 20:52:11298 PredictorConfusionMatrix::kTruePositive, 0);
299 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48300 UmaAttemptRecall(predictor_2, PreloadingType::kPrefetch),
Iman Saboori41d9b352023-03-09 20:52:11301 PredictorConfusionMatrix::kFalseNegative, 1);
302 // 'page_in_domain_check' returns false for predictor_3: TP=0, FN=0.
303 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48304 UmaAttemptRecall(predictor_3, PreloadingType::kPrerender),
Iman Saboori41d9b352023-03-09 20:52:11305 PredictorConfusionMatrix::kTruePositive, 0);
306 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48307 UmaAttemptRecall(predictor_3, PreloadingType::kPrerender),
Iman Saboori41d9b352023-03-09 20:52:11308 PredictorConfusionMatrix::kFalseNegative, 0);
309 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48310 UmaAttemptRecall(predictor_3, PreloadingType::kPrefetch),
Iman Saboori41d9b352023-03-09 20:52:11311 PredictorConfusionMatrix::kTruePositive, 0);
312 histogram_tester.ExpectBucketCount(
Kevin McNee806cf67a2023-04-03 21:29:48313 UmaAttemptRecall(predictor_3, PreloadingType::kPrefetch),
Iman Saboori41d9b352023-03-09 20:52:11314 PredictorConfusionMatrix::kFalseNegative, 0);
Iman Saboori6a245ec2023-02-22 20:03:20315}
316
Kevin McNee8efb8f72024-05-27 19:58:24317namespace {
318void RunSamplingTest(WebContents* web_contents,
319 int num_predictions,
320 int expected_sampling_amount_bucket) {
321 using Preloading_Prediction = ukm::builders::Preloading_Prediction;
322
323 ukm::TestAutoSetUkmRecorder test_ukm_recorder;
324 ukm::SourceId triggered_primary_page_source_id =
325 web_contents->GetPrimaryMainFrame()->GetPageUkmSourceId();
326
327 auto* preloading_data =
328 PreloadingDataImpl::GetOrCreateForWebContents(web_contents);
329 preloading_data->SetIsNavigationInDomainCallback(
330 preloading_predictor::kUrlPointerHoverOnAnchor,
331 base::BindRepeating(
332 [](NavigationHandle* /*navigation_handle*/) { return true; }));
333
334 // Add a number of predictions. If they're beyond the limit, we should only
335 // keep a random sample to stay within the limit.
336 preloading_data->SetMaxPredictionsToTenForTesting();
337 const size_t expected_predictions_size = std::min(10, num_predictions);
338 for (int i = 0; i < num_predictions; ++i) {
339 preloading_data->AddPreloadingPrediction(
340 preloading_predictor::kUrlPointerHoverOnAnchor,
341 PreloadingConfidence{100},
342 PreloadingData::GetSameURLMatcher(
343 GURL(base::StrCat({"https://www.example.com/page",
344 base::NumberToString(i), ".html"}))),
345 triggered_primary_page_source_id);
346 }
347 EXPECT_EQ(expected_predictions_size,
348 preloading_data->GetPredictionsSizeForTesting());
349
350 NavigationSimulator::NavigateAndCommitFromBrowser(
351 web_contents, GURL("https://www.example.com/somewhere_else.html"));
352
353 std::vector<ukm::TestUkmRecorder::HumanReadableUkmEntry> actual_ukm_entries =
354 test_ukm_recorder.GetEntries(
355 Preloading_Prediction::kEntryName,
356 {Preloading_Prediction::kSamplingAmountName});
357 EXPECT_EQ(expected_predictions_size, actual_ukm_entries.size());
358 for (const auto& entry : actual_ukm_entries) {
359 EXPECT_EQ(expected_sampling_amount_bucket,
360 entry.metrics.at(Preloading_Prediction::kSamplingAmountName));
361 }
362}
363} // namespace
364
365TEST_F(PreloadingDataImplTest, MaxPredictions) {
366 constexpr double kBucketSpacing = 1.3;
367 RunSamplingTest(GetWebContents(), /*num_predictions=*/20,
368 /*expected_sampling_amount_bucket=*/
369 ukm::GetExponentialBucketMin(500'000, kBucketSpacing));
370}
371
372TEST_F(PreloadingDataImplTest, NoSamplingUnderMaxPredictions) {
373 RunSamplingTest(GetWebContents(), /*num_predictions=*/5,
374 /*expected_sampling_amount_bucket=*/0);
375}
376
Iman Saboori6a245ec2023-02-22 20:03:20377} // namespace content