Skip to content

Commit

Permalink
Move HTTPS cert unittests from HTTPClient to PrivetV3ContextGetter
Browse files Browse the repository at this point in the history
BUG=524788
[email protected]

Review URL: https://codereview.chromium.org/1450783002

Cr-Commit-Position: refs/heads/master@{#359790}
  • Loading branch information
vitalybuka authored and Commit bot committed Nov 15, 2015
1 parent fe06819 commit 2452a91
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 74 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
// Copyright 2015 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/extensions/api/gcd_private/privet_v3_context_getter.h"

#include "base/command_line.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {

namespace {

using content::BrowserThread;
using net::EmbeddedTestServer;

class PrivetV3ContextGetterTest : public testing::Test,
public net::URLFetcherDelegate {
protected:
PrivetV3ContextGetterTest()
: thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {}

void SetUp() override {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnablePrivetV3);

context_getter_ = new extensions::PrivetV3ContextGetter(
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
}

void OnURLFetchComplete(const net::URLFetcher* source) override {
done_ = true;
status_ = source->GetStatus();

base::MessageLoop::current()->PostTask(FROM_HERE, quit_);
}

void CreateServer(EmbeddedTestServer::Type type) {
server_.reset(new EmbeddedTestServer(type));
ASSERT_TRUE(server_->InitializeAndWaitUntilReady());

base::FilePath test_data_dir;
ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
server_->ServeFilesFromDirectory(
test_data_dir.Append(FILE_PATH_LITERAL("chrome/test/data")));
}

net::URLRequestStatus::Status Run() {
done_ = false;
status_ = net::URLRequestStatus();

base::RunLoop run_loop;
quit_ = run_loop.QuitClosure();

fetcher_ = net::URLFetcher::Create(server_->GetURL("/simple.html"),
net::URLFetcher::GET, this);
fetcher_->SetRequestContext(context_getter_.get());
fetcher_->Start();

run_loop.Run();

EXPECT_TRUE(done_);
return status_.status();
}

void SetFingerprint(const net::SHA256HashValue& fingerprint) {
base::RunLoop run_loop;
context_getter_->AddPairedHost(server_->host_port_pair().host(),
fingerprint, run_loop.QuitClosure());
run_loop.Run();
}

net::SHA256HashValue GetServerFingerprint() const {
return net::X509Certificate::CalculateFingerprint256(
server_->GetCertificate()->os_cert_handle());
}

private:
bool done_ = false;
net::URLRequestStatus status_ = net::URLRequestStatus();
content::TestBrowserThreadBundle thread_bundle_;
scoped_refptr<extensions::PrivetV3ContextGetter> context_getter_;
scoped_ptr<EmbeddedTestServer> server_;
scoped_ptr<net::URLFetcher> fetcher_;

base::Closure quit_;
};

TEST_F(PrivetV3ContextGetterTest, Http) {
CreateServer(EmbeddedTestServer::TYPE_HTTP);
EXPECT_EQ(net::URLRequestStatus::SUCCESS, Run());
}

TEST_F(PrivetV3ContextGetterTest, HttpsUnknownHost) {
CreateServer(EmbeddedTestServer::TYPE_HTTPS);
EXPECT_EQ(net::URLRequestStatus::CANCELED, Run());
}

TEST_F(PrivetV3ContextGetterTest, HttpsInvalidFingerprint) {
CreateServer(EmbeddedTestServer::TYPE_HTTPS);
SetFingerprint(net::SHA256HashValue());
EXPECT_EQ(net::URLRequestStatus::CANCELED, Run());
}

TEST_F(PrivetV3ContextGetterTest, HttpsValidFingerprint) {
CreateServer(EmbeddedTestServer::TYPE_HTTPS);
SetFingerprint(GetServerFingerprint());
EXPECT_EQ(net::URLRequestStatus::SUCCESS, Run());
}

TEST_F(PrivetV3ContextGetterTest, HttpsFingerprintOverride) {
for (size_t i = 0; i < 3; ++i) {
CreateServer(EmbeddedTestServer::TYPE_HTTPS);
SetFingerprint(net::SHA256HashValue());
EXPECT_EQ(net::URLRequestStatus::CANCELED, Run());

CreateServer(EmbeddedTestServer::TYPE_HTTPS);
SetFingerprint(GetServerFingerprint());
EXPECT_EQ(net::URLRequestStatus::SUCCESS, Run());
}
}

} // namespace

} // namespace extensions
94 changes: 20 additions & 74 deletions chrome/browser/local_discovery/privet_http_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/bind.h"
#include "base/command_line.h"
#include "chrome/browser/local_discovery/privet_http.h"

#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/location.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.h"
#include "chrome/browser/local_discovery/privet_http_impl.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_errors.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_test_util.h"
#include "printing/pwg_raster_settings.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

#if defined(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/local_discovery/pwg_raster_converter.h"
#include "printing/pwg_raster_settings.h"
#endif // ENABLE_PRINT_PREVIEW

namespace local_discovery {
Expand Down Expand Up @@ -1041,8 +1032,19 @@ class PrivetHttpWithServerTest : public ::testing::Test,
: thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {}

void SetUp() override {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnablePrivetV3);
context_getter_ = new net::TestURLRequestContextGetter(
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));

server_.reset(new EmbeddedTestServer(EmbeddedTestServer::TYPE_HTTP));
ASSERT_TRUE(server_->InitializeAndWaitUntilReady());

base::FilePath test_data_dir;
ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
server_->ServeFilesFromDirectory(
test_data_dir.Append(FILE_PATH_LITERAL("chrome/test/data")));

client_.reset(new PrivetHTTPClientImpl("test", server_->host_port_pair(),
context_getter_));
}

void OnError(PrivetURLFetcher* fetcher,
Expand Down Expand Up @@ -1072,24 +1074,7 @@ class PrivetHttpWithServerTest : public ::testing::Test,
return true;
}

void CreateServer(EmbeddedTestServer::Type type) {
server_.reset(new EmbeddedTestServer(type));
ASSERT_TRUE(server_->InitializeAndWaitUntilReady());

base::FilePath test_data_dir;
ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
server_->ServeFilesFromDirectory(
test_data_dir.Append(FILE_PATH_LITERAL("chrome/test/data")));
}

void CreateClient() {
context_getter_ = new extensions::PrivetV3ContextGetter(
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
client_.reset(new PrivetHTTPClientImpl("test", server_->host_port_pair(),
context_getter_));
}

void Run() {
bool Run() {
success_ = false;
done_ = false;

Expand All @@ -1106,61 +1091,22 @@ class PrivetHttpWithServerTest : public ::testing::Test,
run_loop.Run();

EXPECT_TRUE(done_);
return success_;
}

bool success_ = false;
bool done_ = false;
PrivetURLFetcher::ErrorType error_ = PrivetURLFetcher::ErrorType();
content::TestBrowserThreadBundle thread_bundle_;
scoped_refptr<extensions::PrivetV3ContextGetter> context_getter_;
scoped_refptr<net::TestURLRequestContextGetter> context_getter_;
scoped_ptr<EmbeddedTestServer> server_;
scoped_ptr<PrivetHTTPClientImpl> client_;

base::Closure quit_;
};

TEST_F(PrivetHttpWithServerTest, HttpServer) {
CreateServer(EmbeddedTestServer::TYPE_HTTP);

CreateClient();
Run();
EXPECT_TRUE(success_);

CreateClient();
client_->SwitchToHttps(server_->host_port_pair().port());
Run();
EXPECT_FALSE(success_);
EXPECT_EQ(PrivetURLFetcher::UNKNOWN_ERROR, error_);
}

TEST_F(PrivetHttpWithServerTest, HttpsServer) {
CreateServer(EmbeddedTestServer::TYPE_HTTPS);

CreateClient();
Run();
EXPECT_FALSE(success_);
EXPECT_EQ(PrivetURLFetcher::UNKNOWN_ERROR, error_);

CreateClient();
net::SHA256HashValue fingerprint =
net::X509Certificate::CalculateFingerprint256(
server_->GetCertificate()->os_cert_handle());
{
base::RunLoop run_loop;
context_getter_->AddPairedHost(client_->GetHost(), fingerprint,
run_loop.QuitClosure());
run_loop.Run();
}
client_->SwitchToHttps(server_->host_port_pair().port());
Run();
EXPECT_TRUE(success_);

CreateClient();
fingerprint = {};
client_->SwitchToHttps(server_->host_port_pair().port());
Run();
EXPECT_FALSE(success_);
EXPECT_EQ(PrivetURLFetcher::REQUEST_CANCELED, error_);
EXPECT_TRUE(Run());
}

} // namespace
Expand Down
1 change: 1 addition & 0 deletions chrome/chrome_tests_unit.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,7 @@
'browser/extensions/api/file_handlers/api_file_handler_util_unittest.cc',
'browser/extensions/api/file_handlers/mime_util_unittest.cc',
'browser/extensions/api/file_system/file_system_api_unittest.cc',
'browser/extensions/api/gcd_private/privet_v3_context_getter_unittest.cc',
'browser/extensions/api/gcd_private/privet_v3_session_unittest.cc',
'browser/extensions/api/identity/extension_token_key_unittest.cc',
'browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc',
Expand Down

0 comments on commit 2452a91

Please sign in to comment.