Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2301)

Side by Side Diff: chrome/test/chromedriver/net/sync_websocket_unittest.cc

Issue 11316115: [chromedriver] Write websocket client and sync websocket client. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address toyoshim's comments and change some NET_EXPORT_PRIVATE Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 <string>
6
7 #include "base/bind.h"
8 #include "base/compiler_specific.h"
9 #include "base/location.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/message_loop.h"
12 #include "base/message_loop_proxy.h"
13 #include "base/single_thread_task_runner.h"
14 #include "base/stringprintf.h"
15 #include "base/synchronization/waitable_event.h"
16 #include "base/threading/thread.h"
17 #include "chrome/test/chromedriver/net/sync_websocket.h"
18 #include "chrome/test/chromedriver/net/url_request_context_getter.h"
19 #include "googleurl/src/gurl.h"
20 #include "net/base/ip_endpoint.h"
21 #include "net/base/net_errors.h"
22 #include "net/base/tcp_listen_socket.h"
23 #include "net/server/http_server.h"
24 #include "net/server/http_server_request_info.h"
25 #include "net/url_request/url_request_context_getter.h"
26 #include "testing/gtest/include/gtest/gtest.h"
27
28 namespace {
29
30 class SyncWebSocketTest : public testing::Test,
31 public net::HttpServer::Delegate {
32 public:
33 SyncWebSocketTest()
34 : io_thread_("io"),
35 close_on_receive_(false) {
36 base::Thread::Options options(MessageLoop::TYPE_IO, 0);
37 CHECK(io_thread_.StartWithOptions(options));
38 context_getter_ = new URLRequestContextGetter(
39 io_thread_.message_loop_proxy());
40 base::WaitableEvent event(false, false);
41 io_thread_.message_loop_proxy()->PostTask(
42 FROM_HERE,
43 base::Bind(&SyncWebSocketTest::InitOnIO,
44 base::Unretained(this), &event));
45 event.Wait();
46 }
47
48 virtual ~SyncWebSocketTest() {
49 base::WaitableEvent event(false, false);
50 io_thread_.message_loop_proxy()->PostTask(
51 FROM_HERE,
52 base::Bind(&SyncWebSocketTest::DestroyServerOnIO,
53 base::Unretained(this), &event));
54 event.Wait();
55 }
56
57 void InitOnIO(base::WaitableEvent* event) {
58 net::TCPListenSocketFactory factory("127.0.0.1", 0);
59 server_ = new net::HttpServer(factory, this);
60 net::IPEndPoint address;
61 CHECK_EQ(net::OK, server_->GetLocalAddress(&address));
62 server_url_ = GURL(base::StringPrintf("ws://127.0.0.1:%d", address.port()));
63 event->Signal();
64 }
65
66 void DestroyServerOnIO(base::WaitableEvent* event) {
67 server_ = NULL;
68 event->Signal();
69 }
70
71 // Overridden from net::HttpServer::Delegate:
72 virtual void OnHttpRequest(int connection_id,
73 const net::HttpServerRequestInfo& info) {}
74
75 virtual void OnWebSocketRequest(int connection_id,
76 const net::HttpServerRequestInfo& info) {
77 server_->AcceptWebSocket(connection_id, info);
78 }
79
80 virtual void OnWebSocketMessage(int connection_id,
81 const std::string& data) {
82 if (close_on_receive_) {
83 MessageLoop::current()->PostTask(
84 FROM_HERE,
85 base::Bind(&net::HttpServer::Close, server_, connection_id));
86 } else {
87 server_->SendOverWebSocket(connection_id, data);
88 }
89 }
90
91 virtual void OnClose(int connection_id) {}
92
93 protected:
94 base::Thread io_thread_;
95 scoped_refptr<net::HttpServer> server_;
96 scoped_refptr<URLRequestContextGetter> context_getter_;
97 GURL server_url_;
98 bool close_on_receive_;
99 };
100
101 } // namespace
102
103 TEST_F(SyncWebSocketTest, CreateDestroy) {
104 SyncWebSocket sock(context_getter_);
105 }
106
107 TEST_F(SyncWebSocketTest, Connect) {
108 SyncWebSocket sock(context_getter_);
109 ASSERT_TRUE(sock.Connect(server_url_));
110 }
111
112 TEST_F(SyncWebSocketTest, ConnectFail) {
113 SyncWebSocket sock(context_getter_);
114 ASSERT_FALSE(sock.Connect(GURL("ws://127.0.0.1:33333")));
115 }
116
117 TEST_F(SyncWebSocketTest, SendReceive) {
118 SyncWebSocket sock(context_getter_);
119 ASSERT_TRUE(sock.Connect(server_url_));
120 ASSERT_TRUE(sock.Send("hi"));
121 std::string message;
122 ASSERT_TRUE(sock.ReceiveNextMessage(&message));
123 ASSERT_STREQ("hi", message.c_str());
124 }
125
126 TEST_F(SyncWebSocketTest, SendReceiveLarge) {
127 SyncWebSocket sock(context_getter_);
128 ASSERT_TRUE(sock.Connect(server_url_));
129 // Sends/receives 200kb. For some reason pushing this above 240kb on my
130 // machine results in receiving no data back from the http server.
131 std::string wrote_message(200 << 10, 'a');
132 ASSERT_TRUE(sock.Send(wrote_message));
133 std::string message;
134 ASSERT_TRUE(sock.ReceiveNextMessage(&message));
135 ASSERT_EQ(wrote_message.length(), message.length());
136 ASSERT_EQ(wrote_message, message);
137 }
138
139 TEST_F(SyncWebSocketTest, SendReceiveMany) {
140 SyncWebSocket sock(context_getter_);
141 ASSERT_TRUE(sock.Connect(server_url_));
142 ASSERT_TRUE(sock.Send("1"));
143 ASSERT_TRUE(sock.Send("2"));
144 std::string message;
145 ASSERT_TRUE(sock.ReceiveNextMessage(&message));
146 ASSERT_STREQ("1", message.c_str());
147 ASSERT_TRUE(sock.Send("3"));
148 ASSERT_TRUE(sock.ReceiveNextMessage(&message));
149 ASSERT_STREQ("2", message.c_str());
150 ASSERT_TRUE(sock.ReceiveNextMessage(&message));
151 ASSERT_STREQ("3", message.c_str());
152 }
153
154 TEST_F(SyncWebSocketTest, CloseOnReceive) {
155 close_on_receive_ = true;
156 SyncWebSocket sock(context_getter_);
157 ASSERT_TRUE(sock.Connect(server_url_));
158 ASSERT_TRUE(sock.Send("1"));
159 std::string message;
160 ASSERT_FALSE(sock.ReceiveNextMessage(&message));
161 ASSERT_STREQ("", message.c_str());
162 }
163
164 TEST_F(SyncWebSocketTest, CloseOnSend) {
165 SyncWebSocket sock(context_getter_);
166 ASSERT_TRUE(sock.Connect(server_url_));
167 base::WaitableEvent event(false, false);
168 io_thread_.message_loop_proxy()->PostTask(
169 FROM_HERE,
170 base::Bind(&SyncWebSocketTest::DestroyServerOnIO,
171 base::Unretained(this), &event));
172 event.Wait();
173 ASSERT_FALSE(sock.Send("1"));
174 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698