blob: ac149593aac3a4a2fcfa8145cd08543eb1ffe7ad [file] [log] [blame]
// Copyright 2016 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/chrome_data_use_group.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/io_thread.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/resource_request_info.h"
#include "content/public/test/test_utils.h"
#include "net/base/network_delegate.h"
#include "net/test/url_request/url_request_mock_http_job.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_filter.h"
#include "net/url_request/url_request_interceptor.h"
#include "net/url_request/url_request_job.h"
#include "testing/gtest/include/gtest/gtest.h"
// Intercepter to confirm that a render process ID and a render frame ID are
// set on URL requests.
class ConfirmFrameIdInterceptor : public net::URLRequestInterceptor {
public:
ConfirmFrameIdInterceptor() : did_intercept_request_(false) {
}
net::URLRequestJob* MaybeInterceptRequest(
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const override {
did_intercept_request_ = true;
int render_process_id;
int render_frame_id;
EXPECT_TRUE(content::ResourceRequestInfo::GetRenderFrameForRequest(
request, &render_process_id, &render_frame_id));
return nullptr;
}
bool did_intercept_request() {
return did_intercept_request_;
}
private:
mutable bool did_intercept_request_;
};
class ChromeDataUseGroupBrowserTest : public InProcessBrowserTest {
public:
ChromeDataUseGroupBrowserTest() : interceptor_(nullptr) {
}
void SetUpOnMainThread() override {
url_ = net::URLRequestMockHTTPJob::GetMockUrl("index.html");
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
base::Bind(&ChromeDataUseGroupBrowserTest::SetUpOnIOThread,
base::Unretained(this)));
RunAllPendingInMessageLoop(content::BrowserThread::IO);
}
void TearDownOnMainThread() override {
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
base::Bind(&ChromeDataUseGroupBrowserTest::TearDownOnIOThread,
base::Unretained(this)));
RunAllPendingInMessageLoop(content::BrowserThread::IO);
}
void SetUpOnIOThread() {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
interceptor_ = new ConfirmFrameIdInterceptor();
net::URLRequestFilter::GetInstance()->AddUrlInterceptor(url_,
base::WrapUnique(interceptor_));
}
void TearDownOnIOThread() {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
interceptor_ = nullptr;
net::URLRequestFilter::GetInstance()->RemoveUrlHandler(url_);
}
protected:
GURL& url() {
return url_;
}
bool did_intercept_request() {
return interceptor_->did_intercept_request();
}
private:
ConfirmFrameIdInterceptor* interceptor_;
GURL url_;
};
// Confirms that URL requests have a valid |render_process_id| and
// |render_frame_id| set on them before they begin. This protects against
// any regressions that may be caused as we move to PlzNavigate.
IN_PROC_BROWSER_TEST_F(ChromeDataUseGroupBrowserTest, ExistsFrameId) {
EXPECT_FALSE(did_intercept_request());
ui_test_utils::NavigateToURL(browser(), url());
EXPECT_TRUE(did_intercept_request());
}