Home | History | Annotate | Download | only in websockets
      1 // Copyright 2013 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_WEBSOCKETS_WEBSOCKET_TEST_UTIL_H_
      6 #define NET_WEBSOCKETS_WEBSOCKET_TEST_UTIL_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "net/url_request/url_request_test_util.h"
     13 #include "net/websockets/websocket_stream.h"
     14 
     15 class GURL;
     16 
     17 namespace net {
     18 
     19 class BoundNetLog;
     20 class DeterministicSocketData;
     21 class URLRequestContext;
     22 class WebSocketHandshakeStreamCreateHelper;
     23 class DeterministicMockClientSocketFactory;
     24 
     25 class LinearCongruentialGenerator {
     26  public:
     27   explicit LinearCongruentialGenerator(uint32 seed);
     28   uint32 Generate();
     29 
     30  private:
     31   uint64 current_;
     32 };
     33 
     34 // Alternate version of WebSocketStream::CreateAndConnectStream() for testing
     35 // use only. The difference is the use of a |create_helper| argument in place of
     36 // |requested_subprotocols|. Implemented in websocket_stream.cc.
     37 NET_EXPORT_PRIVATE extern scoped_ptr<WebSocketStreamRequest>
     38     CreateAndConnectStreamForTesting(
     39         const GURL& socket_url,
     40         scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper,
     41         const GURL& origin,
     42         URLRequestContext* url_request_context,
     43         const BoundNetLog& net_log,
     44         scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate);
     45 
     46 // Generates a standard WebSocket handshake request. The challenge key used is
     47 // "dGhlIHNhbXBsZSBub25jZQ==". Each header in |extra_headers| must be terminated
     48 // with "\r\n".
     49 extern std::string WebSocketStandardRequest(const std::string& path,
     50                                             const std::string& origin,
     51                                             const std::string& extra_headers);
     52 
     53 // A response with the appropriate accept header to match the above challenge
     54 // key. Each header in |extra_headers| must be terminated with "\r\n".
     55 extern std::string WebSocketStandardResponse(const std::string& extra_headers);
     56 
     57 // This class provides a convenient way to construct a
     58 // DeterministicMockClientSocketFactory for WebSocket tests.
     59 class WebSocketDeterministicMockClientSocketFactoryMaker {
     60  public:
     61   WebSocketDeterministicMockClientSocketFactoryMaker();
     62   ~WebSocketDeterministicMockClientSocketFactoryMaker();
     63 
     64   // The socket created by the factory will expect |expect_written| to be
     65   // written to the socket, and will respond with |return_to_read|. The test
     66   // will fail if the expected text is not written, or all the bytes are not
     67   // read.
     68   void SetExpectations(const std::string& expect_written,
     69                        const std::string& return_to_read);
     70 
     71   // A low-level interface to permit arbitrary expectations to be set.
     72   void SetRawExpectations(scoped_ptr<DeterministicSocketData> socket_data);
     73 
     74   // Call to get a pointer to the factory, which remains owned by this object.
     75   DeterministicMockClientSocketFactory* factory();
     76 
     77  private:
     78   struct Detail;
     79   scoped_ptr<Detail> detail_;
     80 
     81   DISALLOW_COPY_AND_ASSIGN(WebSocketDeterministicMockClientSocketFactoryMaker);
     82 };
     83 
     84 // This class encapsulates the details of creating a
     85 // TestURLRequestContext that returns mock ClientSocketHandles that do what is
     86 // required by the tests.
     87 struct WebSocketTestURLRequestContextHost {
     88  public:
     89   WebSocketTestURLRequestContextHost();
     90   ~WebSocketTestURLRequestContextHost();
     91 
     92   void SetExpectations(const std::string& expect_written,
     93                        const std::string& return_to_read) {
     94     maker_.SetExpectations(expect_written, return_to_read);
     95   }
     96 
     97   void SetRawExpectations(scoped_ptr<DeterministicSocketData> socket_data);
     98 
     99   // Call after calling one of SetExpections() or SetRawExpectations(). The
    100   // returned pointer remains owned by this object. This should only be called
    101   // once.
    102   TestURLRequestContext* GetURLRequestContext();
    103 
    104  private:
    105   WebSocketDeterministicMockClientSocketFactoryMaker maker_;
    106   TestURLRequestContext url_request_context_;
    107   TestNetworkDelegate network_delegate_;
    108 
    109   DISALLOW_COPY_AND_ASSIGN(WebSocketTestURLRequestContextHost);
    110 };
    111 
    112 }  // namespace net
    113 
    114 #endif  // NET_WEBSOCKETS_WEBSOCKET_TEST_UTIL_H_
    115