diff options
Diffstat (limited to 'chromium/net/socket/tcp_listen_socket_unittest.h')
-rw-r--r-- | chromium/net/socket/tcp_listen_socket_unittest.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/chromium/net/socket/tcp_listen_socket_unittest.h b/chromium/net/socket/tcp_listen_socket_unittest.h new file mode 100644 index 00000000000..048a0186705 --- /dev/null +++ b/chromium/net/socket/tcp_listen_socket_unittest.h @@ -0,0 +1,122 @@ +// Copyright (c) 2012 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. + +#ifndef NET_BASE_LISTEN_SOCKET_UNITTEST_H_ +#define NET_BASE_LISTEN_SOCKET_UNITTEST_H_ + +#include "build/build_config.h" + +#if defined(OS_WIN) +#include <winsock2.h> +#elif defined(OS_POSIX) +#include <arpa/inet.h> +#include <errno.h> +#include <sys/socket.h> +#endif + +#include "base/basictypes.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop/message_loop.h" +#include "base/strings/string_util.h" +#include "base/synchronization/condition_variable.h" +#include "base/synchronization/lock.h" +#include "base/threading/thread.h" +#include "net/base/net_util.h" +#include "net/base/winsock_init.h" +#include "net/socket/tcp_listen_socket.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { + +enum ActionType { + ACTION_NONE = 0, + ACTION_LISTEN = 1, + ACTION_ACCEPT = 2, + ACTION_READ = 3, + ACTION_SEND = 4, + ACTION_CLOSE = 5, + ACTION_SHUTDOWN = 6 +}; + +class TCPListenSocketTestAction { + public: + TCPListenSocketTestAction() : action_(ACTION_NONE) {} + explicit TCPListenSocketTestAction(ActionType action) : action_(action) {} + TCPListenSocketTestAction(ActionType action, std::string data) + : action_(action), + data_(data) {} + + const std::string data() const { return data_; } + ActionType type() const { return action_; } + + private: + ActionType action_; + std::string data_; +}; + + +// This had to be split out into a separate class because I couldn't +// make the testing::Test class refcounted. +class TCPListenSocketTester : + public StreamListenSocket::Delegate, + public base::RefCountedThreadSafe<TCPListenSocketTester> { + + public: + TCPListenSocketTester(); + + void SetUp(); + void TearDown(); + + void ReportAction(const TCPListenSocketTestAction& action); + void NextAction(); + + // read all pending data from the test socket + int ClearTestSocket(); + // Release the connection and server sockets + void Shutdown(); + void Listen(); + void SendFromTester(); + // verify the send/read from client to server + void TestClientSend(); + // verify send/read of a longer string + void TestClientSendLong(); + // verify a send/read from server to client + void TestServerSend(); + // verify multiple sends and reads from server to client. + void TestServerSendMultiple(); + + virtual bool Send(SocketDescriptor sock, const std::string& str); + + // StreamListenSocket::Delegate: + virtual void DidAccept(StreamListenSocket* server, + StreamListenSocket* connection) OVERRIDE; + virtual void DidRead(StreamListenSocket* connection, const char* data, + int len) OVERRIDE; + virtual void DidClose(StreamListenSocket* sock) OVERRIDE; + + scoped_ptr<base::Thread> thread_; + base::MessageLoopForIO* loop_; + scoped_refptr<TCPListenSocket> server_; + StreamListenSocket* connection_; + TCPListenSocketTestAction last_action_; + + SocketDescriptor test_socket_; + static const int kTestPort; + + base::Lock lock_; // protects |queue_| and wraps |cv_| + base::ConditionVariable cv_; + std::deque<TCPListenSocketTestAction> queue_; + + protected: + friend class base::RefCountedThreadSafe<TCPListenSocketTester>; + + virtual ~TCPListenSocketTester(); + + virtual scoped_refptr<TCPListenSocket> DoListen(); +}; + +} // namespace net + +#endif // NET_BASE_LISTEN_SOCKET_UNITTEST_H_ |