1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/websockets/websocket_test_util.h"
6
7 #include "base/basictypes.h"
8 #include "base/strings/stringprintf.h"
9 #include "net/socket/socket_test_util.h"
10
11 namespace net {
12
13 namespace {
14 const uint64 kA =
15 (static_cast<uint64>(0x5851f42d) << 32) + static_cast<uint64>(0x4c957f2d);
16 const uint64 kC = 12345;
17 const uint64 kM = static_cast<uint64>(1) << 48;
18
19 } // namespace
20
LinearCongruentialGenerator(uint32 seed)21 LinearCongruentialGenerator::LinearCongruentialGenerator(uint32 seed)
22 : current_(seed) {}
23
Generate()24 uint32 LinearCongruentialGenerator::Generate() {
25 uint64 result = current_;
26 current_ = (current_ * kA + kC) % kM;
27 return static_cast<uint32>(result >> 16);
28 }
29
WebSocketStandardRequest(const std::string & path,const std::string & origin,const std::string & extra_headers)30 std::string WebSocketStandardRequest(const std::string& path,
31 const std::string& origin,
32 const std::string& extra_headers) {
33 // Unrelated changes in net/http may change the order and default-values of
34 // HTTP headers, causing WebSocket tests to fail. It is safe to update this
35 // string in that case.
36 return base::StringPrintf(
37 "GET %s HTTP/1.1\r\n"
38 "Host: localhost\r\n"
39 "Connection: Upgrade\r\n"
40 "Upgrade: websocket\r\n"
41 "Origin: %s\r\n"
42 "Sec-WebSocket-Version: 13\r\n"
43 "User-Agent:\r\n"
44 "Accept-Encoding: gzip,deflate\r\n"
45 "Accept-Language: en-us,fr\r\n"
46 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
47 "%s\r\n",
48 path.c_str(),
49 origin.c_str(),
50 extra_headers.c_str());
51 }
52
WebSocketStandardResponse(const std::string & extra_headers)53 std::string WebSocketStandardResponse(const std::string& extra_headers) {
54 return base::StringPrintf(
55 "HTTP/1.1 101 Switching Protocols\r\n"
56 "Upgrade: websocket\r\n"
57 "Connection: Upgrade\r\n"
58 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
59 "%s\r\n",
60 extra_headers.c_str());
61 }
62
63 struct WebSocketDeterministicMockClientSocketFactoryMaker::Detail {
64 std::string expect_written;
65 std::string return_to_read;
66 MockRead read;
67 MockWrite write;
68 scoped_ptr<DeterministicSocketData> data;
69 DeterministicMockClientSocketFactory factory;
70 };
71
72 WebSocketDeterministicMockClientSocketFactoryMaker::
WebSocketDeterministicMockClientSocketFactoryMaker()73 WebSocketDeterministicMockClientSocketFactoryMaker()
74 : detail_(new Detail) {}
75
76 WebSocketDeterministicMockClientSocketFactoryMaker::
~WebSocketDeterministicMockClientSocketFactoryMaker()77 ~WebSocketDeterministicMockClientSocketFactoryMaker() {}
78
79 DeterministicMockClientSocketFactory*
factory()80 WebSocketDeterministicMockClientSocketFactoryMaker::factory() {
81 return &detail_->factory;
82 }
83
SetExpectations(const std::string & expect_written,const std::string & return_to_read)84 void WebSocketDeterministicMockClientSocketFactoryMaker::SetExpectations(
85 const std::string& expect_written,
86 const std::string& return_to_read) {
87 // We need to extend the lifetime of these strings.
88 detail_->expect_written = expect_written;
89 detail_->return_to_read = return_to_read;
90 detail_->write = MockWrite(SYNCHRONOUS, 0, detail_->expect_written.c_str());
91 detail_->read = MockRead(SYNCHRONOUS, 1, detail_->return_to_read.c_str());
92 scoped_ptr<DeterministicSocketData> socket_data(
93 new DeterministicSocketData(&detail_->read, 1, &detail_->write, 1));
94 socket_data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
95 socket_data->SetStop(2);
96 SetRawExpectations(socket_data.Pass());
97 }
98
SetRawExpectations(scoped_ptr<DeterministicSocketData> socket_data)99 void WebSocketDeterministicMockClientSocketFactoryMaker::SetRawExpectations(
100 scoped_ptr<DeterministicSocketData> socket_data) {
101 detail_->data = socket_data.Pass();
102 detail_->factory.AddSocketDataProvider(detail_->data.get());
103 }
104
WebSocketTestURLRequestContextHost()105 WebSocketTestURLRequestContextHost::WebSocketTestURLRequestContextHost()
106 : url_request_context_(true) {
107 url_request_context_.set_client_socket_factory(maker_.factory());
108 }
109
~WebSocketTestURLRequestContextHost()110 WebSocketTestURLRequestContextHost::~WebSocketTestURLRequestContextHost() {}
111
SetRawExpectations(scoped_ptr<DeterministicSocketData> socket_data)112 void WebSocketTestURLRequestContextHost::SetRawExpectations(
113 scoped_ptr<DeterministicSocketData> socket_data) {
114 maker_.SetRawExpectations(socket_data.Pass());
115 }
116
117 TestURLRequestContext*
GetURLRequestContext()118 WebSocketTestURLRequestContextHost::GetURLRequestContext() {
119 url_request_context_.Init();
120 // A Network Delegate is required to make the URLRequest::Delegate work.
121 url_request_context_.set_network_delegate(&network_delegate_);
122 return &url_request_context_;
123 }
124
125 } // namespace net
126