| Index: chrome/browser/net/chrome_network_delegate_unittest.cc
|
| diff --git a/chrome/browser/net/chrome_network_delegate_unittest.cc b/chrome/browser/net/chrome_network_delegate_unittest.cc
|
| index 3ca7bbe09a078acaab591f43fdcdc47c065fa020..ea7b8ca4e38dcb33b9cde26d1fce27117dd96c9a 100644
|
| --- a/chrome/browser/net/chrome_network_delegate_unittest.cc
|
| +++ b/chrome/browser/net/chrome_network_delegate_unittest.cc
|
| @@ -9,52 +9,242 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/prefs/pref_member.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/test/histogram_tester.h"
|
| +#include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/content_settings/cookie_settings_factory.h"
|
| #include "chrome/browser/net/safe_search_util.h"
|
| #include "chrome/common/pref_names.h"
|
| +#include "chrome/test/base/testing_browser_process.h"
|
| #include "chrome/test/base/testing_pref_service_syncable.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| +#include "chrome/test/base/testing_profile_manager.h"
|
| #include "components/content_settings/core/browser/cookie_settings.h"
|
| #include "components/content_settings/core/common/pref_names.h"
|
| +#include "content/public/browser/resource_request_info.h"
|
| #include "content/public/common/content_switches.h"
|
| +#include "content/public/common/resource_type.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "net/base/request_priority.h"
|
| +#include "net/socket/socket_test_util.h"
|
| #include "net/url_request/url_request.h"
|
| #include "net/url_request/url_request_test_util.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "url/gurl.h"
|
|
|
| #if defined(ENABLE_EXTENSIONS)
|
| #include "chrome/browser/extensions/event_router_forwarder.h"
|
| #endif
|
|
|
| -TEST(ChromeNetworkDelegateTest, DisableFirstPartyOnlyCookiesIffFlagDisabled) {
|
| - BooleanPrefMember pref_member_;
|
| - scoped_ptr<ChromeNetworkDelegate> delegate;
|
| +#if !defined(OS_IOS)
|
| +#include "components/data_use_measurement/core/data_use_user_data.h"
|
| +#endif
|
| +
|
| +namespace {
|
| +
|
| +// This function requests a URL, and makes it return a known response. If
|
| +// |from_user| is true, it attaches a ResourceRequestInfo to the URLRequest,
|
| +// because requests from users have this info. If |from_user| is false, the
|
| +// request is presumed to be from a service, and the service name is set in the
|
| +// request's user data. (As an example suggestions service tag is attached). if
|
| +// |redirect| is true, it adds necessary socket data to have it follow redirect
|
| +// before getting the final response.
|
| +void RequestURL(net::URLRequestContext* context,
|
| + net::MockClientSocketFactory* socket_factory,
|
| + bool from_user,
|
| + bool redirect) {
|
| + net::MockRead redirect_mock_reads[] = {
|
| + net::MockRead("HTTP/1.1 302 Found\r\n"
|
| + "Location: http://bar.com/\r\n\r\n"),
|
| + net::MockRead(net::SYNCHRONOUS, net::OK),
|
| + };
|
| + net::StaticSocketDataProvider redirect_socket_data_provider(
|
| + redirect_mock_reads, arraysize(redirect_mock_reads), nullptr, 0);
|
| +
|
| + if (redirect)
|
| + socket_factory->AddSocketDataProvider(&redirect_socket_data_provider);
|
| + net::MockRead response_mock_reads[] = {
|
| + net::MockRead("HTTP/1.1 200 OK\r\n\r\n"), net::MockRead("response body"),
|
| + net::MockRead(net::SYNCHRONOUS, net::OK),
|
| + };
|
| + net::StaticSocketDataProvider response_socket_data_provider(
|
| + response_mock_reads, arraysize(response_mock_reads), nullptr, 0);
|
| + socket_factory->AddSocketDataProvider(&response_socket_data_provider);
|
| + net::TestDelegate test_delegate;
|
| + test_delegate.set_quit_on_complete(true);
|
| + scoped_ptr<net::URLRequest> request(context->CreateRequest(
|
| + GURL("http://example.com"), net::DEFAULT_PRIORITY, &test_delegate));
|
| +
|
| + if (from_user) {
|
| + content::ResourceRequestInfo::AllocateForTesting(
|
| + request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr, -2, -2, -2,
|
| + true, false, true, true);
|
| + } else {
|
| + request->SetUserData(
|
| + data_use_measurement::DataUseUserData::kUserDataKey,
|
| + new data_use_measurement::DataUseUserData(
|
| + data_use_measurement::DataUseUserData::SUGGESTIONS));
|
| + }
|
| + request->Start();
|
| + base::RunLoop().RunUntilIdle();
|
| +}
|
| +
|
| +} // namespace
|
|
|
| +class ChromeNetworkDelegateTest : public testing::Test {
|
| + public:
|
| + ChromeNetworkDelegateTest()
|
| + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
|
| + context_(new net::TestURLRequestContext(true)) {
|
| #if defined(ENABLE_EXTENSIONS)
|
| - scoped_refptr<extensions::EventRouterForwarder> forwarder =
|
| - new extensions::EventRouterForwarder();
|
| - delegate.reset(new ChromeNetworkDelegate(forwarder.get(), &pref_member_));
|
| -#else
|
| - delegate.reset(new ChromeNetworkDelegate(nullptr, &pref_member_));
|
| + forwarder_ = new extensions::EventRouterForwarder();
|
| #endif
|
| - EXPECT_FALSE(delegate->FirstPartyOnlyCookieExperimentEnabled());
|
| -}
|
| + }
|
|
|
| -TEST(ChromeNetworkDelegateTest, EnableFirstPartyOnlyCookiesIffFlagEnabled) {
|
| - base::CommandLine::ForCurrentProcess()->AppendSwitch(
|
| - switches::kEnableExperimentalWebPlatformFeatures);
|
| - BooleanPrefMember pref_member_;
|
| - scoped_ptr<ChromeNetworkDelegate> delegate;
|
| + void SetUp() override {
|
| + ChromeNetworkDelegate::InitializePrefsOnUIThread(
|
| + &enable_referrers_, nullptr, nullptr, nullptr,
|
| + profile_.GetTestingPrefService());
|
| + profile_manager_.reset(
|
| + new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
|
| + ASSERT_TRUE(profile_manager_->SetUp());
|
| + }
|
| +
|
| + void Initialize() {
|
| + network_delegate_.reset(
|
| + new ChromeNetworkDelegate(forwarder(), &enable_referrers_));
|
| + context_->set_client_socket_factory(&socket_factory_);
|
| + context_->set_network_delegate(network_delegate_.get());
|
| + context_->Init();
|
| + }
|
| +
|
| + net::TestURLRequestContext* context() { return context_.get(); }
|
| + net::NetworkDelegate* network_delegate() { return network_delegate_.get(); }
|
| + net::MockClientSocketFactory* socket_factory() { return &socket_factory_; }
|
|
|
| + extensions::EventRouterForwarder* forwarder() {
|
| #if defined(ENABLE_EXTENSIONS)
|
| - scoped_refptr<extensions::EventRouterForwarder> forwarder =
|
| - new extensions::EventRouterForwarder();
|
| - delegate.reset(new ChromeNetworkDelegate(forwarder.get(), &pref_member_));
|
| + return forwarder_.get();
|
| #else
|
| - delegate.reset(new ChromeNetworkDelegate(nullptr, &pref_member_));
|
| + return nullptr;
|
| +#endif
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<TestingProfileManager> profile_manager_;
|
| + content::TestBrowserThreadBundle thread_bundle_;
|
| +#if defined(ENABLE_EXTENSIONS)
|
| + scoped_refptr<extensions::EventRouterForwarder> forwarder_;
|
| +#endif
|
| + TestingProfile profile_;
|
| + BooleanPrefMember enable_referrers_;
|
| + scoped_ptr<net::NetworkDelegate> network_delegate_;
|
| + net::MockClientSocketFactory socket_factory_;
|
| + scoped_ptr<net::TestURLRequestContext> context_;
|
| +};
|
| +
|
| +// This function tests data use measurement for requests by services. it makes a
|
| +// query which is similar to a query of a service, so it should affect
|
| +// DataUse.TrafficSize.System.Dimensions and DataUse.MessageSize.ServiceName
|
| +// histograms. AppState and ConnectionType dimensions are always Foreground and
|
| +// NotCellular respectively.
|
| +#if !defined(OS_IOS)
|
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementServiceTest) {
|
| + Initialize();
|
| + base::HistogramTester histogram_tester;
|
| +
|
| + // A query from a service without redirection.
|
| + RequestURL(context(), socket_factory(), false, false);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 1);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 1);
|
| + // One upload and one download message, so totalCount should be 2.
|
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 2);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 0);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 0);
|
| +}
|
| +
|
| +// This function tests data use measurement for requests by user.The query from
|
| +// a user should affect DataUse.TrafficSize.User.Dimensions histogram. AppState
|
| +// and ConnectionType dimensions are always Foreground and NotCellular
|
| +// respectively.
|
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementUserTest) {
|
| + Initialize();
|
| + base::HistogramTester histogram_tester;
|
| +
|
| + // A query from user without redirection.
|
| + RequestURL(context(), socket_factory(), true, false);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 1);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 1);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 0);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 0);
|
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 0);
|
| +}
|
| +
|
| +// This function tests data use measurement for requests by services in case the
|
| +// request is redirected once. it makes a query which is similar to a query of a
|
| +// service, so it should affect DataUse.TrafficSize.System.Dimensions and
|
| +// DataUse.MessageSize.ServiceName histograms. AppState and ConnectionType
|
| +// dimensions are always Foreground and NotCellular respectively.
|
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementServiceTestWithRedirect) {
|
| + Initialize();
|
| + base::HistogramTester histogram_tester;
|
| +
|
| + // A query from user with one redirection.
|
| + RequestURL(context(), socket_factory(), false, true);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 2);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 2);
|
| + // Two uploads and two downloads message, so totalCount should be 4.
|
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 4);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 0);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 0);
|
| +}
|
| +
|
| +// This function tests data use measurement for requests by user in case the
|
| +// request is redirected once.The query from a user should affect
|
| +// DataUse.TrafficSize.User.Dimensions histogram. AppState and ConnectionType
|
| +// dimensions are always Foreground and NotCellular respectively.
|
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementUserTestWithRedirect) {
|
| + Initialize();
|
| + base::HistogramTester histogram_tester;
|
| +
|
| + // A query from user with one redirection.
|
| + RequestURL(context(), socket_factory(), true, true);
|
| +
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 2);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 2);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 0);
|
| + histogram_tester.ExpectTotalCount(
|
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 0);
|
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 0);
|
| +}
|
| +
|
| #endif
|
| - EXPECT_TRUE(delegate->FirstPartyOnlyCookieExperimentEnabled());
|
| +
|
| +TEST_F(ChromeNetworkDelegateTest, DisableFirstPartyOnlyCookiesIffFlagDisabled) {
|
| + Initialize();
|
| + EXPECT_FALSE(network_delegate()->FirstPartyOnlyCookieExperimentEnabled());
|
| +}
|
| +
|
| +TEST_F(ChromeNetworkDelegateTest, EnableFirstPartyOnlyCookiesIffFlagEnabled) {
|
| + base::CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + switches::kEnableExperimentalWebPlatformFeatures);
|
| + Initialize();
|
| + EXPECT_TRUE(network_delegate()->FirstPartyOnlyCookieExperimentEnabled());
|
| }
|
|
|
| class ChromeNetworkDelegateSafeSearchTest : public testing::Test {
|
|
|