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 SetExpectationsWebSocketTestURLRequestContextHost92 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