diff options
author | rtenneti <rtenneti@chromium.org> | 2015-12-18 12:04:53 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-18 20:06:09 +0000 |
commit | 6dd347458f4bdcc934ac91092eacce2dfa3ee097 (patch) | |
tree | 6260b050d41e3b8371924db54dc435707fa3feed | |
parent | ebd55851dec2eacfc94c16ca6610ea70c3ead003 (diff) | |
download | chromium_src-6dd347458f4bdcc934ac91092eacce2dfa3ee097.zip chromium_src-6dd347458f4bdcc934ac91092eacce2dfa3ee097.tar.gz chromium_src-6dd347458f4bdcc934ac91092eacce2dfa3ee097.tar.bz2 |
SPDY Servers - Servers that are restored from preferences maintain MRU order
relative to the entries that are already in memory.
If an entry from Preferences is not in the memory, it will be added to
the end of MRU list.
If an entry from Preferences is already in the memory, it will be
updated and its MRU order is maintained.
Entries in the memory that are not in Preferences, maintain their
recency.
BUG=568386
R=bnc@chromium.org, rch@chromium.org
Review URL: https://codereview.chromium.org/1523543002
Cr-Commit-Position: refs/heads/master@{#366154}
-rw-r--r-- | net/http/http_server_properties_impl.cc | 16 | ||||
-rw-r--r-- | net/http/http_server_properties_impl_unittest.cc | 75 |
2 files changed, 80 insertions, 11 deletions
diff --git a/net/http/http_server_properties_impl.cc b/net/http/http_server_properties_impl.cc index bd4e38e..e2f710f 100644 --- a/net/http/http_server_properties_impl.cc +++ b/net/http/http_server_properties_impl.cc @@ -47,10 +47,24 @@ void HttpServerPropertiesImpl::InitializeSpdyServers( DCHECK(CalledOnValidThread()); if (!spdy_servers) return; + // Add the entries from persisted data. + SpdyServerHostPortMap spdy_servers_map(SpdyServerHostPortMap::NO_AUTO_EVICT); for (std::vector<std::string>::reverse_iterator it = spdy_servers->rbegin(); it != spdy_servers->rend(); ++it) { - spdy_servers_map_.Put(*it, support_spdy); + spdy_servers_map.Put(*it, support_spdy); + } + + // |spdy_servers_map| will have the memory cache. + spdy_servers_map_.Swap(spdy_servers_map); + + // Add the entries from the memory cache. + for (SpdyServerHostPortMap::reverse_iterator it = spdy_servers_map.rbegin(); + it != spdy_servers_map.rend(); ++it) { + // Add the entry if it is not in the cache, otherwise move it to the front + // of recency list. + if (spdy_servers_map_.Get(it->first) == spdy_servers_map_.end()) + spdy_servers_map_.Put(it->first, it->second); } } diff --git a/net/http/http_server_properties_impl_unittest.cc b/net/http/http_server_properties_impl_unittest.cc index 8a2eb0a..5bc43f4 100644 --- a/net/http/http_server_properties_impl_unittest.cc +++ b/net/http/http_server_properties_impl_unittest.cc @@ -109,9 +109,15 @@ TEST_F(SpdyServerPropertiesTest, Initialize) { HostPortPair spdy_server_google("www.google.com", 443); std::string spdy_server_g = spdy_server_google.ToString(); + HostPortPair spdy_server_photos("photos.google.com", 443); + std::string spdy_server_p = spdy_server_photos.ToString(); + HostPortPair spdy_server_docs("docs.google.com", 443); std::string spdy_server_d = spdy_server_docs.ToString(); + HostPortPair spdy_server_mail("mail.google.com", 443); + std::string spdy_server_m = spdy_server_mail.ToString(); + // Check by initializing NULL spdy servers. impl_.InitializeSpdyServers(NULL, true); EXPECT_FALSE(impl_.SupportsRequestPriority(spdy_server_google)); @@ -121,31 +127,80 @@ TEST_F(SpdyServerPropertiesTest, Initialize) { impl_.InitializeSpdyServers(&spdy_servers, true); EXPECT_FALSE(impl_.SupportsRequestPriority(spdy_server_google)); - // Check by initializing with www.google.com:443 spdy server. + // Check by initializing www.google.com:443 and photos.google.com:443 as spdy + // servers. std::vector<std::string> spdy_servers1; - spdy_servers1.push_back(spdy_server_g); + spdy_servers1.push_back(spdy_server_g); // Will be 0th index. + spdy_servers1.push_back(spdy_server_p); // Will be 1st index. impl_.InitializeSpdyServers(&spdy_servers1, true); + EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_photos)); EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_google)); - // Check by initializing with www.google.com:443 and docs.google.com:443 spdy - // servers. - std::vector<std::string> spdy_servers2; - spdy_servers2.push_back(spdy_server_g); - spdy_servers2.push_back(spdy_server_d); - impl_.InitializeSpdyServers(&spdy_servers2, true); - // Verify spdy_server_g and spdy_server_d are in the list in the same order. base::ListValue spdy_server_list; impl_.GetSpdyServerList(&spdy_server_list, kMaxSupportsSpdyServerHosts); EXPECT_EQ(2U, spdy_server_list.GetSize()); std::string string_value_g; + ASSERT_TRUE(spdy_server_list.GetString(0, &string_value_g)); // 0th index. + ASSERT_EQ(spdy_server_g, string_value_g); + std::string string_value_p; + ASSERT_TRUE(spdy_server_list.GetString(1, &string_value_p)); // 1st index. + ASSERT_EQ(spdy_server_p, string_value_p); + + // Check by initializing mail.google.com:443 and docs.google.com:443 as spdy + // servers. + std::vector<std::string> spdy_servers2; + spdy_servers2.push_back(spdy_server_m); // Will be 2nd index. + spdy_servers2.push_back(spdy_server_d); // Will be 3rd index. + impl_.InitializeSpdyServers(&spdy_servers2, true); + + // Verify all the servers are in the list in the same order. + spdy_server_list.Clear(); + impl_.GetSpdyServerList(&spdy_server_list, kMaxSupportsSpdyServerHosts); + EXPECT_EQ(4U, spdy_server_list.GetSize()); + ASSERT_TRUE(spdy_server_list.GetString(0, &string_value_g)); ASSERT_EQ(spdy_server_g, string_value_g); + ASSERT_TRUE(spdy_server_list.GetString(1, &string_value_p)); + ASSERT_EQ(spdy_server_p, string_value_p); + std::string string_value_m; + ASSERT_TRUE(spdy_server_list.GetString(2, &string_value_m)); + ASSERT_EQ(spdy_server_m, string_value_m); std::string string_value_d; - ASSERT_TRUE(spdy_server_list.GetString(1, &string_value_d)); + ASSERT_TRUE(spdy_server_list.GetString(3, &string_value_d)); ASSERT_EQ(spdy_server_d, string_value_d); + + EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_docs)); + EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_mail)); + EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_photos)); EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_google)); + + // Verify new data that is being initialized overwrites what is already in the + // memory and also verify the recency list order. + // + // Change supports SPDY value for photos and mails servers and order of + // initalization shouldn't matter. + std::vector<std::string> spdy_servers3; + spdy_servers3.push_back(spdy_server_m); + spdy_servers3.push_back(spdy_server_p); + impl_.InitializeSpdyServers(&spdy_servers3, false); + + // Verify the entries are in the same order. + ASSERT_TRUE(spdy_server_list.GetString(0, &string_value_g)); + ASSERT_EQ(spdy_server_g, string_value_g); + ASSERT_TRUE(spdy_server_list.GetString(1, &string_value_p)); + ASSERT_EQ(spdy_server_p, string_value_p); + ASSERT_TRUE(spdy_server_list.GetString(2, &string_value_m)); + ASSERT_EQ(spdy_server_m, string_value_m); + ASSERT_TRUE(spdy_server_list.GetString(3, &string_value_d)); + ASSERT_EQ(spdy_server_d, string_value_d); + + // Verify photos and mail servers don't support SPDY and other servers support + // SPDY. EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_docs)); + EXPECT_FALSE(impl_.SupportsRequestPriority(spdy_server_mail)); + EXPECT_FALSE(impl_.SupportsRequestPriority(spdy_server_photos)); + EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_google)); } TEST_F(SpdyServerPropertiesTest, SupportsRequestPriorityTest) { |