Index: net/websockets/websocket_end_to_end_test.cc |
diff --git a/net/websockets/websocket_end_to_end_test.cc b/net/websockets/websocket_end_to_end_test.cc |
deleted file mode 100644 |
index 1a3df040e9f429320a9c099f86ccc0edd046d0c7..0000000000000000000000000000000000000000 |
--- a/net/websockets/websocket_end_to_end_test.cc |
+++ /dev/null |
@@ -1,382 +0,0 @@ |
-// Copyright 2014 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. |
- |
-// End-to-end tests for WebSocket. |
-// |
-// A python server is (re)started for each test, which is moderately |
-// inefficient. However, it makes these tests a good fit for scenarios which |
-// require special server configurations. |
- |
-#include <string> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "net/base/auth.h" |
-#include "net/base/network_delegate.h" |
-#include "net/base/test_data_directory.h" |
-#include "net/proxy/proxy_service.h" |
-#include "net/test/spawned_test_server/spawned_test_server.h" |
-#include "net/url_request/url_request_test_util.h" |
-#include "net/websockets/websocket_channel.h" |
-#include "net/websockets/websocket_event_interface.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/origin.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-static const char kEchoServer[] = "echo-with-no-extension"; |
- |
-// An implementation of WebSocketEventInterface that waits for and records the |
-// results of the connect. |
-class ConnectTestingEventInterface : public WebSocketEventInterface { |
- public: |
- ConnectTestingEventInterface(); |
- |
- void WaitForResponse(); |
- |
- bool failed() const { return failed_; } |
- |
- // Only set if the handshake failed, otherwise empty. |
- std::string failure_message() const; |
- |
- std::string selected_subprotocol() const; |
- |
- std::string extensions() const; |
- |
- // Implementation of WebSocketEventInterface. |
- ChannelState OnAddChannelResponse(bool fail, |
- const std::string& selected_subprotocol, |
- const std::string& extensions) override; |
- |
- ChannelState OnDataFrame(bool fin, |
- WebSocketMessageType type, |
- const std::vector<char>& data) override; |
- |
- ChannelState OnFlowControl(int64 quota) override; |
- |
- ChannelState OnClosingHandshake() override; |
- |
- ChannelState OnDropChannel(bool was_clean, |
- uint16 code, |
- const std::string& reason) override; |
- |
- ChannelState OnFailChannel(const std::string& message) override; |
- |
- ChannelState OnStartOpeningHandshake( |
- scoped_ptr<WebSocketHandshakeRequestInfo> request) override; |
- |
- ChannelState OnFinishOpeningHandshake( |
- scoped_ptr<WebSocketHandshakeResponseInfo> response) override; |
- |
- ChannelState OnSSLCertificateError( |
- scoped_ptr<SSLErrorCallbacks> ssl_error_callbacks, |
- const GURL& url, |
- const SSLInfo& ssl_info, |
- bool fatal) override; |
- |
- private: |
- void QuitNestedEventLoop(); |
- |
- // failed_ is true if the handshake failed (ie. OnFailChannel was called). |
- bool failed_; |
- std::string selected_subprotocol_; |
- std::string extensions_; |
- std::string failure_message_; |
- base::RunLoop run_loop_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ConnectTestingEventInterface); |
-}; |
- |
-ConnectTestingEventInterface::ConnectTestingEventInterface() : failed_(true) { |
-} |
- |
-void ConnectTestingEventInterface::WaitForResponse() { |
- run_loop_.Run(); |
-} |
- |
-std::string ConnectTestingEventInterface::failure_message() const { |
- return failure_message_; |
-} |
- |
-std::string ConnectTestingEventInterface::selected_subprotocol() const { |
- return selected_subprotocol_; |
-} |
- |
-std::string ConnectTestingEventInterface::extensions() const { |
- return extensions_; |
-} |
- |
-// Make the function definitions below less verbose. |
-typedef ConnectTestingEventInterface::ChannelState ChannelState; |
- |
-ChannelState ConnectTestingEventInterface::OnAddChannelResponse( |
- bool fail, |
- const std::string& selected_subprotocol, |
- const std::string& extensions) { |
- failed_ = fail; |
- selected_subprotocol_ = selected_subprotocol; |
- extensions_ = extensions; |
- QuitNestedEventLoop(); |
- return fail ? CHANNEL_DELETED : CHANNEL_ALIVE; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnDataFrame( |
- bool fin, |
- WebSocketMessageType type, |
- const std::vector<char>& data) { |
- return CHANNEL_ALIVE; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnFlowControl(int64 quota) { |
- return CHANNEL_ALIVE; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnClosingHandshake() { |
- return CHANNEL_ALIVE; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnDropChannel( |
- bool was_clean, |
- uint16 code, |
- const std::string& reason) { |
- return CHANNEL_DELETED; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnFailChannel( |
- const std::string& message) { |
- failed_ = true; |
- failure_message_ = message; |
- QuitNestedEventLoop(); |
- return CHANNEL_DELETED; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnStartOpeningHandshake( |
- scoped_ptr<WebSocketHandshakeRequestInfo> request) { |
- return CHANNEL_ALIVE; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnFinishOpeningHandshake( |
- scoped_ptr<WebSocketHandshakeResponseInfo> response) { |
- return CHANNEL_ALIVE; |
-} |
- |
-ChannelState ConnectTestingEventInterface::OnSSLCertificateError( |
- scoped_ptr<SSLErrorCallbacks> ssl_error_callbacks, |
- const GURL& url, |
- const SSLInfo& ssl_info, |
- bool fatal) { |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, base::Bind(&SSLErrorCallbacks::CancelSSLRequest, |
- base::Owned(ssl_error_callbacks.release()), |
- ERR_SSL_PROTOCOL_ERROR, &ssl_info)); |
- return CHANNEL_ALIVE; |
-} |
- |
-void ConnectTestingEventInterface::QuitNestedEventLoop() { |
- run_loop_.Quit(); |
-} |
- |
-// A subclass of TestNetworkDelegate that additionally implements the |
-// OnResolveProxy callback and records the information passed to it. |
-class TestNetworkDelegateWithProxyInfo : public TestNetworkDelegate { |
- public: |
- TestNetworkDelegateWithProxyInfo() {} |
- |
- struct ResolvedProxyInfo { |
- GURL url; |
- ProxyInfo proxy_info; |
- }; |
- |
- const ResolvedProxyInfo& resolved_proxy_info() const { |
- return resolved_proxy_info_; |
- } |
- |
- protected: |
- void OnResolveProxy(const GURL& url, |
- int load_flags, |
- const ProxyService& proxy_service, |
- ProxyInfo* result) override { |
- resolved_proxy_info_.url = url; |
- resolved_proxy_info_.proxy_info = *result; |
- } |
- |
- private: |
- ResolvedProxyInfo resolved_proxy_info_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestNetworkDelegateWithProxyInfo); |
-}; |
- |
-class WebSocketEndToEndTest : public ::testing::Test { |
- protected: |
- WebSocketEndToEndTest() |
- : event_interface_(new ConnectTestingEventInterface), |
- network_delegate_(new TestNetworkDelegateWithProxyInfo), |
- context_(true), |
- channel_(make_scoped_ptr(event_interface_), &context_), |
- initialised_context_(false) {} |
- |
- // Initialise the URLRequestContext. Normally done automatically by |
- // ConnectAndWait(). This method is for the use of tests that need the |
- // URLRequestContext initialised before calling ConnectAndWait(). |
- void InitialiseContext() { |
- context_.set_network_delegate(network_delegate_.get()); |
- context_.Init(); |
- initialised_context_ = true; |
- } |
- |
- // Send the connect request to |socket_url| and wait for a response. Returns |
- // true if the handshake succeeded. |
- bool ConnectAndWait(const GURL& socket_url) { |
- if (!initialised_context_) { |
- InitialiseContext(); |
- } |
- std::vector<std::string> sub_protocols; |
- url::Origin origin("http://localhost"); |
- channel_.SendAddChannelRequest(GURL(socket_url), sub_protocols, origin); |
- event_interface_->WaitForResponse(); |
- return !event_interface_->failed(); |
- } |
- |
- ConnectTestingEventInterface* event_interface_; // owned by channel_ |
- scoped_ptr<TestNetworkDelegateWithProxyInfo> network_delegate_; |
- TestURLRequestContext context_; |
- WebSocketChannel channel_; |
- bool initialised_context_; |
-}; |
- |
-// None of these tests work on Android. |
-// TODO(ricea): Make these tests work on Android. See crbug.com/441711. |
-#if defined(OS_ANDROID) |
-#define DISABLED_ON_ANDROID(test) DISABLED_##test |
-#else |
-#define DISABLED_ON_ANDROID(test) test |
-#endif |
- |
-// Basic test of connectivity. If this test fails, nothing else can be expected |
-// to work. |
-TEST_F(WebSocketEndToEndTest, DISABLED_ON_ANDROID(BasicSmokeTest)) { |
- SpawnedTestServer ws_server(SpawnedTestServer::TYPE_WS, |
- SpawnedTestServer::kLocalhost, |
- GetWebSocketTestDataDirectory()); |
- ASSERT_TRUE(ws_server.Start()); |
- EXPECT_TRUE(ConnectAndWait(ws_server.GetURL(kEchoServer))); |
-} |
- |
-// Test for issue crbug.com/433695 "Unencrypted WebSocket connection via |
-// authenticated proxy times out" |
-// TODO(ricea): Enable this when the issue is fixed. |
-TEST_F(WebSocketEndToEndTest, DISABLED_HttpsProxyUnauthedFails) { |
- SpawnedTestServer proxy_server(SpawnedTestServer::TYPE_BASIC_AUTH_PROXY, |
- SpawnedTestServer::kLocalhost, |
- base::FilePath()); |
- SpawnedTestServer ws_server(SpawnedTestServer::TYPE_WS, |
- SpawnedTestServer::kLocalhost, |
- GetWebSocketTestDataDirectory()); |
- ASSERT_TRUE(proxy_server.StartInBackground()); |
- ASSERT_TRUE(ws_server.StartInBackground()); |
- ASSERT_TRUE(proxy_server.BlockUntilStarted()); |
- ASSERT_TRUE(ws_server.BlockUntilStarted()); |
- std::string proxy_config = |
- "https=" + proxy_server.host_port_pair().ToString(); |
- scoped_ptr<ProxyService> proxy_service( |
- ProxyService::CreateFixed(proxy_config)); |
- ASSERT_TRUE(proxy_service); |
- context_.set_proxy_service(proxy_service.get()); |
- EXPECT_FALSE(ConnectAndWait(ws_server.GetURL(kEchoServer))); |
- EXPECT_EQ("Proxy authentication failed", event_interface_->failure_message()); |
-} |
- |
-TEST_F(WebSocketEndToEndTest, DISABLED_ON_ANDROID(HttpsWssProxyUnauthedFails)) { |
- SpawnedTestServer proxy_server(SpawnedTestServer::TYPE_BASIC_AUTH_PROXY, |
- SpawnedTestServer::kLocalhost, |
- base::FilePath()); |
- SpawnedTestServer wss_server(SpawnedTestServer::TYPE_WSS, |
- SpawnedTestServer::kLocalhost, |
- GetWebSocketTestDataDirectory()); |
- ASSERT_TRUE(proxy_server.StartInBackground()); |
- ASSERT_TRUE(wss_server.StartInBackground()); |
- ASSERT_TRUE(proxy_server.BlockUntilStarted()); |
- ASSERT_TRUE(wss_server.BlockUntilStarted()); |
- std::string proxy_config = |
- "https=" + proxy_server.host_port_pair().ToString(); |
- scoped_ptr<ProxyService> proxy_service( |
- ProxyService::CreateFixed(proxy_config)); |
- ASSERT_TRUE(proxy_service); |
- context_.set_proxy_service(proxy_service.get()); |
- EXPECT_FALSE(ConnectAndWait(wss_server.GetURL(kEchoServer))); |
- EXPECT_EQ("Proxy authentication failed", event_interface_->failure_message()); |
-} |
- |
-// Regression test for crbug/426736 "WebSocket connections not using configured |
-// system HTTPS Proxy". |
-TEST_F(WebSocketEndToEndTest, DISABLED_ON_ANDROID(HttpsProxyUsed)) { |
- SpawnedTestServer proxy_server(SpawnedTestServer::TYPE_BASIC_AUTH_PROXY, |
- SpawnedTestServer::kLocalhost, |
- base::FilePath()); |
- SpawnedTestServer ws_server(SpawnedTestServer::TYPE_WS, |
- SpawnedTestServer::kLocalhost, |
- GetWebSocketTestDataDirectory()); |
- ASSERT_TRUE(proxy_server.StartInBackground()); |
- ASSERT_TRUE(ws_server.StartInBackground()); |
- ASSERT_TRUE(proxy_server.BlockUntilStarted()); |
- ASSERT_TRUE(ws_server.BlockUntilStarted()); |
- std::string proxy_config = "https=" + |
- proxy_server.host_port_pair().ToString() + ";" + |
- "http=" + proxy_server.host_port_pair().ToString(); |
- scoped_ptr<ProxyService> proxy_service( |
- ProxyService::CreateFixed(proxy_config)); |
- context_.set_proxy_service(proxy_service.get()); |
- InitialiseContext(); |
- |
- // The test server doesn't have an unauthenticated proxy mode. WebSockets |
- // cannot provide auth information that isn't already cached, so it's |
- // necessary to preflight an HTTP request to authenticate against the proxy. |
- GURL::Replacements replacements; |
- replacements.SetSchemeStr("http"); |
- // It doesn't matter what the URL is, as long as it is an HTTP navigation. |
- GURL http_page = |
- ws_server.GetURL("connect_check.html").ReplaceComponents(replacements); |
- TestDelegate delegate; |
- delegate.set_credentials( |
- AuthCredentials(base::ASCIIToUTF16("foo"), base::ASCIIToUTF16("bar"))); |
- { |
- scoped_ptr<URLRequest> request( |
- context_.CreateRequest(http_page, DEFAULT_PRIORITY, &delegate, NULL)); |
- request->Start(); |
- // TestDelegate exits the message loop when the request completes by |
- // default. |
- base::RunLoop().Run(); |
- EXPECT_TRUE(delegate.auth_required_called()); |
- } |
- |
- GURL ws_url = ws_server.GetURL(kEchoServer); |
- EXPECT_TRUE(ConnectAndWait(ws_url)); |
- const TestNetworkDelegateWithProxyInfo::ResolvedProxyInfo& info = |
- network_delegate_->resolved_proxy_info(); |
- EXPECT_EQ(ws_url, info.url); |
- EXPECT_TRUE(info.proxy_info.is_http()); |
-} |
- |
-// This is a regression test for crbug.com/408061 Crash in |
-// net::WebSocketBasicHandshakeStream::Upgrade. |
-TEST_F(WebSocketEndToEndTest, DISABLED_ON_ANDROID(TruncatedResponse)) { |
- SpawnedTestServer ws_server(SpawnedTestServer::TYPE_WS, |
- SpawnedTestServer::kLocalhost, |
- GetWebSocketTestDataDirectory()); |
- ASSERT_TRUE(ws_server.Start()); |
- InitialiseContext(); |
- |
- GURL ws_url = ws_server.GetURL("truncated-headers"); |
- EXPECT_FALSE(ConnectAndWait(ws_url)); |
-} |
- |
-} // namespace |
- |
-} // namespace net |