#include "net/http/broken_alternative_services.h"
#include <algorithm>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/test/test_mock_time_task_runner.h"
#include "base/time/tick_clock.h"
#include "base/time/time.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/schemeful_site.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace net {
namespace {
const uint64_t kBrokenAlternativeProtocolDelaySecs = 300;
class BrokenAlternativeServicesTest
: public BrokenAlternativeServices::Delegate,
public ::testing::Test {
public:
BrokenAlternativeServicesTest()
: test_task_runner_(base::MakeRefCounted<base::TestMockTimeTaskRunner>()),
test_task_runner_context_(test_task_runner_),
broken_services_clock_(test_task_runner_->GetMockTickClock()),
broken_services_(50, this, broken_services_clock_) {
SchemefulSite site1(GURL("http://foo.test"));
SchemefulSite site2(GURL("http://bar.test"));
network_anonymization_key1_ =
NetworkAnonymizationKey::CreateSameSite(site1);
network_anonymization_key2_ =
NetworkAnonymizationKey::CreateSameSite(site2);
}
void OnExpireBrokenAlternativeService(
const AlternativeService& expired_alternative_service,
const NetworkAnonymizationKey& network_anonymization_key) override {
expired_alt_svcs_.emplace_back(expired_alternative_service,
network_anonymization_key,
true );
}
void TestExponentialBackoff(base::TimeDelta initial_delay,
bool exponential_backoff_on_initial_delay);
scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_;
base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context_;
raw_ptr<const base::TickClock> broken_services_clock_;
BrokenAlternativeServices broken_services_;
std::vector<BrokenAlternativeService> expired_alt_svcs_;
NetworkAnonymizationKey network_anonymization_key1_;
NetworkAnonymizationKey network_anonymization_key2_;
};
TEST_F(BrokenAlternativeServicesTest, MarkBroken) {
const BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoHTTP2, "foo", 443),
network_anonymization_key1_, true );
const BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoHTTP2, "foo", 1234),
network_anonymization_key1_, true );
const BrokenAlternativeService alternative_service3(
AlternativeService(NextProto::kProtoHTTP2, "foo", 443),
network_anonymization_key2_, true );
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
broken_services_.MarkBroken(alternative_service1);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
broken_services_.MarkBroken(alternative_service2);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
broken_services_.MarkBroken(alternative_service3);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
broken_services_.Confirm(alternative_service1);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
broken_services_.Confirm(alternative_service2);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
broken_services_.Confirm(alternative_service3);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_EQ(0u, expired_alt_svcs_.size());
}
TEST_F(BrokenAlternativeServicesTest, MarkBrokenUntilDefaultNetworkChanges) {
const BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoHTTP2, "foo", 443),
network_anonymization_key1_, true );
const BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoHTTP2, "foo", 1234),
network_anonymization_key1_, true );
const BrokenAlternativeService alternative_service3(
AlternativeService(NextProto::kProtoHTTP2, "foo", 443),
network_anonymization_key2_, true );
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service1);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service2);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service3);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.Confirm(alternative_service1);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.Confirm(alternative_service2);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.Confirm(alternative_service3);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
EXPECT_EQ(0u, expired_alt_svcs_.size());
}
TEST_F(BrokenAlternativeServicesTest, MarkRecentlyBroken) {
const BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoHTTP2, "foo", 443),
network_anonymization_key1_, true );
const BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoHTTP2, "foo", 443),
network_anonymization_key2_, true );
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
broken_services_.MarkRecentlyBroken(alternative_service1);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
broken_services_.MarkRecentlyBroken(alternative_service2);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
broken_services_.Confirm(alternative_service1);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
broken_services_.Confirm(alternative_service2);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
}
TEST_F(BrokenAlternativeServicesTest, OnDefaultNetworkChanged) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key1_, true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "bar", 443),
network_anonymization_key1_, true );
BrokenAlternativeService alternative_service3(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key2_, true );
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service1);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(5) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service2);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service3));
broken_services_.MarkBroken(alternative_service3);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service3));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
broken_services_.OnDefaultNetworkChanged();
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service3));
}
TEST_F(BrokenAlternativeServicesTest,
ExpireBrokenAlternativeServiceOnDefaultNetwork) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key1_, true );
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(5) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_EQ(0u, expired_alt_svcs_.size());
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(test_task_runner_->HasPendingTask());
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
}
TEST_F(BrokenAlternativeServicesTest, ExpireBrokenAlternateProtocolMappings) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key1_, true );
broken_services_.MarkBroken(alternative_service);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(5) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_EQ(0u, expired_alt_svcs_.size());
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(test_task_runner_->HasPendingTask());
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
}
TEST_F(BrokenAlternativeServicesTest, IsBroken) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
base::TimeTicks brokenness_expiration;
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(
broken_services_.IsBroken(alternative_service, &brokenness_expiration));
broken_services_.MarkBroken(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(
broken_services_.IsBroken(alternative_service, &brokenness_expiration));
EXPECT_EQ(broken_services_clock_->NowTicks() + base::Minutes(5),
brokenness_expiration);
test_task_runner_->FastForwardBy(base::Minutes(5));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(
broken_services_.IsBroken(alternative_service, &brokenness_expiration));
broken_services_.MarkBroken(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(
broken_services_.IsBroken(alternative_service, &brokenness_expiration));
EXPECT_EQ(broken_services_clock_->NowTicks() + base::Minutes(10),
brokenness_expiration);
broken_services_.Confirm(alternative_service);
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(
broken_services_.IsBroken(alternative_service, &brokenness_expiration));
}
TEST_F(BrokenAlternativeServicesTest, BrokenAfterBrokenOnDefaultNetwork) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(
base::Seconds(kBrokenAlternativeProtocolDelaySecs) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(
base::Seconds(kBrokenAlternativeProtocolDelaySecs * 2) -
base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.OnDefaultNetworkChanged();
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
}
TEST_F(BrokenAlternativeServicesTest, BrokenOnDefaultNetworkAfterBroken) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBroken(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(
base::Seconds(kBrokenAlternativeProtocolDelaySecs) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service);
test_task_runner_->FastForwardBy(
base::Seconds(kBrokenAlternativeProtocolDelaySecs * 2) -
base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.OnDefaultNetworkChanged();
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service));
}
TEST_F(BrokenAlternativeServicesTest,
BrokenUntilDefaultNetworkChangeWithExponentialBackoff) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
EXPECT_EQ(base::Seconds(kBrokenAlternativeProtocolDelaySecs),
test_task_runner_->NextPendingTaskDelay());
test_task_runner_->FastForwardBy(
base::Seconds(kBrokenAlternativeProtocolDelaySecs) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
EXPECT_EQ(base::Seconds(kBrokenAlternativeProtocolDelaySecs * 2),
test_task_runner_->NextPendingTaskDelay());
test_task_runner_->FastForwardBy(
base::Seconds(kBrokenAlternativeProtocolDelaySecs * 2) -
base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.OnDefaultNetworkChanged();
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service));
broken_services_.MarkBrokenUntilDefaultNetworkChanges(alternative_service);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service));
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
EXPECT_EQ(base::Seconds(kBrokenAlternativeProtocolDelaySecs),
test_task_runner_->NextPendingTaskDelay());
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff) {
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(5) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(10) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(20) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(40) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(80) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(160) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(320) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(640) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(1280) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(2560) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(2880) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(base::Minutes(2880) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
}
void BrokenAlternativeServicesTest::TestExponentialBackoff(
base::TimeDelta initial_delay,
bool exponential_backoff_on_initial_delay) {
broken_services_.SetDelayParams(initial_delay,
exponential_backoff_on_initial_delay);
BrokenAlternativeService alternative_service(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBroken(alternative_service);
test_task_runner_->FastForwardBy(initial_delay - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
for (size_t broken_count = 1; broken_count < 20; ++broken_count) {
broken_services_.MarkBroken(alternative_service);
base::TimeDelta broken_delay;
if (exponential_backoff_on_initial_delay) {
broken_delay = initial_delay * (1 << broken_count);
} else {
broken_delay = base::Seconds(kBrokenAlternativeProtocolDelaySecs) *
(1 << (broken_count - 1));
}
if (broken_delay > base::Days(2)) {
broken_delay = base::Days(2);
}
test_task_runner_->FastForwardBy(broken_delay - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
}
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_OneSecond_True) {
TestExponentialBackoff(base::Seconds(1), true);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_OneSecond_False) {
TestExponentialBackoff(base::Seconds(1), false);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveSeconds_True) {
TestExponentialBackoff(base::Seconds(5), true);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveSeconds_False) {
TestExponentialBackoff(base::Seconds(5), false);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_TenSeconds_True) {
TestExponentialBackoff(base::Seconds(10), true);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_TenSeconds_False) {
TestExponentialBackoff(base::Seconds(10), false);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveMinutes_True) {
TestExponentialBackoff(base::Seconds(kBrokenAlternativeProtocolDelaySecs),
true);
}
TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveMinutes_False) {
TestExponentialBackoff(base::Seconds(kBrokenAlternativeProtocolDelaySecs),
false);
}
TEST_F(BrokenAlternativeServicesTest, RemoveExpiredBrokenAltSvc) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key1_, true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "bar", 443),
network_anonymization_key2_, true );
broken_services_.MarkBroken(alternative_service1);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(5));
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_.back().alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_.back().network_anonymization_key);
broken_services_.MarkBroken(alternative_service1);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(10));
EXPECT_EQ(2u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_.back().alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_.back().network_anonymization_key);
broken_services_.MarkBroken(alternative_service1);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(20));
EXPECT_EQ(3u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_.back().alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_.back().network_anonymization_key);
expired_alt_svcs_.clear();
broken_services_.MarkBroken(alternative_service1);
broken_services_.MarkBroken(alternative_service2);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
test_task_runner_->FastForwardBy(base::Minutes(5) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(0u, expired_alt_svcs_.size());
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service2.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
test_task_runner_->FastForwardBy(base::Minutes(40) - base::Minutes(5) -
base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service2.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(2u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service2.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_[1].alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_[1].network_anonymization_key);
}
TEST_F(BrokenAlternativeServicesTest,
RemoveExpiredBrokenAltSvcWithNetworkAnonymizationKey) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key1_, true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
network_anonymization_key2_, true );
broken_services_.MarkBroken(alternative_service1);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(5));
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_.back().alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_.back().network_anonymization_key);
broken_services_.MarkBroken(alternative_service1);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(10));
EXPECT_EQ(2u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_.back().alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_.back().network_anonymization_key);
broken_services_.MarkBroken(alternative_service1);
EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
test_task_runner_->FastForwardBy(base::Minutes(20));
EXPECT_EQ(3u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_.back().alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_.back().network_anonymization_key);
expired_alt_svcs_.clear();
broken_services_.MarkBroken(alternative_service1);
broken_services_.MarkBroken(alternative_service2);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
test_task_runner_->FastForwardBy(base::Minutes(5) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(0u, expired_alt_svcs_.size());
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service2.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
test_task_runner_->FastForwardBy(base::Minutes(40) - base::Minutes(5) -
base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(1u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service2.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_EQ(2u, expired_alt_svcs_.size());
EXPECT_EQ(alternative_service2.alternative_service,
expired_alt_svcs_[0].alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
expired_alt_svcs_[0].network_anonymization_key);
EXPECT_EQ(alternative_service1.alternative_service,
expired_alt_svcs_[1].alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
expired_alt_svcs_[1].network_anonymization_key);
}
TEST_F(BrokenAlternativeServicesTest, SetBrokenAlternativeServices) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo1", 443),
NetworkAnonymizationKey(), true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "foo2", 443),
NetworkAnonymizationKey(), true );
base::TimeDelta delay1 = base::Minutes(1);
std::unique_ptr<BrokenAlternativeServiceList> broken_list =
std::make_unique<BrokenAlternativeServiceList>();
broken_list->push_back(
{alternative_service1, broken_services_clock_->NowTicks() + delay1});
std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map =
std::make_unique<RecentlyBrokenAlternativeServices>(10);
recently_broken_map->Put(alternative_service1, 1);
recently_broken_map->Put(alternative_service2, 2);
broken_services_.SetBrokenAndRecentlyBrokenAlternativeServices(
std::move(broken_list), std::move(recently_broken_map));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
test_task_runner_->FastForwardBy(delay1 - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
broken_services_.MarkBroken(alternative_service2);
broken_services_.MarkBroken(alternative_service1);
test_task_runner_->FastForwardBy(base::Minutes(10) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
test_task_runner_->FastForwardBy(base::Minutes(20) - base::Minutes(10) -
base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
}
TEST_F(BrokenAlternativeServicesTest,
SetBrokenAlternativeServicesWithExisting) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo1", 443),
NetworkAnonymizationKey(), true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "foo2", 443),
network_anonymization_key1_, true );
BrokenAlternativeService alternative_service3(
AlternativeService(NextProto::kProtoQUIC, "foo3", 443),
network_anonymization_key2_, true );
std::unique_ptr<BrokenAlternativeServiceList> broken_list =
std::make_unique<BrokenAlternativeServiceList>();
broken_list->push_back(
{alternative_service1,
broken_services_clock_->NowTicks() + base::Minutes(3)});
broken_list->push_back(
{alternative_service3,
broken_services_clock_->NowTicks() + base::Minutes(1)});
std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map =
std::make_unique<RecentlyBrokenAlternativeServices>(10);
recently_broken_map->Put(alternative_service1, 1);
recently_broken_map->Put(alternative_service3, 1);
broken_services_.MarkBroken(alternative_service1);
broken_services_.MarkBroken(alternative_service2);
broken_services_.SetBrokenAndRecentlyBrokenAlternativeServices(
std::move(broken_list), std::move(recently_broken_map));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
test_task_runner_->FastForwardBy(base::Minutes(1) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service3));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
test_task_runner_->FastForwardBy(base::Minutes(2) - base::Seconds(1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
test_task_runner_->FastForwardBy(base::Minutes(2) - base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
test_task_runner_->FastForwardBy(base::Seconds(1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service3));
auto it = broken_services_.recently_broken_alternative_services().begin();
EXPECT_EQ(alternative_service2.alternative_service,
it->first.alternative_service);
EXPECT_EQ(alternative_service2.network_anonymization_key,
it->first.network_anonymization_key);
++it;
EXPECT_EQ(alternative_service1.alternative_service,
it->first.alternative_service);
EXPECT_EQ(alternative_service1.network_anonymization_key,
it->first.network_anonymization_key);
++it;
EXPECT_EQ(alternative_service3.alternative_service,
it->first.alternative_service);
EXPECT_EQ(alternative_service3.network_anonymization_key,
it->first.network_anonymization_key);
}
TEST_F(BrokenAlternativeServicesTest, ScheduleExpireTaskAfterExpire) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "bar", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBroken(alternative_service1);
test_task_runner_->FastForwardBy(base::Minutes(5));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(test_task_runner_->HasPendingTask());
broken_services_.MarkBroken(alternative_service1);
broken_services_.MarkBroken(alternative_service2);
test_task_runner_->FastForwardBy(base::Minutes(5));
EXPECT_FALSE(broken_services_.IsBroken(alternative_service2));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(test_task_runner_->HasPendingTask());
}
TEST_F(BrokenAlternativeServicesTest, Clear) {
BrokenAlternativeService alternative_service1(
AlternativeService(NextProto::kProtoQUIC, "foo", 443),
NetworkAnonymizationKey(), true );
BrokenAlternativeService alternative_service2(
AlternativeService(NextProto::kProtoQUIC, "bar", 443),
NetworkAnonymizationKey(), true );
broken_services_.MarkBroken(alternative_service1);
broken_services_.MarkRecentlyBroken(alternative_service2);
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
broken_services_.Clear();
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
std::unique_ptr<BrokenAlternativeServiceList> broken_list =
std::make_unique<BrokenAlternativeServiceList>();
broken_list->push_back(
{alternative_service1,
broken_services_clock_->NowTicks() + base::Minutes(1)});
std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map =
std::make_unique<RecentlyBrokenAlternativeServices>(10);
recently_broken_map->Put(alternative_service2, 2);
broken_services_.SetBrokenAndRecentlyBrokenAlternativeServices(
std::move(broken_list), std::move(recently_broken_map));
EXPECT_TRUE(broken_services_.IsBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_TRUE(broken_services_.WasRecentlyBroken(alternative_service2));
broken_services_.Clear();
EXPECT_FALSE(broken_services_.IsBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service1));
EXPECT_FALSE(broken_services_.WasRecentlyBroken(alternative_service2));
}
}
}