// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/reporting/reporting_network_change_observer.h" #include "base/bind.h" #include "base/run_loop.h" #include "base/test/simple_test_tick_clock.h" #include "base/unguessable_token.h" #include "base/values.h" #include "net/base/network_change_notifier.h" #include "net/reporting/reporting_cache.h" #include "net/reporting/reporting_report.h" #include "net/reporting/reporting_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace net { namespace { class ReportingNetworkChangeObserverTest : public ReportingTestBase { protected: void SimulateNetworkChange() { // TODO: Need to SetTestNotificationsOnly(true) to keep things from flaking, // but have to figure out how to do that before NCN is created or how to // recreate NCN. NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( NetworkChangeNotifier::CONNECTION_NONE); base::RunLoop().RunUntilIdle(); NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( NetworkChangeNotifier::CONNECTION_WIFI); base::RunLoop().RunUntilIdle(); } void SetEndpoint() { ASSERT_TRUE(SetEndpointInCache(kGroupKey_, kEndpoint_, base::Time::Now() + base::Days(7))); } size_t report_count() { std::vector reports; cache()->GetReports(&reports); return reports.size(); } const absl::optional kReportingSource_ = absl::nullopt; const NetworkIsolationKey kNik_; const GURL kUrl_ = GURL("https://origin/path"); const url::Origin kOrigin_ = url::Origin::Create(kUrl_); const GURL kEndpoint_ = GURL("https://endpoint/"); const std::string kUserAgent_ = "Mozilla/1.0"; const std::string kGroup_ = "group"; const std::string kType_ = "default"; const ReportingEndpointGroupKey kGroupKey_ = ReportingEndpointGroupKey(NetworkIsolationKey(), kOrigin_, kGroup_); }; TEST_F(ReportingNetworkChangeObserverTest, ClearNothing) { ReportingPolicy new_policy = policy(); new_policy.persist_reports_across_network_changes = true; new_policy.persist_clients_across_network_changes = true; UsePolicy(new_policy); cache()->AddReport(kReportingSource_, kNik_, kUrl_, kUserAgent_, kGroup_, kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(), 0); SetEndpoint(); ASSERT_EQ(1u, report_count()); ASSERT_EQ(1u, cache()->GetEndpointCount()); SimulateNetworkChange(); EXPECT_EQ(1u, report_count()); EXPECT_EQ(1u, cache()->GetEndpointCount()); } TEST_F(ReportingNetworkChangeObserverTest, ClearReports) { ReportingPolicy new_policy = policy(); new_policy.persist_reports_across_network_changes = false; new_policy.persist_clients_across_network_changes = true; UsePolicy(new_policy); cache()->AddReport(kReportingSource_, kNik_, kUrl_, kUserAgent_, kGroup_, kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(), 0); SetEndpoint(); ASSERT_EQ(1u, report_count()); ASSERT_EQ(1u, cache()->GetEndpointCount()); SimulateNetworkChange(); EXPECT_EQ(0u, report_count()); EXPECT_EQ(1u, cache()->GetEndpointCount()); } TEST_F(ReportingNetworkChangeObserverTest, ClearClients) { ReportingPolicy new_policy = policy(); new_policy.persist_reports_across_network_changes = true; new_policy.persist_clients_across_network_changes = false; UsePolicy(new_policy); cache()->AddReport(kReportingSource_, kNik_, kUrl_, kUserAgent_, kGroup_, kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(), 0); SetEndpoint(); ASSERT_EQ(1u, report_count()); ASSERT_EQ(1u, cache()->GetEndpointCount()); SimulateNetworkChange(); EXPECT_EQ(1u, report_count()); EXPECT_EQ(0u, cache()->GetEndpointCount()); } TEST_F(ReportingNetworkChangeObserverTest, ClearReportsAndClients) { ReportingPolicy new_policy = policy(); new_policy.persist_reports_across_network_changes = false; new_policy.persist_clients_across_network_changes = false; UsePolicy(new_policy); cache()->AddReport(kReportingSource_, kNik_, kUrl_, kUserAgent_, kGroup_, kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(), 0); SetEndpoint(); ASSERT_EQ(1u, report_count()); ASSERT_EQ(1u, cache()->GetEndpointCount()); SimulateNetworkChange(); EXPECT_EQ(0u, report_count()); EXPECT_EQ(0u, cache()->GetEndpointCount()); } } // namespace } // namespace net