http_transaction_test_util.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_factory_(this), 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_(NULL), 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_cursor_(0), 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) priority_(priority), 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) websocket_handshake_stream_create_helper_(NULL), 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) transaction_factory_(factory->AsWeakPtr()), 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) received_bytes_(0), 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) socket_log_id_(net::NetLog::Source::kInvalidId) { 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) 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int MockNetworkTransaction::ResumeNetworkStart() { 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Should not get here. 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return net::ERR_FAILED; 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkTransaction::CallbackLater( 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, int result) { 43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&MockNetworkTransaction::RunCallback, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback, result)); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkTransaction::RunCallback( 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, int result) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(result); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockNetworkLayer::MockNetworkLayer() 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : transaction_count_(0), 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) done_reading_called_(false), 447effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch stop_caching_called_(false), 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_create_transaction_priority_(net::DEFAULT_PRIORITY) {} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockNetworkLayer::~MockNetworkLayer() {} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockNetworkLayer::TransactionDoneReading() { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_reading_called_ = true; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MockNetworkLayer::TransactionStopCaching() { 457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch stop_caching_called_ = true; 458effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockNetworkLayer::CreateTransaction( 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority, 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::HttpTransaction>* trans) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction_count_++; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_create_transaction_priority_ = priority; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<MockNetworkTransaction> mock_transaction( 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new MockNetworkTransaction(priority, this)); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_transaction_ = mock_transaction->AsWeakPtr(); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *trans = mock_transaction.Pass(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HttpCache* MockNetworkLayer::GetCache() { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HttpNetworkSession* MockNetworkLayer::GetSession() { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// helpers 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReadTransaction(net::HttpTransaction* trans, std::string* result) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback callback; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string content; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(256)); 491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) rv = trans->Read(buf.get(), 256, callback.callback()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::ERR_IO_PENDING) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = callback.WaitForResult(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv > 0) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content.append(buf->data(), rv); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (rv < 0) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (rv > 0); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->swap(content); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 504