93c0352bca69dbeae5351f84a987451ec6562df1
[platform/framework/web/crosswalk.git] / src / net / tools / quic / test_tools / quic_test_client.h
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 #ifndef NET_TOOLS_QUIC_TEST_TOOLS_QUIC_TEST_CLIENT_H_
6 #define NET_TOOLS_QUIC_TEST_TOOLS_QUIC_TEST_CLIENT_H_
7
8 #include <string>
9
10 #include "base/basictypes.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "net/base/ip_endpoint.h"
13 #include "net/quic/quic_framer.h"
14 #include "net/quic/quic_packet_creator.h"
15 #include "net/quic/quic_protocol.h"
16 #include "net/tools/balsa/balsa_frame.h"
17 #include "net/tools/epoll_server/epoll_server.h"
18 #include "net/tools/quic/quic_client.h"
19 #include "net/tools/quic/test_tools/simple_client.h"
20
21 namespace net {
22
23 class ProofVerifier;
24
25 namespace tools {
26
27 class QuicPacketWriterWrapper;
28
29 namespace test {
30
31 class HTTPMessage;
32 class MockableQuicClient;
33
34 // A quic client which allows mocking out writes.
35 class MockableQuicClient : public QuicClient {
36  public:
37   MockableQuicClient(IPEndPoint server_address,
38                      const QuicServerId& server_id,
39                      const QuicVersionVector& supported_versions,
40                      EpollServer* epoll_server);
41
42   MockableQuicClient(IPEndPoint server_address,
43                      const QuicServerId& server_id,
44                      const QuicConfig& config,
45                      const QuicVersionVector& supported_versions,
46                      EpollServer* epoll_server);
47
48   virtual ~MockableQuicClient() OVERRIDE;
49   virtual QuicPacketWriter* CreateQuicPacketWriter() OVERRIDE;
50   virtual QuicConnectionId GenerateConnectionId() OVERRIDE;
51   void UseWriter(QuicPacketWriterWrapper* writer);
52   void UseConnectionId(QuicConnectionId connection_id);
53
54  private:
55   QuicConnectionId override_connection_id_;  // ConnectionId to use, if nonzero
56   QuicPacketWriterWrapper* test_writer_;
57
58   DISALLOW_COPY_AND_ASSIGN(MockableQuicClient);
59 };
60
61 // A toy QUIC client used for testing, mostly following the SimpleClient APIs.
62 class QuicTestClient : public SimpleClient,
63                        public QuicDataStream::Visitor {
64  public:
65   QuicTestClient(IPEndPoint server_address,
66                  const string& server_hostname,
67                  const QuicVersionVector& supported_versions);
68   QuicTestClient(IPEndPoint server_address,
69                  const string& server_hostname,
70                  bool secure,
71                  const QuicVersionVector& supported_versions);
72   QuicTestClient(IPEndPoint server_address,
73                  const string& server_hostname,
74                  bool secure,
75                  const QuicConfig& config,
76                  const QuicVersionVector& supported_versions);
77
78   virtual ~QuicTestClient();
79
80   // ExpectCertificates controls whether the server is expected to provide
81   // certificates. The certificates, if any, are not verified, but the common
82   // name is recorded and available with |cert_common_name()|.
83   void ExpectCertificates(bool on);
84
85   // Sets the |user_agent_id| of the |client_|.
86   void SetUserAgentID(const string& user_agent_id);
87
88   // Wraps data in a quic packet and sends it.
89   ssize_t SendData(string data, bool last_data);
90
91   // From SimpleClient
92   // Clears any outstanding state and sends a simple GET of 'uri' to the
93   // server.  Returns 0 if the request failed and no bytes were written.
94   virtual ssize_t SendRequest(const string& uri) OVERRIDE;
95   virtual ssize_t SendMessage(const HTTPMessage& message) OVERRIDE;
96   virtual string SendCustomSynchronousRequest(
97       const HTTPMessage& message) OVERRIDE;
98   virtual string SendSynchronousRequest(const string& uri) OVERRIDE;
99   virtual void Connect() OVERRIDE;
100   virtual void ResetConnection() OVERRIDE;
101   virtual void Disconnect() OVERRIDE;
102   virtual IPEndPoint LocalSocketAddress() const OVERRIDE;
103   virtual void ClearPerRequestState() OVERRIDE;
104   virtual void WaitForResponseForMs(int timeout_ms) OVERRIDE;
105   virtual void WaitForInitialResponseForMs(int timeout_ms) OVERRIDE;
106   virtual ssize_t Send(const void *buffer, size_t size) OVERRIDE;
107   virtual bool response_complete() const OVERRIDE;
108   virtual bool response_headers_complete() const OVERRIDE;
109   virtual const BalsaHeaders* response_headers() const OVERRIDE;
110   virtual int64 response_size() const OVERRIDE;
111   virtual int response_header_size() const OVERRIDE;
112   virtual int64 response_body_size() const OVERRIDE;
113   virtual size_t bytes_read() const OVERRIDE;
114   virtual size_t bytes_written() const OVERRIDE;
115   virtual bool buffer_body() const OVERRIDE;
116   virtual void set_buffer_body(bool buffer_body) OVERRIDE;
117   virtual bool ServerInLameDuckMode() const OVERRIDE;
118   virtual const string& response_body() OVERRIDE;
119   virtual bool connected() const OVERRIDE;
120   // These functions are all unimplemented functions from SimpleClient, and log
121   // DFATAL if called by users of SimpleClient.
122   virtual ssize_t SendAndWaitForResponse(const void *buffer,
123                                          size_t size) OVERRIDE;
124   virtual void Bind(IPEndPoint* local_address) OVERRIDE;
125   virtual string SerializeMessage(const HTTPMessage& message) OVERRIDE;
126   virtual IPAddressNumber bind_to_address() const OVERRIDE;
127   virtual void set_bind_to_address(IPAddressNumber address) OVERRIDE;
128   virtual const IPEndPoint& address() const OVERRIDE;
129   virtual size_t requests_sent() const OVERRIDE;
130
131   // From QuicDataStream::Visitor
132   virtual void OnClose(QuicDataStream* stream) OVERRIDE;
133
134   // Configures client_ to take ownership of and use the writer.
135   // Must be called before initial connect.
136   void UseWriter(QuicPacketWriterWrapper* writer);
137   // If the given ConnectionId is nonzero, configures client_ to use a specific
138   // ConnectionId instead of a random one.
139   void UseConnectionId(QuicConnectionId connection_id);
140
141   // Returns NULL if the maximum number of streams have already been created.
142   QuicSpdyClientStream* GetOrCreateStream();
143
144   QuicRstStreamErrorCode stream_error() { return stream_error_; }
145   QuicErrorCode connection_error();
146
147   MockableQuicClient* client();
148
149   // cert_common_name returns the common name value of the server's certificate,
150   // or the empty string if no certificate was presented.
151   const string& cert_common_name() const;
152
153   // Get the server config map.
154   QuicTagValueMap GetServerConfig() const;
155
156   void set_auto_reconnect(bool reconnect) { auto_reconnect_ = reconnect; }
157
158   void set_priority(QuicPriority priority) { priority_ = priority; }
159
160   // Sets client's FEC policy. This policy applies to the data stream(s), and
161   // also to the headers and crypto streams.
162   void SetFecPolicy(FecPolicy fec_policy);
163
164   void WaitForWriteToFlush();
165
166   EpollServer* epoll_server() { return &epoll_server_; }
167
168  protected:
169   QuicTestClient();
170
171   void Initialize(bool secure);
172
173   void set_client(MockableQuicClient* client) { client_.reset(client); }
174
175  private:
176   EpollServer epoll_server_;
177   scoped_ptr<MockableQuicClient> client_;  // The actual client
178   QuicSpdyClientStream* stream_;
179
180   QuicRstStreamErrorCode stream_error_;
181
182   bool response_complete_;
183   bool response_headers_complete_;
184   BalsaHeaders headers_;
185   QuicPriority priority_;
186   string response_;
187   uint64 bytes_read_;
188   uint64 bytes_written_;
189   // The number of uncompressed HTTP header bytes received.
190   int response_header_size_;
191   // The number of HTTP body bytes received.
192   int64 response_body_size_;
193   // True if we tried to connect already since the last call to Disconnect().
194   bool connect_attempted_;
195   bool secure_;
196   // The client will auto-connect exactly once before sending data.  If
197   // something causes a connection reset, it will not automatically reconnect
198   // unless auto_reconnect_ is true.
199   bool auto_reconnect_;
200   // Should we buffer the response body? Defaults to true.
201   bool buffer_body_;
202   // FEC policy for data sent by this client.
203   FecPolicy fec_policy_;
204   // proof_verifier_ points to a RecordingProofVerifier that is owned by
205   // client_.
206   ProofVerifier* proof_verifier_;
207
208   DISALLOW_COPY_AND_ASSIGN(QuicTestClient);
209 };
210
211 }  // namespace test
212
213 }  // namespace tools
214 }  // namespace net
215
216 #endif  // NET_TOOLS_QUIC_TEST_TOOLS_QUIC_TEST_CLIENT_H_