http_transaction_test_util.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/http/http_transaction_test_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/base/load_timing_info.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/base/net_errors.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_info.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef base::hash_map<std::string, const MockTransaction*> MockTransactionMap;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static MockTransactionMap mock_transactions;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mock transaction data
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockTransaction kSimpleGET_Transaction = {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "http://www.google.com/",
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "GET",
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::LOAD_NORMAL,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "HTTP/1.1 200 OK",
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Cache-Control: max-age=10000\n",
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<html><body>Google Blah Blah</body></html>",
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_MODE_NORMAL,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::OK
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockTransaction kSimplePOST_Transaction = {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "http://bugdatabase.com/edit",
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "POST",
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "",
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::LOAD_NORMAL,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "HTTP/1.1 200 OK",
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "",
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<html><body>Google Blah Blah</body></html>",
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_MODE_NORMAL,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::OK
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockTransaction kTypicalGET_Transaction = {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "http://www.example.com/~foo/bar.html",
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "GET",
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::LOAD_NORMAL,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "HTTP/1.1 200 OK",
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Date: Wed, 28 Nov 2007 09:40:09 GMT\n"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Last-Modified: Wed, 28 Nov 2007 00:40:09 GMT\n",
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<html><body>Google Blah Blah</body></html>",
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_MODE_NORMAL,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::OK
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockTransaction kETagGET_Transaction = {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "http://www.google.com/foopy",
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "GET",
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "",
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::LOAD_NORMAL,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "HTTP/1.1 200 OK",
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Cache-Control: max-age=10000\n"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Etag: \"foopy\"\n",
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<html><body>Google Blah Blah</body></html>",
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_MODE_NORMAL,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::OK
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockTransaction kRangeGET_Transaction = {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "http://www.google.com/",
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "GET",
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Range: 0-100\r\n",
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::LOAD_NORMAL,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "HTTP/1.1 200 OK",
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Cache-Control: max-age=10000\n",
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time(),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<html><body>Google Blah Blah</body></html>",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_MODE_NORMAL,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::OK
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const MockTransaction* const kBuiltinMockTransactions[] = {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &kSimpleGET_Transaction,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &kSimplePOST_Transaction,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &kTypicalGET_Transaction,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &kETagGET_Transaction,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &kRangeGET_Transaction
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockTransaction* FindMockTransaction(const GURL& url) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // look for overrides:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTransactionMap::const_iterator it = mock_transactions.find(url.spec());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it != mock_transactions.end())
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return it->second;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // look for builtins:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kBuiltinMockTransactions); ++i) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (url == GURL(kBuiltinMockTransactions[i]->url))
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kBuiltinMockTransactions[i];
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddMockTransaction(const MockTransaction* trans) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_transactions[GURL(trans->url).spec()] = trans;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RemoveMockTransaction(const MockTransaction* trans) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_transactions.erase(GURL(trans->url).spec());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockHttpRequest::MockHttpRequest(const MockTransaction& t) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL(t.url);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  method = t.method;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extra_headers.AddHeadersFromString(t.request_headers);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_flags = t.load_flags;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTransactionConsumer::quit_counter_ = 0;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestTransactionConsumer::TestTransactionConsumer(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::RequestPriority priority,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpTransactionFactory* factory)
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : state_(IDLE), error_(net::OK) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disregard the error code.
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  factory->CreateTransaction(priority, &trans_);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++quit_counter_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestTransactionConsumer::~TestTransactionConsumer() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTransactionConsumer::Start(const net::HttpRequestInfo* request,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const net::BoundNetLog& net_log) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = STARTING;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = trans_->Start(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request, base::Bind(&TestTransactionConsumer::OnIOComplete,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          base::Unretained(this)), net_log);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != net::ERR_IO_PENDING)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidStart(result);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTransactionConsumer::DidStart(int result) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != net::OK) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidFinish(result);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Read();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTransactionConsumer::DidRead(int result) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result <= 0) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidFinish(result);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_.append(read_buf_->data(), result);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Read();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTransactionConsumer::DidFinish(int result) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = DONE;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_ = result;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (--quit_counter_ == 0)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTransactionConsumer::Read() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = READING;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_buf_ = new net::IOBuffer(1024);
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int result = trans_->Read(read_buf_.get(),
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            1024,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&TestTransactionConsumer::OnIOComplete,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       base::Unretained(this)));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != net::ERR_IO_PENDING)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidRead(result);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTransactionConsumer::OnIOComplete(int result) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state_) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STARTING:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DidStart(result);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case READING:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DidRead(result);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockNetworkTransaction::MockNetworkTransaction(
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::RequestPriority priority,
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockNetworkLayer* factory)
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : request_(NULL),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_cursor_(0),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      priority_(priority),
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      websocket_handshake_stream_create_helper_(NULL),
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      transaction_factory_(factory->AsWeakPtr()),
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      received_bytes_(0),
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      socket_log_id_(net::NetLog::Source::kInvalidId),
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_factory_(this) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockNetworkTransaction::~MockNetworkTransaction() {}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkTransaction::Start(const net::HttpRequestInfo* request,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const net::CompletionCallback& callback,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const net::BoundNetLog& net_log) {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (request_)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::ERR_FAILED;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  request_ = request;
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return StartInternal(request, callback, net_log);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkTransaction::RestartIgnoringLastError(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::ERR_FAILED;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkTransaction::RestartWithCertificate(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::X509Certificate* client_cert,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::ERR_FAILED;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkTransaction::RestartWithAuth(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::AuthCredentials& credentials,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback) {
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!IsReadyToRestartForAuth())
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return net::ERR_FAILED;
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::HttpRequestInfo auth_request_info = *request_;
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  auth_request_info.extra_headers.AddHeaderFromString("Authorization: Bar");
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Let the MockTransactionHandler worry about this: the only way for this
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // test to succeed is by using an explicit handler for the transaction so
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // that server behavior can be simulated.
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return StartInternal(&auth_request_info, callback, net::BoundNetLog());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockNetworkTransaction::IsReadyToRestartForAuth() {
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!request_)
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only mock auth when the test asks for it.
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return request_->extra_headers.HasHeader("X-Require-Mock-Auth");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkTransaction::Read(net::IOBuffer* buf, int buf_len,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const net::CompletionCallback& callback) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int data_len = static_cast<int>(data_.size());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num = std::min(buf_len, data_len - data_cursor_);
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (test_mode_ & TEST_MODE_SLOW_READ)
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    num = std::min(num, 1);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (num) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(buf->data(), data_.data() + data_cursor_, num);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_cursor_ += num;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test_mode_ & TEST_MODE_SYNC_NET_READ)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallbackLater(callback, num);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::ERR_IO_PENDING;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MockNetworkTransaction::StopCaching() {
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (transaction_factory_.get())
303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    transaction_factory_->TransactionStopCaching();
304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool MockNetworkTransaction::GetFullRequestHeaders(
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    net::HttpRequestHeaders* headers) const {
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int64 MockNetworkTransaction::GetTotalReceivedBytes() const {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return received_bytes_;
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkTransaction::DoneReading() {
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (transaction_factory_.get())
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transaction_factory_->TransactionDoneReading();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::HttpResponseInfo* MockNetworkTransaction::GetResponseInfo() const {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &response_;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::LoadState MockNetworkTransaction::GetLoadState() const {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_cursor_)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::LOAD_STATE_READING_RESPONSE;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::LOAD_STATE_IDLE;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::UploadProgress MockNetworkTransaction::GetUploadProgress() const {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::UploadProgress();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MockNetworkTransaction::SetQuicServerInfo(
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    net::QuicServerInfo* quic_server_info) {}
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockNetworkTransaction::GetLoadTimingInfo(
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::LoadTimingInfo* load_timing_info) const {
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (socket_log_id_ != net::NetLog::Source::kInvalidId) {
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The minimal set of times for a request that gets a response, assuming it
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // gets a new socket.
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->socket_reused = false;
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->socket_log_id = socket_log_id_;
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->connect_timing.connect_start = base::TimeTicks::Now();
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->connect_timing.connect_end = base::TimeTicks::Now();
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->send_start = base::TimeTicks::Now();
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->send_end = base::TimeTicks::Now();
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // If there's no valid socket ID, just use the generic socket reused values.
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // No tests currently depend on this, just should not match the values set
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // by a cache hit.
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->socket_reused = true;
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->send_start = base::TimeTicks::Now();
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    load_timing_info->send_end = base::TimeTicks::Now();
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockNetworkTransaction::SetPriority(net::RequestPriority priority) {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  priority_ = priority;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MockNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper(
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    net::WebSocketHandshakeStreamBase::CreateHelper* create_helper) {
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  websocket_handshake_stream_create_helper_ = create_helper;
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int MockNetworkTransaction::StartInternal(
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const net::HttpRequestInfo* request,
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const net::CompletionCallback& callback,
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const net::BoundNetLog& net_log) {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const MockTransaction* t = FindMockTransaction(request->url);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!t)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return net::ERR_FAILED;
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_mode_ = t->test_mode;
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Return immediately if we're returning an error.
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (net::OK != t->return_code) {
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_mode_ & TEST_MODE_SYNC_NET_START)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return t->return_code;
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CallbackLater(callback, t->return_code);
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return net::ERR_IO_PENDING;
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string resp_status = t->status;
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string resp_headers = t->response_headers;
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string resp_data = t->data;
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  received_bytes_ = resp_status.size() + resp_headers.size() + resp_data.size();
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (t->handler)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    (t->handler)(request, &resp_status, &resp_headers, &resp_data);
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string header_data = base::StringPrintf(
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "%s\n%s\n", resp_status.c_str(), resp_headers.c_str());
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::replace(header_data.begin(), header_data.end(), '\n', '\0');
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.request_time = base::Time::Now();
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!t->request_time.is_null())
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    response_.request_time = t->request_time;
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.was_cached = false;
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.network_accessed = true;
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.response_time = base::Time::Now();
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!t->response_time.is_null())
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    response_.response_time = t->response_time;
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.headers = new net::HttpResponseHeaders(header_data);
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.vary_data.Init(*request, *response_.headers.get());
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  response_.ssl_info.cert_status = t->cert_status;
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data_ = resp_data;
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (net_log.net_log())
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    socket_log_id_ = net_log.net_log()->NextID();
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (test_mode_ & TEST_MODE_SYNC_NET_START)
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return net::OK;
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallbackLater(callback, net::OK);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return net::ERR_IO_PENDING;
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MockNetworkTransaction::SetBeforeNetworkStartCallback(
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const BeforeNetworkStartCallback& callback) {
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockNetworkTransaction::SetBeforeProxyHeadersSentCallback(
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const BeforeProxyHeadersSentCallback& callback) {
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int MockNetworkTransaction::ResumeNetworkStart() {
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should not get here.
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return net::ERR_FAILED;
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkTransaction::CallbackLater(
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback, int result) {
43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&MockNetworkTransaction::RunCallback,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            weak_factory_.GetWeakPtr(), callback, result));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkTransaction::RunCallback(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback, int result) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(result);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockNetworkLayer::MockNetworkLayer()
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : transaction_count_(0),
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      done_reading_called_(false),
451effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      stop_caching_called_(false),
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_create_transaction_priority_(net::DEFAULT_PRIORITY) {}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockNetworkLayer::~MockNetworkLayer() {}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkLayer::TransactionDoneReading() {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done_reading_called_ = true;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MockNetworkLayer::TransactionStopCaching() {
461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stop_caching_called_ = true;
462effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
463effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkLayer::CreateTransaction(
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::RequestPriority priority,
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<net::HttpTransaction>* trans) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transaction_count_++;
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_create_transaction_priority_ = priority;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MockNetworkTransaction> mock_transaction(
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new MockNetworkTransaction(priority, this));
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_transaction_ = mock_transaction->AsWeakPtr();
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *trans = mock_transaction.Pass();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::OK;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HttpCache* MockNetworkLayer::GetCache() {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HttpNetworkSession* MockNetworkLayer::GetSession() {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// helpers
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReadTransaction(net::HttpTransaction* trans, std::string* result) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback callback;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(256));
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    rv = trans->Read(buf.get(), 256, callback.callback());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rv == net::ERR_IO_PENDING)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = callback.WaitForResult();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rv > 0)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content.append(buf->data(), rv);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (rv < 0)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return rv;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (rv > 0);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->swap(content);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::OK;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
508