Index: net/websockets/websocket_stream_create_test_base.cc |
diff --git a/net/websockets/websocket_stream_create_test_base.cc b/net/websockets/websocket_stream_create_test_base.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..900b1aff09b48d0f7fc98f61c945c7f2dc816abe |
--- /dev/null |
+++ b/net/websockets/websocket_stream_create_test_base.cc |
@@ -0,0 +1,150 @@ |
+// 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 "net/websockets/websocket_stream_create_test_base.h" |
+ |
+#include "base/callback.h" |
+#include "net/http/http_request_headers.h" |
+#include "net/http/http_response_headers.h" |
+#include "net/websockets/websocket_basic_handshake_stream.h" |
+#include "net/websockets/websocket_handshake_request_info.h" |
+#include "net/websockets/websocket_handshake_response_info.h" |
+#include "net/websockets/websocket_handshake_stream_create_helper.h" |
+#include "net/websockets/websocket_stream.h" |
+#include "url/gurl.h" |
+#include "url/origin.h" |
+ |
+namespace net { |
+ |
+using HeaderKeyValuePair = WebSocketStreamCreateTestBase::HeaderKeyValuePair; |
+ |
+// A sub-class of WebSocketHandshakeStreamCreateHelper which always sets a |
+// deterministic key to use in the WebSocket handshake. |
+class DeterministicKeyWebSocketHandshakeStreamCreateHelper |
+ : public WebSocketHandshakeStreamCreateHelper { |
+ public: |
+ DeterministicKeyWebSocketHandshakeStreamCreateHelper( |
+ WebSocketStream::ConnectDelegate* connect_delegate, |
+ const std::vector<std::string>& requested_subprotocols) |
+ : WebSocketHandshakeStreamCreateHelper(connect_delegate, |
+ requested_subprotocols) {} |
+ |
+ void OnStreamCreated(WebSocketBasicHandshakeStream* stream) override { |
+ stream->SetWebSocketKeyForTesting("dGhlIHNhbXBsZSBub25jZQ=="); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN( |
+ DeterministicKeyWebSocketHandshakeStreamCreateHelper); |
+}; |
+ |
+class WebSocketStreamCreateTestBase::TestConnectDelegate |
+ : public WebSocketStream::ConnectDelegate { |
+ public: |
+ TestConnectDelegate(WebSocketStreamCreateTestBase* owner, |
+ const base::Closure& done_callback) |
+ : owner_(owner), done_callback_(done_callback) {} |
+ |
+ void OnSuccess(scoped_ptr<WebSocketStream> stream) override { |
+ stream.swap(owner_->stream_); |
+ done_callback_.Run(); |
+ } |
+ |
+ void OnFailure(const std::string& message) override { |
+ owner_->has_failed_ = true; |
+ owner_->failure_message_ = message; |
+ done_callback_.Run(); |
+ } |
+ |
+ void OnStartOpeningHandshake( |
+ scoped_ptr<WebSocketHandshakeRequestInfo> request) override { |
+ // Can be called multiple times (in the case of HTTP auth). Last call |
+ // wins. |
+ owner_->request_info_ = request.Pass(); |
+ } |
+ |
+ void OnFinishOpeningHandshake( |
+ scoped_ptr<WebSocketHandshakeResponseInfo> response) override { |
+ if (owner_->response_info_) |
+ ADD_FAILURE(); |
+ owner_->response_info_ = response.Pass(); |
+ } |
+ |
+ 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: |
+ WebSocketStreamCreateTestBase* owner_; |
+ base::Closure done_callback_; |
+ DISALLOW_COPY_AND_ASSIGN(TestConnectDelegate); |
+}; |
+ |
+WebSocketStreamCreateTestBase::WebSocketStreamCreateTestBase() |
+ : has_failed_(false), ssl_fatal_(false) { |
+} |
+ |
+WebSocketStreamCreateTestBase::~WebSocketStreamCreateTestBase() { |
+} |
+ |
+void WebSocketStreamCreateTestBase::CreateAndConnectStream( |
+ const std::string& socket_url, |
+ const std::vector<std::string>& sub_protocols, |
+ const std::string& origin, |
+ scoped_ptr<base::Timer> timer) { |
+ for (size_t i = 0; i < ssl_data_.size(); ++i) { |
+ scoped_ptr<SSLSocketDataProvider> ssl_data(ssl_data_[i]); |
+ url_request_context_host_.AddSSLSocketDataProvider(ssl_data.Pass()); |
+ } |
+ ssl_data_.weak_clear(); |
+ scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate( |
+ new TestConnectDelegate(this, connect_run_loop_.QuitClosure())); |
+ WebSocketStream::ConnectDelegate* delegate = connect_delegate.get(); |
+ scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( |
+ new DeterministicKeyWebSocketHandshakeStreamCreateHelper(delegate, |
+ sub_protocols)); |
+ stream_request_ = CreateAndConnectStreamForTesting( |
+ GURL(socket_url), create_helper.Pass(), url::Origin(origin), |
+ url_request_context_host_.GetURLRequestContext(), BoundNetLog(), |
+ connect_delegate.Pass(), |
+ timer ? timer.Pass() |
+ : scoped_ptr<base::Timer>(new base::Timer(false, false))); |
+} |
+ |
+std::vector<HeaderKeyValuePair> |
+WebSocketStreamCreateTestBase::RequestHeadersToVector( |
+ const HttpRequestHeaders& headers) { |
+ HttpRequestHeaders::Iterator it(headers); |
+ std::vector<HeaderKeyValuePair> result; |
+ while (it.GetNext()) |
+ result.push_back(HeaderKeyValuePair(it.name(), it.value())); |
+ return result; |
+} |
+ |
+std::vector<HeaderKeyValuePair> |
+WebSocketStreamCreateTestBase::ResponseHeadersToVector( |
+ const HttpResponseHeaders& headers) { |
+ void* iter = NULL; |
+ std::string name, value; |
+ std::vector<HeaderKeyValuePair> result; |
+ while (headers.EnumerateHeaderLines(&iter, &name, &value)) |
+ result.push_back(HeaderKeyValuePair(name, value)); |
+ return result; |
+} |
+ |
+void WebSocketStreamCreateTestBase::WaitUntilConnectDone() { |
+ connect_run_loop_.Run(); |
+} |
+ |
+std::vector<std::string> WebSocketStreamCreateTestBase::NoSubProtocols() { |
+ return std::vector<std::string>(); |
+} |
+ |
+} // namespace net |