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.
7 #include "base/compiler_specific.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/message_loop/message_loop_proxy.h"
11 #include "base/single_thread_task_runner.h"
12 #include "base/threading/platform_thread.h"
13 #include "base/threading/thread.h"
14 #include "base/time/time.h"
15 #include "chrome/test/chromedriver/net/sync_websocket_impl.h"
16 #include "chrome/test/chromedriver/net/test_http_server.h"
17 #include "chrome/test/chromedriver/net/url_request_context_getter.h"
18 #include "testing/gtest/include/gtest/gtest.h"
23 class SyncWebSocketImplTest
: public testing::Test
{
25 SyncWebSocketImplTest()
26 : client_thread_("ClientThread"),
27 long_timeout_(base::TimeDelta::FromMinutes(1)) {}
28 ~SyncWebSocketImplTest() override
{}
30 void SetUp() override
{
31 base::Thread::Options
options(base::MessageLoop::TYPE_IO
, 0);
32 ASSERT_TRUE(client_thread_
.StartWithOptions(options
));
33 context_getter_
= new URLRequestContextGetter(
34 client_thread_
.message_loop_proxy());
35 ASSERT_TRUE(server_
.Start());
38 void TearDown() override
{ server_
.Stop(); }
40 base::Thread client_thread_
;
41 TestHttpServer server_
;
42 scoped_refptr
<URLRequestContextGetter
> context_getter_
;
43 const base::TimeDelta long_timeout_
;
48 TEST_F(SyncWebSocketImplTest
, CreateDestroy
) {
49 SyncWebSocketImpl
sock(context_getter_
.get());
52 TEST_F(SyncWebSocketImplTest
, Connect
) {
53 SyncWebSocketImpl
sock(context_getter_
.get());
54 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
57 TEST_F(SyncWebSocketImplTest
, ConnectFail
) {
58 SyncWebSocketImpl
sock(context_getter_
.get());
59 ASSERT_FALSE(sock
.Connect(GURL("ws://127.0.0.1:33333")));
62 TEST_F(SyncWebSocketImplTest
, SendReceive
) {
63 SyncWebSocketImpl
sock(context_getter_
.get());
64 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
65 ASSERT_TRUE(sock
.Send("hi"));
69 sock
.ReceiveNextMessage(&message
, long_timeout_
));
70 ASSERT_STREQ("hi", message
.c_str());
73 TEST_F(SyncWebSocketImplTest
, SendReceiveTimeout
) {
74 SyncWebSocketImpl
sock(context_getter_
.get());
75 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
76 ASSERT_TRUE(sock
.Send("hi"));
79 SyncWebSocket::kTimeout
,
80 sock
.ReceiveNextMessage(
81 &message
, base::TimeDelta()));
84 TEST_F(SyncWebSocketImplTest
, SendReceiveLarge
) {
85 SyncWebSocketImpl
sock(context_getter_
.get());
86 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
87 std::string
wrote_message(10 << 20, 'a');
88 ASSERT_TRUE(sock
.Send(wrote_message
));
92 sock
.ReceiveNextMessage(&message
, long_timeout_
));
93 ASSERT_EQ(wrote_message
.length(), message
.length());
94 ASSERT_EQ(wrote_message
, message
);
97 TEST_F(SyncWebSocketImplTest
, SendReceiveMany
) {
98 SyncWebSocketImpl
sock(context_getter_
.get());
99 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
100 ASSERT_TRUE(sock
.Send("1"));
101 ASSERT_TRUE(sock
.Send("2"));
105 sock
.ReceiveNextMessage(&message
, long_timeout_
));
106 ASSERT_STREQ("1", message
.c_str());
107 ASSERT_TRUE(sock
.Send("3"));
110 sock
.ReceiveNextMessage(&message
, long_timeout_
));
111 ASSERT_STREQ("2", message
.c_str());
114 sock
.ReceiveNextMessage(&message
, long_timeout_
));
115 ASSERT_STREQ("3", message
.c_str());
118 TEST_F(SyncWebSocketImplTest
, CloseOnReceive
) {
119 server_
.SetMessageAction(TestHttpServer::kCloseOnMessage
);
120 SyncWebSocketImpl
sock(context_getter_
.get());
121 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
122 ASSERT_TRUE(sock
.Send("1"));
125 SyncWebSocket::kDisconnected
,
126 sock
.ReceiveNextMessage(&message
, long_timeout_
));
127 ASSERT_STREQ("", message
.c_str());
130 TEST_F(SyncWebSocketImplTest
, CloseOnSend
) {
131 SyncWebSocketImpl
sock(context_getter_
.get());
132 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
134 ASSERT_FALSE(sock
.Send("1"));
137 TEST_F(SyncWebSocketImplTest
, Reconnect
) {
138 SyncWebSocketImpl
sock(context_getter_
.get());
139 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
140 ASSERT_TRUE(sock
.Send("1"));
141 // Wait for SyncWebSocket to receive the response from the server.
142 base::TimeTicks deadline
=
143 base::TimeTicks::Now() + base::TimeDelta::FromSeconds(20);
144 while (base::TimeTicks::Now() < deadline
) {
145 if (sock
.IsConnected() && !sock
.HasNextMessage())
146 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
151 ASSERT_FALSE(sock
.Send("2"));
152 ASSERT_FALSE(sock
.IsConnected());
154 ASSERT_TRUE(sock
.HasNextMessage());
155 ASSERT_TRUE(sock
.Connect(server_
.web_socket_url()));
156 ASSERT_FALSE(sock
.HasNextMessage());
157 ASSERT_TRUE(sock
.Send("3"));
161 sock
.ReceiveNextMessage(&message
, long_timeout_
));
162 ASSERT_STREQ("3", message
.c_str());
163 ASSERT_FALSE(sock
.HasNextMessage());