Avi Drissman | 6459548 | 2022-09-14 20:52:29 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors |
license.bot | bf09a50 | 2008-08-24 00:55:55 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 4 | |
[email protected] | c41737d | 2014-05-14 07:47:19 | [diff] [blame] | 5 | #include "net/http/http_transaction_test_util.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 6 | |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 7 | #include <algorithm> |
davidben | 1e912ea | 2016-04-20 19:17:07 | [diff] [blame] | 8 | #include <unordered_map> |
dcheng | c7eeda42 | 2015-12-26 03:56:48 | [diff] [blame] | 9 | #include <utility> |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 10 | |
Avi Drissman | 41c4a41 | 2023-01-11 22:45:37 | [diff] [blame^] | 11 | #include "base/functional/bind.h" |
| 12 | #include "base/functional/callback_helpers.h" |
skyostil | 4891b25b | 2015-06-11 11:43:45 | [diff] [blame] | 13 | #include "base/location.h" |
bnc | eb9aa711 | 2017-01-05 01:03:46 | [diff] [blame] | 14 | #include "base/run_loop.h" |
[email protected] | 125ef48 | 2013-06-11 18:32:47 | [diff] [blame] | 15 | #include "base/strings/stringprintf.h" |
Patrick Monette | 643cdf6 | 2021-10-15 19:13:42 | [diff] [blame] | 16 | #include "base/task/single_thread_task_runner.h" |
jkarlin | fb1d517 | 2015-01-12 14:10:29 | [diff] [blame] | 17 | #include "base/time/clock.h" |
eroman | 7267378 | 2016-11-17 05:59:50 | [diff] [blame] | 18 | #include "base/time/time.h" |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 19 | #include "net/base/ip_address.h" |
| 20 | #include "net/base/ip_endpoint.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 21 | #include "net/base/load_flags.h" |
[email protected] | 3b23a22 | 2013-05-15 21:33:25 | [diff] [blame] | 22 | #include "net/base/load_timing_info.h" |
[email protected] | 125ef48 | 2013-06-11 18:32:47 | [diff] [blame] | 23 | #include "net/base/net_errors.h" |
Shivani Sharma | 7ef36b8 | 2019-10-23 18:33:56 | [diff] [blame] | 24 | #include "net/base/network_isolation_key.h" |
Matt Menke | 4807a9a | 2020-11-21 00:14:41 | [diff] [blame] | 25 | #include "net/base/schemeful_site.h" |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 26 | #include "net/cert/x509_certificate.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 27 | #include "net/disk_cache/disk_cache.h" |
| 28 | #include "net/http/http_cache.h" |
| 29 | #include "net/http/http_request_info.h" |
| 30 | #include "net/http/http_response_info.h" |
| 31 | #include "net/http/http_transaction.h" |
mikecirone | f22f981 | 2016-10-04 03:40:19 | [diff] [blame] | 32 | #include "net/log/net_log.h" |
| 33 | #include "net/log/net_log_source.h" |
Matt Menke | ce5d76537 | 2021-08-17 18:24:12 | [diff] [blame] | 34 | #include "net/ssl/ssl_private_key.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 35 | #include "testing/gtest/include/gtest/gtest.h" |
Matt Menke | 4807a9a | 2020-11-21 00:14:41 | [diff] [blame] | 36 | #include "url/gurl.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 37 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 38 | namespace net { |
| 39 | |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 40 | namespace { |
davidben | 1e912ea | 2016-04-20 19:17:07 | [diff] [blame] | 41 | using MockTransactionMap = |
| 42 | std::unordered_map<std::string, const MockTransaction*>; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 43 | static MockTransactionMap mock_transactions; |
| 44 | } // namespace |
| 45 | |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 46 | TransportInfo DefaultTransportInfo() { |
| 47 | return TransportInfo(TransportType::kDirect, |
Aaron Tagliaboschi | 603540d2 | 2021-04-05 00:37:14 | [diff] [blame] | 48 | IPEndPoint(IPAddress::IPv4Localhost(), 80), ""); |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 49 | } |
| 50 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 51 | //----------------------------------------------------------------------------- |
| 52 | // mock transaction data |
| 53 | |
| 54 | const MockTransaction kSimpleGET_Transaction = { |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 55 | "http://www.google.com/", |
| 56 | "GET", |
| 57 | base::Time(), |
| 58 | "", |
| 59 | LOAD_NORMAL, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 60 | DefaultTransportInfo(), |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 61 | "HTTP/1.1 200 OK", |
| 62 | "Cache-Control: max-age=10000\n", |
| 63 | base::Time(), |
| 64 | "<html><body>Google Blah Blah</body></html>", |
Cammie Smith Barnes | bf91e2a | 2020-12-23 20:49:04 | [diff] [blame] | 65 | {}, |
Shuran Huang | 6c73e33dc | 2022-09-27 22:28:41 | [diff] [blame] | 66 | absl::nullopt, |
| 67 | absl::nullopt, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 68 | TEST_MODE_NORMAL, |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 69 | nullptr, |
| 70 | nullptr, |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 71 | nullptr, |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 72 | 0, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 73 | 0, |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 74 | OK, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 75 | OK, |
| 76 | }; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 77 | |
| 78 | const MockTransaction kSimplePOST_Transaction = { |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 79 | "http://bugdatabase.com/edit", |
| 80 | "POST", |
| 81 | base::Time(), |
| 82 | "", |
| 83 | LOAD_NORMAL, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 84 | DefaultTransportInfo(), |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 85 | "HTTP/1.1 200 OK", |
| 86 | "", |
| 87 | base::Time(), |
| 88 | "<html><body>Google Blah Blah</body></html>", |
Cammie Smith Barnes | bf91e2a | 2020-12-23 20:49:04 | [diff] [blame] | 89 | {}, |
Shuran Huang | 6c73e33dc | 2022-09-27 22:28:41 | [diff] [blame] | 90 | absl::nullopt, |
| 91 | absl::nullopt, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 92 | TEST_MODE_NORMAL, |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 93 | nullptr, |
| 94 | nullptr, |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 95 | nullptr, |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 96 | 0, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 97 | 0, |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 98 | OK, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 99 | OK, |
| 100 | }; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 101 | |
| 102 | const MockTransaction kTypicalGET_Transaction = { |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 103 | "http://www.example.com/~foo/bar.html", |
| 104 | "GET", |
| 105 | base::Time(), |
| 106 | "", |
| 107 | LOAD_NORMAL, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 108 | DefaultTransportInfo(), |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 109 | "HTTP/1.1 200 OK", |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 110 | "Date: Wed, 28 Nov 2007 09:40:09 GMT\n" |
| 111 | "Last-Modified: Wed, 28 Nov 2007 00:40:09 GMT\n", |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 112 | base::Time(), |
| 113 | "<html><body>Google Blah Blah</body></html>", |
Cammie Smith Barnes | bf91e2a | 2020-12-23 20:49:04 | [diff] [blame] | 114 | {}, |
Shuran Huang | 6c73e33dc | 2022-09-27 22:28:41 | [diff] [blame] | 115 | absl::nullopt, |
| 116 | absl::nullopt, |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 117 | TEST_MODE_NORMAL, |
| 118 | nullptr, |
| 119 | nullptr, |
| 120 | nullptr, |
| 121 | 0, |
| 122 | 0, |
| 123 | OK, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 124 | OK, |
| 125 | }; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 126 | |
| 127 | const MockTransaction kETagGET_Transaction = { |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 128 | "http://www.google.com/foopy", |
| 129 | "GET", |
| 130 | base::Time(), |
| 131 | "", |
| 132 | LOAD_NORMAL, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 133 | DefaultTransportInfo(), |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 134 | "HTTP/1.1 200 OK", |
| 135 | "Cache-Control: max-age=10000\n" |
| 136 | "Etag: \"foopy\"\n", |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 137 | base::Time(), |
| 138 | "<html><body>Google Blah Blah</body></html>", |
Cammie Smith Barnes | bf91e2a | 2020-12-23 20:49:04 | [diff] [blame] | 139 | {}, |
Shuran Huang | 6c73e33dc | 2022-09-27 22:28:41 | [diff] [blame] | 140 | absl::nullopt, |
| 141 | absl::nullopt, |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 142 | TEST_MODE_NORMAL, |
| 143 | nullptr, |
| 144 | nullptr, |
| 145 | nullptr, |
| 146 | 0, |
| 147 | 0, |
| 148 | OK, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 149 | OK, |
| 150 | }; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 151 | |
| 152 | const MockTransaction kRangeGET_Transaction = { |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 153 | "http://www.google.com/", |
| 154 | "GET", |
| 155 | base::Time(), |
| 156 | "Range: 0-100\r\n", |
| 157 | LOAD_NORMAL, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 158 | DefaultTransportInfo(), |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 159 | "HTTP/1.1 200 OK", |
| 160 | "Cache-Control: max-age=10000\n", |
| 161 | base::Time(), |
| 162 | "<html><body>Google Blah Blah</body></html>", |
Cammie Smith Barnes | bf91e2a | 2020-12-23 20:49:04 | [diff] [blame] | 163 | {}, |
Shuran Huang | 6c73e33dc | 2022-09-27 22:28:41 | [diff] [blame] | 164 | absl::nullopt, |
| 165 | absl::nullopt, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 166 | TEST_MODE_NORMAL, |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 167 | nullptr, |
| 168 | nullptr, |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 169 | nullptr, |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 170 | 0, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 171 | 0, |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 172 | OK, |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 173 | OK, |
| 174 | }; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 175 | |
| 176 | static const MockTransaction* const kBuiltinMockTransactions[] = { |
| 177 | &kSimpleGET_Transaction, |
| 178 | &kSimplePOST_Transaction, |
| 179 | &kTypicalGET_Transaction, |
| 180 | &kETagGET_Transaction, |
| 181 | &kRangeGET_Transaction |
| 182 | }; |
| 183 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 184 | const MockTransaction* FindMockTransaction(const GURL& url) { |
| 185 | // look for overrides: |
| 186 | MockTransactionMap::const_iterator it = mock_transactions.find(url.spec()); |
| 187 | if (it != mock_transactions.end()) |
| 188 | return it->second; |
| 189 | |
| 190 | // look for builtins: |
Tsuyoshi Horo | 17ef47d0 | 2022-06-30 10:58:27 | [diff] [blame] | 191 | for (const auto* transaction : kBuiltinMockTransactions) { |
| 192 | if (url == GURL(transaction->url)) |
| 193 | return transaction; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 194 | } |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 195 | return nullptr; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 196 | } |
| 197 | |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 198 | void AddMockTransaction(const MockTransaction* trans) { |
| 199 | mock_transactions[GURL(trans->url).spec()] = trans; |
| 200 | } |
| 201 | |
| 202 | void RemoveMockTransaction(const MockTransaction* trans) { |
| 203 | mock_transactions.erase(GURL(trans->url).spec()); |
| 204 | } |
| 205 | |
| 206 | MockHttpRequest::MockHttpRequest(const MockTransaction& t) { |
| 207 | url = GURL(t.url); |
| 208 | method = t.method; |
| 209 | extra_headers.AddHeadersFromString(t.request_headers); |
| 210 | load_flags = t.load_flags; |
Matt Menke | 4807a9a | 2020-11-21 00:14:41 | [diff] [blame] | 211 | SchemefulSite site(url); |
| 212 | network_isolation_key = NetworkIsolationKey(site, site); |
Brianna Goldstein | 314ddf72 | 2022-09-24 02:00:52 | [diff] [blame] | 213 | network_anonymization_key = NetworkAnonymizationKey(site, site); |
Shuran Huang | 6c73e33dc | 2022-09-27 22:28:41 | [diff] [blame] | 214 | fps_cache_filter = t.fps_cache_filter; |
| 215 | browser_run_id = t.browser_run_id; |
Shivani Sharma | 7ef36b8 | 2019-10-23 18:33:56 | [diff] [blame] | 216 | } |
| 217 | |
| 218 | std::string MockHttpRequest::CacheKey() { |
Matt Menke | 11ffd53 | 2022-07-22 00:49:33 | [diff] [blame] | 219 | return *HttpCache::GenerateCacheKeyForRequest(this); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 220 | } |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 221 | |
| 222 | //----------------------------------------------------------------------------- |
| 223 | |
| 224 | // static |
| 225 | int TestTransactionConsumer::quit_counter_ = 0; |
| 226 | |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 227 | TestTransactionConsumer::TestTransactionConsumer( |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 228 | RequestPriority priority, |
Tsuyoshi Horo | ca07e3a | 2022-06-07 07:37:56 | [diff] [blame] | 229 | HttpTransactionFactory* factory) { |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 230 | // Disregard the error code. |
[email protected] | 027bd85a | 2013-12-27 22:39:10 | [diff] [blame] | 231 | factory->CreateTransaction(priority, &trans_); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 232 | ++quit_counter_; |
| 233 | } |
| 234 | |
Chris Watkins | 7a41d355 | 2017-12-01 02:13:27 | [diff] [blame] | 235 | TestTransactionConsumer::~TestTransactionConsumer() = default; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 236 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 237 | void TestTransactionConsumer::Start(const HttpRequestInfo* request, |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 238 | const NetLogWithSource& net_log) { |
Peter Kasting | d039b77 | 2021-08-18 00:06:20 | [diff] [blame] | 239 | state_ = State::kStarting; |
Yannic Bonenberger | cc716d4 | 2019-09-04 17:05:36 | [diff] [blame] | 240 | int result = |
| 241 | trans_->Start(request, |
| 242 | base::BindOnce(&TestTransactionConsumer::OnIOComplete, |
| 243 | base::Unretained(this)), |
| 244 | net_log); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 245 | if (result != ERR_IO_PENDING) |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 246 | DidStart(result); |
| 247 | } |
| 248 | |
| 249 | void TestTransactionConsumer::DidStart(int result) { |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 250 | if (result != OK) { |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 251 | DidFinish(result); |
| 252 | } else { |
| 253 | Read(); |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | void TestTransactionConsumer::DidRead(int result) { |
| 258 | if (result <= 0) { |
| 259 | DidFinish(result); |
| 260 | } else { |
| 261 | content_.append(read_buf_->data(), result); |
| 262 | Read(); |
| 263 | } |
| 264 | } |
| 265 | |
| 266 | void TestTransactionConsumer::DidFinish(int result) { |
Peter Kasting | d039b77 | 2021-08-18 00:06:20 | [diff] [blame] | 267 | state_ = State::kDone; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 268 | error_ = result; |
| 269 | if (--quit_counter_ == 0) |
Gabriel Charette | 53a9ef81 | 2017-07-26 12:36:23 | [diff] [blame] | 270 | base::RunLoop::QuitCurrentWhenIdleDeprecated(); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 271 | } |
| 272 | |
| 273 | void TestTransactionConsumer::Read() { |
Peter Kasting | d039b77 | 2021-08-18 00:06:20 | [diff] [blame] | 274 | state_ = State::kReading; |
Victor Costan | 9c7302b | 2018-08-27 16:39:44 | [diff] [blame] | 275 | read_buf_ = base::MakeRefCounted<IOBuffer>(1024); |
Yannic Bonenberger | cc716d4 | 2019-09-04 17:05:36 | [diff] [blame] | 276 | int result = |
| 277 | trans_->Read(read_buf_.get(), 1024, |
| 278 | base::BindOnce(&TestTransactionConsumer::OnIOComplete, |
| 279 | base::Unretained(this))); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 280 | if (result != ERR_IO_PENDING) |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 281 | DidRead(result); |
| 282 | } |
| 283 | |
[email protected] | b35f629f | 2011-12-23 02:53:32 | [diff] [blame] | 284 | void TestTransactionConsumer::OnIOComplete(int result) { |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 285 | switch (state_) { |
Peter Kasting | d039b77 | 2021-08-18 00:06:20 | [diff] [blame] | 286 | case State::kStarting: |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 287 | DidStart(result); |
| 288 | break; |
Peter Kasting | d039b77 | 2021-08-18 00:06:20 | [diff] [blame] | 289 | case State::kReading: |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 290 | DidRead(result); |
| 291 | break; |
| 292 | default: |
| 293 | NOTREACHED(); |
| 294 | } |
| 295 | } |
| 296 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 297 | MockNetworkTransaction::MockNetworkTransaction(RequestPriority priority, |
| 298 | MockNetworkLayer* factory) |
Tsuyoshi Horo | 432981d5 | 2022-06-09 09:50:13 | [diff] [blame] | 299 | : priority_(priority), transaction_factory_(factory->AsWeakPtr()) {} |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 300 | |
shivanisha | a71773ef | 2017-06-16 23:35:01 | [diff] [blame] | 301 | MockNetworkTransaction::~MockNetworkTransaction() { |
| 302 | // Use request_ as in ~HttpNetworkTransaction to make sure its valid and not |
Shivani Sharma | 864513b4 | 2017-10-25 21:14:55 | [diff] [blame] | 303 | // already freed by the consumer. Only check till Read is invoked since |
| 304 | // HttpNetworkTransaction sets request_ to nullptr when Read is invoked. |
| 305 | // See crbug.com/734037. |
| 306 | if (request_ && !reading_) |
shivanisha | a71773ef | 2017-06-16 23:35:01 | [diff] [blame] | 307 | DCHECK(request_->load_flags >= 0); |
| 308 | } |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 309 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 310 | int MockNetworkTransaction::Start(const HttpRequestInfo* request, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 311 | CompletionOnceCallback callback, |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 312 | const NetLogWithSource& net_log) { |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 313 | if (request_) |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 314 | return ERR_FAILED; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 315 | |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 316 | request_ = request; |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 317 | return StartInternal(request, std::move(callback), net_log); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 318 | } |
| 319 | |
| 320 | int MockNetworkTransaction::RestartIgnoringLastError( |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 321 | CompletionOnceCallback callback) { |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 322 | return ERR_FAILED; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 323 | } |
| 324 | |
| 325 | int MockNetworkTransaction::RestartWithCertificate( |
mattm | 436ccfe | 2017-06-19 20:24:08 | [diff] [blame] | 326 | scoped_refptr<X509Certificate> client_cert, |
| 327 | scoped_refptr<SSLPrivateKey> client_private_key, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 328 | CompletionOnceCallback callback) { |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 329 | return ERR_FAILED; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 330 | } |
| 331 | |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 332 | int MockNetworkTransaction::RestartWithAuth(const AuthCredentials& credentials, |
| 333 | CompletionOnceCallback callback) { |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 334 | if (!IsReadyToRestartForAuth()) |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 335 | return ERR_FAILED; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 336 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 337 | HttpRequestInfo auth_request_info = *request_; |
ricea | 9965adea | 2016-09-13 03:41:37 | [diff] [blame] | 338 | auth_request_info.extra_headers.SetHeader("Authorization", "Bar"); |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 339 | |
| 340 | // Let the MockTransactionHandler worry about this: the only way for this |
| 341 | // test to succeed is by using an explicit handler for the transaction so |
| 342 | // that server behavior can be simulated. |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 343 | return StartInternal(&auth_request_info, std::move(callback), |
| 344 | NetLogWithSource()); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 345 | } |
| 346 | |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 347 | void MockNetworkTransaction::PopulateNetErrorDetails( |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 348 | NetErrorDetails* /*details*/) const { |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 349 | NOTIMPLEMENTED(); |
| 350 | } |
| 351 | |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 352 | bool MockNetworkTransaction::IsReadyToRestartForAuth() { |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 353 | if (!request_) |
| 354 | return false; |
| 355 | |
ricea | 64c07d79 | 2014-10-08 03:37:00 | [diff] [blame] | 356 | if (!request_->extra_headers.HasHeader("X-Require-Mock-Auth")) |
| 357 | return false; |
| 358 | |
| 359 | // Allow the mock server to decide whether authentication is required or not. |
| 360 | std::string status_line = response_.headers->GetStatusLine(); |
| 361 | return status_line.find(" 401 ") != std::string::npos || |
| 362 | status_line.find(" 407 ") != std::string::npos; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 363 | } |
| 364 | |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 365 | int MockNetworkTransaction::Read(net::IOBuffer* buf, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 366 | int buf_len, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 367 | CompletionOnceCallback callback) { |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 368 | const MockTransaction* t = FindMockTransaction(request_->url); |
| 369 | DCHECK(t); |
| 370 | |
xunjieli | 26ede96 | 2015-11-23 19:39:13 | [diff] [blame] | 371 | CHECK(!done_reading_called_); |
Shivani Sharma | 864513b4 | 2017-10-25 21:14:55 | [diff] [blame] | 372 | reading_ = true; |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 373 | |
| 374 | int num = t->read_return_code; |
| 375 | |
| 376 | if (OK == num) { |
| 377 | if (read_handler_) { |
| 378 | num = (*read_handler_)(content_length_, data_cursor_, buf, buf_len); |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 379 | data_cursor_ += num; |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 380 | } else { |
| 381 | int data_len = static_cast<int>(data_.size()); |
| 382 | num = std::min(static_cast<int64_t>(buf_len), data_len - data_cursor_); |
| 383 | if (test_mode_ & TEST_MODE_SLOW_READ) |
| 384 | num = std::min(num, 1); |
| 385 | if (num) { |
| 386 | memcpy(buf->data(), data_.data() + data_cursor_, num); |
| 387 | data_cursor_ += num; |
| 388 | } |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 389 | } |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 390 | } |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 391 | |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 392 | if (test_mode_ & TEST_MODE_SYNC_NET_READ) |
| 393 | return num; |
| 394 | |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 395 | CallbackLater(std::move(callback), num); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 396 | return ERR_IO_PENDING; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 397 | } |
| 398 | |
[email protected] | e50efea | 2014-03-24 18:41:00 | [diff] [blame] | 399 | void MockNetworkTransaction::StopCaching() { |
| 400 | if (transaction_factory_.get()) |
| 401 | transaction_factory_->TransactionStopCaching(); |
| 402 | } |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 403 | |
sclittle | 4de1bab9 | 2015-09-22 21:28:24 | [diff] [blame] | 404 | int64_t MockNetworkTransaction::GetTotalReceivedBytes() const { |
[email protected] | b8015c4 | 2013-12-24 15:18:19 | [diff] [blame] | 405 | return received_bytes_; |
| 406 | } |
| 407 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 408 | int64_t MockNetworkTransaction::GetTotalSentBytes() const { |
| 409 | return sent_bytes_; |
| 410 | } |
| 411 | |
[email protected] | 5c04f72 | 2011-08-12 17:52:47 | [diff] [blame] | 412 | void MockNetworkTransaction::DoneReading() { |
xunjieli | 26ede96 | 2015-11-23 19:39:13 | [diff] [blame] | 413 | CHECK(!done_reading_called_); |
| 414 | done_reading_called_ = true; |
[email protected] | 11fbca0b | 2013-06-02 23:37:21 | [diff] [blame] | 415 | if (transaction_factory_.get()) |
[email protected] | 5c04f72 | 2011-08-12 17:52:47 | [diff] [blame] | 416 | transaction_factory_->TransactionDoneReading(); |
| 417 | } |
| 418 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 419 | const HttpResponseInfo* MockNetworkTransaction::GetResponseInfo() const { |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 420 | return &response_; |
| 421 | } |
| 422 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 423 | LoadState MockNetworkTransaction::GetLoadState() const { |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 424 | if (data_cursor_) |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 425 | return LOAD_STATE_READING_RESPONSE; |
| 426 | return LOAD_STATE_IDLE; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 427 | } |
| 428 | |
[email protected] | 8cd06c0 | 2014-01-25 07:50:14 | [diff] [blame] | 429 | void MockNetworkTransaction::SetQuicServerInfo( |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 430 | QuicServerInfo* quic_server_info) { |
| 431 | } |
[email protected] | 8cd06c0 | 2014-01-25 07:50:14 | [diff] [blame] | 432 | |
[email protected] | 58e32bb | 2013-01-21 18:23:25 | [diff] [blame] | 433 | bool MockNetworkTransaction::GetLoadTimingInfo( |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 434 | LoadTimingInfo* load_timing_info) const { |
mikecirone | f22f981 | 2016-10-04 03:40:19 | [diff] [blame] | 435 | if (socket_log_id_ != NetLogSource::kInvalidId) { |
[email protected] | 3b23a22 | 2013-05-15 21:33:25 | [diff] [blame] | 436 | // The minimal set of times for a request that gets a response, assuming it |
| 437 | // gets a new socket. |
| 438 | load_timing_info->socket_reused = false; |
| 439 | load_timing_info->socket_log_id = socket_log_id_; |
eroman | 7267378 | 2016-11-17 05:59:50 | [diff] [blame] | 440 | load_timing_info->connect_timing.connect_start = base::TimeTicks::Now(); |
| 441 | load_timing_info->connect_timing.connect_end = base::TimeTicks::Now(); |
| 442 | load_timing_info->send_start = base::TimeTicks::Now(); |
| 443 | load_timing_info->send_end = base::TimeTicks::Now(); |
[email protected] | 3b23a22 | 2013-05-15 21:33:25 | [diff] [blame] | 444 | } else { |
| 445 | // If there's no valid socket ID, just use the generic socket reused values. |
| 446 | // No tests currently depend on this, just should not match the values set |
| 447 | // by a cache hit. |
| 448 | load_timing_info->socket_reused = true; |
eroman | 7267378 | 2016-11-17 05:59:50 | [diff] [blame] | 449 | load_timing_info->send_start = base::TimeTicks::Now(); |
| 450 | load_timing_info->send_end = base::TimeTicks::Now(); |
[email protected] | 3b23a22 | 2013-05-15 21:33:25 | [diff] [blame] | 451 | } |
| 452 | return true; |
[email protected] | 58e32bb | 2013-01-21 18:23:25 | [diff] [blame] | 453 | } |
| 454 | |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 455 | bool MockNetworkTransaction::GetRemoteEndpoint(IPEndPoint* endpoint) const { |
tfarina | a3dd7aa | 2016-02-25 08:15:44 | [diff] [blame] | 456 | *endpoint = IPEndPoint(IPAddress(127, 0, 0, 1), 80); |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 457 | return true; |
| 458 | } |
| 459 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 460 | void MockNetworkTransaction::SetPriority(RequestPriority priority) { |
[email protected] | 5033ab8 | 2013-03-22 20:17:46 | [diff] [blame] | 461 | priority_ = priority; |
| 462 | } |
| 463 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 464 | void MockNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper( |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 465 | WebSocketHandshakeStreamBase::CreateHelper* create_helper) { |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 466 | websocket_handshake_stream_create_helper_ = create_helper; |
| 467 | } |
| 468 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 469 | // static |
| 470 | const int64_t MockNetworkTransaction::kTotalReceivedBytes = 1000; |
| 471 | |
| 472 | // static |
| 473 | const int64_t MockNetworkTransaction::kTotalSentBytes = 100; |
| 474 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 475 | int MockNetworkTransaction::StartInternal(const HttpRequestInfo* request, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 476 | CompletionOnceCallback callback, |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 477 | const NetLogWithSource& net_log) { |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 478 | const MockTransaction* t = FindMockTransaction(request->url); |
| 479 | if (!t) |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 480 | return ERR_FAILED; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 481 | |
| 482 | test_mode_ = t->test_mode; |
| 483 | |
| 484 | // Return immediately if we're returning an error. |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 485 | if (OK != t->start_return_code) { |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 486 | if (test_mode_ & TEST_MODE_SYNC_NET_START) |
shivanisha | c6582e1 | 2017-07-14 22:18:19 | [diff] [blame] | 487 | return t->start_return_code; |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 488 | CallbackLater(std::move(callback), t->start_return_code); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 489 | return ERR_IO_PENDING; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 490 | } |
| 491 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 492 | sent_bytes_ = kTotalSentBytes; |
| 493 | received_bytes_ = kTotalReceivedBytes; |
| 494 | |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 495 | std::string resp_status = t->status; |
| 496 | std::string resp_headers = t->response_headers; |
| 497 | std::string resp_data = t->data; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 498 | if (t->handler) |
| 499 | (t->handler)(request, &resp_status, &resp_headers, &resp_data); |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 500 | if (t->read_handler) |
| 501 | read_handler_ = t->read_handler; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 502 | |
| 503 | std::string header_data = base::StringPrintf( |
| 504 | "%s\n%s\n", resp_status.c_str(), resp_headers.c_str()); |
| 505 | std::replace(header_data.begin(), header_data.end(), '\n', '\0'); |
| 506 | |
jkarlin | fb1d517 | 2015-01-12 14:10:29 | [diff] [blame] | 507 | response_.request_time = transaction_factory_->Now(); |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 508 | if (!t->request_time.is_null()) |
| 509 | response_.request_time = t->request_time; |
| 510 | |
| 511 | response_.was_cached = false; |
| 512 | response_.network_accessed = true; |
Titouan Rigoudy | 52a5508 | 2022-04-11 20:06:34 | [diff] [blame] | 513 | response_.remote_endpoint = t->transport_info.endpoint; |
Titouan Rigoudy | 4ba5aa2 | 2022-06-08 19:14:28 | [diff] [blame] | 514 | response_.was_fetched_via_proxy = |
| 515 | t->transport_info.type == TransportType::kProxied; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 516 | |
jkarlin | fb1d517 | 2015-01-12 14:10:29 | [diff] [blame] | 517 | response_.response_time = transaction_factory_->Now(); |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 518 | if (!t->response_time.is_null()) |
| 519 | response_.response_time = t->response_time; |
| 520 | |
Tsuyoshi Horo | 2c0a504 | 2022-07-06 05:53:07 | [diff] [blame] | 521 | response_.headers = base::MakeRefCounted<HttpResponseHeaders>(header_data); |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 522 | response_.ssl_info.cert = t->cert; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 523 | response_.ssl_info.cert_status = t->cert_status; |
davidben | 2ec0ed34 | 2015-06-08 21:17:28 | [diff] [blame] | 524 | response_.ssl_info.connection_status = t->ssl_connection_status; |
Cammie Smith Barnes | bf91e2a | 2020-12-23 20:49:04 | [diff] [blame] | 525 | response_.dns_aliases = t->dns_aliases; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 526 | data_ = resp_data; |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 527 | content_length_ = response_.headers->GetContentLength(); |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 528 | |
| 529 | if (net_log.net_log()) |
| 530 | socket_log_id_ = net_log.net_log()->NextID(); |
| 531 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 532 | if (request_->load_flags & LOAD_PREFETCH) |
jkarlin | fb1d517 | 2015-01-12 14:10:29 | [diff] [blame] | 533 | response_.unused_since_prefetch = true; |
| 534 | |
Dominic Farolino | 4ecaf0a | 2019-08-16 06:40:09 | [diff] [blame] | 535 | if (request_->load_flags & LOAD_RESTRICTED_PREFETCH) { |
| 536 | DCHECK(response_.unused_since_prefetch); |
| 537 | response_.restricted_prefetch = true; |
| 538 | } |
| 539 | |
shivanisha | 8061c420 | 2017-06-13 23:35:52 | [diff] [blame] | 540 | // Pause and resume. |
| 541 | if (!before_network_start_callback_.is_null()) { |
| 542 | bool defer = false; |
Will Cassella | 61125f9 | 2020-07-25 09:11:37 | [diff] [blame] | 543 | std::move(before_network_start_callback_).Run(&defer); |
shivanisha | 8061c420 | 2017-06-13 23:35:52 | [diff] [blame] | 544 | if (defer) { |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 545 | resume_start_callback_ = std::move(callback); |
shivanisha | 8061c420 | 2017-06-13 23:35:52 | [diff] [blame] | 546 | return net::ERR_IO_PENDING; |
| 547 | } |
| 548 | } |
| 549 | |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 550 | if (test_mode_ & TEST_MODE_SYNC_NET_START) |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 551 | return OK; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 552 | |
Titouan Rigoudy | ed46e0c | 2020-07-09 14:42:44 | [diff] [blame] | 553 | int result = OK; |
| 554 | if (!connected_callback_.is_null()) { |
Daniel Cheng | e0fc463 | 2021-10-01 00:37:41 | [diff] [blame] | 555 | result = connected_callback_.Run(t->transport_info, base::DoNothing()); |
Titouan Rigoudy | ed46e0c | 2020-07-09 14:42:44 | [diff] [blame] | 556 | } |
| 557 | |
| 558 | CallbackLater(std::move(callback), result); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 559 | return ERR_IO_PENDING; |
[email protected] | d7358ba | 2014-01-04 01:39:49 | [diff] [blame] | 560 | } |
| 561 | |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 562 | void MockNetworkTransaction::SetBeforeNetworkStartCallback( |
Will Cassella | 61125f9 | 2020-07-25 09:11:37 | [diff] [blame] | 563 | BeforeNetworkStartCallback callback) { |
| 564 | before_network_start_callback_ = std::move(callback); |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 565 | } |
| 566 | |
Titouan Rigoudy | 78af7da | 2020-07-07 14:30:12 | [diff] [blame] | 567 | void MockNetworkTransaction::SetConnectedCallback( |
Titouan Rigoudy | ed46e0c | 2020-07-09 14:42:44 | [diff] [blame] | 568 | const ConnectedCallback& callback) { |
| 569 | connected_callback_ = callback; |
| 570 | } |
Titouan Rigoudy | 78af7da | 2020-07-07 14:30:12 | [diff] [blame] | 571 | |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 572 | int MockNetworkTransaction::ResumeNetworkStart() { |
shivanisha | 8061c420 | 2017-06-13 23:35:52 | [diff] [blame] | 573 | DCHECK(!resume_start_callback_.is_null()); |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 574 | CallbackLater(std::move(resume_start_callback_), OK); |
shivanisha | 8061c420 | 2017-06-13 23:35:52 | [diff] [blame] | 575 | return ERR_IO_PENDING; |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 576 | } |
| 577 | |
David Benjamin | 3c19a2ed | 2022-04-09 21:58:27 | [diff] [blame] | 578 | ConnectionAttempts MockNetworkTransaction::GetConnectionAttempts() const { |
Adam Rice | 4b6fb113 | 2022-05-21 08:05:01 | [diff] [blame] | 579 | // TODO(ricea): Replace this with a proper implementation if needed. |
David Benjamin | 3c19a2ed | 2022-04-09 21:58:27 | [diff] [blame] | 580 | return {}; |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 581 | } |
| 582 | |
Matt Menke | 2451c8b | 2020-12-08 22:42:51 | [diff] [blame] | 583 | void MockNetworkTransaction::CloseConnectionOnDestruction() { |
| 584 | NOTIMPLEMENTED(); |
| 585 | } |
| 586 | |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 587 | void MockNetworkTransaction::CallbackLater(CompletionOnceCallback callback, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 588 | int result) { |
Sean Maher | 5b9af51f | 2022-11-21 15:32:47 | [diff] [blame] | 589 | base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 590 | FROM_HERE, |
| 591 | base::BindOnce(&MockNetworkTransaction::RunCallback, |
| 592 | weak_factory_.GetWeakPtr(), std::move(callback), result)); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 593 | } |
| 594 | |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 595 | void MockNetworkTransaction::RunCallback(CompletionOnceCallback callback, |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 596 | int result) { |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame] | 597 | std::move(callback).Run(result); |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 598 | } |
| 599 | |
Tsuyoshi Horo | ca07e3a | 2022-06-07 07:37:56 | [diff] [blame] | 600 | MockNetworkLayer::MockNetworkLayer() = default; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 601 | |
Chris Watkins | 7a41d355 | 2017-12-01 02:13:27 | [diff] [blame] | 602 | MockNetworkLayer::~MockNetworkLayer() = default; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 603 | |
[email protected] | 5c04f72 | 2011-08-12 17:52:47 | [diff] [blame] | 604 | void MockNetworkLayer::TransactionDoneReading() { |
xunjieli | 26ede96 | 2015-11-23 19:39:13 | [diff] [blame] | 605 | CHECK(!done_reading_called_); |
[email protected] | 5c04f72 | 2011-08-12 17:52:47 | [diff] [blame] | 606 | done_reading_called_ = true; |
| 607 | } |
| 608 | |
[email protected] | e50efea | 2014-03-24 18:41:00 | [diff] [blame] | 609 | void MockNetworkLayer::TransactionStopCaching() { |
| 610 | stop_caching_called_ = true; |
| 611 | } |
| 612 | |
asanka | b5fb4b4 | 2016-06-29 11:06:08 | [diff] [blame] | 613 | void MockNetworkLayer::ResetTransactionCount() { |
| 614 | transaction_count_ = 0; |
| 615 | } |
| 616 | |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 617 | int MockNetworkLayer::CreateTransaction( |
| 618 | RequestPriority priority, |
| 619 | std::unique_ptr<HttpTransaction>* trans) { |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 620 | transaction_count_++; |
[email protected] | 5033ab8 | 2013-03-22 20:17:46 | [diff] [blame] | 621 | last_create_transaction_priority_ = priority; |
Tsuyoshi Horo | f8861cb | 2022-07-05 23:50:20 | [diff] [blame] | 622 | auto mock_transaction = |
| 623 | std::make_unique<MockNetworkTransaction>(priority, this); |
[email protected] | 5033ab8 | 2013-03-22 20:17:46 | [diff] [blame] | 624 | last_transaction_ = mock_transaction->AsWeakPtr(); |
dcheng | c7eeda42 | 2015-12-26 03:56:48 | [diff] [blame] | 625 | *trans = std::move(mock_transaction); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 626 | return OK; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 627 | } |
| 628 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 629 | HttpCache* MockNetworkLayer::GetCache() { |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 630 | return nullptr; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 631 | } |
| 632 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 633 | HttpNetworkSession* MockNetworkLayer::GetSession() { |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 634 | return nullptr; |
[email protected] | d2db029 | 2011-01-26 20:23:44 | [diff] [blame] | 635 | } |
| 636 | |
jkarlin | fb1d517 | 2015-01-12 14:10:29 | [diff] [blame] | 637 | void MockNetworkLayer::SetClock(base::Clock* clock) { |
| 638 | DCHECK(!clock_); |
| 639 | clock_ = clock; |
| 640 | } |
| 641 | |
| 642 | base::Time MockNetworkLayer::Now() { |
| 643 | if (clock_) |
| 644 | return clock_->Now(); |
| 645 | return base::Time::Now(); |
| 646 | } |
| 647 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 648 | //----------------------------------------------------------------------------- |
| 649 | // helpers |
| 650 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 651 | int ReadTransaction(HttpTransaction* trans, std::string* result) { |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 652 | int rv; |
| 653 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 654 | std::string content; |
| 655 | do { |
Mario Sanchez Prada | 21c85a3 | 2019-03-27 19:23:58 | [diff] [blame] | 656 | TestCompletionCallback callback; |
Victor Costan | 9c7302b | 2018-08-27 16:39:44 | [diff] [blame] | 657 | scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(256); |
[email protected] | 9049948 | 2013-06-01 00:39:50 | [diff] [blame] | 658 | rv = trans->Read(buf.get(), 256, callback.callback()); |
bnc | eb9aa711 | 2017-01-05 01:03:46 | [diff] [blame] | 659 | if (rv == ERR_IO_PENDING) { |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 660 | rv = callback.WaitForResult(); |
bnc | eb9aa711 | 2017-01-05 01:03:46 | [diff] [blame] | 661 | base::RunLoop().RunUntilIdle(); |
| 662 | } |
[email protected] | 49639fa | 2011-12-20 23:22:41 | [diff] [blame] | 663 | |
| 664 | if (rv > 0) |
[email protected] | 9dea9e1f | 2009-01-29 00:30:47 | [diff] [blame] | 665 | content.append(buf->data(), rv); |
[email protected] | 49639fa | 2011-12-20 23:22:41 | [diff] [blame] | 666 | else if (rv < 0) |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 667 | return rv; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 668 | } while (rv > 0); |
| 669 | |
| 670 | result->swap(content); |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 671 | return OK; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 672 | } |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 673 | |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 674 | //----------------------------------------------------------------------------- |
| 675 | // connected callback handler |
| 676 | |
| 677 | ConnectedHandler::ConnectedHandler() = default; |
| 678 | ConnectedHandler::~ConnectedHandler() = default; |
| 679 | |
| 680 | ConnectedHandler::ConnectedHandler(const ConnectedHandler&) = default; |
| 681 | ConnectedHandler& ConnectedHandler::operator=(const ConnectedHandler&) = |
| 682 | default; |
| 683 | ConnectedHandler::ConnectedHandler(ConnectedHandler&&) = default; |
| 684 | ConnectedHandler& ConnectedHandler::operator=(ConnectedHandler&&) = default; |
| 685 | |
Aaron Tagliaboschi | b35cc40 | 2021-03-10 22:23:32 | [diff] [blame] | 686 | int ConnectedHandler::OnConnected(const TransportInfo& info, |
| 687 | CompletionOnceCallback callback) { |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 688 | transports_.push_back(info); |
Aaron Tagliaboschi | b35cc40 | 2021-03-10 22:23:32 | [diff] [blame] | 689 | if (run_callback_) { |
Sean Maher | 5b9af51f | 2022-11-21 15:32:47 | [diff] [blame] | 690 | base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( |
Aaron Tagliaboschi | b35cc40 | 2021-03-10 22:23:32 | [diff] [blame] | 691 | FROM_HERE, base::BindOnce(std::move(callback), result_)); |
| 692 | return net::ERR_IO_PENDING; |
| 693 | } |
Titouan Rigoudy | ba507a88 | 2020-07-31 12:15:15 | [diff] [blame] | 694 | return result_; |
| 695 | } |
| 696 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 697 | } // namespace net |