Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 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/http/broken_alternative_services.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 #include <vector> | |
| 9 | |
| 10 #include "base/test/test_mock_time_task_runner.h" | |
| 11 #include "base/time/tick_clock.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | |
| 13 | |
| 14 namespace net { | |
| 15 | |
| 16 namespace { | |
| 17 | |
| 18 const base::TimeDelta BROKEN_ALT_SVC_EXPIRE_DELAYS[10] = { | |
| 19 base::TimeDelta::FromSeconds(300), base::TimeDelta::FromSeconds(600), | |
|
Ryan Hamilton
2017/05/27 13:28:16
Since these are all more than 60 seconds, how abou
wangyix1
2017/05/30 21:18:18
Done.
| |
| 20 base::TimeDelta::FromSeconds(1200), base::TimeDelta::FromSeconds(2400), | |
| 21 base::TimeDelta::FromSeconds(4800), base::TimeDelta::FromSeconds(9600), | |
| 22 base::TimeDelta::FromSeconds(19200), base::TimeDelta::FromSeconds(38400), | |
| 23 base::TimeDelta::FromSeconds(76800), base::TimeDelta::FromSeconds(153600), | |
| 24 }; | |
| 25 | |
| 26 class BrokenAlternativeServicesTest | |
| 27 : public BrokenAlternativeServices::Delegate, | |
| 28 public ::testing::Test { | |
| 29 public: | |
| 30 BrokenAlternativeServicesTest() | |
| 31 : test_task_runner_(new base::TestMockTimeTaskRunner()), | |
| 32 broken_services_clock_(test_task_runner_->GetMockTickClock()), | |
| 33 broken_services_(this, broken_services_clock_.get()) {} | |
| 34 | |
| 35 // BrokenAlternativeServices::Delegate implementation | |
| 36 void OnExpireBrokenAlternativeService( | |
| 37 const AlternativeService& expired_alternative_service) override { | |
| 38 expired_alt_svcs_.push_back(expired_alternative_service); | |
| 39 } | |
| 40 | |
| 41 scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_; | |
| 42 | |
| 43 std::unique_ptr<base::TickClock> broken_services_clock_; | |
| 44 BrokenAlternativeServices broken_services_; | |
| 45 | |
| 46 std::vector<AlternativeService> expired_alt_svcs_; | |
| 47 }; | |
| 48 | |
| 49 TEST_F(BrokenAlternativeServicesTest, MarkBroken) { | |
| 50 const AlternativeService alternative_service1(kProtoHTTP2, "foo", 443); | |
| 51 const AlternativeService alternative_service2(kProtoHTTP2, "foo", 1234); | |
| 52 | |
| 53 EXPECT_FALSE( | |
| 54 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 55 EXPECT_FALSE( | |
| 56 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 57 | |
| 58 broken_services_.MarkAlternativeServiceBroken(alternative_service1); | |
| 59 | |
| 60 EXPECT_TRUE( | |
| 61 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 62 EXPECT_FALSE( | |
| 63 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 64 | |
| 65 broken_services_.MarkAlternativeServiceBroken(alternative_service2); | |
| 66 | |
| 67 EXPECT_TRUE( | |
| 68 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 69 EXPECT_TRUE( | |
| 70 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 71 | |
| 72 broken_services_.ConfirmAlternativeService(alternative_service1); | |
| 73 | |
| 74 EXPECT_FALSE( | |
| 75 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 76 EXPECT_TRUE( | |
| 77 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 78 | |
| 79 broken_services_.ConfirmAlternativeService(alternative_service2); | |
| 80 | |
| 81 EXPECT_FALSE( | |
| 82 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 83 EXPECT_FALSE( | |
| 84 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 85 | |
| 86 EXPECT_EQ(0u, expired_alt_svcs_.size()); | |
| 87 } | |
| 88 | |
| 89 TEST_F(BrokenAlternativeServicesTest, MarkRecentlyBroken) { | |
| 90 const AlternativeService alternative_service(kProtoHTTP2, "foo", 443); | |
| 91 | |
| 92 EXPECT_FALSE( | |
| 93 broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
| 94 EXPECT_FALSE(broken_services_.WasAlternativeServiceRecentlyBroken( | |
| 95 alternative_service)); | |
| 96 | |
| 97 broken_services_.MarkAlternativeServiceRecentlyBroken(alternative_service); | |
| 98 EXPECT_FALSE( | |
| 99 broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
| 100 EXPECT_TRUE(broken_services_.WasAlternativeServiceRecentlyBroken( | |
| 101 alternative_service)); | |
| 102 | |
| 103 broken_services_.ConfirmAlternativeService(alternative_service); | |
| 104 EXPECT_FALSE( | |
| 105 broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
| 106 EXPECT_FALSE(broken_services_.WasAlternativeServiceRecentlyBroken( | |
| 107 alternative_service)); | |
| 108 } | |
| 109 | |
| 110 TEST_F(BrokenAlternativeServicesTest, ExpireBrokenAlternateProtoclMappings) { | |
| 111 AlternativeService alternative_service(kProtoQUIC, "foo", 443); | |
| 112 | |
| 113 EXPECT_FALSE( | |
| 114 broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
| 115 EXPECT_FALSE(broken_services_.WasAlternativeServiceRecentlyBroken( | |
| 116 alternative_service)); | |
|
Ryan Hamilton
2017/05/27 13:28:16
nit: no need to test this since you verified the i
wangyix1
2017/05/30 21:18:18
Done.
| |
| 117 | |
| 118 { | |
| 119 base::TestMockTimeTaskRunner::ScopedContext scoped_context( | |
| 120 test_task_runner_); | |
|
Ryan Hamilton
2017/05/27 13:28:16
Can you remove this ScopedContext? (and the nestin
wangyix1
2017/05/30 21:18:18
Done.
| |
| 121 broken_services_.MarkAlternativeServiceBroken(alternative_service); | |
| 122 } | |
| 123 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
|
Ryan Hamilton
2017/05/27 13:28:16
ditto
wangyix1
2017/05/30 21:18:18
Done.
| |
| 124 | |
| 125 // |broken_services_| should have posted task to expire the brokenness of | |
| 126 // |alternative_service|. | |
| 127 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount()); | |
| 128 | |
| 129 // Advance time until one time quantum before |alternative_service1|'s | |
| 130 // brokenness expires | |
| 131 test_task_runner_->FastForwardBy(BROKEN_ALT_SVC_EXPIRE_DELAYS[0] - | |
|
Ryan Hamilton
2017/05/27 13:28:16
can you inline FromMinutes(5) instead of using thi
wangyix1
2017/05/30 21:18:18
Done.
| |
| 132 base::TimeDelta::FromInternalValue(1)); | |
| 133 | |
| 134 // Ensure |alternative_service| is still marked broken. | |
|
Ryan Hamilton
2017/05/27 13:28:16
nit: might want to check that there is still a pos
wangyix1
2017/05/30 21:18:18
Done.
| |
| 135 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
| 136 EXPECT_EQ(0u, expired_alt_svcs_.size()); | |
| 137 | |
| 138 // Advance time by just enough so that |alternative_service|'s brokenness | |
| 139 // expires. | |
| 140 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); | |
| 141 | |
| 142 // Ensure |alternative_service| brokenness has expired. | |
| 143 EXPECT_FALSE( | |
|
Ryan Hamilton
2017/05/27 13:28:16
nit: might want to check that there are no posted
wangyix1
2017/05/30 21:18:18
Done.
| |
| 144 broken_services_.IsAlternativeServiceBroken(alternative_service)); | |
|
Ryan Hamilton
2017/05/27 13:28:16
It should now be RecentlyBroken, right? Can you ve
wangyix1
2017/05/30 21:18:18
Done.
| |
| 145 EXPECT_EQ(1u, expired_alt_svcs_.size()); | |
| 146 EXPECT_EQ(alternative_service, expired_alt_svcs_[0]); | |
| 147 } | |
|
Ryan Hamilton
2017/05/27 13:28:16
Nice test! Very clear.
Let's add another test wh
wangyix1
2017/05/30 21:18:18
Done.
Ryan Hamilton
2017/05/30 21:32:28
Thanks for adding the test. Can we unroll the loop
wangyix1
2017/05/30 23:57:49
Done.
| |
| 148 | |
| 149 TEST_F(BrokenAlternativeServicesTest, RemoveExpiredBrokenAltSvc) { | |
| 150 // This test will mark broken an alternative service A that has already been | |
| 151 // marked broken many times, then immediately mark another alternative service | |
| 152 // B as broken for the first time. Because A's been marked broken many times | |
| 153 // already, its brokenness will be scheduled to expire much further in the | |
| 154 // future than B, even though it was marked broken before B. This test makes | |
| 155 // sure that even though A was marked broken before B, B's brokenness should | |
| 156 // expire before A. | |
| 157 | |
| 158 AlternativeService alternative_service1(kProtoQUIC, "foo", 443); | |
| 159 AlternativeService alternative_service2(kProtoQUIC, "bar", 443); | |
| 160 | |
| 161 // Repeately mark |alternative_service1| broken and let brokenness expire. | |
| 162 // Do this a few times. | |
| 163 for (int i = 0; i < 3; ++i) { | |
| 164 { | |
| 165 base::TestMockTimeTaskRunner::ScopedContext scoped_context( | |
| 166 test_task_runner_); | |
|
Ryan Hamilton
2017/05/27 13:28:16
ditto about the scoped context
wangyix1
2017/05/30 21:18:18
Done.
| |
| 167 broken_services_.MarkAlternativeServiceBroken(alternative_service1); | |
| 168 } | |
| 169 EXPECT_TRUE( | |
| 170 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
|
Ryan Hamilton
2017/05/27 13:28:16
nit: no need to re-verify this since you've done s
wangyix1
2017/05/30 21:18:18
Done.
| |
| 171 | |
| 172 // |broken_services_| should have posted task to expire the brokenness of | |
| 173 // |alternative_service|. | |
| 174 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount()); | |
| 175 | |
| 176 // Advance time by just enough so that |alternative_service|'s brokenness | |
| 177 // expires. | |
| 178 test_task_runner_->FastForwardBy(BROKEN_ALT_SVC_EXPIRE_DELAYS[i]); | |
| 179 | |
| 180 // Ensure |alternative_service| brokenness has expired | |
| 181 EXPECT_FALSE( | |
| 182 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 183 EXPECT_EQ(i + 1, (int)expired_alt_svcs_.size()); | |
| 184 EXPECT_EQ(alternative_service1, expired_alt_svcs_[i]); | |
| 185 } | |
| 186 expired_alt_svcs_.clear(); | |
| 187 | |
| 188 // Mark |alternative_service1| broken (will be given longer expiration delay), | |
| 189 // then mark |alternative_service2| broken (will be given shorter expiration | |
| 190 // delay). | |
| 191 { | |
| 192 base::TestMockTimeTaskRunner::ScopedContext scoped_context( | |
| 193 test_task_runner_); | |
|
Ryan Hamilton
2017/05/27 13:28:16
can you remove this?
wangyix1
2017/05/30 21:18:18
Done.
| |
| 194 | |
| 195 broken_services_.MarkAlternativeServiceBroken(alternative_service1); | |
| 196 broken_services_.MarkAlternativeServiceBroken(alternative_service2); | |
| 197 } | |
| 198 EXPECT_TRUE( | |
| 199 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 200 EXPECT_TRUE( | |
| 201 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 202 | |
| 203 // Advance time until one time quantum before |alternative_service2|'s | |
| 204 // brokenness expires. | |
| 205 test_task_runner_->FastForwardBy(BROKEN_ALT_SVC_EXPIRE_DELAYS[0] - | |
| 206 base::TimeDelta::FromInternalValue(1)); | |
| 207 | |
| 208 EXPECT_TRUE( | |
| 209 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 210 EXPECT_TRUE( | |
| 211 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 212 EXPECT_EQ(0u, expired_alt_svcs_.size()); | |
| 213 | |
| 214 // Advance time by one time quantum. |alternative_service2| should no longer | |
| 215 // be broken. | |
| 216 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); | |
| 217 | |
| 218 EXPECT_TRUE( | |
| 219 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 220 EXPECT_FALSE( | |
| 221 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 222 EXPECT_EQ(1u, expired_alt_svcs_.size()); | |
| 223 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]); | |
| 224 | |
| 225 // Advance time until one time quantum before |alternative_service1|'s | |
| 226 // brokenness expires | |
| 227 test_task_runner_->FastForwardBy(BROKEN_ALT_SVC_EXPIRE_DELAYS[3] - | |
| 228 BROKEN_ALT_SVC_EXPIRE_DELAYS[0] - | |
| 229 base::TimeDelta::FromInternalValue(1)); | |
| 230 | |
| 231 EXPECT_TRUE( | |
| 232 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 233 EXPECT_FALSE( | |
| 234 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 235 EXPECT_EQ(1u, expired_alt_svcs_.size()); | |
| 236 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]); | |
| 237 | |
| 238 // Advance time by one time quantum. |alternative_service1| should no longer | |
| 239 // be broken. | |
| 240 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); | |
| 241 | |
| 242 EXPECT_FALSE( | |
| 243 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | |
| 244 EXPECT_FALSE( | |
| 245 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | |
| 246 EXPECT_EQ(2u, expired_alt_svcs_.size()); | |
| 247 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]); | |
| 248 EXPECT_EQ(alternative_service1, expired_alt_svcs_[1]); | |
| 249 } | |
| 250 | |
| 251 } // namespace | |
| 252 | |
| 253 } // namespace net | |
| OLD | NEW |