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