| Index: net/websockets/websocket_stream_test.cc
|
| diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc
|
| index 4ea8538b76273c28af1164db13b8e145192a3770..0344cceb539810aaf0028477d316f31f6d6540b5 100644
|
| --- a/net/websockets/websocket_stream_test.cc
|
| +++ b/net/websockets/websocket_stream_test.cc
|
| @@ -16,10 +16,12 @@
|
| #include "base/run_loop.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "net/base/net_errors.h"
|
| +#include "net/base/test_data_directory.h"
|
| #include "net/http/http_request_headers.h"
|
| #include "net/http/http_response_headers.h"
|
| #include "net/socket/client_socket_handle.h"
|
| #include "net/socket/socket_test_util.h"
|
| +#include "net/test/cert_test_util.h"
|
| #include "net/url_request/url_request_test_util.h"
|
| #include "net/websockets/websocket_basic_handshake_stream.h"
|
| #include "net/websockets/websocket_frame.h"
|
| @@ -79,7 +81,7 @@ class DeterministicKeyWebSocketHandshakeStreamCreateHelper
|
|
|
| class WebSocketStreamCreateTest : public ::testing::Test {
|
| public:
|
| - WebSocketStreamCreateTest(): has_failed_(false) {}
|
| + WebSocketStreamCreateTest() : has_failed_(false), ssl_fatal_(false) {}
|
|
|
| void CreateAndConnectCustomResponse(
|
| const std::string& socket_url,
|
| @@ -116,7 +118,7 @@ class WebSocketStreamCreateTest : public ::testing::Test {
|
| const std::vector<std::string>& sub_protocols,
|
| const std::string& origin,
|
| scoped_ptr<DeterministicSocketData> socket_data) {
|
| - url_request_context_host_.SetRawExpectations(socket_data.Pass());
|
| + url_request_context_host_.AddRawExpectations(socket_data.Pass());
|
| CreateAndConnectStream(socket_url, sub_protocols, origin);
|
| }
|
|
|
| @@ -125,6 +127,12 @@ class WebSocketStreamCreateTest : public ::testing::Test {
|
| void CreateAndConnectStream(const std::string& socket_url,
|
| const std::vector<std::string>& sub_protocols,
|
| const std::string& origin) {
|
| + for (size_t i = 0; i < ssl_data_.size(); ++i) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_data(ssl_data_[i]);
|
| + ssl_data_[i] = NULL;
|
| + url_request_context_host_.AddSSLSocketDataProvider(ssl_data.Pass());
|
| + }
|
| + ssl_data_.clear();
|
| scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate(
|
| new TestConnectDelegate(this));
|
| WebSocketStream::ConnectDelegate* delegate = connect_delegate.get();
|
| @@ -175,6 +183,15 @@ class WebSocketStreamCreateTest : public ::testing::Test {
|
| ADD_FAILURE();
|
| owner_->response_info_ = response.Pass();
|
| }
|
| + virtual void OnSSLCertificateError(
|
| + scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks>
|
| + ssl_error_callbacks,
|
| + const SSLInfo& ssl_info,
|
| + bool fatal) OVERRIDE {
|
| + owner_->ssl_error_callbacks_ = ssl_error_callbacks.Pass();
|
| + owner_->ssl_info_ = ssl_info;
|
| + owner_->ssl_fatal_ = fatal;
|
| + }
|
|
|
| private:
|
| WebSocketStreamCreateTest* owner_;
|
| @@ -189,6 +206,10 @@ class WebSocketStreamCreateTest : public ::testing::Test {
|
| bool has_failed_;
|
| scoped_ptr<WebSocketHandshakeRequestInfo> request_info_;
|
| scoped_ptr<WebSocketHandshakeResponseInfo> response_info_;
|
| + scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> ssl_error_callbacks_;
|
| + SSLInfo ssl_info_;
|
| + bool ssl_fatal_;
|
| + ScopedVector<SSLSocketDataProvider> ssl_data_;
|
| };
|
|
|
| // There are enough tests of the Sec-WebSocket-Extensions header that they
|
| @@ -1032,6 +1053,48 @@ TEST_F(WebSocketStreamCreateTest, NoResponse) {
|
| failure_message());
|
| }
|
|
|
| +TEST_F(WebSocketStreamCreateTest, SelfSignedCertificateFailure) {
|
| + ssl_data_.push_back(
|
| + new SSLSocketDataProvider(ASYNC, ERR_CERT_AUTHORITY_INVALID));
|
| + ssl_data_[0]->cert =
|
| + ImportCertFromFile(GetTestCertsDirectory(), "unittest.selfsigned.der");
|
| + ASSERT_TRUE(ssl_data_[0]->cert);
|
| + scoped_ptr<DeterministicSocketData> raw_socket_data(
|
| + new DeterministicSocketData(NULL, 0, NULL, 0));
|
| + CreateAndConnectRawExpectations("wss://localhost/",
|
| + NoSubProtocols(),
|
| + "http://localhost",
|
| + raw_socket_data.Pass());
|
| + RunUntilIdle();
|
| + EXPECT_FALSE(has_failed());
|
| + ASSERT_TRUE(ssl_error_callbacks_);
|
| + ssl_error_callbacks_->CancelSSLRequest(ERR_CERT_AUTHORITY_INVALID,
|
| + &ssl_info_);
|
| + RunUntilIdle();
|
| + EXPECT_TRUE(has_failed());
|
| +}
|
| +
|
| +TEST_F(WebSocketStreamCreateTest, SelfSignedCertificateSuccess) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_data(
|
| + new SSLSocketDataProvider(ASYNC, ERR_CERT_AUTHORITY_INVALID));
|
| + ssl_data->cert =
|
| + ImportCertFromFile(GetTestCertsDirectory(), "unittest.selfsigned.der");
|
| + ASSERT_TRUE(ssl_data->cert);
|
| + ssl_data_.push_back(ssl_data.release());
|
| + ssl_data.reset(new SSLSocketDataProvider(ASYNC, OK));
|
| + ssl_data_.push_back(ssl_data.release());
|
| + url_request_context_host_.AddRawExpectations(
|
| + make_scoped_ptr(new DeterministicSocketData(NULL, 0, NULL, 0)));
|
| + CreateAndConnectStandard(
|
| + "wss://localhost/", "/", NoSubProtocols(), "http://localhost", "", "");
|
| + RunUntilIdle();
|
| + ASSERT_TRUE(ssl_error_callbacks_);
|
| + ssl_error_callbacks_->ContinueSSLRequest();
|
| + RunUntilIdle();
|
| + EXPECT_FALSE(has_failed());
|
| + EXPECT_TRUE(stream_);
|
| +}
|
| +
|
| TEST_F(WebSocketStreamCreateUMATest, Incomplete) {
|
| const std::string name("Net.WebSocket.HandshakeResult");
|
| scoped_ptr<base::HistogramSamples> original(GetSamples(name));
|
| @@ -1107,9 +1170,9 @@ TEST_F(WebSocketStreamCreateUMATest, Failed) {
|
| if (original) {
|
| samples->Subtract(*original); // Cancel the original values.
|
| }
|
| - EXPECT_EQ(0, samples->GetCount(INCOMPLETE));
|
| + EXPECT_EQ(1, samples->GetCount(INCOMPLETE));
|
| EXPECT_EQ(0, samples->GetCount(CONNECTED));
|
| - EXPECT_EQ(1, samples->GetCount(FAILED));
|
| + EXPECT_EQ(0, samples->GetCount(FAILED));
|
| }
|
|
|
| } // namespace
|
|
|