OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_SPDY_SPDY_TEST_UTIL_H_ | 5 #ifndef NET_SPDY_SPDY_TEST_UTIL_H_ |
6 #define NET_SPDY_SPDY_TEST_UTIL_H_ | 6 #define NET_SPDY_SPDY_TEST_UTIL_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "net/socket/socket_test_util.h" |
| 10 #include "net/spdy/spdy_framer.h" |
9 | 11 |
10 namespace net { | 12 namespace net { |
11 | 13 |
12 const uint8 kGetSyn[] = { | |
13 0x80, 0x01, 0x00, 0x01, // header | |
14 0x01, 0x00, 0x00, 0x49, // FIN, len | |
15 0x00, 0x00, 0x00, 0x01, // stream id | |
16 0x00, 0x00, 0x00, 0x00, // associated | |
17 0xc0, 0x00, 0x00, 0x03, // 3 headers | |
18 0x00, 0x06, 'm', 'e', 't', 'h', 'o', 'd', | |
19 0x00, 0x03, 'G', 'E', 'T', | |
20 0x00, 0x03, 'u', 'r', 'l', | |
21 0x00, 0x16, 'h', 't', 't', 'p', ':', '/', '/', 'w', 'w', 'w', | |
22 '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', | |
23 'm', '/', | |
24 0x00, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n', | |
25 0x00, 0x08, 'H', 'T', 'T', 'P', '/', '1', '.', '1', | |
26 }; | |
27 | |
28 const uint8 kGetSynReply[] = { | |
29 0x80, 0x01, 0x00, 0x02, // header | |
30 0x00, 0x00, 0x00, 0x45, | |
31 0x00, 0x00, 0x00, 0x01, | |
32 0x00, 0x00, 0x00, 0x04, // 4 headers | |
33 0x00, 0x05, 'h', 'e', 'l', 'l', 'o', // "hello" | |
34 0x00, 0x03, 'b', 'y', 'e', // "bye" | |
35 0x00, 0x06, 's', 't', 'a', 't', 'u', 's', // "status" | |
36 0x00, 0x03, '2', '0', '0', // "200" | |
37 0x00, 0x03, 'u', 'r', 'l', // "url" | |
38 0x00, 0x0a, '/', 'i', 'n', 'd', 'e', 'x', '.', 'p', 'h', 'p', // "/index... | |
39 0x00, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n', // "version" | |
40 0x00, 0x08, 'H', 'T', 'T', 'P', '/', '1', '.', '1', // "HTTP/1.1" | |
41 }; | |
42 | |
43 const uint8 kGetBodyFrame[] = { | 14 const uint8 kGetBodyFrame[] = { |
44 0x00, 0x00, 0x00, 0x01, // header | 15 0x00, 0x00, 0x00, 0x01, // header |
45 0x01, 0x00, 0x00, 0x06, // FIN, length | 16 0x01, 0x00, 0x00, 0x06, // FIN, length |
46 'h', 'e', 'l', 'l', 'o', '!', // "hello" | 17 'h', 'e', 'l', 'l', 'o', '!', // "hello" |
47 }; | 18 }; |
48 | 19 |
49 const uint8 kGetSynCompressed[] = { | 20 const uint8 kGetSynCompressed[] = { |
50 0x80, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x47, | 21 0x80, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x47, |
51 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | 22 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, |
52 0xc0, 0x00, 0x38, 0xea, 0xdf, 0xa2, 0x51, 0xb2, | 23 0xc0, 0x00, 0x38, 0xea, 0xdf, 0xa2, 0x51, 0xb2, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 0x01, 0x00, 0x00, 0x06, // FIN, length | 74 0x01, 0x00, 0x00, 0x06, // FIN, length |
104 'h', 'e', 'l', 'l', 'o', '!', // "hello" | 75 'h', 'e', 'l', 'l', 'o', '!', // "hello" |
105 }; | 76 }; |
106 | 77 |
107 const uint8 kGoAway[] = { | 78 const uint8 kGoAway[] = { |
108 0x80, 0x01, 0x00, 0x07, // header | 79 0x80, 0x01, 0x00, 0x07, // header |
109 0x00, 0x00, 0x00, 0x04, // flags, len | 80 0x00, 0x00, 0x00, 0x04, // flags, len |
110 0x00, 0x00, 0x00, 0x00, // last-accepted-stream-id | 81 0x00, 0x00, 0x00, 0x00, // last-accepted-stream-id |
111 }; | 82 }; |
112 | 83 |
| 84 // ---------------------------------------------------------------------------- |
| 85 |
| 86 // NOTE: In GCC, on a Mac, this can't be in an anonymous namespace! |
| 87 // This struct holds information used to construct spdy control and data frames. |
| 88 struct SpdyHeaderInfo { |
| 89 spdy::SpdyControlType kind; |
| 90 spdy::SpdyStreamId id; |
| 91 spdy::SpdyStreamId assoc_id; |
| 92 spdy::SpdyPriority priority; |
| 93 spdy::SpdyControlFlags control_flags; |
| 94 bool compressed; |
| 95 spdy::SpdyStatusCodes status; |
| 96 const char* data; |
| 97 uint32 data_length; |
| 98 spdy::SpdyDataFlags data_flags; |
| 99 }; |
| 100 |
| 101 // Chop a frame into an array of MockWrites. |
| 102 // |data| is the frame to chop. |
| 103 // |length| is the length of the frame to chop. |
| 104 // |num_chunks| is the number of chunks to create. |
| 105 MockWrite* ChopFrame(const char* data, int length, int num_chunks); |
| 106 |
| 107 // Chop a SpdyFrame into an array of MockWrites. |
| 108 // |frame| is the frame to chop. |
| 109 // |num_chunks| is the number of chunks to create. |
| 110 MockWrite* ChopFrame(const spdy::SpdyFrame* frame, int num_chunks); |
| 111 |
| 112 // Adds headers and values to a map. |
| 113 // |extra_headers| is an array of { name, value } pairs, arranged as strings |
| 114 // where the even entries are the header names, and the odd entries are the |
| 115 // header values. |
| 116 // |headers| gets filled in from |extra_headers|. |
| 117 void AppendHeadersToSpdyFrame(const char* const extra_headers[], |
| 118 int extra_header_count, |
| 119 spdy::SpdyHeaderBlock* headers); |
| 120 |
| 121 // Writes |str| of the given |len| to the buffer pointed to by |buffer_handle|. |
| 122 // Uses a template so buffer_handle can be a char* or an unsigned char*. |
| 123 // Updates the |*buffer_handle| pointer by |len| |
| 124 // Returns the number of bytes written into *|buffer_handle| |
| 125 template<class T> |
| 126 int AppendToBuffer(const char* str, |
| 127 int len, |
| 128 T** buffer_handle, |
| 129 int* buffer_len_remaining) { |
| 130 DCHECK_GT(len, 0); |
| 131 DCHECK(NULL != buffer_handle) << "NULL buffer handle"; |
| 132 DCHECK(NULL != *buffer_handle) << "NULL pointer"; |
| 133 DCHECK(NULL != buffer_len_remaining) |
| 134 << "NULL buffer remainder length pointer"; |
| 135 DCHECK_GE(*buffer_len_remaining, len) << "Insufficient buffer size"; |
| 136 memcpy(*buffer_handle, str, len); |
| 137 *buffer_handle += len; |
| 138 *buffer_len_remaining -= len; |
| 139 return len; |
| 140 } |
| 141 |
| 142 // Writes |val| to a location of size |len|, in big-endian format. |
| 143 // in the buffer pointed to by |buffer_handle|. |
| 144 // Updates the |*buffer_handle| pointer by |len| |
| 145 // Returns the number of bytes written |
| 146 int AppendToBuffer(int val, |
| 147 int len, |
| 148 unsigned char** buffer_handle, |
| 149 int* buffer_len_remaining); |
| 150 |
| 151 // Construct a SPDY packet. |
| 152 // |head| is the start of the packet, up to but not including |
| 153 // the header value pairs. |
| 154 // |extra_headers| are the extra header-value pairs, which typically |
| 155 // will vary the most between calls. |
| 156 // |tail| is any (relatively constant) header-value pairs to add. |
| 157 // |buffer| is the buffer we're filling in. |
| 158 // Returns a SpdyFrame. |
| 159 spdy::SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo* header_info, |
| 160 const char* const extra_headers[], |
| 161 int extra_header_count, |
| 162 const char* const tail[], |
| 163 int tail_header_count); |
| 164 |
| 165 // Construct an expected SPDY reply string. |
| 166 // |extra_headers| are the extra header-value pairs, which typically |
| 167 // will vary the most between calls. |
| 168 // |buffer| is the buffer we're filling in. |
| 169 // Returns the number of bytes written into |buffer|. |
| 170 int ConstructSpdyReplyString(const char* const extra_headers[], |
| 171 int extra_header_count, |
| 172 char* buffer, |
| 173 int buffer_length); |
| 174 |
| 175 // Construct an expected SPDY SETTINGS frame. |
| 176 // |settings| are the settings to set. |
| 177 // Returns the constructed frame. The caller takes ownership of the frame. |
| 178 spdy::SpdyFrame* ConstructSpdySettings(spdy::SpdySettings settings); |
| 179 |
| 180 // Construct a single SPDY header entry, for validation. |
| 181 // |extra_headers| are the extra header-value pairs. |
| 182 // |buffer| is the buffer we're filling in. |
| 183 // |index| is the index of the header we want. |
| 184 // Returns the number of bytes written into |buffer|. |
| 185 int ConstructSpdyHeader(const char* const extra_headers[], |
| 186 int extra_header_count, |
| 187 char* buffer, |
| 188 int buffer_length, |
| 189 int index); |
| 190 |
| 191 // Constructs a standard SPDY GET packet. |
| 192 // |extra_headers| are the extra header-value pairs, which typically |
| 193 // will vary the most between calls. |
| 194 // Returns a SpdyFrame. |
| 195 spdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], |
| 196 int extra_header_count); |
| 197 |
| 198 // Constructs a standard SPDY SYN_REPLY packet to match the SPDY GET. |
| 199 // |extra_headers| are the extra header-value pairs, which typically |
| 200 // will vary the most between calls. |
| 201 // Returns a SpdyFrame. |
| 202 spdy::SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[], |
| 203 int extra_header_count); |
| 204 |
| 205 // Create an async MockWrite from the given SpdyFrame. |
| 206 MockWrite CreateMockWrite(spdy::SpdyFrame* req); |
| 207 |
| 208 // Create a MockRead from the given SpdyFrame. |
| 209 MockRead CreateMockRead(spdy::SpdyFrame* resp); |
| 210 |
| 211 // Create a MockRead from the given SpdyFrame and sequence number. |
| 212 MockRead CreateMockRead(spdy::SpdyFrame* resp, int seq); |
| 213 |
113 } // namespace net | 214 } // namespace net |
114 | 215 |
115 #endif // NET_SPDY_SPDY_TEST_UTIL_H_ | 216 #endif // NET_SPDY_SPDY_TEST_UTIL_H_ |
OLD | NEW |