• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef RTC_BASE_TEST_CLIENT_H_
12 #define RTC_BASE_TEST_CLIENT_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "rtc_base/async_udp_socket.h"
18 #include "rtc_base/constructor_magic.h"
19 #include "rtc_base/fake_clock.h"
20 #include "rtc_base/synchronization/mutex.h"
21 
22 namespace rtc {
23 
24 // A simple client that can send TCP or UDP data and check that it receives
25 // what it expects to receive. Useful for testing server functionality.
26 class TestClient : public sigslot::has_slots<> {
27  public:
28   // Records the contents of a packet that was received.
29   struct Packet {
30     Packet(const SocketAddress& a,
31            const char* b,
32            size_t s,
33            int64_t packet_time_us);
34     Packet(const Packet& p);
35     virtual ~Packet();
36 
37     SocketAddress addr;
38     char* buf;
39     size_t size;
40     int64_t packet_time_us;
41   };
42 
43   // Default timeout for NextPacket reads.
44   static const int kTimeoutMs = 5000;
45 
46   // Creates a client that will send and receive with the given socket and
47   // will post itself messages with the given thread.
48   explicit TestClient(std::unique_ptr<AsyncPacketSocket> socket);
49   // Create a test client that will use a fake clock. NextPacket needs to wait
50   // for a packet to be received, and thus it needs to advance the fake clock
51   // if the test is using one, rather than just sleeping.
52   TestClient(std::unique_ptr<AsyncPacketSocket> socket,
53              ThreadProcessingFakeClock* fake_clock);
54   ~TestClient() override;
55 
address()56   SocketAddress address() const { return socket_->GetLocalAddress(); }
remote_address()57   SocketAddress remote_address() const { return socket_->GetRemoteAddress(); }
58 
59   // Checks that the socket moves to the specified connect state.
60   bool CheckConnState(AsyncPacketSocket::State state);
61 
62   // Checks that the socket is connected to the remote side.
CheckConnected()63   bool CheckConnected() {
64     return CheckConnState(AsyncPacketSocket::STATE_CONNECTED);
65   }
66 
67   // Sends using the clients socket.
68   int Send(const char* buf, size_t size);
69 
70   // Sends using the clients socket to the given destination.
71   int SendTo(const char* buf, size_t size, const SocketAddress& dest);
72 
73   // Returns the next packet received by the client or null if none is received
74   // within the specified timeout.
75   std::unique_ptr<Packet> NextPacket(int timeout_ms);
76 
77   // Checks that the next packet has the given contents. Returns the remote
78   // address that the packet was sent from.
79   bool CheckNextPacket(const char* buf, size_t len, SocketAddress* addr);
80 
81   // Checks that no packets have arrived or will arrive in the next second.
82   bool CheckNoPacket();
83 
84   int GetError();
85   int SetOption(Socket::Option opt, int value);
86 
ready_to_send()87   bool ready_to_send() const { return ready_to_send_count() > 0; }
88 
89   // How many times SignalReadyToSend has been fired.
ready_to_send_count()90   int ready_to_send_count() const { return ready_to_send_count_; }
91 
92  private:
93   // Timeout for reads when no packet is expected.
94   static const int kNoPacketTimeoutMs = 1000;
95   // Workaround for the fact that AsyncPacketSocket::GetConnState doesn't exist.
96   Socket::ConnState GetState();
97   // Slot for packets read on the socket.
98   void OnPacket(AsyncPacketSocket* socket,
99                 const char* buf,
100                 size_t len,
101                 const SocketAddress& remote_addr,
102                 const int64_t& packet_time_us);
103   void OnReadyToSend(AsyncPacketSocket* socket);
104   bool CheckTimestamp(int64_t packet_timestamp);
105   void AdvanceTime(int ms);
106 
107   ThreadProcessingFakeClock* fake_clock_ = nullptr;
108   webrtc::Mutex mutex_;
109   std::unique_ptr<AsyncPacketSocket> socket_;
110   std::vector<std::unique_ptr<Packet>> packets_;
111   int ready_to_send_count_ = 0;
112   int64_t prev_packet_timestamp_;
113   RTC_DISALLOW_COPY_AND_ASSIGN(TestClient);
114 };
115 
116 }  // namespace rtc
117 
118 #endif  // RTC_BASE_TEST_CLIENT_H_
119