| Index: chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.cc
|
| diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.cc
|
| index 5721de91f27fef4197db55bff02ec29c2efb8c26..1ca8938ef43d6c43dc08cf5280b8ebde50ef6fcd 100644
|
| --- a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.cc
|
| +++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.cc
|
| @@ -5,11 +5,13 @@
|
| #include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.h"
|
|
|
| #include "base/command_line.h"
|
| +#include "base/md5.h"
|
| #include "base/metrics/field_trial.h"
|
| #include "base/prefs/pref_registry_simple.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "base/prefs/testing_pref_service.h"
|
| #include "base/strings/string_number_conversions.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| #include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings.h"
|
| #include "chrome/browser/prefs/proxy_prefs.h"
|
| #include "chrome/browser/prefs/scoped_user_pref_update.h"
|
| @@ -17,11 +19,16 @@
|
| #include "chrome/common/metrics/variations/variations_util.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "components/variations/entropy_provider.h"
|
| +#include "net/base/auth.h"
|
| +#include "net/base/host_port_pair.h"
|
| +#include "net/http/http_auth.h"
|
| +#include "net/http/http_auth_cache.h"
|
| #include "net/url_request/test_url_fetcher_factory.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "url/gurl.h"
|
|
|
| -const char kDataReductionProxyOrigin[] = "https://foo:443/";
|
| +const char kDataReductionProxyOrigin[] = "https://foo.com:443/";
|
| +const char kDataReductionProxyFallback[] = "http://bar.com:80";
|
| const char kDataReductionProxyAuth[] = "12345";
|
|
|
| const char kProbeURLWithOKResponse[] = "http://ok.org/";
|
| @@ -40,6 +47,7 @@ class TestDataReductionProxySettings
|
| local_state_prefs_(local_state_prefs) {
|
| }
|
|
|
| + // TODO(marq): Replace virtual methods with MOCKs. Also mock LogProxyState.
|
| // DataReductionProxySettings implementation:
|
| virtual net::URLFetcher* GetURLFetcher() OVERRIDE {
|
| if (test_url_.empty())
|
| @@ -89,6 +97,8 @@ void DataReductionProxySettingsTestBase::AddProxyToCommandLine() {
|
| CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| switches::kSpdyProxyAuthOrigin, kDataReductionProxyOrigin);
|
| CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| + switches::kSpdyProxyAuthFallback, kDataReductionProxyFallback);
|
| + CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| switches::kSpdyProxyAuthValue, kDataReductionProxyAuth);
|
| }
|
|
|
| @@ -133,8 +143,10 @@ void DataReductionProxySettingsTestBase::CheckProxyPref(
|
| void DataReductionProxySettingsTestBase::CheckProxyConfigs(
|
| bool expected_enabled) {
|
| if (expected_enabled) {
|
| + std::string main_proxy = kDataReductionProxyOrigin;
|
| + std::string fallback_proxy = kDataReductionProxyFallback;
|
| std::string servers =
|
| - "http=" + Settings()->GetDataReductionProxyOrigin() + ",direct://;";
|
| + "http=" + main_proxy + "," + fallback_proxy + ",direct://;";
|
| CheckProxyPref(servers,
|
| ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS));
|
| } else {
|
| @@ -214,32 +226,95 @@ class DataReductionProxySettingsTest:
|
| scoped_ptr<TestDataReductionProxySettings> settings_;
|
| };
|
|
|
| +TEST_F(DataReductionProxySettingsTest, TestAuthenticationInit) {
|
| + AddProxyToCommandLine();
|
| + net::HttpAuthCache cache;
|
| + DataReductionProxySettings::InitDataReductionAuthentication(&cache);
|
| + DataReductionProxySettings::DataReductionProxyList proxies =
|
| + DataReductionProxySettings::GetDataReductionProxies();
|
| + for (DataReductionProxySettings::DataReductionProxyList::iterator it =
|
| + proxies.begin(); it != proxies.end(); ++it) {
|
| + //GURL server = (*it).GetOrigin();
|
| + net::HttpAuthCache::Entry* entry =
|
| + cache.LookupByPath(*it, std::string());
|
| + EXPECT_TRUE(entry != NULL);
|
| + EXPECT_EQ(net::HttpAuth::AUTH_SCHEME_SPDYPROXY, entry->scheme());
|
| + EXPECT_EQ("SpdyProxy", entry->auth_challenge().substr(0,9));
|
| + }
|
| + GURL bad_server = GURL("https://bad.proxy.com/");
|
| + net::HttpAuthCache::Entry* entry =
|
| + cache.LookupByPath(bad_server, std::string());
|
| + EXPECT_TRUE(entry == NULL);
|
| +}
|
| +
|
| TEST_F(DataReductionProxySettingsTest, TestGetDataReductionProxyOrigin) {
|
| AddProxyToCommandLine();
|
| // SetUp() adds the origin to the command line, which should be returned here.
|
| - std::string result = settings_->GetDataReductionProxyOrigin();
|
| + std::string result =
|
| + DataReductionProxySettings::GetDataReductionProxyOrigin();
|
| EXPECT_EQ(kDataReductionProxyOrigin, result);
|
| }
|
|
|
| -TEST_F(DataReductionProxySettingsTest, TestGetDataReductionProxyAuth) {
|
| +TEST_F(DataReductionProxySettingsTest, TestGetDataReductionProxies) {
|
| + DataReductionProxySettings::DataReductionProxyList proxies =
|
| + DataReductionProxySettings::GetDataReductionProxies();
|
| +
|
| + unsigned int expected_proxy_size = 0u;
|
| +#if defined(SPDY_PROXY_AUTH_ORIGIN)
|
| + ++expected_proxy_size;
|
| +#endif
|
| +#if defined(DATA_REDUCTION_FALLBACK_HOST)
|
| + ++expected_proxy_size;
|
| +#endif
|
| +
|
| + EXPECT_EQ(expected_proxy_size, proxies.size());
|
| +
|
| + // Adding just the fallback on the command line shouldn't add a proxy unless
|
| + // there was already one compiled in.
|
| + CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| + switches::kSpdyProxyAuthFallback, kDataReductionProxyFallback);
|
| + proxies = DataReductionProxySettings::GetDataReductionProxies();
|
| +
|
| + // So: if there weren't any proxies before, there still won't be.
|
| + // If there were one or two, there will be two now.
|
| + expected_proxy_size = expected_proxy_size == 0u ? 0u : 2u;
|
| +
|
| + EXPECT_EQ(expected_proxy_size, proxies.size());
|
| +
|
| + CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| + switches::kSpdyProxyAuthOrigin, kDataReductionProxyOrigin);
|
| + proxies = DataReductionProxySettings::GetDataReductionProxies();
|
| + EXPECT_EQ(2u, proxies.size());
|
| +
|
| + // Command line proxies have precedence, so even if there were other values
|
| + // compiled in, these should be the ones in the list.
|
| + EXPECT_EQ("foo.com", proxies[0].host());
|
| + EXPECT_EQ(443 ,proxies[0].EffectiveIntPort());
|
| + EXPECT_EQ("bar.com", proxies[1].host());
|
| + EXPECT_EQ(80, proxies[1].EffectiveIntPort());
|
| +}
|
| +
|
| +TEST_F(DataReductionProxySettingsTest, TestAuthHashGeneration) {
|
| AddProxyToCommandLine();
|
| - // SetUp() adds the auth string to the command line, which should be returned
|
| - // here.
|
| - std::string result = settings_->GetDataReductionProxyAuth();
|
| - EXPECT_EQ(kDataReductionProxyAuth, result);
|
| + std::string salt = "8675309"; // Jenny's number to test the hash generator.
|
| + std::string salted_key = salt + kDataReductionProxyAuth + salt;
|
| + base::string16 expected_hash = UTF8ToUTF16(base::MD5String(salted_key));
|
| + EXPECT_EQ(expected_hash,
|
| + DataReductionProxySettings::AuthHashForSalt(8675309));
|
| }
|
|
|
| -// Test that the auth value set by preprocessor directive is not returned
|
| +// Test that the auth key set by preprocessor directive is not used
|
| // when an origin is set via a switch. This test only does anything useful in
|
| // Chrome builds.
|
| TEST_F(DataReductionProxySettingsTest,
|
| - TestGetDataReductionProxyAuthWithOriginSetViaSwitch) {
|
| + TestAuthHashGenerationWithOriginSetViaSwitch) {
|
| CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| switches::kSpdyProxyAuthOrigin, kDataReductionProxyOrigin);
|
| - std::string result = settings_->GetDataReductionProxyAuth();
|
| - EXPECT_EQ("", result);
|
| + EXPECT_EQ(base::string16(),
|
| + DataReductionProxySettings::AuthHashForSalt(8675309));
|
| }
|
|
|
| +
|
| TEST_F(DataReductionProxySettingsTest, TestIsProxyEnabledOrManaged) {
|
| settings_->InitPrefMembers();
|
| EXPECT_FALSE(settings_->IsDataReductionProxyEnabled());
|
| @@ -255,6 +330,64 @@ TEST_F(DataReductionProxySettingsTest, TestIsProxyEnabledOrManaged) {
|
| EXPECT_TRUE(settings_->IsDataReductionProxyManaged());
|
| }
|
|
|
| +
|
| +TEST_F(DataReductionProxySettingsTest, TestAcceptableChallenges) {
|
| + AddProxyToCommandLine();
|
| + typedef struct {
|
| + std::string host;
|
| + std::string realm;
|
| + bool expected_to_succeed;
|
| + } challenge_test;
|
| +
|
| + challenge_test tests[] = {
|
| + {"foo.com:443", "", false}, // 0. No realm.
|
| + {"foo.com:443", "xxx", false}, // 1. Wrong realm.
|
| + {"foo.com:443", "spdyproxy", false}, // 2. Case matters.
|
| + {"foo.com:443", "SpdyProxy", true}, // 3. OK.
|
| + {"foo.com:443", "SpdyProxy1234567", true}, // 4. OK
|
| + {"bar.com:80", "SpdyProxy1234567", true}, // 5. OK.
|
| + {"foo.com:443", "SpdyProxyxxx", true}, // 6. OK
|
| + {"", "SpdyProxy1234567", false}, // 7. No challenger.
|
| + {"xxx.net:443", "SpdyProxy1234567", false}, // 8. Wrong host.
|
| + {"foo.com", "SpdyProxy1234567", false}, // 9. No port.
|
| + {"foo.com:80", "SpdyProxy1234567", false}, // 10.Wrong port.
|
| + {"bar.com:81", "SpdyProxy1234567", false}, // 11.Wrong port.
|
| + };
|
| +
|
| + for (int i = 0; i <= 11; ++i) {
|
| + scoped_refptr<net::AuthChallengeInfo> auth_info(new net::AuthChallengeInfo);
|
| + auth_info->challenger = net::HostPortPair::FromString(tests[i].host);
|
| + auth_info->realm = tests[i].realm;
|
| + EXPECT_EQ(tests[i].expected_to_succeed,
|
| + settings_->IsAcceptableAuthChallenge(auth_info.get()));
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxySettingsTest, TestChallengeTokens) {
|
| + AddProxyToCommandLine();
|
| + typedef struct {
|
| + std::string realm;
|
| + bool expected_empty_token;
|
| + } token_test;
|
| +
|
| + token_test tests[] = {
|
| + {"", true}, // 0. No realm.
|
| + {"xxx", true}, // 1. realm too short.
|
| + {"spdyproxy", true}, // 2. no salt.
|
| + {"SpdyProxyxxx", true}, // 3. Salt not an int.
|
| + {"SpdyProxy1234567", false}, // 4. OK
|
| + };
|
| +
|
| + for (int i = 0; i <= 4; ++i) {
|
| + scoped_refptr<net::AuthChallengeInfo> auth_info(new net::AuthChallengeInfo);
|
| + auth_info->challenger =
|
| + net::HostPortPair::FromString(kDataReductionProxyOrigin);
|
| + auth_info->realm = tests[i].realm;
|
| + base::string16 token = settings_->GetTokenForAuthChallenge(auth_info.get());
|
| + EXPECT_EQ(tests[i].expected_empty_token, token.empty());
|
| + }
|
| +}
|
| +
|
| TEST_F(DataReductionProxySettingsTest, TestResetDataReductionStatistics) {
|
| int64 original_content_length;
|
| int64 received_content_length;
|
| @@ -415,4 +548,3 @@ TEST_F(DataReductionProxySettingsTest, TestBypassList) {
|
| EXPECT_EQ(expected[i++], *it);
|
| }
|
| }
|
| -
|
|
|