[go: nahoru, domu]

blob: 23ec4c5b06d5b8d4f53367a9c5dad95ee4c312aa [file] [log] [blame]
Avi Drissman4e1b7bc2022-09-15 14:03:501// Copyright 2021 The Chromium Authors
Alex Turner7b0c6b62021-10-05 18:34:392// 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/aggregation_service/aggregatable_report_assembler.h"
6
7#include <stddef.h>
8
9#include <memory>
Dan McArdle08ad6112023-11-21 20:39:4710#include <optional>
Alex Turner7b0c6b62021-10-05 18:34:3911#include <utility>
12#include <vector>
13
Keishi Hattori0e45c022021-11-27 09:25:5214#include "base/memory/raw_ptr.h"
Nan Lin32c794f2022-01-25 22:57:0315#include "base/test/gmock_callback_support.h"
16#include "base/test/gmock_move_support.h"
Nan Lind637a9c92022-02-24 02:48:0217#include "base/test/metrics/histogram_tester.h"
Nan Lin32c794f2022-01-25 22:57:0318#include "base/test/mock_callback.h"
Alex Turner7b0c6b62021-10-05 18:34:3919#include "content/browser/aggregation_service/aggregatable_report.h"
20#include "content/browser/aggregation_service/aggregation_service_key_fetcher.h"
21#include "content/browser/aggregation_service/aggregation_service_test_utils.h"
22#include "content/browser/aggregation_service/public_key.h"
Nan Lin32c794f2022-01-25 22:57:0323#include "testing/gmock/include/gmock/gmock.h"
Alex Turner7b0c6b62021-10-05 18:34:3924#include "testing/gtest/include/gtest/gtest.h"
Yao Xiao4890a292023-02-28 23:52:4725#include "third_party/blink/public/mojom/private_aggregation/aggregatable_report.mojom.h"
Alex Turner7b0c6b62021-10-05 18:34:3926#include "url/gurl.h"
Alex Turner7b0c6b62021-10-05 18:34:3927
28namespace content {
29
Nan Lin32c794f2022-01-25 22:57:0330namespace {
31
32using ::testing::_;
33using ::testing::Eq;
34using ::testing::Invoke;
35using ::testing::Return;
36
37// Will be used to verify the sequence of expected function calls.
38using Checkpoint = ::testing::MockFunction<void(int)>;
39
40using FetchCallback = AggregationServiceKeyFetcher::FetchCallback;
41using AssemblyCallback = AggregatableReportAssembler::AssemblyCallback;
42using PublicKeyFetchStatus = AggregationServiceKeyFetcher::PublicKeyFetchStatus;
43using AssemblyStatus = AggregatableReportAssembler::AssemblyStatus;
44
Nan Lind637a9c92022-02-24 02:48:0245constexpr char kReportAssemblerStatusHistogramName[] =
46 "PrivacySandbox.AggregationService.ReportAssembler.Status";
47
Dan McArdle08ad6112023-11-21 20:39:4748auto CloneRequestAndReturnReport(std::optional<AggregatableReportRequest>* out,
Nan Lin55ad2a5a2022-08-15 21:32:5749 AggregatableReport report) {
Nan Lin32c794f2022-01-25 22:57:0350 return [out, report = std::move(report)](
Nan Lin55ad2a5a2022-08-15 21:32:5751 const AggregatableReportRequest& report_request,
Nan Lin32c794f2022-01-25 22:57:0352 std::vector<PublicKey> public_keys) {
Nan Lin55ad2a5a2022-08-15 21:32:5753 *out = aggregation_service::CloneReportRequest(report_request);
Nan Lin32c794f2022-01-25 22:57:0354 return std::move(report);
55 };
56}
57
58class MockAggregationServiceKeyFetcher : public AggregationServiceKeyFetcher {
59 public:
60 MockAggregationServiceKeyFetcher()
61 : AggregationServiceKeyFetcher(/*storage_context=*/nullptr,
62 /*network_fetcher=*/nullptr) {}
63
64 MOCK_METHOD(void,
65 GetPublicKey,
Nan Lin4c75cd82022-02-18 23:39:3466 (const GURL& url, FetchCallback callback),
Nan Lin32c794f2022-01-25 22:57:0367 (override));
68};
69
70class MockAggregatableReportProvider : public AggregatableReport::Provider {
71 public:
Dan McArdle08ad6112023-11-21 20:39:4772 MOCK_METHOD(std::optional<AggregatableReport>,
Nan Lin32c794f2022-01-25 22:57:0373 CreateFromRequestAndPublicKeys,
Nan Lin55ad2a5a2022-08-15 21:32:5774 (const AggregatableReportRequest&, std::vector<PublicKey>),
Nan Lin32c794f2022-01-25 22:57:0375 (const, override));
76};
77
78} // namespace
79
Alex Turner7b0c6b62021-10-05 18:34:3980class AggregatableReportAssemblerTest : public testing::Test {
81 public:
82 AggregatableReportAssemblerTest() = default;
83
84 void SetUp() override {
Nan Lin32c794f2022-01-25 22:57:0385 auto fetcher = std::make_unique<MockAggregationServiceKeyFetcher>();
86 auto report_provider = std::make_unique<MockAggregatableReportProvider>();
Alex Turner7b0c6b62021-10-05 18:34:3987
88 fetcher_ = fetcher.get();
89 report_provider_ = report_provider.get();
90 assembler_ = AggregatableReportAssembler::CreateForTesting(
91 std::move(fetcher), std::move(report_provider));
Alex Turner7b0c6b62021-10-05 18:34:3992 }
93
Tom Sepez239d7ff2023-03-10 22:18:0594 void ResetAssembler() {
95 fetcher_ = nullptr;
96 report_provider_ = nullptr;
97 assembler_.reset();
98 }
Alex Turner7b0c6b62021-10-05 18:34:3999
100 AggregatableReportAssembler* assembler() { return assembler_.get(); }
Nan Lin32c794f2022-01-25 22:57:03101 MockAggregationServiceKeyFetcher* fetcher() { return fetcher_; }
102 MockAggregatableReportProvider* report_provider() { return report_provider_; }
103 base::MockCallback<AssemblyCallback>& callback() { return callback_; }
Alex Turner7b0c6b62021-10-05 18:34:39104
105 private:
106 std::unique_ptr<AggregatableReportAssembler> assembler_;
107
108 // These objects are owned by `assembler_`.
Nan Lin32c794f2022-01-25 22:57:03109 raw_ptr<MockAggregationServiceKeyFetcher> fetcher_;
110 raw_ptr<MockAggregatableReportProvider> report_provider_;
Alex Turner7b0c6b62021-10-05 18:34:39111
Nan Lin32c794f2022-01-25 22:57:03112 base::MockCallback<AssemblyCallback> callback_;
Alex Turner7b0c6b62021-10-05 18:34:39113};
114
115TEST_F(AggregatableReportAssemblerTest, BothKeyFetchesFail_ErrorReturned) {
Nan Lind637a9c92022-02-24 02:48:02116 base::HistogramTester histograms;
117
Alex Turnerbed5a1942022-03-14 22:38:06118 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47119 blink::mojom::AggregationServiceMode::kExperimentalPoplar);
Nan Lin4c75cd82022-02-18 23:39:34120 std::vector<GURL> processing_urls = request.processing_urls();
Alex Turner7b0c6b62021-10-05 18:34:39121
Nan Lin4c75cd82022-02-18 23:39:34122 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[0], _))
Nan Lin32c794f2022-01-25 22:57:03123 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle08ad6112023-11-21 20:39:47124 std::nullopt, PublicKeyFetchStatus::kPublicKeyFetchFailed));
Nan Lin4c75cd82022-02-18 23:39:34125 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[1], _))
Nan Lin32c794f2022-01-25 22:57:03126 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle08ad6112023-11-21 20:39:47127 std::nullopt, PublicKeyFetchStatus::kPublicKeyFetchFailed));
Nan Lin32c794f2022-01-25 22:57:03128 EXPECT_CALL(callback(),
Dan McArdle08ad6112023-11-21 20:39:47129 Run(_, Eq(std::nullopt), AssemblyStatus::kPublicKeyFetchFailed));
Alex Turner7b0c6b62021-10-05 18:34:39130
Nan Lin32c794f2022-01-25 22:57:03131 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys(_, _))
132 .Times(0);
Alex Turner7b0c6b62021-10-05 18:34:39133
Nan Lin32c794f2022-01-25 22:57:03134 assembler()->AssembleReport(std::move(request), callback().Get());
Nan Lind637a9c92022-02-24 02:48:02135
136 histograms.ExpectUniqueSample(
137 kReportAssemblerStatusHistogramName,
138 AggregatableReportAssembler::AssemblyStatus::kPublicKeyFetchFailed, 1);
Alex Turner7b0c6b62021-10-05 18:34:39139}
140
141TEST_F(AggregatableReportAssemblerTest, FirstKeyFetchFails_ErrorReturned) {
Nan Lind637a9c92022-02-24 02:48:02142 base::HistogramTester histograms;
143
Alex Turnerbed5a1942022-03-14 22:38:06144 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47145 blink::mojom::AggregationServiceMode::kExperimentalPoplar);
Nan Lin4c75cd82022-02-18 23:39:34146 std::vector<GURL> processing_urls = request.processing_urls();
Alex Turner7b0c6b62021-10-05 18:34:39147
Nan Lin4c75cd82022-02-18 23:39:34148 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[0], _))
Nan Lin32c794f2022-01-25 22:57:03149 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle08ad6112023-11-21 20:39:47150 std::nullopt, PublicKeyFetchStatus::kPublicKeyFetchFailed));
Nan Lin4c75cd82022-02-18 23:39:34151 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[1], _))
Nan Lin32c794f2022-01-25 22:57:03152 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle1bb24d42023-10-24 22:29:13153 aggregation_service::TestHpkeKey().GetPublicKey(),
Nan Lin32c794f2022-01-25 22:57:03154 PublicKeyFetchStatus::kOk));
155 EXPECT_CALL(callback(),
Dan McArdle08ad6112023-11-21 20:39:47156 Run(_, Eq(std::nullopt), AssemblyStatus::kPublicKeyFetchFailed));
Alex Turner7b0c6b62021-10-05 18:34:39157
Nan Lin32c794f2022-01-25 22:57:03158 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys(_, _))
159 .Times(0);
Alex Turner7b0c6b62021-10-05 18:34:39160
Nan Lin32c794f2022-01-25 22:57:03161 assembler()->AssembleReport(std::move(request), callback().Get());
Nan Lind637a9c92022-02-24 02:48:02162
163 histograms.ExpectUniqueSample(
164 kReportAssemblerStatusHistogramName,
165 AggregatableReportAssembler::AssemblyStatus::kPublicKeyFetchFailed, 1);
Alex Turner7b0c6b62021-10-05 18:34:39166}
167
168TEST_F(AggregatableReportAssemblerTest, SecondKeyFetchFails_ErrorReturned) {
Nan Lind637a9c92022-02-24 02:48:02169 base::HistogramTester histograms;
170
Alex Turnerbed5a1942022-03-14 22:38:06171 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47172 blink::mojom::AggregationServiceMode::kExperimentalPoplar);
Nan Lin4c75cd82022-02-18 23:39:34173 std::vector<GURL> processing_urls = request.processing_urls();
Alex Turner7b0c6b62021-10-05 18:34:39174
Nan Lin4c75cd82022-02-18 23:39:34175 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[0], _))
Nan Lin32c794f2022-01-25 22:57:03176 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle1bb24d42023-10-24 22:29:13177 aggregation_service::TestHpkeKey().GetPublicKey(),
Nan Lin32c794f2022-01-25 22:57:03178 PublicKeyFetchStatus::kOk));
Nan Lin4c75cd82022-02-18 23:39:34179 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[1], _))
Nan Lin32c794f2022-01-25 22:57:03180 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle08ad6112023-11-21 20:39:47181 std::nullopt, PublicKeyFetchStatus::kPublicKeyFetchFailed));
Nan Lin32c794f2022-01-25 22:57:03182 EXPECT_CALL(callback(),
Dan McArdle08ad6112023-11-21 20:39:47183 Run(_, Eq(std::nullopt), AssemblyStatus::kPublicKeyFetchFailed));
Alex Turner7b0c6b62021-10-05 18:34:39184
Nan Lin32c794f2022-01-25 22:57:03185 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys(_, _))
186 .Times(0);
Alex Turner7b0c6b62021-10-05 18:34:39187
Nan Lin32c794f2022-01-25 22:57:03188 assembler()->AssembleReport(std::move(request), callback().Get());
Nan Lind637a9c92022-02-24 02:48:02189
190 histograms.ExpectUniqueSample(
191 kReportAssemblerStatusHistogramName,
192 AggregatableReportAssembler::AssemblyStatus::kPublicKeyFetchFailed, 1);
Alex Turner7b0c6b62021-10-05 18:34:39193}
194
195TEST_F(AggregatableReportAssemblerTest,
196 BothKeyFetchesSucceed_ValidReportReturned) {
Nan Lind637a9c92022-02-24 02:48:02197 base::HistogramTester histograms;
198
Alex Turnerbed5a1942022-03-14 22:38:06199 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47200 blink::mojom::AggregationServiceMode::kExperimentalPoplar);
Alex Turner7b0c6b62021-10-05 18:34:39201
Nan Lin4c75cd82022-02-18 23:39:34202 std::vector<GURL> processing_urls = request.processing_urls();
Alex Turner7b0c6b62021-10-05 18:34:39203 std::vector<PublicKey> public_keys = {
Dan McArdle1bb24d42023-10-24 22:29:13204 aggregation_service::TestHpkeKey("id123").GetPublicKey(),
205 aggregation_service::TestHpkeKey("456abc").GetPublicKey()};
Alex Turner7b0c6b62021-10-05 18:34:39206
Dan McArdle08ad6112023-11-21 20:39:47207 std::optional<AggregatableReport> report =
Alex Turner7b0c6b62021-10-05 18:34:39208 AggregatableReport::Provider().CreateFromRequestAndPublicKeys(
Nan Lin55ad2a5a2022-08-15 21:32:57209 request, public_keys);
Alex Turner7b0c6b62021-10-05 18:34:39210 ASSERT_TRUE(report.has_value());
Alex Turner7b0c6b62021-10-05 18:34:39211
Nan Lin4c75cd82022-02-18 23:39:34212 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[0], _))
Nan Lin32c794f2022-01-25 22:57:03213 .WillOnce(base::test::RunOnceCallback<1>(public_keys[0],
214 PublicKeyFetchStatus::kOk));
Nan Lin4c75cd82022-02-18 23:39:34215 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[1], _))
Nan Lin32c794f2022-01-25 22:57:03216 .WillOnce(base::test::RunOnceCallback<1>(public_keys[1],
217 PublicKeyFetchStatus::kOk));
Nan Lin55ad2a5a2022-08-15 21:32:57218 EXPECT_CALL(callback(), Run(_, report, AssemblyStatus::kOk));
Alex Turner7b0c6b62021-10-05 18:34:39219
Dan McArdle08ad6112023-11-21 20:39:47220 std::optional<AggregatableReportRequest> actual_request;
Nan Lin32c794f2022-01-25 22:57:03221 EXPECT_CALL(*report_provider(),
222 CreateFromRequestAndPublicKeys(_, public_keys))
Nan Lin55ad2a5a2022-08-15 21:32:57223 .WillOnce(CloneRequestAndReturnReport(&actual_request,
224 std::move(report.value())));
Alex Turner7b0c6b62021-10-05 18:34:39225
Nan Lin32c794f2022-01-25 22:57:03226 assembler()->AssembleReport(aggregation_service::CloneReportRequest(request),
227 callback().Get());
228 ASSERT_TRUE(actual_request.has_value());
229 EXPECT_TRUE(aggregation_service::ReportRequestsEqual(actual_request.value(),
230 request));
Nan Lind637a9c92022-02-24 02:48:02231
232 histograms.ExpectUniqueSample(
233 kReportAssemblerStatusHistogramName,
234 AggregatableReportAssembler::AssemblyStatus::kOk, 1);
Alex Turner7b0c6b62021-10-05 18:34:39235}
236
237TEST_F(AggregatableReportAssemblerTest,
Alex Turnerbed5a1942022-03-14 22:38:06238 OnlyKeyFetchSucceeds_ValidReportReturned) {
Nan Lind637a9c92022-02-24 02:48:02239 base::HistogramTester histograms;
240
Alex Turner68655bec2021-11-03 16:20:53241 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47242 blink::mojom::AggregationServiceMode::kTeeBased);
Alex Turner68655bec2021-11-03 16:20:53243
Dan McArdle1bb24d42023-10-24 22:29:13244 PublicKey public_key =
245 aggregation_service::TestHpkeKey("id123").GetPublicKey();
Alex Turner68655bec2021-11-03 16:20:53246
Dan McArdle08ad6112023-11-21 20:39:47247 std::optional<AggregatableReport> report =
Alex Turner68655bec2021-11-03 16:20:53248 AggregatableReport::Provider().CreateFromRequestAndPublicKeys(
Nan Lin55ad2a5a2022-08-15 21:32:57249 request, {public_key});
Alex Turner68655bec2021-11-03 16:20:53250 ASSERT_TRUE(report.has_value());
Alex Turner68655bec2021-11-03 16:20:53251
Nan Linf1a880f82022-02-10 17:59:08252 EXPECT_CALL(*fetcher(), GetPublicKey)
Nan Lin32c794f2022-01-25 22:57:03253 .WillOnce(base::test::RunOnceCallback<1>(public_key,
254 PublicKeyFetchStatus::kOk));
Nan Lin55ad2a5a2022-08-15 21:32:57255 EXPECT_CALL(callback(), Run(_, report, AssemblyStatus::kOk));
Alex Turner68655bec2021-11-03 16:20:53256
Dan McArdle08ad6112023-11-21 20:39:47257 std::optional<AggregatableReportRequest> actual_request;
Nan Lin32c794f2022-01-25 22:57:03258 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys(
259 _, std::vector<PublicKey>{public_key}))
Nan Lin55ad2a5a2022-08-15 21:32:57260 .WillOnce(CloneRequestAndReturnReport(&actual_request,
261 std::move(report.value())));
Alex Turner68655bec2021-11-03 16:20:53262
Nan Lin32c794f2022-01-25 22:57:03263 assembler()->AssembleReport(aggregation_service::CloneReportRequest(request),
264 callback().Get());
265 ASSERT_TRUE(actual_request.has_value());
266 EXPECT_TRUE(aggregation_service::ReportRequestsEqual(actual_request.value(),
267 request));
Nan Lind637a9c92022-02-24 02:48:02268
269 histograms.ExpectUniqueSample(
270 kReportAssemblerStatusHistogramName,
271 AggregatableReportAssembler::AssemblyStatus::kOk, 1);
Alex Turner68655bec2021-11-03 16:20:53272}
273
Alex Turnerbed5a1942022-03-14 22:38:06274TEST_F(AggregatableReportAssemblerTest, OnlyKeyFetchFails_ErrorReturned) {
Nan Lind637a9c92022-02-24 02:48:02275 base::HistogramTester histograms;
276
Alex Turner68655bec2021-11-03 16:20:53277 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47278 blink::mojom::AggregationServiceMode::kTeeBased);
Alex Turner68655bec2021-11-03 16:20:53279
Nan Linf1a880f82022-02-10 17:59:08280 EXPECT_CALL(*fetcher(), GetPublicKey)
Nan Lin32c794f2022-01-25 22:57:03281 .WillOnce(base::test::RunOnceCallback<1>(
Dan McArdle08ad6112023-11-21 20:39:47282 std::nullopt, PublicKeyFetchStatus::kPublicKeyFetchFailed));
Nan Lin32c794f2022-01-25 22:57:03283 EXPECT_CALL(callback(),
Dan McArdle08ad6112023-11-21 20:39:47284 Run(_, Eq(std::nullopt), AssemblyStatus::kPublicKeyFetchFailed));
Alex Turner68655bec2021-11-03 16:20:53285
Nan Lin32c794f2022-01-25 22:57:03286 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys(_, _))
287 .Times(0);
Alex Turner68655bec2021-11-03 16:20:53288
Nan Lin32c794f2022-01-25 22:57:03289 assembler()->AssembleReport(std::move(request), callback().Get());
Nan Lind637a9c92022-02-24 02:48:02290
291 histograms.ExpectUniqueSample(
292 kReportAssemblerStatusHistogramName,
293 AggregatableReportAssembler::AssemblyStatus::kPublicKeyFetchFailed, 1);
Alex Turner68655bec2021-11-03 16:20:53294}
295
296TEST_F(AggregatableReportAssemblerTest,
Alex Turnerbed5a1942022-03-14 22:38:06297 TwoKeyFetchesReturnInSwappedOrder_ValidReportReturned) {
Nan Lind637a9c92022-02-24 02:48:02298 base::HistogramTester histograms;
299
Alex Turnerbed5a1942022-03-14 22:38:06300 AggregatableReportRequest request = aggregation_service::CreateExampleRequest(
Yao Xiao4890a292023-02-28 23:52:47301 blink::mojom::AggregationServiceMode::kExperimentalPoplar);
Alex Turner7b0c6b62021-10-05 18:34:39302
Nan Lin4c75cd82022-02-18 23:39:34303 std::vector<GURL> processing_urls = request.processing_urls();
Alex Turner7b0c6b62021-10-05 18:34:39304 std::vector<PublicKey> public_keys = {
Dan McArdle1bb24d42023-10-24 22:29:13305 aggregation_service::TestHpkeKey("id123").GetPublicKey(),
306 aggregation_service::TestHpkeKey("456abc").GetPublicKey()};
Alex Turner7b0c6b62021-10-05 18:34:39307
Dan McArdle08ad6112023-11-21 20:39:47308 std::optional<AggregatableReport> report =
Alex Turner7b0c6b62021-10-05 18:34:39309 AggregatableReport::Provider().CreateFromRequestAndPublicKeys(
Nan Lin55ad2a5a2022-08-15 21:32:57310 request, public_keys);
Alex Turner7b0c6b62021-10-05 18:34:39311 ASSERT_TRUE(report.has_value());
Alex Turner7b0c6b62021-10-05 18:34:39312
Nan Lin32c794f2022-01-25 22:57:03313 std::vector<FetchCallback> pending_callbacks(2);
Nan Lin4c75cd82022-02-18 23:39:34314 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[0], _))
Nan Lin32c794f2022-01-25 22:57:03315 .WillOnce(MoveArg<1>(&pending_callbacks.front()));
Nan Lin4c75cd82022-02-18 23:39:34316 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[1], _))
Nan Lin32c794f2022-01-25 22:57:03317 .WillOnce(MoveArg<1>(&pending_callbacks.back()));
Nan Lin55ad2a5a2022-08-15 21:32:57318 EXPECT_CALL(callback(), Run(_, report, AssemblyStatus::kOk));
Nan Lin32c794f2022-01-25 22:57:03319
Dan McArdle08ad6112023-11-21 20:39:47320 std::optional<AggregatableReportRequest> actual_request;
Nan Lin32c794f2022-01-25 22:57:03321 EXPECT_CALL(*report_provider(),
322 CreateFromRequestAndPublicKeys(_, public_keys))
Nan Lin55ad2a5a2022-08-15 21:32:57323 .WillOnce(CloneRequestAndReturnReport(&actual_request,
324 std::move(report.value())));
Nan Lin32c794f2022-01-25 22:57:03325
326 assembler()->AssembleReport(aggregation_service::CloneReportRequest(request),
327 callback().Get());
Alex Turner7b0c6b62021-10-05 18:34:39328
329 // Swap order of responses
Nan Lin32c794f2022-01-25 22:57:03330 std::move(pending_callbacks.back())
331 .Run(public_keys[1], PublicKeyFetchStatus::kOk);
332 std::move(pending_callbacks.front())
333 .Run(public_keys[0], PublicKeyFetchStatus::kOk);
Nan Lind637a9c92022-02-24 02:48:02334
335 histograms.ExpectUniqueSample(
336 kReportAssemblerStatusHistogramName,
337 AggregatableReportAssembler::AssemblyStatus::kOk, 1);
Alex Turner7b0c6b62021-10-05 18:34:39338}
339
340TEST_F(AggregatableReportAssemblerTest,
Alex Turner7b0c6b62021-10-05 18:34:39341 AssemblerDeleted_PendingRequestsNotRun) {
Nan Lind637a9c92022-02-24 02:48:02342 base::HistogramTester histograms;
343
Alex Turner7b0c6b62021-10-05 18:34:39344 AggregatableReportRequest request =
345 aggregation_service::CreateExampleRequest();
Nan Lin4c75cd82022-02-18 23:39:34346 std::vector<GURL> processing_urls = request.processing_urls();
Alex Turner7b0c6b62021-10-05 18:34:39347
Nan Lin32c794f2022-01-25 22:57:03348 EXPECT_CALL(callback(), Run).Times(0);
Alex Turnerbed5a1942022-03-14 22:38:06349 EXPECT_CALL(*fetcher(), GetPublicKey);
Nan Lin32c794f2022-01-25 22:57:03350 assembler()->AssembleReport(std::move(request), callback().Get());
Alex Turner7b0c6b62021-10-05 18:34:39351
352 ResetAssembler();
Nan Lind637a9c92022-02-24 02:48:02353
354 histograms.ExpectTotalCount(kReportAssemblerStatusHistogramName, 0);
Alex Turner7b0c6b62021-10-05 18:34:39355}
356
357TEST_F(AggregatableReportAssemblerTest,
358 MultipleSimultaneousRequests_BothSucceed) {
Nan Lind637a9c92022-02-24 02:48:02359 base::HistogramTester histograms;
360
Alex Turner7b0c6b62021-10-05 18:34:39361 AggregatableReportRequest request =
362 aggregation_service::CreateExampleRequest();
363
Nan Lin4c75cd82022-02-18 23:39:34364 std::vector<GURL> processing_urls = request.processing_urls();
Dan McArdle1bb24d42023-10-24 22:29:13365 PublicKey public_key =
366 aggregation_service::TestHpkeKey("id123").GetPublicKey();
Alex Turner7b0c6b62021-10-05 18:34:39367
Dan McArdle08ad6112023-11-21 20:39:47368 std::optional<AggregatableReport> report =
Alex Turner7b0c6b62021-10-05 18:34:39369 AggregatableReport::Provider().CreateFromRequestAndPublicKeys(
Nan Lin55ad2a5a2022-08-15 21:32:57370 request, {public_key});
Alex Turner7b0c6b62021-10-05 18:34:39371 ASSERT_TRUE(report.has_value());
Alex Turner7b0c6b62021-10-05 18:34:39372
Alex Turnerbed5a1942022-03-14 22:38:06373 std::vector<FetchCallback> pending_callbacks(2);
Nan Lin4c75cd82022-02-18 23:39:34374 EXPECT_CALL(*fetcher(), GetPublicKey(processing_urls[0], _))
Alex Turnerbed5a1942022-03-14 22:38:06375 .WillOnce(MoveArg<1>(&pending_callbacks.front()))
376 .WillOnce(MoveArg<1>(&pending_callbacks.back()));
Alex Turner7b0c6b62021-10-05 18:34:39377
Nan Lin55ad2a5a2022-08-15 21:32:57378 EXPECT_CALL(callback(), Run(_, report, AssemblyStatus::kOk)).Times(2);
Alex Turner7b0c6b62021-10-05 18:34:39379
Dan McArdle08ad6112023-11-21 20:39:47380 std::optional<AggregatableReportRequest> first_request;
381 std::optional<AggregatableReportRequest> second_request;
Alex Turnerbed5a1942022-03-14 22:38:06382 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys(
383 _, std::vector<PublicKey>{public_key}))
Nan Lin55ad2a5a2022-08-15 21:32:57384 .WillOnce(CloneRequestAndReturnReport(&first_request, report.value()))
385 .WillOnce(CloneRequestAndReturnReport(&second_request,
386 std::move(report.value())));
Alex Turner7b0c6b62021-10-05 18:34:39387
Nan Lin32c794f2022-01-25 22:57:03388 assembler()->AssembleReport(aggregation_service::CloneReportRequest(request),
389 callback().Get());
390 assembler()->AssembleReport(aggregation_service::CloneReportRequest(request),
391 callback().Get());
Alex Turner7b0c6b62021-10-05 18:34:39392
Alex Turnerbed5a1942022-03-14 22:38:06393 std::move(pending_callbacks.front())
394 .Run(public_key, PublicKeyFetchStatus::kOk);
395 std::move(pending_callbacks.back())
396 .Run(public_key, PublicKeyFetchStatus::kOk);
Nan Lin32c794f2022-01-25 22:57:03397
398 ASSERT_TRUE(first_request.has_value());
399 EXPECT_TRUE(
400 aggregation_service::ReportRequestsEqual(first_request.value(), request));
401 ASSERT_TRUE(second_request.has_value());
402 EXPECT_TRUE(aggregation_service::ReportRequestsEqual(second_request.value(),
403 request));
Nan Lind637a9c92022-02-24 02:48:02404
405 histograms.ExpectUniqueSample(
406 kReportAssemblerStatusHistogramName,
407 AggregatableReportAssembler::AssemblyStatus::kOk, 2);
Alex Turner7b0c6b62021-10-05 18:34:39408}
409
410TEST_F(AggregatableReportAssemblerTest,
411 TooManySimultaneousRequests_ErrorCausedForNewRequests) {
Nan Lind637a9c92022-02-24 02:48:02412 base::HistogramTester histograms;
413
Dan McArdle1bb24d42023-10-24 22:29:13414 PublicKey public_key =
415 aggregation_service::TestHpkeKey("id123").GetPublicKey();
Dan McArdle08ad6112023-11-21 20:39:47416 std::optional<AggregatableReport> report =
Alex Turner7b0c6b62021-10-05 18:34:39417 AggregatableReport::Provider().CreateFromRequestAndPublicKeys(
Alex Turnerbed5a1942022-03-14 22:38:06418 aggregation_service::CreateExampleRequest(), {std::move(public_key)});
Alex Turner7b0c6b62021-10-05 18:34:39419 ASSERT_TRUE(report.has_value());
Nan Lin32c794f2022-01-25 22:57:03420
421 std::vector<FetchCallback> pending_callbacks;
422
423 Checkpoint checkpoint;
424 int current_call = 1;
425
426 {
427 testing::InSequence seq;
428 int current_check = 1;
429
430 EXPECT_CALL(*fetcher(), GetPublicKey)
Alex Turnerbed5a1942022-03-14 22:38:06431 .Times(AggregatableReportAssembler::kMaxSimultaneousRequests)
Nan Lin4c75cd82022-02-18 23:39:34432 .WillRepeatedly(Invoke([&](const GURL& url, FetchCallback callback) {
433 pending_callbacks.push_back(std::move(callback));
434 }));
Nan Lin32c794f2022-01-25 22:57:03435
Nan Lin55ad2a5a2022-08-15 21:32:57436 EXPECT_CALL(callback(), Run).Times(0);
Nan Lin32c794f2022-01-25 22:57:03437
438 EXPECT_CALL(checkpoint, Call(current_check++));
439
Dan McArdle08ad6112023-11-21 20:39:47440 EXPECT_CALL(callback(), Run(_, Eq(std::nullopt),
Nan Lin32c794f2022-01-25 22:57:03441 AssemblyStatus::kTooManySimultaneousRequests))
442 .Times(1);
443
444 EXPECT_CALL(checkpoint, Call(current_check++));
445
446 for (size_t i = 0;
447 i < AggregatableReportAssembler::kMaxSimultaneousRequests; i++) {
448 EXPECT_CALL(checkpoint, Call(current_check++));
449 EXPECT_CALL(*report_provider(), CreateFromRequestAndPublicKeys)
450 .WillOnce(Return(report));
Nan Lin55ad2a5a2022-08-15 21:32:57451 EXPECT_CALL(callback(), Run(_, report, AssemblyStatus::kOk));
Nan Lin32c794f2022-01-25 22:57:03452 }
453 }
Alex Turner7b0c6b62021-10-05 18:34:39454
455 for (size_t i = 0; i < AggregatableReportAssembler::kMaxSimultaneousRequests;
456 ++i) {
Nan Lin32c794f2022-01-25 22:57:03457 assembler()->AssembleReport(aggregation_service::CreateExampleRequest(),
458 callback().Get());
Alex Turner7b0c6b62021-10-05 18:34:39459 }
460
Nan Lin32c794f2022-01-25 22:57:03461 checkpoint.Call(current_call++);
Alex Turner7b0c6b62021-10-05 18:34:39462
Nan Lin32c794f2022-01-25 22:57:03463 assembler()->AssembleReport(aggregation_service::CreateExampleRequest(),
464 callback().Get());
Alex Turner7b0c6b62021-10-05 18:34:39465
Nan Lin32c794f2022-01-25 22:57:03466 checkpoint.Call(current_call++);
Alex Turner7b0c6b62021-10-05 18:34:39467
Alex Turnerbed5a1942022-03-14 22:38:06468 for (FetchCallback& pending_callback : pending_callbacks) {
469 checkpoint.Call(current_call++);
Alex Turner7b0c6b62021-10-05 18:34:39470
Alex Turnerbed5a1942022-03-14 22:38:06471 std::move(pending_callback)
Dan McArdle1bb24d42023-10-24 22:29:13472 .Run(aggregation_service::TestHpkeKey("id123").GetPublicKey(),
Nan Lin32c794f2022-01-25 22:57:03473 PublicKeyFetchStatus::kOk);
474 }
Nan Lind637a9c92022-02-24 02:48:02475
476 histograms.ExpectBucketCount(
477 kReportAssemblerStatusHistogramName,
478 AggregatableReportAssembler::AssemblyStatus::kOk,
479 AggregatableReportAssembler::kMaxSimultaneousRequests);
480 histograms.ExpectBucketCount(
481 kReportAssemblerStatusHistogramName,
482 AggregatableReportAssembler::AssemblyStatus::kTooManySimultaneousRequests,
483 1);
Alex Turner7b0c6b62021-10-05 18:34:39484}
485
486} // namespace content