blob: 73b0b05e877ce14098983aa382a047354ae242ce [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings_unittest.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/base64.h"
#include "base/command_line.h"
#include "base/metrics/field_trial.h"
#include "base/prefs/pref_service.h"
#include "base/prefs/scoped_user_pref_update.h"
#include "base/prefs/testing_pref_service.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h"
#include "chrome/browser/prefs/proxy_prefs.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/metrics/variations/variations_util.h"
#include "chrome/common/pref_names.h"
#include "components/variations/entropy_provider.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
const char kDataReductionProxyOrigin[] = "https://foo.com:443/";
const char kDataReductionProxyOriginPAC[] = "HTTPS foo.com:443;";
const char kDataReductionProxyFallbackPAC[] = "HTTP bar.com:80;";
class DataReductionProxySettingsAndroidTest
: public ConcreteDataReductionProxySettingsTest<
DataReductionProxySettingsAndroid> {
public:
// DataReductionProxySettingsTest implementation:
virtual void SetUp() OVERRIDE {
env_ = base::android::AttachCurrentThread();
DataReductionProxySettingsAndroid::Register(env_);
DataReductionProxySettingsTestBase::SetUp();
}
void CheckProxyPacPref(const std::string& expected_pac_url,
const std::string& expected_mode) {
const DictionaryValue* dict = pref_service_.GetDictionary(prefs::kProxy);
std::string mode;
std::string pac_url;
dict->GetString("mode", &mode);
ASSERT_EQ(expected_mode, mode);
dict->GetString("pac_url", &pac_url);
ASSERT_EQ(expected_pac_url, pac_url);
}
DataReductionProxySettingsAndroid* Settings() {
return static_cast<DataReductionProxySettingsAndroid*>(settings_.get());
}
JNIEnv* env_;
};
TEST_F(DataReductionProxySettingsAndroidTest, TestGetDataReductionProxyOrigin) {
AddProxyToCommandLine();
// SetUp() adds the origin to the command line, which should be returned here.
ScopedJavaLocalRef<jstring> result =
Settings()->GetDataReductionProxyOrigin(env_, NULL);
ASSERT_TRUE(result.obj());
const base::android::JavaRef<jstring>& str_ref = result;
EXPECT_EQ(kDataReductionProxyOrigin, ConvertJavaStringToUTF8(str_ref));
}
// Confirm that the bypass rule functions generate the intended JavaScript
// code for the Proxy PAC.
TEST_F(DataReductionProxySettingsAndroidTest, TestBypassPACRules) {
Settings()->AddURLPatternToBypass("http://foo.com/*");
Settings()->AddHostPatternToBypass("bar.com");
EXPECT_EQ(Settings()->pac_bypass_rules_.size(), 1u);
EXPECT_EQ("shExpMatch(url, 'http://foo.com/*')",
Settings()->pac_bypass_rules_[0]);
EXPECT_EQ(Settings()->BypassRules().size(), 1u);
EXPECT_EQ("bar.com", Settings()->BypassRules()[0]);
}
TEST_F(DataReductionProxySettingsAndroidTest, TestSetProxyPac) {
AddProxyToCommandLine();
Settings()->AddDefaultProxyBypassRules();
std::string raw_pac = Settings()->GetProxyPacScript();
EXPECT_NE(raw_pac.find(kDataReductionProxyOriginPAC), std::string::npos);
EXPECT_NE(raw_pac.find(kDataReductionProxyFallbackPAC), std::string::npos);;
std::string pac;
base::Base64Encode(raw_pac, &pac);
std::string expected_pac_url =
"data:application/x-ns-proxy-autoconfig;base64," + pac;
// Test setting the PAC, without generating histograms.
Settings()->SetHasTurnedOn();
Settings()->SetProxyConfigs(true, false);
CheckProxyPacPref(expected_pac_url,
ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT));
// Test disabling the PAC, without generating histograms.
Settings()->SetHasTurnedOff();
Settings()->SetProxyConfigs(false, false);
CheckProxyPacPref(std::string(), ProxyModeToString(ProxyPrefs::MODE_SYSTEM));
}
TEST_F(DataReductionProxySettingsAndroidTest, TestGetDailyContentLengths) {
ScopedJavaLocalRef<jlongArray> result = Settings()->GetDailyContentLengths(
env_, prefs::kDailyHttpOriginalContentLength);
ASSERT_TRUE(result.obj());
jsize java_array_len = env_->GetArrayLength(result.obj());
ASSERT_EQ(static_cast<jsize>(spdyproxy::kNumDaysInHistory), java_array_len);
jlong value;
for (size_t i = 0; i < spdyproxy::kNumDaysInHistory; ++i) {
env_->GetLongArrayRegion(result.obj(), i, 1, &value);
ASSERT_EQ(
static_cast<long>((spdyproxy::kNumDaysInHistory - 1 - i) * 2), value);
}
}