147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_TESTCLIENT_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_TESTCLIENT_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncudpsocket.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/criticalsection.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// A simple client that can send TCP or UDP data and check that it receives 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// what it expects to receive. Useful for testing server functionality. 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TestClient : public sigslot::has_slots<> { 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Records the contents of a packet that was received. 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org struct Packet { 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Packet(const SocketAddress& a, const char* b, size_t s); 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Packet(const Packet& p); 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~Packet(); 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress addr; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char* buf; 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t size; 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Creates a client that will send and receive with the given socket and 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // will post itself messages with the given thread. 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit TestClient(AsyncPacketSocket* socket); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~TestClient(); 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress address() const { return socket_->GetLocalAddress(); } 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress remote_address() const { return socket_->GetRemoteAddress(); } 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Checks that the socket moves to the specified connect state. 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool CheckConnState(AsyncPacketSocket::State state); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Checks that the socket is connected to the remote side. 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool CheckConnected() { 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return CheckConnState(AsyncPacketSocket::STATE_CONNECTED); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Sends using the clients socket. 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int Send(const char* buf, size_t size); 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Sends using the clients socket to the given destination. 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int SendTo(const char* buf, size_t size, const SocketAddress& dest); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the next packet received by the client or 0 if none is received 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // within a reasonable amount of time. The caller must delete the packet 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // when done with it. 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Packet* NextPacket(); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Checks that the next packet has the given contents. Returns the remote 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // address that the packet was sent from. 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool CheckNextPacket(const char* buf, size_t len, SocketAddress* addr); 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Checks that no packets have arrived or will arrive in the next second. 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool CheckNoPacket(); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int GetError(); 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int SetOption(Socket::Option opt, int value); 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ready_to_send() const; 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const int kTimeout = 1000; 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Workaround for the fact that AsyncPacketSocket::GetConnState doesn't exist. 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Socket::ConnState GetState(); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Slot for packets read on the socket. 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnPacket(AsyncPacketSocket* socket, const char* buf, size_t len, 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SocketAddress& remote_addr, 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const PacketTime& packet_time); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnReadyToSend(AsyncPacketSocket* socket); 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CriticalSection crit_; 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncPacketSocket* socket_; 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::vector<Packet*>* packets_; 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ready_to_send_; 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(TestClient); 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_TESTCLIENT_H_ 94