Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / test / chromedriver / net / sync_websocket_impl_unittest.cc
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/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"
19 #include "url/gurl.h"
20
21 namespace {
22
23 class SyncWebSocketImplTest : public testing::Test {
24  protected:
25   SyncWebSocketImplTest()
26       : client_thread_("ClientThread"),
27         long_timeout_(base::TimeDelta::FromMinutes(1)) {}
28   ~SyncWebSocketImplTest() override {}
29
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());
36   }
37
38   void TearDown() override { server_.Stop(); }
39
40   base::Thread client_thread_;
41   TestHttpServer server_;
42   scoped_refptr<URLRequestContextGetter> context_getter_;
43   const base::TimeDelta long_timeout_;
44 };
45
46 }  // namespace
47
48 TEST_F(SyncWebSocketImplTest, CreateDestroy) {
49   SyncWebSocketImpl sock(context_getter_.get());
50 }
51
52 TEST_F(SyncWebSocketImplTest, Connect) {
53   SyncWebSocketImpl sock(context_getter_.get());
54   ASSERT_TRUE(sock.Connect(server_.web_socket_url()));
55 }
56
57 TEST_F(SyncWebSocketImplTest, ConnectFail) {
58   SyncWebSocketImpl sock(context_getter_.get());
59   ASSERT_FALSE(sock.Connect(GURL("ws://127.0.0.1:33333")));
60 }
61
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"));
66   std::string message;
67   ASSERT_EQ(
68       SyncWebSocket::kOk,
69       sock.ReceiveNextMessage(&message, long_timeout_));
70   ASSERT_STREQ("hi", message.c_str());
71 }
72
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"));
77   std::string message;
78   ASSERT_EQ(
79       SyncWebSocket::kTimeout,
80       sock.ReceiveNextMessage(
81           &message, base::TimeDelta()));
82 }
83
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));
89   std::string message;
90   ASSERT_EQ(
91       SyncWebSocket::kOk,
92       sock.ReceiveNextMessage(&message, long_timeout_));
93   ASSERT_EQ(wrote_message.length(), message.length());
94   ASSERT_EQ(wrote_message, message);
95 }
96
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"));
102   std::string message;
103   ASSERT_EQ(
104       SyncWebSocket::kOk,
105       sock.ReceiveNextMessage(&message, long_timeout_));
106   ASSERT_STREQ("1", message.c_str());
107   ASSERT_TRUE(sock.Send("3"));
108   ASSERT_EQ(
109       SyncWebSocket::kOk,
110       sock.ReceiveNextMessage(&message, long_timeout_));
111   ASSERT_STREQ("2", message.c_str());
112   ASSERT_EQ(
113       SyncWebSocket::kOk,
114       sock.ReceiveNextMessage(&message, long_timeout_));
115   ASSERT_STREQ("3", message.c_str());
116 }
117
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"));
123   std::string message;
124   ASSERT_EQ(
125       SyncWebSocket::kDisconnected,
126       sock.ReceiveNextMessage(&message, long_timeout_));
127   ASSERT_STREQ("", message.c_str());
128 }
129
130 TEST_F(SyncWebSocketImplTest, CloseOnSend) {
131   SyncWebSocketImpl sock(context_getter_.get());
132   ASSERT_TRUE(sock.Connect(server_.web_socket_url()));
133   server_.Stop();
134   ASSERT_FALSE(sock.Send("1"));
135 }
136
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));
147     else
148       break;
149   }
150   server_.Stop();
151   ASSERT_FALSE(sock.Send("2"));
152   ASSERT_FALSE(sock.IsConnected());
153   server_.Start();
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"));
158   std::string message;
159   ASSERT_EQ(
160       SyncWebSocket::kOk,
161       sock.ReceiveNextMessage(&message, long_timeout_));
162   ASSERT_STREQ("3", message.c_str());
163   ASSERT_FALSE(sock.HasNextMessage());
164 }