| // 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/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" |
| |
| 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::TimeDelta::FromDays(7))); |
| } |
| |
| size_t report_count() { |
| std::vector<const ReportingReport*> reports; |
| cache()->GetReports(&reports); |
| return reports.size(); |
| } |
| |
| 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(kNik_, kUrl_, kUserAgent_, kGroup_, kType_, |
| std::make_unique<base::DictionaryValue>(), 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(kNik_, kUrl_, kUserAgent_, kGroup_, kType_, |
| std::make_unique<base::DictionaryValue>(), 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(kNik_, kUrl_, kUserAgent_, kGroup_, kType_, |
| std::make_unique<base::DictionaryValue>(), 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(kNik_, kUrl_, kUserAgent_, kGroup_, kType_, |
| std::make_unique<base::DictionaryValue>(), 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 |