summaryrefslogtreecommitdiff
path: root/chromium/net/websockets/websocket_test_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/websockets/websocket_test_util.cc')
-rw-r--r--chromium/net/websockets/websocket_test_util.cc125
1 files changed, 125 insertions, 0 deletions
diff --git a/chromium/net/websockets/websocket_test_util.cc b/chromium/net/websockets/websocket_test_util.cc
new file mode 100644
index 00000000000..55113c6f15c
--- /dev/null
+++ b/chromium/net/websockets/websocket_test_util.cc
@@ -0,0 +1,125 @@
+// Copyright 2013 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_test_util.h"
+
+#include "base/basictypes.h"
+#include "base/strings/stringprintf.h"
+#include "net/socket/socket_test_util.h"
+
+namespace net {
+
+namespace {
+const uint64 kA =
+ (static_cast<uint64>(0x5851f42d) << 32) + static_cast<uint64>(0x4c957f2d);
+const uint64 kC = 12345;
+const uint64 kM = static_cast<uint64>(1) << 48;
+
+} // namespace
+
+LinearCongruentialGenerator::LinearCongruentialGenerator(uint32 seed)
+ : current_(seed) {}
+
+uint32 LinearCongruentialGenerator::Generate() {
+ uint64 result = current_;
+ current_ = (current_ * kA + kC) % kM;
+ return static_cast<uint32>(result >> 16);
+}
+
+std::string WebSocketStandardRequest(const std::string& path,
+ const std::string& origin,
+ const std::string& extra_headers) {
+ // Unrelated changes in net/http may change the order and default-values of
+ // HTTP headers, causing WebSocket tests to fail. It is safe to update this
+ // string in that case.
+ return base::StringPrintf(
+ "GET %s HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Connection: Upgrade\r\n"
+ "Upgrade: websocket\r\n"
+ "Origin: %s\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "User-Agent:\r\n"
+ "Accept-Encoding: gzip,deflate\r\n"
+ "Accept-Language: en-us,fr\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "%s\r\n",
+ path.c_str(),
+ origin.c_str(),
+ extra_headers.c_str());
+}
+
+std::string WebSocketStandardResponse(const std::string& extra_headers) {
+ return base::StringPrintf(
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "%s\r\n",
+ extra_headers.c_str());
+}
+
+struct WebSocketDeterministicMockClientSocketFactoryMaker::Detail {
+ std::string expect_written;
+ std::string return_to_read;
+ MockRead read;
+ MockWrite write;
+ scoped_ptr<DeterministicSocketData> data;
+ DeterministicMockClientSocketFactory factory;
+};
+
+WebSocketDeterministicMockClientSocketFactoryMaker::
+ WebSocketDeterministicMockClientSocketFactoryMaker()
+ : detail_(new Detail) {}
+
+WebSocketDeterministicMockClientSocketFactoryMaker::
+ ~WebSocketDeterministicMockClientSocketFactoryMaker() {}
+
+DeterministicMockClientSocketFactory*
+WebSocketDeterministicMockClientSocketFactoryMaker::factory() {
+ return &detail_->factory;
+}
+
+void WebSocketDeterministicMockClientSocketFactoryMaker::SetExpectations(
+ const std::string& expect_written,
+ const std::string& return_to_read) {
+ // We need to extend the lifetime of these strings.
+ detail_->expect_written = expect_written;
+ detail_->return_to_read = return_to_read;
+ detail_->write = MockWrite(SYNCHRONOUS, 0, detail_->expect_written.c_str());
+ detail_->read = MockRead(SYNCHRONOUS, 1, detail_->return_to_read.c_str());
+ scoped_ptr<DeterministicSocketData> socket_data(
+ new DeterministicSocketData(&detail_->read, 1, &detail_->write, 1));
+ socket_data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
+ socket_data->SetStop(2);
+ SetRawExpectations(socket_data.Pass());
+}
+
+void WebSocketDeterministicMockClientSocketFactoryMaker::SetRawExpectations(
+ scoped_ptr<DeterministicSocketData> socket_data) {
+ detail_->data = socket_data.Pass();
+ detail_->factory.AddSocketDataProvider(detail_->data.get());
+}
+
+WebSocketTestURLRequestContextHost::WebSocketTestURLRequestContextHost()
+ : url_request_context_(true) {
+ url_request_context_.set_client_socket_factory(maker_.factory());
+}
+
+WebSocketTestURLRequestContextHost::~WebSocketTestURLRequestContextHost() {}
+
+void WebSocketTestURLRequestContextHost::SetRawExpectations(
+ scoped_ptr<DeterministicSocketData> socket_data) {
+ maker_.SetRawExpectations(socket_data.Pass());
+}
+
+TestURLRequestContext*
+WebSocketTestURLRequestContextHost::GetURLRequestContext() {
+ url_request_context_.Init();
+ // A Network Delegate is required to make the URLRequest::Delegate work.
+ url_request_context_.set_network_delegate(&network_delegate_);
+ return &url_request_context_;
+}
+
+} // namespace net