13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_HTTP_HTTP_TRANSACTION_UNITTEST_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_HTTP_HTTP_TRANSACTION_UNITTEST_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_transaction.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/compiler_specific.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/io_buffer.h"
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/load_flags.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/net_errors.h"
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/test_completion_callback.h"
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_cache.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_request_info.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_headers.h"
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_info.h"
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace net {
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass IOBuffer;
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//-----------------------------------------------------------------------------
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// mock transaction data
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// these flags may be combined to form the test_mode field
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum {
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TEST_MODE_NORMAL = 0,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TEST_MODE_SYNC_NET_START = 1 << 0,
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TEST_MODE_SYNC_NET_READ  = 1 << 1,
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TEST_MODE_SYNC_CACHE_START = 1 << 2,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TEST_MODE_SYNC_CACHE_READ  = 1 << 3,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TEST_MODE_SYNC_CACHE_WRITE  = 1 << 4,
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TEST_MODE_SYNC_ALL = (TEST_MODE_SYNC_NET_START | TEST_MODE_SYNC_NET_READ |
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        TEST_MODE_SYNC_CACHE_START | TEST_MODE_SYNC_CACHE_READ |
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        TEST_MODE_SYNC_CACHE_WRITE)
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void (*MockTransactionHandler)(const net::HttpRequestInfo* request,
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       std::string* response_status,
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       std::string* response_headers,
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       std::string* response_data);
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct MockTransaction {
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* url;
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* method;
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If |request_time| is unspecified, the current time will be used.
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::Time request_time;
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* request_headers;
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int load_flags;
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* status;
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* response_headers;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If |response_time| is unspecified, the current time will be used.
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::Time response_time;
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* data;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int test_mode;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockTransactionHandler handler;
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int cert_status;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern const MockTransaction kSimpleGET_Transaction;
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern const MockTransaction kSimplePOST_Transaction;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern const MockTransaction kTypicalGET_Transaction;
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern const MockTransaction kETagGET_Transaction;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern const MockTransaction kRangeGET_Transaction;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// returns the mock transaction for the given URL
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst MockTransaction* FindMockTransaction(const GURL& url);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Add/Remove a mock transaction that can be accessed via FindMockTransaction.
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// There can be only one MockTransaction associated with a given URL.
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid AddMockTransaction(const MockTransaction* trans);
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid RemoveMockTransaction(const MockTransaction* trans);
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct ScopedMockTransaction : MockTransaction {
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedMockTransaction() {
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    AddMockTransaction(this);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit ScopedMockTransaction(const MockTransaction& t)
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      : MockTransaction(t) {
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    AddMockTransaction(this);
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ~ScopedMockTransaction() {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    RemoveMockTransaction(this);
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//-----------------------------------------------------------------------------
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// mock http request
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MockHttpRequest : public net::HttpRequestInfo {
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit MockHttpRequest(const MockTransaction& t);
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//-----------------------------------------------------------------------------
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// use this class to test completely consuming a transaction
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestTransactionConsumer : public CallbackRunner< Tuple1<int> > {
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit TestTransactionConsumer(net::HttpTransactionFactory* factory);
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~TestTransactionConsumer();
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Start(const net::HttpRequestInfo* request,
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             const net::BoundNetLog& net_log);
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_done() const { return state_ == DONE; }
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int error() const { return error_; }
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const net::HttpResponseInfo* response_info() const {
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return trans_->GetResponseInfo();
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const std::string& content() const { return content_; }
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  enum State {
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    IDLE,
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STARTING,
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    READING,
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    DONE
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DidStart(int result);
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DidRead(int result);
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DidFinish(int result);
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Read();
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Callback implementation:
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void RunWithParams(const Tuple1<int>& params);
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  State state_;
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_ptr<net::HttpTransaction> trans_;
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string content_;
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<net::IOBuffer> read_buf_;
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int error_;
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static int quit_counter_;
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//-----------------------------------------------------------------------------
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// mock network layer
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This transaction class inspects the available set of mock transactions to
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// find data for the request URL.  It supports IO operations that complete
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// synchronously or asynchronously to help exercise different code paths in the
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// HttpCache implementation.
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MockNetworkTransaction : public net::HttpTransaction {
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MockNetworkTransaction();
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~MockNetworkTransaction();
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int Start(const net::HttpRequestInfo* request,
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    net::CompletionCallback* callback,
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    const net::BoundNetLog& net_log);
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual int RestartIgnoringLastError(net::CompletionCallback* callback);
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int RestartWithCertificate(net::X509Certificate* client_cert,
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     net::CompletionCallback* callback);
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int RestartWithAuth(const string16& username,
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              const string16& password,
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              net::CompletionCallback* callback);
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsReadyToRestartForAuth();
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int Read(net::IOBuffer* buf, int buf_len,
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                   net::CompletionCallback* callback);
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void StopCaching();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual const net::HttpResponseInfo* GetResponseInfo() const;
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual net::LoadState GetLoadState() const;
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual uint64 GetUploadProgress() const;
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CallbackLater(net::CompletionCallback* callback, int result);
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void RunCallback(net::CompletionCallback* callback, int result);
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedRunnableMethodFactory<MockNetworkTransaction> task_factory_;
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpResponseInfo response_;
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string data_;
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int data_cursor_;
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int test_mode_;
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MockNetworkLayer : public net::HttpTransactionFactory {
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MockNetworkLayer();
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~MockNetworkLayer();
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int transaction_count() const { return transaction_count_; }
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // net::HttpTransactionFactory:
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual int CreateTransaction(scoped_ptr<net::HttpTransaction>* trans);
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual net::HttpCache* GetCache();
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual net::HttpNetworkSession* GetSession();
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Suspend(bool suspend);
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int transaction_count_;
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//-----------------------------------------------------------------------------
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// helpers
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// read the transaction completely
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint ReadTransaction(net::HttpTransaction* trans, std::string* result);
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_HTTP_HTTP_TRANSACTION_UNITTEST_H_
220