blob: 83874936dcea6736acdf995392e8127878d4e9e2 [file] [log] [blame]
juliatuttle381d77e2017-04-07 18:54:121// 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
5#include "net/reporting/reporting_service.h"
6
7#include <memory>
8#include <string>
9
Sam Burnettf13c06b2019-07-30 15:53:4910#include "base/bind.h"
juliatuttle381d77e2017-04-07 18:54:1211#include "base/memory/ptr_util.h"
Matt Menke055f5c92020-10-22 19:33:2312#include "base/test/scoped_feature_list.h"
juliatuttle381d77e2017-04-07 18:54:1213#include "base/time/tick_clock.h"
14#include "base/values.h"
Matt Menke055f5c92020-10-22 19:33:2315#include "net/base/features.h"
Lily Chenad5dd0802020-03-10 21:58:0916#include "net/base/network_isolation_key.h"
Matt Menke4807a9a2020-11-21 00:14:4117#include "net/base/schemeful_site.h"
Sam Burnettf13c06b2019-07-30 15:53:4918#include "net/reporting/mock_persistent_reporting_store.h"
19#include "net/reporting/reporting_browsing_data_remover.h"
juliatuttle381d77e2017-04-07 18:54:1220#include "net/reporting/reporting_cache.h"
21#include "net/reporting/reporting_context.h"
Lily Chenad5dd0802020-03-10 21:58:0922#include "net/reporting/reporting_endpoint.h"
juliatuttle381d77e2017-04-07 18:54:1223#include "net/reporting/reporting_policy.h"
24#include "net/reporting/reporting_report.h"
25#include "net/reporting/reporting_service.h"
26#include "net/reporting/reporting_test_util.h"
Gabriel Charettec7108742019-08-23 03:31:4027#include "net/test/test_with_task_environment.h"
Sam Burnettf13c06b2019-07-30 15:53:4928#include "testing/gmock/include/gmock/gmock.h"
juliatuttle381d77e2017-04-07 18:54:1229#include "testing/gtest/include/gtest/gtest.h"
Matt Menke4807a9a2020-11-21 00:14:4130#include "url/gurl.h"
31#include "url/origin.h"
juliatuttle381d77e2017-04-07 18:54:1232
33namespace net {
34namespace {
35
Sam Burnettf13c06b2019-07-30 15:53:4936using CommandType = MockPersistentReportingStore::Command::Type;
37
38// The tests are parametrized on a boolean value which represents whether to use
39// a MockPersistentReportingStore (if false, no store is used).
40class ReportingServiceTest : public ::testing::TestWithParam<bool>,
Gabriel Charette694c3c332019-08-19 14:53:0541 public WithTaskEnvironment {
juliatuttle381d77e2017-04-07 18:54:1242 protected:
43 const GURL kUrl_ = GURL("https://origin/path");
Sam Burnettf13c06b2019-07-30 15:53:4944 const GURL kUrl2_ = GURL("https://origin2/path");
Daniel Cheng88186bd52017-10-20 08:14:4645 const url::Origin kOrigin_ = url::Origin::Create(kUrl_);
Sam Burnettf13c06b2019-07-30 15:53:4946 const url::Origin kOrigin2_ = url::Origin::Create(kUrl2_);
juliatuttle381d77e2017-04-07 18:54:1247 const GURL kEndpoint_ = GURL("https://endpoint/");
Douglas Creagerf6cb49f72018-07-19 20:14:5348 const std::string kUserAgent_ = "Mozilla/1.0";
juliatuttle381d77e2017-04-07 18:54:1249 const std::string kGroup_ = "group";
50 const std::string kType_ = "type";
Matt Menke4807a9a2020-11-21 00:14:4151 const NetworkIsolationKey kNik_ =
52 NetworkIsolationKey(SchemefulSite(kOrigin_), SchemefulSite(kOrigin_));
53 const NetworkIsolationKey kNik2_ =
54 NetworkIsolationKey(SchemefulSite(kOrigin2_), SchemefulSite(kOrigin2_));
Lily Chenad5dd0802020-03-10 21:58:0955 const ReportingEndpointGroupKey kGroupKey_ =
Matt Menke17b23c42020-10-22 05:14:5756 ReportingEndpointGroupKey(kNik_, kOrigin_, kGroup_);
Lily Chenad5dd0802020-03-10 21:58:0957 const ReportingEndpointGroupKey kGroupKey2_ =
Matt Menke17b23c42020-10-22 05:14:5758 ReportingEndpointGroupKey(kNik2_, kOrigin2_, kGroup_);
juliatuttle381d77e2017-04-07 18:54:1259
Sam Burnettf13c06b2019-07-30 15:53:4960 ReportingServiceTest() {
Matt Menke055f5c92020-10-22 19:33:2361 feature_list_.InitAndEnableFeature(
62 features::kPartitionNelAndReportingByNetworkIsolationKey);
63 Init();
64 }
65
66 // Initializes, or re-initializes, |service_| and its dependencies.
67 void Init() {
Sam Burnettf13c06b2019-07-30 15:53:4968 if (GetParam())
69 store_ = std::make_unique<MockPersistentReportingStore>();
70 else
71 store_ = nullptr;
juliatuttle381d77e2017-04-07 18:54:1272
Sam Burnettf13c06b2019-07-30 15:53:4973 auto test_context = std::make_unique<TestReportingContext>(
74 &clock_, &tick_clock_, ReportingPolicy(), store_.get());
75 context_ = test_context.get();
76
77 service_ = ReportingService::CreateForTesting(std::move(test_context));
78 }
79
80 // If the store exists, simulate finishing loading the store, which should
81 // make the rest of the test run synchronously.
82 void FinishLoading(bool load_success) {
83 if (store_)
84 store_->FinishLoading(load_success);
85 }
86
87 MockPersistentReportingStore* store() { return store_.get(); }
juliatuttle381d77e2017-04-07 18:54:1288 TestReportingContext* context() { return context_; }
89 ReportingService* service() { return service_.get(); }
90
91 private:
Matt Menke055f5c92020-10-22 19:33:2392 base::test::ScopedFeatureList feature_list_;
93
tzik26331742017-12-07 07:28:3394 base::SimpleTestClock clock_;
95 base::SimpleTestTickClock tick_clock_;
96
Sam Burnettf13c06b2019-07-30 15:53:4997 std::unique_ptr<MockPersistentReportingStore> store_;
juliatuttle381d77e2017-04-07 18:54:1298 TestReportingContext* context_;
99 std::unique_ptr<ReportingService> service_;
100};
101
Sam Burnettf13c06b2019-07-30 15:53:49102TEST_P(ReportingServiceTest, QueueReport) {
Matt Menkedd2ed7a2020-10-22 04:09:20103 service()->QueueReport(kUrl_, kNik_, kUserAgent_, kGroup_, kType_,
Julia Tuttle107e30672018-03-29 18:48:42104 std::make_unique<base::DictionaryValue>(), 0);
Sam Burnettf13c06b2019-07-30 15:53:49105 FinishLoading(true /* load_success */);
juliatuttle381d77e2017-04-07 18:54:12106
107 std::vector<const ReportingReport*> reports;
108 context()->cache()->GetReports(&reports);
109 ASSERT_EQ(1u, reports.size());
110 EXPECT_EQ(kUrl_, reports[0]->url);
Matt Menkedd2ed7a2020-10-22 04:09:20111 EXPECT_EQ(kNik_, reports[0]->network_isolation_key);
Douglas Creagerf6cb49f72018-07-19 20:14:53112 EXPECT_EQ(kUserAgent_, reports[0]->user_agent);
juliatuttle381d77e2017-04-07 18:54:12113 EXPECT_EQ(kGroup_, reports[0]->group);
114 EXPECT_EQ(kType_, reports[0]->type);
115}
116
Sam Burnettf13c06b2019-07-30 15:53:49117TEST_P(ReportingServiceTest, QueueReportSanitizeUrl) {
Lily Chen8fed0dd72019-01-23 17:13:27118 // Same as kUrl_ but with username, password, and fragment.
119 GURL url = GURL("https://username:password@origin/path#fragment");
Matt Menkedd2ed7a2020-10-22 04:09:20120 service()->QueueReport(url, kNik_, kUserAgent_, kGroup_, kType_,
Lily Chen8fed0dd72019-01-23 17:13:27121 std::make_unique<base::DictionaryValue>(), 0);
Sam Burnettf13c06b2019-07-30 15:53:49122 FinishLoading(true /* load_success */);
Lily Chen8fed0dd72019-01-23 17:13:27123
124 std::vector<const ReportingReport*> reports;
125 context()->cache()->GetReports(&reports);
126 ASSERT_EQ(1u, reports.size());
127 EXPECT_EQ(kUrl_, reports[0]->url);
Matt Menkedd2ed7a2020-10-22 04:09:20128 EXPECT_EQ(kNik_, reports[0]->network_isolation_key);
Lily Chen8fed0dd72019-01-23 17:13:27129 EXPECT_EQ(kUserAgent_, reports[0]->user_agent);
130 EXPECT_EQ(kGroup_, reports[0]->group);
131 EXPECT_EQ(kType_, reports[0]->type);
132}
133
Sam Burnettf13c06b2019-07-30 15:53:49134TEST_P(ReportingServiceTest, DontQueueReportInvalidUrl) {
Lily Chen8fed0dd72019-01-23 17:13:27135 GURL url = GURL("https://");
Sam Burnettf13c06b2019-07-30 15:53:49136 // This does not trigger an attempt to load from the store because the url
137 // is immediately rejected as invalid.
Matt Menkedd2ed7a2020-10-22 04:09:20138 service()->QueueReport(url, kNik_, kUserAgent_, kGroup_, kType_,
Lily Chen8fed0dd72019-01-23 17:13:27139 std::make_unique<base::DictionaryValue>(), 0);
140
141 std::vector<const ReportingReport*> reports;
142 context()->cache()->GetReports(&reports);
143 ASSERT_EQ(0u, reports.size());
144}
145
Matt Menke055f5c92020-10-22 19:33:23146TEST_P(ReportingServiceTest, QueueReportNetworkIsolationKeyDisabled) {
147 base::test::ScopedFeatureList feature_list;
148 feature_list.InitAndDisableFeature(
149 features::kPartitionNelAndReportingByNetworkIsolationKey);
150
151 // Re-create the store, so it reads the new feature value.
152 Init();
153
154 service()->QueueReport(kUrl_, kNik_, kUserAgent_, kGroup_, kType_,
155 std::make_unique<base::DictionaryValue>(), 0);
156 FinishLoading(true /* load_success */);
157
158 std::vector<const ReportingReport*> reports;
159 context()->cache()->GetReports(&reports);
160 ASSERT_EQ(1u, reports.size());
161
162 // NetworkIsolationKey should be empty, instead of kNik_;
163 EXPECT_EQ(NetworkIsolationKey(), reports[0]->network_isolation_key);
164 EXPECT_NE(kNik_, reports[0]->network_isolation_key);
165
166 EXPECT_EQ(kUrl_, reports[0]->url);
167 EXPECT_EQ(kUserAgent_, reports[0]->user_agent);
168 EXPECT_EQ(kGroup_, reports[0]->group);
169 EXPECT_EQ(kType_, reports[0]->type);
170}
171
Rodney Ding329e4bb2021-03-19 22:21:53172TEST_P(ReportingServiceTest, ProcessReportToHeader) {
173 service()->ProcessReportToHeader(kUrl_, kNik_,
174 "{\"endpoints\":[{\"url\":\"" +
175 kEndpoint_.spec() +
176 "\"}],"
177 "\"group\":\"" +
178 kGroup_ +
179 "\","
180 "\"max_age\":86400}");
Sam Burnettf13c06b2019-07-30 15:53:49181 FinishLoading(true /* load_success */);
juliatuttle381d77e2017-04-07 18:54:12182
Lily Chenefb6fcf2019-04-19 04:17:54183 EXPECT_EQ(1u, context()->cache()->GetEndpointCount());
Matt Menke055f5c92020-10-22 19:33:23184 EXPECT_TRUE(context()->cache()->GetEndpointForTesting(
185 ReportingEndpointGroupKey(kNik_, kOrigin_, kGroup_), kEndpoint_));
juliatuttle381d77e2017-04-07 18:54:12186}
187
Rodney Ding329e4bb2021-03-19 22:21:53188TEST_P(ReportingServiceTest, ProcessReportingEndpointsHeader) {
189 base::test::ScopedFeatureList feature_list;
190 feature_list.InitAndEnableFeature(net::features::kDocumentReporting);
191 service()->ProcessReportingEndpointsHeader(
192 kOrigin_, kNik_, kGroup_ + "=\"" + kEndpoint_.spec() + "\"");
193 FinishLoading(true /* load_success */);
194
195 EXPECT_EQ(1u, context()->cache()->GetEndpointCount());
196 EXPECT_TRUE(context()->cache()->GetEndpointForTesting(
197 ReportingEndpointGroupKey(kNik_, kOrigin_, kGroup_), kEndpoint_));
198}
199
200TEST_P(ReportingServiceTest, ProcessReportingEndpointsHeaderPathAbsolute) {
201 base::test::ScopedFeatureList feature_list;
202 feature_list.InitAndEnableFeature(net::features::kDocumentReporting);
203 service()->ProcessReportingEndpointsHeader(kOrigin_, kNik_,
204 kGroup_ + "=\"/path-absolute\"");
Rodney Dingb8809432020-03-12 22:19:59205 FinishLoading(true /* load_success */);
206
207 EXPECT_EQ(1u, context()->cache()->GetEndpointCount());
208}
209
Rodney Ding329e4bb2021-03-19 22:21:53210TEST_P(ReportingServiceTest, ProcessReportToHeaderPathAbsolute) {
211 service()->ProcessReportToHeader(
212 kUrl_, kNik_,
213 "{\"endpoints\":[{\"url\":\"/path-absolute\"}],"
214 "\"group\":\"" +
215 kGroup_ +
216 "\","
217 "\"max_age\":86400}");
218 FinishLoading(true /* load_success */);
219
220 EXPECT_EQ(1u, context()->cache()->GetEndpointCount());
221}
222
223TEST_P(ReportingServiceTest, ProcessReportToHeader_TooLong) {
Julia Tuttle7d874942018-03-02 01:19:13224 const std::string header_too_long =
225 "{\"endpoints\":[{\"url\":\"" + kEndpoint_.spec() +
226 "\"}],"
227 "\"group\":\"" +
228 kGroup_ +
229 "\","
Douglas Creagerbca64422018-06-18 13:54:42230 "\"max_age\":86400," +
Julia Tuttle7d874942018-03-02 01:19:13231 "\"junk\":\"" + std::string(32 * 1024, 'a') + "\"}";
Sam Burnettf13c06b2019-07-30 15:53:49232 // This does not trigger an attempt to load from the store because the header
233 // is immediately rejected as invalid.
Rodney Ding329e4bb2021-03-19 22:21:53234 service()->ProcessReportToHeader(kUrl_, kNik_, header_too_long);
Julia Tuttle7d874942018-03-02 01:19:13235
Lily Chenefb6fcf2019-04-19 04:17:54236 EXPECT_EQ(0u, context()->cache()->GetEndpointCount());
Julia Tuttle7d874942018-03-02 01:19:13237}
238
Rodney Ding329e4bb2021-03-19 22:21:53239TEST_P(ReportingServiceTest, ProcessReportToHeader_TooDeep) {
Julia Tuttle7d874942018-03-02 01:19:13240 const std::string header_too_deep = "{\"endpoints\":[{\"url\":\"" +
241 kEndpoint_.spec() +
242 "\"}],"
243 "\"group\":\"" +
244 kGroup_ +
245 "\","
Douglas Creagerbca64422018-06-18 13:54:42246 "\"max_age\":86400," +
Julia Tuttle7d874942018-03-02 01:19:13247 "\"junk\":[[[[[[[[[[]]]]]]]]]]}";
Sam Burnettf13c06b2019-07-30 15:53:49248 // This does not trigger an attempt to load from the store because the header
249 // is immediately rejected as invalid.
Rodney Ding329e4bb2021-03-19 22:21:53250 service()->ProcessReportToHeader(kUrl_, kNik_, header_too_deep);
Julia Tuttle7d874942018-03-02 01:19:13251
Lily Chenefb6fcf2019-04-19 04:17:54252 EXPECT_EQ(0u, context()->cache()->GetEndpointCount());
Julia Tuttle7d874942018-03-02 01:19:13253}
254
Rodney Ding329e4bb2021-03-19 22:21:53255TEST_P(ReportingServiceTest, ProcessReportToHeaderNetworkIsolationKeyDisabled) {
Matt Menke055f5c92020-10-22 19:33:23256 base::test::ScopedFeatureList feature_list;
257 feature_list.InitAndDisableFeature(
258 features::kPartitionNelAndReportingByNetworkIsolationKey);
259
260 // Re-create the store, so it reads the new feature value.
261 Init();
262
Rodney Ding329e4bb2021-03-19 22:21:53263 service()->ProcessReportToHeader(kUrl_, kNik_,
264 "{\"endpoints\":[{\"url\":\"" +
265 kEndpoint_.spec() +
266 "\"}],"
267 "\"group\":\"" +
268 kGroup_ +
269 "\","
270 "\"max_age\":86400}");
Matt Menke055f5c92020-10-22 19:33:23271 FinishLoading(true /* load_success */);
272
273 EXPECT_EQ(1u, context()->cache()->GetEndpointCount());
274 EXPECT_FALSE(context()->cache()->GetEndpointForTesting(
275 ReportingEndpointGroupKey(kNik_, kOrigin_, kGroup_), kEndpoint_));
276 EXPECT_TRUE(context()->cache()->GetEndpointForTesting(
277 ReportingEndpointGroupKey(NetworkIsolationKey(), kOrigin_, kGroup_),
278 kEndpoint_));
279}
280
Sam Burnettf13c06b2019-07-30 15:53:49281TEST_P(ReportingServiceTest, WriteToStore) {
282 if (!store())
283 return;
284
285 MockPersistentReportingStore::CommandList expected_commands;
286
287 // This first call to any public method triggers a load. The load will block
288 // until we call FinishLoading.
Rodney Ding329e4bb2021-03-19 22:21:53289 service()->ProcessReportToHeader(kUrl_, kNik_,
290 "{\"endpoints\":[{\"url\":\"" +
291 kEndpoint_.spec() +
292 "\"}],"
293 "\"group\":\"" +
294 kGroup_ +
295 "\","
296 "\"max_age\":86400}");
Sam Burnettf13c06b2019-07-30 15:53:49297 expected_commands.emplace_back(CommandType::LOAD_REPORTING_CLIENTS);
298 EXPECT_THAT(store()->GetAllCommands(),
299 testing::UnorderedElementsAreArray(expected_commands));
300
301 // Unblock the load. The will let the remaining calls to the service complete
302 // without blocking.
303 FinishLoading(true /* load_success */);
Lily Chenad5dd0802020-03-10 21:58:09304 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT,
305 kGroupKey_, kEndpoint_);
306 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP,
307 kGroupKey_);
Sam Burnettf13c06b2019-07-30 15:53:49308 EXPECT_THAT(store()->GetAllCommands(),
309 testing::UnorderedElementsAreArray(expected_commands));
310
Rodney Ding329e4bb2021-03-19 22:21:53311 service()->ProcessReportToHeader(kUrl2_, kNik2_,
312 "{\"endpoints\":[{\"url\":\"" +
313 kEndpoint_.spec() +
314 "\"}],"
315 "\"group\":\"" +
316 kGroup_ +
317 "\","
318 "\"max_age\":86400}");
Lily Chenad5dd0802020-03-10 21:58:09319 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT,
320 kGroupKey2_, kEndpoint_);
321 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP,
322 kGroupKey2_);
Sam Burnettf13c06b2019-07-30 15:53:49323 EXPECT_THAT(store()->GetAllCommands(),
324 testing::UnorderedElementsAreArray(expected_commands));
325
Matt Menke17b23c42020-10-22 05:14:57326 service()->QueueReport(kUrl_, kNik_, kUserAgent_, kGroup_, kType_,
327 std::make_unique<base::DictionaryValue>(), 0);
Sam Burnettf13c06b2019-07-30 15:53:49328 expected_commands.emplace_back(
Lily Chenad5dd0802020-03-10 21:58:09329 CommandType::UPDATE_REPORTING_ENDPOINT_GROUP_ACCESS_TIME, kGroupKey_);
Sam Burnettf13c06b2019-07-30 15:53:49330 EXPECT_THAT(store()->GetAllCommands(),
331 testing::UnorderedElementsAreArray(expected_commands));
332
333 service()->RemoveBrowsingData(ReportingBrowsingDataRemover::DATA_TYPE_CLIENTS,
334 base::BindRepeating([](const GURL& url) {
335 return url.host() == "origin";
336 }));
Lily Chenad5dd0802020-03-10 21:58:09337 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT,
338 kGroupKey_, kEndpoint_);
339 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT_GROUP,
340 kGroupKey_);
Sam Burnettf13c06b2019-07-30 15:53:49341 expected_commands.emplace_back(CommandType::FLUSH);
342 EXPECT_THAT(store()->GetAllCommands(),
343 testing::UnorderedElementsAreArray(expected_commands));
344
345 service()->RemoveAllBrowsingData(
346 ReportingBrowsingDataRemover::DATA_TYPE_CLIENTS);
Lily Chenad5dd0802020-03-10 21:58:09347 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT,
348 kGroupKey2_, kEndpoint_);
349 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT_GROUP,
350 kGroupKey2_);
Sam Burnettf13c06b2019-07-30 15:53:49351 expected_commands.emplace_back(CommandType::FLUSH);
352 EXPECT_THAT(store()->GetAllCommands(),
353 testing::UnorderedElementsAreArray(expected_commands));
354}
355
356TEST_P(ReportingServiceTest, WaitUntilLoadFinishesBeforeWritingToStore) {
357 if (!store())
358 return;
359
360 MockPersistentReportingStore::CommandList expected_commands;
361
362 // This first call to any public method triggers a load. The load will block
363 // until we call FinishLoading.
Rodney Ding329e4bb2021-03-19 22:21:53364 service()->ProcessReportToHeader(kUrl_, kNik_,
365 "{\"endpoints\":[{\"url\":\"" +
366 kEndpoint_.spec() +
367 "\"}],"
368 "\"group\":\"" +
369 kGroup_ +
370 "\","
371 "\"max_age\":86400}");
Sam Burnettf13c06b2019-07-30 15:53:49372 expected_commands.emplace_back(CommandType::LOAD_REPORTING_CLIENTS);
373 EXPECT_THAT(store()->GetAllCommands(),
374 testing::UnorderedElementsAreArray(expected_commands));
375
Rodney Ding329e4bb2021-03-19 22:21:53376 service()->ProcessReportToHeader(kUrl2_, kNik2_,
377 "{\"endpoints\":[{\"url\":\"" +
378 kEndpoint_.spec() +
379 "\"}],"
380 "\"group\":\"" +
381 kGroup_ +
382 "\","
383 "\"max_age\":86400}");
Sam Burnettf13c06b2019-07-30 15:53:49384 EXPECT_THAT(store()->GetAllCommands(),
385 testing::UnorderedElementsAreArray(expected_commands));
386
Matt Menke17b23c42020-10-22 05:14:57387 service()->QueueReport(kUrl_, kNik_, kUserAgent_, kGroup_, kType_,
388 std::make_unique<base::DictionaryValue>(), 0);
Sam Burnettf13c06b2019-07-30 15:53:49389 EXPECT_THAT(store()->GetAllCommands(),
390 testing::UnorderedElementsAreArray(expected_commands));
391
392 service()->RemoveBrowsingData(ReportingBrowsingDataRemover::DATA_TYPE_CLIENTS,
393 base::BindRepeating([](const GURL& url) {
394 return url.host() == "origin";
395 }));
396 EXPECT_THAT(store()->GetAllCommands(),
397 testing::UnorderedElementsAreArray(expected_commands));
398
399 service()->RemoveAllBrowsingData(
400 ReportingBrowsingDataRemover::DATA_TYPE_CLIENTS);
401 EXPECT_THAT(store()->GetAllCommands(),
402 testing::UnorderedElementsAreArray(expected_commands));
403
404 // Unblock the load. The will let the remaining calls to the service complete
405 // without blocking.
406 FinishLoading(true /* load_success */);
Lily Chenad5dd0802020-03-10 21:58:09407 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT,
408 kGroupKey_, kEndpoint_);
409 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT,
410 kGroupKey2_, kEndpoint_);
411 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP,
412 kGroupKey_);
413 expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP,
414 kGroupKey2_);
Sam Burnettf13c06b2019-07-30 15:53:49415 expected_commands.emplace_back(
Lily Chenad5dd0802020-03-10 21:58:09416 CommandType::UPDATE_REPORTING_ENDPOINT_GROUP_ACCESS_TIME, kGroupKey_);
417 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT,
418 kGroupKey_, kEndpoint_);
419 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT_GROUP,
420 kGroupKey_);
Sam Burnettf13c06b2019-07-30 15:53:49421 expected_commands.emplace_back(CommandType::FLUSH);
Lily Chenad5dd0802020-03-10 21:58:09422 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT,
423 kGroupKey2_, kEndpoint_);
424 expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT_GROUP,
425 kGroupKey2_);
Sam Burnettf13c06b2019-07-30 15:53:49426 expected_commands.emplace_back(CommandType::FLUSH);
427 EXPECT_THAT(store()->GetAllCommands(),
428 testing::UnorderedElementsAreArray(expected_commands));
429}
430
431INSTANTIATE_TEST_SUITE_P(ReportingServiceStoreTest,
432 ReportingServiceTest,
433 ::testing::Bool());
juliatuttle381d77e2017-04-07 18:54:12434} // namespace
435} // namespace net