1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_server_properties_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/test/test_simple_task_runner.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace net {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestHttpServerProperties[] = "TestHttpServerProperties";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingHttpServerPropertiesManager(
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      PrefService* pref_service,
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const char* pref_path,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : HttpServerPropertiesManager(pref_service, pref_path, io_task_runner) {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InitializeOnNetworkThread();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~TestingHttpServerPropertiesManager() {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make these methods public for testing.
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread;
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  using HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post tasks without a delay during tests.
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void StartPrefsUpdateTimerOnNetworkThread(
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::TimeDelta delay) OVERRIDE {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCacheFromPrefsOnUIConcrete() {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post tasks without a delay during tests.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void StartCacheUpdateTimerOnPrefThread(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::TimeDelta delay) OVERRIDE {
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HttpServerPropertiesManager::StartCacheUpdateTimerOnPrefThread(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void UpdatePrefsFromCacheOnNetworkThreadConcrete(
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Closure& callback) {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(callback);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MOCK_METHOD0(UpdateCacheFromPrefsOnPrefThread, void());
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkThread, void(const base::Closure&));
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD6(UpdateCacheFromPrefsOnNetworkThread,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(std::vector<std::string>* spdy_servers,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    net::SpdySettingsMap* spdy_settings_map,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    net::AlternateProtocolMap* alternate_protocol_map,
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    net::AlternateProtocolExperiment experiment,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    net::SupportsQuicMap* supports_quic_map,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool detected_corrupted_prefs));
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD4(UpdatePrefsOnPref,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(base::ListValue* spdy_server_list,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    net::SpdySettingsMap* spdy_settings_map,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    net::AlternateProtocolMap* alternate_protocol_map,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    net::SupportsQuicMap* supports_quic_map));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpServerPropertiesManagerTest : public testing::Test {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HttpServerPropertiesManagerTest() {}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pref_service_.registry()->RegisterDictionaryPref(kTestHttpServerProperties);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_server_props_manager_.reset(
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new StrictMock<TestingHttpServerPropertiesManager>(
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            &pref_service_,
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            kTestHttpServerProperties,
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            base::MessageLoop::current()->message_loop_proxy()));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectCacheUpdate();
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop().RunUntilIdle();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_server_props_manager_.get())
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      http_server_props_manager_->ShutdownOnPrefThread();
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop().RunUntilIdle();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_server_props_manager_.reset();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectCacheUpdate() {
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*http_server_props_manager_, UpdateCacheFromPrefsOnPrefThread())
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(Invoke(http_server_props_manager_.get(),
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         &TestingHttpServerPropertiesManager::
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             UpdateCacheFromPrefsOnUIConcrete));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectPrefsUpdate() {
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*http_server_props_manager_,
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                UpdatePrefsFromCacheOnNetworkThread(_))
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(Invoke(http_server_props_manager_.get(),
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         &TestingHttpServerPropertiesManager::
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             UpdatePrefsFromCacheOnNetworkThreadConcrete));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectPrefsUpdateRepeatedly() {
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*http_server_props_manager_,
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                UpdatePrefsFromCacheOnNetworkThread(_))
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillRepeatedly(
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            Invoke(http_server_props_manager_.get(),
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   &TestingHttpServerPropertiesManager::
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       UpdatePrefsFromCacheOnNetworkThreadConcrete));
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //base::RunLoop loop_;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple pref_service_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingHttpServerPropertiesManager> http_server_props_manager_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManagerTest);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       SingleUpdateForTwoSpdyServerPrefChanges) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCacheUpdate();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the prefs for www.google.com:80 and mail.google.com:80 and then set
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it twice. Only expect a single cache update.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* server_pref_dict = new base::DictionaryValue;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set supports_spdy for www.google.com:80.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_pref_dict->SetBoolean("supports_spdy", true);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up alternate_protocol for www.google.com:80.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* alternate_protocol = new base::DictionaryValue;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alternate_protocol->SetInteger("port", 443);
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  alternate_protocol->SetString("protocol_str", "npn-spdy/3");
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  server_pref_dict->SetWithoutPathExpansion("alternate_protocol",
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            alternate_protocol);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set up SupportsQuic for www.google.com:80.
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue* supports_quic = new base::DictionaryValue;
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  supports_quic->SetBoolean("used_quic", true);
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  supports_quic->SetString("address", "foo");
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  server_pref_dict->SetWithoutPathExpansion("supports_quic", supports_quic);
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the server preference for www.google.com:80.
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue* servers_dict = new base::DictionaryValue;
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  servers_dict->SetWithoutPathExpansion("www.google.com:80", server_pref_dict);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the preference for mail.google.com server.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* server_pref_dict1 = new base::DictionaryValue;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set supports_spdy for mail.google.com:80
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_pref_dict1->SetBoolean("supports_spdy", true);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up alternate_protocol for mail.google.com:80
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* alternate_protocol1 = new base::DictionaryValue;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alternate_protocol1->SetInteger("port", 444);
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  alternate_protocol1->SetString("protocol_str", "npn-spdy/3.1");
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  server_pref_dict1->SetWithoutPathExpansion("alternate_protocol",
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             alternate_protocol1);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set up SupportsQuic for mail.google.com:80
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue* supports_quic1 = new base::DictionaryValue;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  supports_quic1->SetBoolean("used_quic", false);
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  supports_quic1->SetString("address", "bar");
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  server_pref_dict1->SetWithoutPathExpansion("supports_quic", supports_quic1);
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the server preference for mail.google.com:80.
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  servers_dict->SetWithoutPathExpansion("mail.google.com:80",
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        server_pref_dict1);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue* http_server_properties_dict =
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new base::DictionaryValue;
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  HttpServerPropertiesManager::SetVersion(http_server_properties_dict, -1);
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  http_server_properties_dict->SetWithoutPathExpansion("servers", servers_dict);
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the same value for kHttpServerProperties multiple times.
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pref_service_.SetManagedPref(kTestHttpServerProperties,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               http_server_properties_dict);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* http_server_properties_dict2 =
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_properties_dict->DeepCopy();
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pref_service_.SetManagedPref(kTestHttpServerProperties,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               http_server_properties_dict2);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify SupportsSpdy.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(http_server_props_manager_->SupportsSpdy(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair::FromString("www.google.com:80")));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(http_server_props_manager_->SupportsSpdy(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair::FromString("mail.google.com:80")));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(http_server_props_manager_->SupportsSpdy(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair::FromString("foo.google.com:1337")));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify AlternateProtocol.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(http_server_props_manager_->HasAlternateProtocol(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair::FromString("www.google.com:80")));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(http_server_props_manager_->HasAlternateProtocol(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair::FromString("mail.google.com:80")));
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  net::AlternateProtocolInfo port_alternate_protocol =
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->GetAlternateProtocol(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          net::HostPortPair::FromString("www.google.com:80"));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(443, port_alternate_protocol.port);
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(net::NPN_SPDY_3, port_alternate_protocol.protocol);
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  port_alternate_protocol = http_server_props_manager_->GetAlternateProtocol(
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::HostPortPair::FromString("mail.google.com:80"));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(444, port_alternate_protocol.port);
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(net::NPN_SPDY_3_1, port_alternate_protocol.protocol);
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Verify SupportsQuic.
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::SupportsQuic supports_quic2 =
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      http_server_props_manager_->GetSupportsQuic(
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          net::HostPortPair::FromString("www.google.com:80"));
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(supports_quic2.used_quic);
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("foo", supports_quic2.address);
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  supports_quic2 = http_server_props_manager_->GetSupportsQuic(
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::HostPortPair::FromString("mail.google.com:80"));
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(supports_quic2.used_quic);
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("bar", supports_quic2.address);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, SupportsSpdy) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPrefsUpdate();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Post an update task to the network thread. SetSupportsSpdy calls
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ScheduleUpdatePrefsOnNetworkThread.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add mail.google.com:443 as a supporting spdy server.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostPortPair spdy_server_mail("mail.google.com", 443);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(http_server_props_manager_->SupportsSpdy(spdy_server_mail));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->SetSupportsSpdy(spdy_server_mail, true);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task.
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(http_server_props_manager_->SupportsSpdy(spdy_server_mail));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, SetSpdySetting) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPrefsUpdate();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add SpdySetting for mail.google.com:443.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostPortPair spdy_server_mail("mail.google.com", 443);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SpdySettingsIds id1 = net::SETTINGS_UPLOAD_BANDWIDTH;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SpdySettingsFlags flags1 = net::SETTINGS_FLAG_PLEASE_PERSIST;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 value1 = 31337;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->SetSpdySetting(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      spdy_server_mail, id1, flags1, value1);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task.
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SettingsMap& settings_map1_ret =
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->GetSpdySettings(spdy_server_mail);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, settings_map1_ret.size());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SettingsMap::const_iterator it1_ret = settings_map1_ret.find(id1);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(it1_ret != settings_map1_ret.end());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SettingsFlagsAndValue flags_and_value1_ret = it1_ret->second;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, flags_and_value1_ret.first);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(value1, flags_and_value1_ret.second);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ClearSpdySetting) {
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectPrefsUpdateRepeatedly();
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add SpdySetting for mail.google.com:443.
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::HostPortPair spdy_server_mail("mail.google.com", 443);
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SpdySettingsIds id1 = net::SETTINGS_UPLOAD_BANDWIDTH;
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SpdySettingsFlags flags1 = net::SETTINGS_FLAG_PLEASE_PERSIST;
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const uint32 value1 = 31337;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  http_server_props_manager_->SetSpdySetting(
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      spdy_server_mail, id1, flags1, value1);
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Run the task.
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SettingsMap& settings_map1_ret =
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      http_server_props_manager_->GetSpdySettings(spdy_server_mail);
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(1U, settings_map1_ret.size());
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SettingsMap::const_iterator it1_ret = settings_map1_ret.find(id1);
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(it1_ret != settings_map1_ret.end());
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SettingsFlagsAndValue flags_and_value1_ret = it1_ret->second;
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, flags_and_value1_ret.first);
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(value1, flags_and_value1_ret.second);
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clear SpdySetting for mail.google.com:443.
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  http_server_props_manager_->ClearSpdySettings(spdy_server_mail);
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Run the task.
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that there are no entries in the settings map for
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // mail.google.com:443.
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SettingsMap& settings_map2_ret =
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      http_server_props_manager_->GetSpdySettings(spdy_server_mail);
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(0U, settings_map2_ret.size());
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ClearAllSpdySetting) {
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectPrefsUpdateRepeatedly();
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add SpdySetting for mail.google.com:443.
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::HostPortPair spdy_server_mail("mail.google.com", 443);
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SpdySettingsIds id1 = net::SETTINGS_UPLOAD_BANDWIDTH;
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SpdySettingsFlags flags1 = net::SETTINGS_FLAG_PLEASE_PERSIST;
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const uint32 value1 = 31337;
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  http_server_props_manager_->SetSpdySetting(
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      spdy_server_mail, id1, flags1, value1);
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Run the task.
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SettingsMap& settings_map1_ret =
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      http_server_props_manager_->GetSpdySettings(spdy_server_mail);
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(1U, settings_map1_ret.size());
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SettingsMap::const_iterator it1_ret = settings_map1_ret.find(id1);
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(it1_ret != settings_map1_ret.end());
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SettingsFlagsAndValue flags_and_value1_ret = it1_ret->second;
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, flags_and_value1_ret.first);
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(value1, flags_and_value1_ret.second);
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clear All SpdySettings.
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  http_server_props_manager_->ClearAllSpdySettings();
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Run the task.
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that there are no entries in the settings map.
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SpdySettingsMap& spdy_settings_map2_ret =
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      http_server_props_manager_->spdy_settings_map();
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(0U, spdy_settings_map2_ret.size());
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, HasAlternateProtocol) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPrefsUpdate();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostPortPair spdy_server_mail("mail.google.com", 80);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->HasAlternateProtocol(spdy_server_mail));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->SetAlternateProtocol(
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      spdy_server_mail, 443, net::NPN_SPDY_3, 1);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task.
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->HasAlternateProtocol(spdy_server_mail));
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  net::AlternateProtocolInfo port_alternate_protocol =
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->GetAlternateProtocol(spdy_server_mail);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(443, port_alternate_protocol.port);
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(net::NPN_SPDY_3, port_alternate_protocol.protocol);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HttpServerPropertiesManagerTest, SupportsQuic) {
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectPrefsUpdate();
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::HostPortPair quic_server_mail("mail.google.com", 80);
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::SupportsQuic supports_quic = http_server_props_manager_->GetSupportsQuic(
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quic_server_mail);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(supports_quic.used_quic);
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", supports_quic.address);
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  http_server_props_manager_->SetSupportsQuic(quic_server_mail, true, "foo");
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Run the task.
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::SupportsQuic supports_quic1 =
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      http_server_props_manager_->GetSupportsQuic(quic_server_mail);
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(supports_quic1.used_quic);
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("foo", supports_quic1.address);
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, Clear) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPrefsUpdate();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostPortPair spdy_server_mail("mail.google.com", 443);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->SetSupportsSpdy(spdy_server_mail, true);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->SetAlternateProtocol(
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      spdy_server_mail, 443, net::NPN_SPDY_3, 1);
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  http_server_props_manager_->SetSupportsQuic(spdy_server_mail, true, "foo");
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SpdySettingsIds id1 = net::SETTINGS_UPLOAD_BANDWIDTH;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SpdySettingsFlags flags1 = net::SETTINGS_FLAG_PLEASE_PERSIST;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 value1 = 31337;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->SetSpdySetting(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      spdy_server_mail, id1, flags1, value1);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task.
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(http_server_props_manager_->SupportsSpdy(spdy_server_mail));
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->HasAlternateProtocol(spdy_server_mail));
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::SupportsQuic supports_quic = http_server_props_manager_->GetSupportsQuic(
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      spdy_server_mail);
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(supports_quic.used_quic);
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("foo", supports_quic.address);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check SPDY settings values.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SettingsMap& settings_map1_ret =
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->GetSpdySettings(spdy_server_mail);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, settings_map1_ret.size());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SettingsMap::const_iterator it1_ret = settings_map1_ret.find(id1);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(it1_ret != settings_map1_ret.end());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SettingsFlagsAndValue flags_and_value1_ret = it1_ret->second;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, flags_and_value1_ret.first);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(value1, flags_and_value1_ret.second);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPrefsUpdate();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear http server data, time out if we do not get a completion callback.
44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  http_server_props_manager_->Clear(base::MessageLoop::QuitClosure());
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().Run();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(http_server_props_manager_->SupportsSpdy(spdy_server_mail));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->HasAlternateProtocol(spdy_server_mail));
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::SupportsQuic supports_quic1 =
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      http_server_props_manager_->GetSupportsQuic(spdy_server_mail);
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(supports_quic1.used_quic);
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", supports_quic1.address);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SettingsMap& settings_map2_ret =
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_props_manager_->GetSpdySettings(spdy_server_mail);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, settings_map2_ret.size());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache0) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task to the UI thread.
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ShutdownOnPrefThread();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_.reset();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown and deletion.
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache1) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task.
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ShutdownOnPrefThread();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_.reset();
483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache2) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_->UpdateCacheFromPrefsOnUIConcrete();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ShutdownOnPrefThread();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_.reset();
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for shutdown when updating prefs.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs0) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task to the IO thread.
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ScheduleUpdatePrefsOnNetworkThread();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ShutdownOnPrefThread();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_.reset();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown and deletion.
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs1) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectPrefsUpdate();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post an update task.
513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ScheduleUpdatePrefsOnNetworkThread();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ShutdownOnPrefThread();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_.reset();
520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs2) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This posts a task to the UI thread.
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->UpdatePrefsFromCacheOnNetworkThreadConcrete(
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Closure());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown comes before the task is executed.
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_props_manager_->ShutdownOnPrefThread();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the task after shutdown, but before deletion.
530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_server_props_manager_.reset();
533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace net
539