172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef NET_SPDY_SPDY_TEST_UTIL_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define NET_SPDY_SPDY_TEST_UTIL_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/cert_verifier.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/mock_host_resolver.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/request_priority.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_config_service_defaults.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_auth_handler_factory.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_cache.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_network_session.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_network_layer.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_transaction_factory.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/proxy/proxy_service.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/socket_test_util.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/spdy/spdy_framer.h"
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/url_request/url_request_context.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Default upload data used by both, mock objects and framer when creating
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// data frames.
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kDefaultURL[] = "http://www.google.com";
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kUploadData[] = "hello!";
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kUploadDataSize = arraysize(kUploadData)-1;
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NOTE: In GCC, on a Mac, this can't be in an anonymous namespace!
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This struct holds information used to construct spdy control and data frames.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct SpdyHeaderInfo {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyControlType kind;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyStreamId id;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyStreamId assoc_id;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyPriority priority;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyControlFlags control_flags;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool compressed;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyStatusCodes status;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* data;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  uint32 data_length;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  spdy::SpdyDataFlags data_flags;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Chop a frame into an array of MockWrites.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |data| is the frame to chop.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |length| is the length of the frame to chop.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |num_chunks| is the number of chunks to create.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockWrite* ChopWriteFrame(const char* data, int length, int num_chunks);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Chop a SpdyFrame into an array of MockWrites.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |frame| is the frame to chop.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |num_chunks| is the number of chunks to create.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockWrite* ChopWriteFrame(const spdy::SpdyFrame& frame, int num_chunks);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Chop a frame into an array of MockReads.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |data| is the frame to chop.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |length| is the length of the frame to chop.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |num_chunks| is the number of chunks to create.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockRead* ChopReadFrame(const char* data, int length, int num_chunks);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Chop a SpdyFrame into an array of MockReads.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |frame| is the frame to chop.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |num_chunks| is the number of chunks to create.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockRead* ChopReadFrame(const spdy::SpdyFrame& frame, int num_chunks);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Adds headers and values to a map.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| is an array of { name, value } pairs, arranged as strings
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// where the even entries are the header names, and the odd entries are the
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// header values.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |headers| gets filled in from |extra_headers|.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppendHeadersToSpdyFrame(const char* const extra_headers[],
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              int extra_header_count,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              spdy::SpdyHeaderBlock* headers);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Writes |str| of the given |len| to the buffer pointed to by |buffer_handle|.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Uses a template so buffer_handle can be a char* or an unsigned char*.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Updates the |*buffer_handle| pointer by |len|
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of bytes written into *|buffer_handle|
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate<class T>
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint AppendToBuffer(const char* str,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int len,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   T** buffer_handle,
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int* buffer_len_remaining) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_GT(len, 0);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(NULL != buffer_handle) << "NULL buffer handle";
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(NULL != *buffer_handle) << "NULL pointer";
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(NULL != buffer_len_remaining)
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << "NULL buffer remainder length pointer";
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_GE(*buffer_len_remaining, len) << "Insufficient buffer size";
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  memcpy(*buffer_handle, str, len);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *buffer_handle += len;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *buffer_len_remaining -= len;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return len;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Writes |val| to a location of size |len|, in big-endian format.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the buffer pointed to by |buffer_handle|.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Updates the |*buffer_handle| pointer by |len|
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of bytes written
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint AppendToBuffer(int val,
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int len,
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   unsigned char** buffer_handle,
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int* buffer_len_remaining);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct a SPDY packet.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |head| is the start of the packet, up to but not including
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the header value pairs.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs, which typically
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will vary the most between calls.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |tail| is any (relatively constant) header-value pairs to add.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |buffer| is the buffer we're filling in.
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns a SpdyFrame.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo& header_info,
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     const char* const extra_headers[],
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     int extra_header_count,
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     const char* const tail[],
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     int tail_header_count);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Construct a generic SpdyControlFrame.
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[],
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int extra_header_count,
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           bool compressed,
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int stream_id,
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           RequestPriority request_priority,
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           spdy::SpdyControlType type,
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           spdy::SpdyControlFlags flags,
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           const char* const* kHeaders,
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int kHeadersSize);
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[],
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int extra_header_count,
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           bool compressed,
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int stream_id,
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           RequestPriority request_priority,
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           spdy::SpdyControlType type,
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           spdy::SpdyControlFlags flags,
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           const char* const* kHeaders,
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int kHeadersSize,
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int associated_stream_id);
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct an expected SPDY reply string.
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs, which typically
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will vary the most between calls.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |buffer| is the buffer we're filling in.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of bytes written into |buffer|.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint ConstructSpdyReplyString(const char* const extra_headers[],
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             int extra_header_count,
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             char* buffer,
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             int buffer_length);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct an expected SPDY SETTINGS frame.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |settings| are the settings to set.
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the constructed frame.  The caller takes ownership of the frame.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdySettings(spdy::SpdySettings settings);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1582c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun// Construct a SPDY PING frame.
1592c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun// Returns the constructed frame.  The caller takes ownership of the frame.
1602c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurunspdy::SpdyFrame* ConstructSpdyPing();
1612c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct a SPDY GOAWAY frame.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the constructed frame.  The caller takes ownership of the frame.
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyGoAway();
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct a SPDY WINDOW_UPDATE frame.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the constructed frame.  The caller takes ownership of the frame.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyWindowUpdate(spdy::SpdyStreamId,
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           uint32 delta_window_size);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct a SPDY RST_STREAM frame.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the constructed frame.  The caller takes ownership of the frame.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyRstStream(spdy::SpdyStreamId stream_id,
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        spdy::SpdyStatusCodes status);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construct a single SPDY header entry, for validation.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |buffer| is the buffer we're filling in.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |index| is the index of the header we want.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of bytes written into |buffer|.
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint ConstructSpdyHeader(const char* const extra_headers[],
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        int extra_header_count,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        char* buffer,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        int buffer_length,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        int index);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Constructs a standard SPDY GET SYN packet, optionally compressed
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// for the url |url|.
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// |extra_headers| are the extra header-value pairs, which typically
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// will vary the most between calls.
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Returns a SpdyFrame.
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyGet(const char* const url,
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  bool compressed,
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int stream_id,
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  RequestPriority request_priority);
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Constructs a standard SPDY GET SYN packet, optionally compressed.
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs, which typically
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will vary the most between calls.
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns a SpdyFrame.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[],
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int extra_header_count,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  bool compressed,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int stream_id,
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  RequestPriority request_priority);
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Constructs a standard SPDY GET SYN packet, optionally compressed.
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// |extra_headers| are the extra header-value pairs, which typically
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// will vary the most between calls.  If |direct| is false, the
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the full url will be used instead of simply the path.
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Returns a SpdyFrame.
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[],
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int extra_header_count,
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  bool compressed,
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int stream_id,
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  RequestPriority request_priority,
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  bool direct);
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Constructs a standard SPDY SYN_STREAM frame for a CONNECT request.
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickspdy::SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[],
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                      int extra_header_count,
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                      int stream_id);
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Constructs a standard SPDY push SYN packet.
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// |extra_headers| are the extra header-value pairs, which typically
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// will vary the most between calls.
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Returns a SpdyFrame.
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyPush(const char* const extra_headers[],
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int extra_header_count,
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int stream_id,
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int associated_stream_id);
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyPush(const char* const extra_headers[],
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int extra_header_count,
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int stream_id,
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int associated_stream_id,
236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const char* url);
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyPush(const char* const extra_headers[],
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int extra_header_count,
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int stream_id,
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  int associated_stream_id,
241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const char* url,
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  const char* status,
243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const char* location);
244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochspdy::SpdyFrame* ConstructSpdyPush(int stream_id,
245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  int associated_stream_id,
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  const char* url);
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochspdy::SpdyFrame* ConstructSpdyPushHeaders(int stream_id,
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                          const char* const extra_headers[],
250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                          int extra_header_count);
251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Constructs a standard SPDY SYN_REPLY packet to match the SPDY GET.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs, which typically
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will vary the most between calls.
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns a SpdyFrame.
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[],
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          int extra_header_count,
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          int stream_id);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Constructs a standard SPDY SYN_REPLY packet to match the SPDY GET.
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// |extra_headers| are the extra header-value pairs, which typically
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// will vary the most between calls.
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Returns a SpdyFrame.
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyGetSynReplyRedirect(int stream_id);
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Constructs a standard SPDY SYN_REPLY packet with an Internal Server
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Error status code.
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns a SpdyFrame.
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickspdy::SpdyFrame* ConstructSpdySynReplyError(int stream_id);
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Constructs a standard SPDY SYN_REPLY packet with the specified status code.
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns a SpdyFrame.
273513209b27ff55e2841eac0e4120199c23acce758Ben Murdochspdy::SpdyFrame* ConstructSpdySynReplyError(
274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const char* const status,
275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const char* const* const extra_headers,
276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int extra_header_count,
277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int stream_id);
278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Constructs a standard SPDY POST SYN packet.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs, which typically
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will vary the most between calls.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns a SpdyFrame.
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyPost(int64 content_length,
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                   const char* const extra_headers[],
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   int extra_header_count);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Constructs a chunked transfer SPDY POST SYN packet.
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// |extra_headers| are the extra header-value pairs, which typically
289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// will vary the most between calls.
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Returns a SpdyFrame.
291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenspdy::SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[],
292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                          int extra_header_count);
293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Constructs a standard SPDY SYN_REPLY packet to match the SPDY POST.
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |extra_headers| are the extra header-value pairs, which typically
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will vary the most between calls.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns a SpdyFrame.
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyPostSynReply(const char* const extra_headers[],
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           int extra_header_count);
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Constructs a single SPDY data frame with the contents "hello!"
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochspdy::SpdyFrame* ConstructSpdyBodyFrame(int stream_id,
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        bool fin);
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Constructs a single SPDY data frame with the given content.
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickspdy::SpdyFrame* ConstructSpdyBodyFrame(int stream_id, const char* data,
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                        uint32 len, bool fin);
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Wraps |frame| in the payload of a data frame in stream |stream_id|.
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickspdy::SpdyFrame* ConstructWrappedSpdyFrame(
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const scoped_ptr<spdy::SpdyFrame>& frame, int stream_id);
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create an async MockWrite from the given SpdyFrame.
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockWrite CreateMockWrite(const spdy::SpdyFrame& req);
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create an async MockWrite from the given SpdyFrame and sequence number.
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockWrite CreateMockWrite(const spdy::SpdyFrame& req, int seq);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickMockWrite CreateMockWrite(const spdy::SpdyFrame& req, int seq, bool async);
3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create a MockRead from the given SpdyFrame.
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockRead CreateMockRead(const spdy::SpdyFrame& resp);
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create a MockRead from the given SpdyFrame and sequence number.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockRead CreateMockRead(const spdy::SpdyFrame& resp, int seq);
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickMockRead CreateMockRead(const spdy::SpdyFrame& resp, int seq, bool async);
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Combines the given SpdyFrames into the given char array and returns
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the total length.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint CombineFrames(const spdy::SpdyFrame** frames, int num_frames,
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  char* buff, int buff_len);
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper to manage the lifetimes of the dependencies for a
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HttpNetworkTransaction.
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SpdySessionDependencies {
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Default set of dependencies -- "null" proxy service.
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SpdySessionDependencies();
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Custom proxy service dependency.
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit SpdySessionDependencies(ProxyService* proxy_service);
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ~SpdySessionDependencies();
34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static HttpNetworkSession* SpdyCreateSession(
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SpdySessionDependencies* session_deps);
34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static HttpNetworkSession* SpdyCreateSessionDeterministic(
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SpdySessionDependencies* session_deps);
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // NOTE: host_resolver must be ordered before http_auth_handler_factory.
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<MockHostResolverBase> host_resolver;
35321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<CertVerifier> cert_verifier;
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<ProxyService> proxy_service;
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<SSLConfigService> ssl_config_service;
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<MockClientSocketFactory> socket_factory;
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<DeterministicMockClientSocketFactory> deterministic_socket_factory;
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory;
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SpdyURLRequestContext : public URLRequestContext {
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SpdyURLRequestContext();
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MockClientSocketFactory& socket_factory() { return socket_factory_; }
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SpdyURLRequestContext();
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MockClientSocketFactory socket_factory_;
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst SpdyHeaderInfo make_spdy_header(spdy::SpdyControlType type);
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // NET_SPDY_SPDY_TEST_UTIL_H_
378