Index: net/http/http_server_properties_manager_unittest.cc |
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc |
index 0b9fb61c4e89f312bf9060b1956d2a63372d1700..35da22f80a630df82b799f7a1bcf91012f53752f 100644 |
--- a/net/http/http_server_properties_manager_unittest.cc |
+++ b/net/http/http_server_properties_manager_unittest.cc |
@@ -7,15 +7,16 @@ |
#include <memory> |
#include <utility> |
+#include "base/bind.h" |
#include "base/json/json_reader.h" |
#include "base/json/json_writer.h" |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
+#include "base/memory/ref_counted.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/stringprintf.h" |
+#include "base/test/scoped_mock_time_message_loop_task_runner.h" |
#include "base/test/test_mock_time_task_runner.h" |
#include "base/test/test_simple_task_runner.h" |
#include "base/threading/thread_task_runner_handle.h" |
@@ -81,12 +82,16 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { |
public: |
TestingHttpServerPropertiesManager( |
HttpServerPropertiesManager::PrefDelegate* pref_delegate, |
- scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> net_task_runner) |
+ scoped_refptr<TestMockTimeTaskRunner> pref_task_runner, |
+ scoped_refptr<TestMockTimeTaskRunner> net_task_runner) |
: HttpServerPropertiesManager(pref_delegate, |
pref_task_runner, |
- net_task_runner) { |
- InitializeOnNetworkThread(); |
+ net_task_runner), |
+ pref_task_runner_(std::move(pref_task_runner)), |
+ net_task_runner_(std::move(net_task_runner)) { |
+ // This call must run in the context of |net_task_runner_|. |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_); |
+ HttpServerPropertiesManager::InitializeOnNetworkThread(); |
} |
~TestingHttpServerPropertiesManager() override {} |
@@ -95,19 +100,23 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { |
using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread; |
void UpdateCacheFromPrefsOnUIConcrete() { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(pref_task_runner_); |
HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread(); |
} |
void UpdatePrefsFromCacheOnNetworkThreadConcrete( |
const base::Closure& callback) { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_); |
HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(callback); |
} |
void ScheduleUpdatePrefsOnNetworkThreadConcrete(Location location) { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_); |
HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread(location); |
} |
- void ScheduleUpdatePrefsOnNetworkThread() { |
+ void ScheduleUpdatePrefsOnNetworkThreadDefault() { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_); |
// Picked a random Location as caller. |
HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread( |
DETECTED_CORRUPTED_PREFS); |
@@ -132,6 +141,11 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { |
const base::Closure& completion)); |
private: |
+ // References to the underlying task runners, used to simulate running in |
+ // their contexts where required. |
+ scoped_refptr<TestMockTimeTaskRunner> pref_task_runner_; |
+ scoped_refptr<TestMockTimeTaskRunner> net_task_runner_; |
+ |
DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager); |
}; |
@@ -143,50 +157,36 @@ static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; |
class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { |
protected: |
- HttpServerPropertiesManagerTest() |
- : pref_test_task_runner_(new TestMockTimeTaskRunner()), |
- net_test_task_runner_(new TestMockTimeTaskRunner()) {} |
+ HttpServerPropertiesManagerTest() = default; |
void SetUp() override { |
one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1); |
pref_delegate_ = new MockPrefDelegate; |
http_server_props_manager_.reset( |
new StrictMock<TestingHttpServerPropertiesManager>( |
- pref_delegate_, pref_test_task_runner_, net_test_task_runner_)); |
+ pref_delegate_, pref_test_task_runner_.task_runner(), |
+ net_test_task_runner_)); |
EXPECT_FALSE(http_server_props_manager_->IsInitialized()); |
ExpectCacheUpdate(); |
EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
- pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
- // InitializeOnNetworkThread() is called from the test thread, so |
- // PostTaskAndReply() will post back to the test thread. |
- // TODO(xunjieli): Fix this in a follow-up so we can use |
- // |net_test_task_runner_|->RunUntilIdle(). |
- base::RunLoop().RunUntilIdle(); |
+ pref_test_task_runner_->RunUntilIdle(); |
+ net_test_task_runner_->RunUntilIdle(); |
EXPECT_TRUE(http_server_props_manager_->IsInitialized()); |
EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
} |
- void SetUpWithNonTaskRunner() { |
- pref_delegate_ = new MockPrefDelegate; |
- http_server_props_manager_.reset( |
- new StrictMock<TestingHttpServerPropertiesManager>( |
- pref_delegate_, base::ThreadTaskRunnerHandle::Get(), |
- net_test_task_runner_)); |
- |
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
- ExpectCacheUpdate(); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_TRUE(http_server_props_manager_->IsInitialized()); |
- } |
- |
void TearDown() override { |
if (http_server_props_manager_.get()) |
http_server_props_manager_->ShutdownOnPrefThread(); |
- base::RunLoop().RunUntilIdle(); |
- pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
- net_test_task_runner_->FastForwardUntilNoTasksRemain(); |
+ // Run pending non-delayed tasks but don't FastForwardUntilNoTasksRemain() |
+ // as some delayed tasks may forever repost (e.g. because impl doesn't use a |
+ // mock clock and doesn't see timings as having expired, ref. |
+ // HttpServerPropertiesImpl:: |
+ // ScheduleBrokenAlternateProtocolMappingsExpiration()). |
+ pref_test_task_runner_->RunUntilIdle(); |
+ net_test_task_runner_->RunUntilIdle(); |
http_server_props_manager_.reset(); |
} |
@@ -234,8 +234,16 @@ class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { |
std::unique_ptr<TestingHttpServerPropertiesManager> |
http_server_props_manager_; |
base::Time one_day_from_now_; |
- scoped_refptr<TestMockTimeTaskRunner> pref_test_task_runner_; |
- scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_; |
+ |
+ // Overrides the main thread's message loop with a mock tick clock. Making the |
+ // main thread the |pref_test_task_runner_| matches expectations better than |
+ // having an independent TestMockTimeTaskRunner and makes tests easier to |
+ // write. |
+ base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_; |
+ |
+ // Mock the net task runner as well. |
+ scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ = |
+ new TestMockTimeTaskRunner; |
private: |
DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManagerTest); |
@@ -655,8 +663,6 @@ TEST_P(HttpServerPropertiesManagerTest, SupportsSpdy) { |
// completed. |
TEST_P(HttpServerPropertiesManagerTest, |
SinglePrefUpdateForTwoSpdyServerCacheChanges) { |
- // Keep this in sync with http_server_properties_manager.cc |
- const int64_t kUpdatePrefsDelayMs = 60000; |
ExpectPrefsUpdate(2); |
ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(3); |
@@ -669,9 +675,10 @@ TEST_P(HttpServerPropertiesManagerTest, |
// The pref update task should be scheduled to network thread. |
EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
- // Move forward the task runner with kUpdatePrefsDelayMs/2. |
+ // Move forward the task runner short by 20ms. |
net_test_task_runner_->FastForwardBy( |
- base::TimeDelta::FromMilliseconds(kUpdatePrefsDelayMs / 2)); |
+ HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting() - |
+ base::TimeDelta::FromMilliseconds(20)); |
// Set another spdy server to trigger another call to |
// ScheduleUpdatePrefsOnNetworkThread. There should be no new update posted to |
@@ -681,9 +688,8 @@ TEST_P(HttpServerPropertiesManagerTest, |
EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
- // Forward another kUpdatePrefsDelayMs/2. The pref update should be executed. |
- net_test_task_runner_->FastForwardBy( |
- base::TimeDelta::FromMilliseconds(kUpdatePrefsDelayMs / 2)); |
+ // Move forward the extra 20ms. The pref update should be executed. |
+ net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); |
EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
@@ -802,38 +808,50 @@ TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServicesEmpty) { |
TEST_P(HttpServerPropertiesManagerTest, ConfirmAlternativeService) { |
ExpectPrefsUpdate(1); |
- url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); |
- EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); |
- AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 443); |
- |
- ExpectScheduleUpdatePrefsOnNetworkThread(); |
- http_server_props_manager_->SetAlternativeService( |
- spdy_server_mail, alternative_service, one_day_from_now_); |
- |
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
- alternative_service)); |
- EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
- alternative_service)); |
- |
- ExpectScheduleUpdatePrefsOnNetworkThread(); |
- http_server_props_manager_->MarkAlternativeServiceBroken(alternative_service); |
- EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken( |
- alternative_service)); |
- EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
- alternative_service)); |
- |
- ExpectScheduleUpdatePrefsOnNetworkThread(); |
- http_server_props_manager_->ConfirmAlternativeService(alternative_service); |
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
- alternative_service)); |
- EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
- alternative_service)); |
- // ExpectScheduleUpdatePrefsOnNetworkThread() should be called only once. |
- http_server_props_manager_->ConfirmAlternativeService(alternative_service); |
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
- alternative_service)); |
- EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
- alternative_service)); |
+ url::SchemeHostPort spdy_server_mail; |
+ AlternativeService alternative_service; |
+ |
+ { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
+ |
+ spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80); |
+ EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); |
+ alternative_service = |
+ AlternativeService(kProtoHTTP2, "mail.google.com", 443); |
+ |
+ ExpectScheduleUpdatePrefsOnNetworkThread(); |
+ http_server_props_manager_->SetAlternativeService( |
+ spdy_server_mail, alternative_service, one_day_from_now_); |
+ |
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
+ alternative_service)); |
+ EXPECT_FALSE( |
+ http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
+ alternative_service)); |
+ |
+ ExpectScheduleUpdatePrefsOnNetworkThread(); |
+ http_server_props_manager_->MarkAlternativeServiceBroken( |
+ alternative_service); |
+ EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken( |
+ alternative_service)); |
+ EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
+ alternative_service)); |
+ |
+ ExpectScheduleUpdatePrefsOnNetworkThread(); |
+ http_server_props_manager_->ConfirmAlternativeService(alternative_service); |
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
+ alternative_service)); |
+ EXPECT_FALSE( |
+ http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
+ alternative_service)); |
+ // ExpectScheduleUpdatePrefsOnNetworkThread() should be called only once. |
+ http_server_props_manager_->ConfirmAlternativeService(alternative_service); |
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
+ alternative_service)); |
+ EXPECT_FALSE( |
+ http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
+ alternative_service)); |
+ } |
// Run the task. |
EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
@@ -846,10 +864,14 @@ TEST_P(HttpServerPropertiesManagerTest, ConfirmAlternativeService) { |
Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
- alternative_service)); |
- EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
- alternative_service)); |
+ { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
+ alternative_service)); |
+ EXPECT_FALSE( |
+ http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
+ alternative_service)); |
+ } |
} |
TEST_P(HttpServerPropertiesManagerTest, SupportsQuic) { |
@@ -939,31 +961,33 @@ TEST_P(HttpServerPropertiesManagerTest, QuicServerInfo) { |
} |
TEST_P(HttpServerPropertiesManagerTest, Clear) { |
- // This task expect to run the QuitWhenIdleClosure in the current thread, |
- // thus can not mock the pref task runner. |
- SetUpWithNonTaskRunner(); |
- |
ExpectPrefsUpdate(1); |
ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(5); |
- url::SchemeHostPort spdy_server("https", "mail.google.com", 443); |
- http_server_props_manager_->SetSupportsSpdy(spdy_server, true); |
- AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 1234); |
- http_server_props_manager_->SetAlternativeService( |
- spdy_server, alternative_service, one_day_from_now_); |
- IPAddress actual_address(127, 0, 0, 1); |
- http_server_props_manager_->SetSupportsQuic(true, actual_address); |
- ServerNetworkStats stats; |
- stats.srtt = base::TimeDelta::FromMicroseconds(10); |
- http_server_props_manager_->SetServerNetworkStats(spdy_server, stats); |
- |
- QuicServerId mail_quic_server_id("mail.google.com", 80); |
- std::string quic_server_info1("quic_server_info1"); |
- http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, |
- quic_server_info1); |
+ const url::SchemeHostPort spdy_server("https", "mail.google.com", 443); |
+ const IPAddress actual_address(127, 0, 0, 1); |
+ const QuicServerId mail_quic_server_id("mail.google.com", 80); |
+ const std::string quic_server_info1("quic_server_info1"); |
+ |
+ { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
+ |
+ http_server_props_manager_->SetSupportsSpdy(spdy_server, true); |
+ AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", |
+ 1234); |
+ http_server_props_manager_->SetAlternativeService( |
+ spdy_server, alternative_service, one_day_from_now_); |
+ http_server_props_manager_->SetSupportsQuic(true, actual_address); |
+ ServerNetworkStats stats; |
+ stats.srtt = base::TimeDelta::FromMicroseconds(10); |
+ http_server_props_manager_->SetServerNetworkStats(spdy_server, stats); |
+ |
+ http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, |
+ quic_server_info1); |
+ } |
// Run the task. |
- base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
net_test_task_runner_->FastForwardUntilNoTasksRemain(); |
EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
@@ -983,10 +1007,14 @@ TEST_P(HttpServerPropertiesManagerTest, Clear) { |
ExpectPrefsUpdate(1); |
- // Clear http server data, time out if we do not get a completion callback. |
- http_server_props_manager_->Clear(base::MessageLoop::QuitWhenIdleClosure()); |
- |
- base::RunLoop().Run(); |
+ // Clear http server data and run the ensuing non-delayed prefs update. |
+ { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
+ http_server_props_manager_->Clear(); |
+ } |
+ EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
+ pref_test_task_runner_->RunUntilIdle(); |
+ EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
EXPECT_FALSE( |
@@ -1186,8 +1214,6 @@ TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) { |
TEST_P(HttpServerPropertiesManagerTest, |
SingleCacheUpdateForMultipleUpdatesScheduled) { |
- // Keep this in sync with http_server_properties_manager.cc |
- const int64_t kUpdateCacheDelayMs = 1000; |
// Update cache. |
ExpectCacheUpdate(); |
@@ -1196,17 +1222,17 @@ TEST_P(HttpServerPropertiesManagerTest, |
http_server_props_manager_->ScheduleUpdateCacheOnPrefThread(); |
EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount()); |
- // Move forward the task runner kUpdateCacheDelayMs/2. |
+ // Move forward the task runner short by 20ms. |
pref_test_task_runner_->FastForwardBy( |
- base::TimeDelta::FromMilliseconds(kUpdateCacheDelayMs / 2)); |
+ HttpServerPropertiesManager::GetUpdateCacheDelayForTesting() - |
+ base::TimeDelta::FromMilliseconds(20)); |
// Schedule a new cache update within the time window should be a no-op. |
http_server_props_manager_->ScheduleUpdateCacheOnPrefThread(); |
EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount()); |
- // Move forward the task runner kUpdateCaceDelayMs/2, now the cache update |
- // should be exectured. |
- pref_test_task_runner_->FastForwardBy( |
- base::TimeDelta::FromMilliseconds(kUpdateCacheDelayMs / 2)); |
+ // Move forward the task runner the extra 20ms, now the cache update should be |
+ // executed. |
+ pref_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); |
// Since this test has no pref corruption, there shouldn't be any pref update. |
EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
@@ -1295,44 +1321,56 @@ TEST_P(HttpServerPropertiesManagerTest, |
DoNotPersistExpiredOrBrokenAlternativeService) { |
ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(2); |
- AlternativeServiceInfoVector alternative_service_info_vector; |
- |
- const AlternativeService broken_alternative_service( |
- kProtoHTTP2, "broken.example.com", 443); |
- const base::Time time_one_day_later = |
- base::Time::Now() + base::TimeDelta::FromDays(1); |
- alternative_service_info_vector.push_back( |
- AlternativeServiceInfo(broken_alternative_service, time_one_day_later)); |
- // #1: MarkAlternativeServiceBroken(). |
- http_server_props_manager_->MarkAlternativeServiceBroken( |
- broken_alternative_service); |
- |
- const AlternativeService expired_alternative_service( |
- kProtoHTTP2, "expired.example.com", 443); |
- const base::Time time_one_day_ago = |
- base::Time::Now() - base::TimeDelta::FromDays(1); |
- alternative_service_info_vector.push_back( |
- AlternativeServiceInfo(expired_alternative_service, time_one_day_ago)); |
- |
- const AlternativeService valid_alternative_service(kProtoHTTP2, |
- "valid.example.com", 443); |
- alternative_service_info_vector.push_back( |
- AlternativeServiceInfo(valid_alternative_service, time_one_day_later)); |
- |
- const url::SchemeHostPort server("https", "www.example.com", 443); |
- // #2: SetAlternativeService(). |
- ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( |
- server, alternative_service_info_vector)); |
+ { |
+ TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
+ |
+ AlternativeServiceInfoVector alternative_service_info_vector; |
+ |
+ const AlternativeService broken_alternative_service( |
+ kProtoHTTP2, "broken.example.com", 443); |
+ const base::Time time_one_day_later = |
+ base::Time::Now() + base::TimeDelta::FromDays(1); |
+ alternative_service_info_vector.push_back( |
+ AlternativeServiceInfo(broken_alternative_service, time_one_day_later)); |
+ // #1: MarkAlternativeServiceBroken(). |
+ http_server_props_manager_->MarkAlternativeServiceBroken( |
+ broken_alternative_service); |
+ |
+ const AlternativeService expired_alternative_service( |
+ kProtoHTTP2, "expired.example.com", 443); |
+ const base::Time time_one_day_ago = |
+ base::Time::Now() - base::TimeDelta::FromDays(1); |
+ alternative_service_info_vector.push_back( |
+ AlternativeServiceInfo(expired_alternative_service, time_one_day_ago)); |
+ |
+ const AlternativeService valid_alternative_service( |
+ kProtoHTTP2, "valid.example.com", 443); |
+ alternative_service_info_vector.push_back( |
+ AlternativeServiceInfo(valid_alternative_service, time_one_day_later)); |
+ |
+ const url::SchemeHostPort server("https", "www.example.com", 443); |
+ // #2: SetAlternativeService(). |
+ ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( |
+ server, alternative_service_info_vector)); |
+ } |
// Update cache. |
ExpectPrefsUpdate(1); |
EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
- net_test_task_runner_->FastForwardUntilNoTasksRemain(); |
+ |
+ // |net_test_task_runner_| has a remaining pending task to expire |
+ // |broken_alternative_service| |time_one_day_later| (and the impl uses |
+ // TimeTicks::Now() without a mock clock so FastForwardUntilNoTasksRemain() |
+ // would result in an infinite loop). |
+ net_test_task_runner_->FastForwardBy( |
+ HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting()); |
+ EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount()); |
+ |
EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
+ EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount()); |
EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
const base::DictionaryValue& pref_dict = |
@@ -1457,7 +1495,7 @@ TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache2) { |
// |
TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs0) { |
// Post an update task to the IO thread. |
- http_server_props_manager_->ScheduleUpdatePrefsOnNetworkThread(); |
+ http_server_props_manager_->ScheduleUpdatePrefsOnNetworkThreadDefault(); |
// Shutdown comes before the task is executed. |
http_server_props_manager_->ShutdownOnPrefThread(); |
http_server_props_manager_.reset(); |
@@ -1472,7 +1510,7 @@ TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs0) { |
TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs1) { |
ExpectPrefsUpdate(1); |
// Post an update task. |
- http_server_props_manager_->ScheduleUpdatePrefsOnNetworkThread(); |
+ http_server_props_manager_->ScheduleUpdatePrefsOnNetworkThreadDefault(); |
// Shutdown comes before the task is executed. |
http_server_props_manager_->ShutdownOnPrefThread(); |
// Run the task after shutdown, but before deletion. |