| Alex Deymo | aea4c1c | 2015-08-19 20:24:43 -0700 | [diff] [blame] | 1 | // | 
 | 2 | // Copyright (C) 2012 The Android Open Source Project | 
 | 3 | // | 
 | 4 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 | // you may not use this file except in compliance with the License. | 
 | 6 | // You may obtain a copy of the License at | 
 | 7 | // | 
 | 8 | //      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 | // | 
 | 10 | // Unless required by applicable law or agreed to in writing, software | 
 | 11 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 | // See the License for the specific language governing permissions and | 
 | 14 | // limitations under the License. | 
 | 15 | // | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 16 |  | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 17 | #include <netinet/in.h> | 
 | 18 | #include <netinet/ip.h> | 
 | 19 | #include <sys/socket.h> | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 20 | #include <unistd.h> | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 21 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 22 | #include <memory> | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 23 | #include <string> | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 24 | #include <utility> | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 25 | #include <vector> | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 26 |  | 
| Alex Deymo | 706a5ab | 2015-11-23 17:48:30 -0300 | [diff] [blame] | 27 | #include <base/bind.h> | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 28 | #include <base/location.h> | 
| Andrew de los Reyes | 4516810 | 2010-11-22 11:13:50 -0800 | [diff] [blame] | 29 | #include <base/logging.h> | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 30 | #include <base/message_loop/message_loop.h> | 
 | 31 | #include <base/strings/string_number_conversions.h> | 
| Alex Vakulenko | 75039d7 | 2014-03-25 12:36:28 -0700 | [diff] [blame] | 32 | #include <base/strings/string_util.h> | 
 | 33 | #include <base/strings/stringprintf.h> | 
 | 34 | #include <base/time/time.h> | 
| Alex Deymo | 706a5ab | 2015-11-23 17:48:30 -0300 | [diff] [blame] | 35 | #include <brillo/bind_lambda.h> | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 36 | #include <brillo/message_loops/base_message_loop.h> | 
 | 37 | #include <brillo/message_loops/message_loop.h> | 
 | 38 | #include <brillo/message_loops/message_loop_utils.h> | 
 | 39 | #include <brillo/process.h> | 
 | 40 | #include <brillo/streams/file_stream.h> | 
 | 41 | #include <brillo/streams/stream.h> | 
| Andrew de los Reyes | 4516810 | 2010-11-22 11:13:50 -0800 | [diff] [blame] | 42 | #include <gtest/gtest.h> | 
 | 43 |  | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 44 | #include "update_engine/common/fake_hardware.h" | 
| Alex Deymo | 39910dc | 2015-11-09 17:04:30 -0800 | [diff] [blame] | 45 | #include "update_engine/common/http_common.h" | 
 | 46 | #include "update_engine/common/libcurl_http_fetcher.h" | 
 | 47 | #include "update_engine/common/mock_http_fetcher.h" | 
 | 48 | #include "update_engine/common/multi_range_http_fetcher.h" | 
 | 49 | #include "update_engine/common/test_utils.h" | 
 | 50 | #include "update_engine/common/utils.h" | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 51 | #include "update_engine/mock_proxy_resolver.h" | 
| Andrew de los Reyes | 4516810 | 2010-11-22 11:13:50 -0800 | [diff] [blame] | 52 | #include "update_engine/proxy_resolver.h" | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 53 |  | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 54 | using brillo::MessageLoop; | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 55 | using std::make_pair; | 
| Andrew de los Reyes | 819fef2 | 2010-12-17 11:33:58 -0800 | [diff] [blame] | 56 | using std::pair; | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 57 | using std::string; | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 58 | using std::unique_ptr; | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 59 | using std::vector; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 60 | using testing::DoAll; | 
 | 61 | using testing::Return; | 
 | 62 | using testing::SaveArg; | 
 | 63 | using testing::_; | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 64 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 65 | namespace { | 
 | 66 |  | 
 | 67 | const int kBigLength           = 100000; | 
 | 68 | const int kMediumLength        = 1000; | 
| Gilad Arnold | 34bf1ee | 2012-02-09 16:16:02 -0800 | [diff] [blame] | 69 | const int kFlakyTruncateLength = 29000; | 
 | 70 | const int kFlakySleepEvery     = 3; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 71 | const int kFlakySleepSecs      = 10; | 
 | 72 |  | 
 | 73 | }  // namespace | 
 | 74 |  | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 75 | namespace chromeos_update_engine { | 
 | 76 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 77 | static const char *kUnusedUrl = "unused://unused"; | 
 | 78 |  | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 79 | static inline string LocalServerUrlForPath(in_port_t port, | 
 | 80 |                                            const string& path) { | 
| Alex Vakulenko | 75039d7 | 2014-03-25 12:36:28 -0700 | [diff] [blame] | 81 |   string port_str = (port ? base::StringPrintf(":%hu", port) : ""); | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 82 |   return base::StringPrintf("http://127.0.0.1%s%s", port_str.c_str(), | 
 | 83 |                             path.c_str()); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 84 | } | 
 | 85 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 86 | // | 
 | 87 | // Class hierarchy for HTTP server implementations. | 
 | 88 | // | 
 | 89 |  | 
 | 90 | class HttpServer { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 91 |  public: | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 92 |   // This makes it an abstract class (dirty but works). | 
 | 93 |   virtual ~HttpServer() = 0; | 
 | 94 |  | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 95 |   virtual in_port_t GetPort() const { | 
 | 96 |     return 0; | 
 | 97 |   } | 
 | 98 |  | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 99 |   bool started_; | 
 | 100 | }; | 
 | 101 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 102 | HttpServer::~HttpServer() {} | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 103 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 104 |  | 
 | 105 | class NullHttpServer : public HttpServer { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 106 |  public: | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 107 |   NullHttpServer() { | 
 | 108 |     started_ = true; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 109 |   } | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 110 | }; | 
 | 111 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 112 |  | 
 | 113 | class PythonHttpServer : public HttpServer { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 114 |  public: | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 115 |   PythonHttpServer() : port_(0) { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 116 |     started_ = false; | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 117 |  | 
 | 118 |     // Spawn the server process. | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 119 |     unique_ptr<brillo::Process> http_server(new brillo::ProcessImpl()); | 
| Sen Jiang | 260f03b | 2016-03-21 15:34:58 -0700 | [diff] [blame] | 120 |     http_server->AddArg(test_utils::GetBuildArtifactsPath("test_http_server")); | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 121 |     http_server->RedirectUsingPipe(STDOUT_FILENO, false); | 
 | 122 |  | 
 | 123 |     if (!http_server->Start()) { | 
 | 124 |       ADD_FAILURE() << "failed to spawn http server process"; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 125 |       return; | 
 | 126 |     } | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 127 |     LOG(INFO) << "started http server with pid " << http_server->pid(); | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 128 |  | 
 | 129 |     // Wait for server to begin accepting connections, obtain its port. | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 130 |     brillo::StreamPtr stdout = brillo::FileStream::FromFileDescriptor( | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 131 |         http_server->GetPipe(STDOUT_FILENO), false /* own */, nullptr); | 
 | 132 |     if (!stdout) | 
 | 133 |       return; | 
 | 134 |  | 
 | 135 |     vector<char> buf(128); | 
 | 136 |     string line; | 
 | 137 |     while (line.find('\n') == string::npos) { | 
 | 138 |       size_t read; | 
 | 139 |       if (!stdout->ReadBlocking(buf.data(), buf.size(), &read, nullptr)) { | 
 | 140 |         ADD_FAILURE() << "error reading http server stdout"; | 
 | 141 |         return; | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 142 |       } | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 143 |       line.append(buf.data(), read); | 
 | 144 |       if (read == 0) | 
 | 145 |         break; | 
 | 146 |     } | 
 | 147 |     // Parse the port from the output line. | 
 | 148 |     const size_t listening_msg_prefix_len = strlen(kServerListeningMsgPrefix); | 
 | 149 |     if (line.size() < listening_msg_prefix_len) { | 
 | 150 |       ADD_FAILURE() << "server output too short"; | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 151 |       return; | 
 | 152 |     } | 
 | 153 |  | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 154 |     EXPECT_EQ(kServerListeningMsgPrefix, | 
 | 155 |               line.substr(0, listening_msg_prefix_len)); | 
 | 156 |     string port_str = line.substr(listening_msg_prefix_len); | 
 | 157 |     port_str.resize(port_str.find('\n')); | 
 | 158 |     EXPECT_TRUE(base::StringToUint(port_str, &port_)); | 
 | 159 |  | 
| Andrew de los Reyes | 3270f74 | 2010-07-15 22:28:14 -0700 | [diff] [blame] | 160 |     started_ = true; | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 161 |     LOG(INFO) << "server running, listening on port " << port_; | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 162 |  | 
 | 163 |     // Any failure before this point will SIGKILL the test server if started | 
 | 164 |     // when the |http_server| goes out of scope. | 
 | 165 |     http_server_ = std::move(http_server); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 166 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 167 |  | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 168 |   ~PythonHttpServer() { | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 169 |     // If there's no process, do nothing. | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 170 |     if (!http_server_) | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 171 |       return; | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 172 |     // Wait up to 10 seconds for the process to finish. Destroying the process | 
 | 173 |     // will kill it with a SIGKILL otherwise. | 
 | 174 |     http_server_->Kill(SIGTERM, 10); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 175 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 176 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 177 |   in_port_t GetPort() const override { | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 178 |     return port_; | 
 | 179 |   } | 
 | 180 |  | 
 | 181 |  private: | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 182 |   static const char* kServerListeningMsgPrefix; | 
 | 183 |  | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 184 |   unique_ptr<brillo::Process> http_server_; | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 185 |   unsigned int port_; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 186 | }; | 
 | 187 |  | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 188 | const char* PythonHttpServer::kServerListeningMsgPrefix = "listening on port "; | 
 | 189 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 190 | // | 
 | 191 | // Class hierarchy for HTTP fetcher test wrappers. | 
 | 192 | // | 
 | 193 |  | 
 | 194 | class AnyHttpFetcherTest { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 195 |  public: | 
| Chris Sosa | 77f79e8 | 2014-06-02 18:16:24 -0700 | [diff] [blame] | 196 |   AnyHttpFetcherTest() {} | 
| Alex Deymo | c4acdf4 | 2014-05-28 21:07:10 -0700 | [diff] [blame] | 197 |   virtual ~AnyHttpFetcherTest() {} | 
| Jay Srinivasan | 4348879 | 2012-06-19 00:25:31 -0700 | [diff] [blame] | 198 |  | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 199 |   virtual HttpFetcher* NewLargeFetcher(ProxyResolver* proxy_resolver) = 0; | 
 | 200 |   HttpFetcher* NewLargeFetcher(size_t num_proxies) { | 
 | 201 |     proxy_resolver_.set_num_proxies(num_proxies); | 
 | 202 |     return NewLargeFetcher(&proxy_resolver_); | 
 | 203 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 204 |   HttpFetcher* NewLargeFetcher() { | 
 | 205 |     return NewLargeFetcher(1); | 
 | 206 |   } | 
 | 207 |  | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 208 |   virtual HttpFetcher* NewSmallFetcher(ProxyResolver* proxy_resolver) = 0; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 209 |   HttpFetcher* NewSmallFetcher() { | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 210 |     proxy_resolver_.set_num_proxies(1); | 
 | 211 |     return NewSmallFetcher(&proxy_resolver_); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 212 |   } | 
 | 213 |  | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 214 |   virtual string BigUrl(in_port_t port) const { return kUnusedUrl; } | 
 | 215 |   virtual string SmallUrl(in_port_t port) const { return kUnusedUrl; } | 
 | 216 |   virtual string ErrorUrl(in_port_t port) const { return kUnusedUrl; } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 217 |  | 
 | 218 |   virtual bool IsMock() const = 0; | 
 | 219 |   virtual bool IsMulti() const = 0; | 
 | 220 |  | 
 | 221 |   virtual void IgnoreServerAborting(HttpServer* server) const {} | 
 | 222 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 223 |   virtual HttpServer* CreateServer() = 0; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 224 |  | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 225 |   FakeHardware* fake_hardware() { | 
| Alex Deymo | 706a5ab | 2015-11-23 17:48:30 -0300 | [diff] [blame] | 226 |     return &fake_hardware_; | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 227 |   } | 
 | 228 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 229 |  protected: | 
 | 230 |   DirectProxyResolver proxy_resolver_; | 
| Alex Deymo | 706a5ab | 2015-11-23 17:48:30 -0300 | [diff] [blame] | 231 |   FakeHardware fake_hardware_; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 232 | }; | 
 | 233 |  | 
 | 234 | class MockHttpFetcherTest : public AnyHttpFetcherTest { | 
 | 235 |  public: | 
 | 236 |   // Necessary to unhide the definition in the base class. | 
 | 237 |   using AnyHttpFetcherTest::NewLargeFetcher; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 238 |   HttpFetcher* NewLargeFetcher(ProxyResolver* proxy_resolver) override { | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 239 |     brillo::Blob big_data(1000000); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 240 |     return new MockHttpFetcher( | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 241 |         big_data.data(), big_data.size(), proxy_resolver); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 242 |   } | 
 | 243 |  | 
 | 244 |   // Necessary to unhide the definition in the base class. | 
 | 245 |   using AnyHttpFetcherTest::NewSmallFetcher; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 246 |   HttpFetcher* NewSmallFetcher(ProxyResolver* proxy_resolver) override { | 
 | 247 |     return new MockHttpFetcher("x", 1, proxy_resolver); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 248 |   } | 
 | 249 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 250 |   bool IsMock() const override { return true; } | 
 | 251 |   bool IsMulti() const override { return false; } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 252 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 253 |   HttpServer* CreateServer() override { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 254 |     return new NullHttpServer; | 
 | 255 |   } | 
 | 256 | }; | 
 | 257 |  | 
 | 258 | class LibcurlHttpFetcherTest : public AnyHttpFetcherTest { | 
 | 259 |  public: | 
 | 260 |   // Necessary to unhide the definition in the base class. | 
 | 261 |   using AnyHttpFetcherTest::NewLargeFetcher; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 262 |   HttpFetcher* NewLargeFetcher(ProxyResolver* proxy_resolver) override { | 
 | 263 |     LibcurlHttpFetcher* ret = | 
 | 264 |         new LibcurlHttpFetcher(proxy_resolver, &fake_hardware_); | 
| Darin Petkov | b83371f | 2010-08-17 09:34:49 -0700 | [diff] [blame] | 265 |     // Speed up test execution. | 
 | 266 |     ret->set_idle_seconds(1); | 
 | 267 |     ret->set_retry_seconds(1); | 
| Alex Deymo | 706a5ab | 2015-11-23 17:48:30 -0300 | [diff] [blame] | 268 |     fake_hardware_.SetIsOfficialBuild(false); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 269 |     return ret; | 
 | 270 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 271 |  | 
 | 272 |   // Necessary to unhide the definition in the base class. | 
 | 273 |   using AnyHttpFetcherTest::NewSmallFetcher; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 274 |   HttpFetcher* NewSmallFetcher(ProxyResolver* proxy_resolver) override { | 
 | 275 |     return NewLargeFetcher(proxy_resolver); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 276 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 277 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 278 |   string BigUrl(in_port_t port) const override { | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 279 |     return LocalServerUrlForPath(port, | 
 | 280 |                                  base::StringPrintf("/download/%d", | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 281 |                                                     kBigLength)); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 282 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 283 |   string SmallUrl(in_port_t port) const override { | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 284 |     return LocalServerUrlForPath(port, "/foo"); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 285 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 286 |   string ErrorUrl(in_port_t port) const override { | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 287 |     return LocalServerUrlForPath(port, "/error"); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 288 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 289 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 290 |   bool IsMock() const override { return false; } | 
 | 291 |   bool IsMulti() const override { return false; } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 292 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 293 |   void IgnoreServerAborting(HttpServer* server) const override { | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 294 |     // Nothing to do. | 
| Andrew de los Reyes | 08c4e27 | 2010-04-15 14:02:17 -0700 | [diff] [blame] | 295 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 296 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 297 |   HttpServer* CreateServer() override { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 298 |     return new PythonHttpServer; | 
 | 299 |   } | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 300 | }; | 
 | 301 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 302 | class MultiRangeHttpFetcherTest : public LibcurlHttpFetcherTest { | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 303 |  public: | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 304 |   // Necessary to unhide the definition in the base class. | 
 | 305 |   using AnyHttpFetcherTest::NewLargeFetcher; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 306 |   HttpFetcher* NewLargeFetcher(ProxyResolver* proxy_resolver) override { | 
 | 307 |     MultiRangeHttpFetcher* ret = new MultiRangeHttpFetcher( | 
 | 308 |         new LibcurlHttpFetcher(proxy_resolver, &fake_hardware_)); | 
| Andrew de los Reyes | 819fef2 | 2010-12-17 11:33:58 -0800 | [diff] [blame] | 309 |     ret->ClearRanges(); | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 310 |     ret->AddRange(0); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 311 |     // Speed up test execution. | 
 | 312 |     ret->set_idle_seconds(1); | 
 | 313 |     ret->set_retry_seconds(1); | 
| Alex Deymo | 706a5ab | 2015-11-23 17:48:30 -0300 | [diff] [blame] | 314 |     fake_hardware_.SetIsOfficialBuild(false); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 315 |     return ret; | 
 | 316 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 317 |  | 
 | 318 |   // Necessary to unhide the definition in the base class. | 
 | 319 |   using AnyHttpFetcherTest::NewSmallFetcher; | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 320 |   HttpFetcher* NewSmallFetcher(ProxyResolver* proxy_resolver) override { | 
 | 321 |     return NewLargeFetcher(proxy_resolver); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 322 |   } | 
 | 323 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 324 |   bool IsMulti() const override { return true; } | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 325 | }; | 
 | 326 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 327 |  | 
 | 328 | // | 
 | 329 | // Infrastructure for type tests of HTTP fetcher. | 
 | 330 | // See: http://code.google.com/p/googletest/wiki/AdvancedGuide#Typed_Tests | 
 | 331 | // | 
 | 332 |  | 
 | 333 | // Fixture class template. We use an explicit constraint to guarantee that it | 
 | 334 | // can only be instantiated with an AnyHttpFetcherTest type, see: | 
 | 335 | // http://www2.research.att.com/~bs/bs_faq2.html#constraints | 
 | 336 | template <typename T> | 
 | 337 | class HttpFetcherTest : public ::testing::Test { | 
 | 338 |  public: | 
| Alex Deymo | 535f3b7 | 2015-08-07 10:51:32 -0700 | [diff] [blame] | 339 |   base::MessageLoopForIO base_loop_; | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 340 |   brillo::BaseMessageLoop loop_{&base_loop_}; | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 341 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 342 |   T test_; | 
 | 343 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 344 |  protected: | 
 | 345 |   HttpFetcherTest() { | 
 | 346 |     loop_.SetAsCurrent(); | 
 | 347 |   } | 
 | 348 |  | 
 | 349 |   void TearDown() override { | 
| Alex Vakulenko | 3f39d5c | 2015-10-13 09:27:13 -0700 | [diff] [blame] | 350 |     EXPECT_EQ(0, brillo::MessageLoopRunMaxIterations(&loop_, 1)); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 351 |   } | 
 | 352 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 353 |  private: | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 354 |   static void TypeConstraint(T* a) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 355 |     AnyHttpFetcherTest *b = a; | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 356 |     if (b == 0)  // Silence compiler warning of unused variable. | 
| Yunlian Jiang | 2dac576 | 2013-04-12 09:53:09 -0700 | [diff] [blame] | 357 |       *b = a; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 358 |   } | 
 | 359 | }; | 
 | 360 |  | 
 | 361 | // Test case types list. | 
 | 362 | typedef ::testing::Types<LibcurlHttpFetcherTest, | 
 | 363 |                          MockHttpFetcherTest, | 
 | 364 |                          MultiRangeHttpFetcherTest> HttpFetcherTestTypes; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 365 | TYPED_TEST_CASE(HttpFetcherTest, HttpFetcherTestTypes); | 
 | 366 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 367 |  | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 368 | namespace { | 
 | 369 | class HttpFetcherTestDelegate : public HttpFetcherDelegate { | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 370 |  public: | 
| Alex Deymo | fdd6dec | 2016-03-03 22:35:43 -0800 | [diff] [blame] | 371 |   HttpFetcherTestDelegate() = default; | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 372 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 373 |   void ReceivedBytes(HttpFetcher* /* fetcher */, | 
| Alex Deymo | fdd6dec | 2016-03-03 22:35:43 -0800 | [diff] [blame] | 374 |                      const void* bytes, | 
 | 375 |                      size_t length) override { | 
 | 376 |     data.append(reinterpret_cast<const char*>(bytes), length); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 377 |     // Update counters | 
 | 378 |     times_received_bytes_called_++; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 379 |   } | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 380 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 381 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 382 |     if (is_expect_error_) | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 383 |       EXPECT_EQ(kHttpResponseNotFound, fetcher->http_response_code()); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 384 |     else | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 385 |       EXPECT_EQ(kHttpResponseOk, fetcher->http_response_code()); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 386 |     MessageLoop::current()->BreakLoop(); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 387 |  | 
 | 388 |     // Update counter | 
 | 389 |     times_transfer_complete_called_++; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 390 |   } | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 391 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 392 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 393 |     ADD_FAILURE(); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 394 |     times_transfer_terminated_called_++; | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 395 |   } | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 396 |  | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 397 |   // Are we expecting an error response? (default: no) | 
| Alex Deymo | fdd6dec | 2016-03-03 22:35:43 -0800 | [diff] [blame] | 398 |   bool is_expect_error_{false}; | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 399 |  | 
 | 400 |   // Counters for callback invocations. | 
| Alex Deymo | fdd6dec | 2016-03-03 22:35:43 -0800 | [diff] [blame] | 401 |   int times_transfer_complete_called_{0}; | 
 | 402 |   int times_transfer_terminated_called_{0}; | 
 | 403 |   int times_received_bytes_called_{0}; | 
 | 404 |  | 
 | 405 |   // The received data bytes. | 
 | 406 |   string data; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 407 | }; | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 408 |  | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 409 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 410 | void StartTransfer(HttpFetcher* http_fetcher, const string& url) { | 
 | 411 |   http_fetcher->BeginTransfer(url); | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 412 | } | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 413 | }  // namespace | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 414 |  | 
 | 415 | TYPED_TEST(HttpFetcherTest, SimpleTest) { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 416 |   HttpFetcherTestDelegate delegate; | 
 | 417 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
 | 418 |   fetcher->set_delegate(&delegate); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 419 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 420 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
 | 421 |   ASSERT_TRUE(server->started_); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 422 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 423 |   this->loop_.PostTask(FROM_HERE, base::Bind( | 
 | 424 |       StartTransfer, | 
 | 425 |       fetcher.get(), | 
 | 426 |       this->test_.SmallUrl(server->GetPort()))); | 
 | 427 |   this->loop_.Run(); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 428 | } | 
 | 429 |  | 
| Andrew de los Reyes | 3270f74 | 2010-07-15 22:28:14 -0700 | [diff] [blame] | 430 | TYPED_TEST(HttpFetcherTest, SimpleBigTest) { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 431 |   HttpFetcherTestDelegate delegate; | 
 | 432 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewLargeFetcher()); | 
 | 433 |   fetcher->set_delegate(&delegate); | 
| Andrew de los Reyes | 3270f74 | 2010-07-15 22:28:14 -0700 | [diff] [blame] | 434 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 435 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
 | 436 |   ASSERT_TRUE(server->started_); | 
| Andrew de los Reyes | 3270f74 | 2010-07-15 22:28:14 -0700 | [diff] [blame] | 437 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 438 |   this->loop_.PostTask(FROM_HERE, base::Bind( | 
 | 439 |       StartTransfer, | 
 | 440 |       fetcher.get(), | 
 | 441 |       this->test_.BigUrl(server->GetPort()))); | 
 | 442 |   this->loop_.Run(); | 
| Andrew de los Reyes | 3270f74 | 2010-07-15 22:28:14 -0700 | [diff] [blame] | 443 | } | 
 | 444 |  | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 445 | // Issue #9648: when server returns an error HTTP response, the fetcher needs to | 
 | 446 | // terminate transfer prematurely, rather than try to process the error payload. | 
 | 447 | TYPED_TEST(HttpFetcherTest, ErrorTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 448 |   if (this->test_.IsMock() || this->test_.IsMulti()) | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 449 |     return; | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 450 |   HttpFetcherTestDelegate delegate; | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 451 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 452 |   // Delegate should expect an error response. | 
 | 453 |   delegate.is_expect_error_ = true; | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 454 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 455 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
 | 456 |   fetcher->set_delegate(&delegate); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 457 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 458 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
 | 459 |   ASSERT_TRUE(server->started_); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 460 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 461 |   this->loop_.PostTask(FROM_HERE, base::Bind( | 
 | 462 |       StartTransfer, | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 463 |       fetcher.get(), | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 464 |       this->test_.ErrorUrl(server->GetPort()))); | 
 | 465 |   this->loop_.Run(); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 466 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 467 |   // Make sure that no bytes were received. | 
 | 468 |   CHECK_EQ(delegate.times_received_bytes_called_, 0); | 
 | 469 |   CHECK_EQ(fetcher->GetBytesDownloaded(), static_cast<size_t>(0)); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 470 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 471 |   // Make sure that transfer completion was signaled once, and no termination | 
 | 472 |   // was signaled. | 
 | 473 |   CHECK_EQ(delegate.times_transfer_complete_called_, 1); | 
 | 474 |   CHECK_EQ(delegate.times_transfer_terminated_called_, 0); | 
| Gilad Arnold | 48085ba | 2011-11-16 09:36:08 -0800 | [diff] [blame] | 475 | } | 
 | 476 |  | 
| Alex Deymo | fdd6dec | 2016-03-03 22:35:43 -0800 | [diff] [blame] | 477 | TYPED_TEST(HttpFetcherTest, ExtraHeadersInRequestTest) { | 
 | 478 |   if (this->test_.IsMock()) | 
 | 479 |     return; | 
 | 480 |  | 
 | 481 |   HttpFetcherTestDelegate delegate; | 
 | 482 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
 | 483 |   fetcher->set_delegate(&delegate); | 
 | 484 |   fetcher->SetHeader("User-Agent", "MyTest"); | 
 | 485 |   fetcher->SetHeader("user-agent", "Override that header"); | 
 | 486 |   fetcher->SetHeader("Authorization", "Basic user:passwd"); | 
 | 487 |  | 
 | 488 |   // Invalid headers. | 
 | 489 |   fetcher->SetHeader("X-Foo", "Invalid\nHeader\nIgnored"); | 
 | 490 |   fetcher->SetHeader("X-Bar: ", "I do not know how to parse"); | 
 | 491 |  | 
 | 492 |   // Hide Accept header normally added by default. | 
 | 493 |   fetcher->SetHeader("Accept", ""); | 
 | 494 |  | 
 | 495 |   PythonHttpServer server; | 
 | 496 |   int port = server.GetPort(); | 
 | 497 |   ASSERT_TRUE(server.started_); | 
 | 498 |  | 
 | 499 |   StartTransfer(fetcher.get(), LocalServerUrlForPath(port, "/echo-headers")); | 
 | 500 |   this->loop_.Run(); | 
 | 501 |  | 
 | 502 |   EXPECT_NE(string::npos, | 
 | 503 |             delegate.data.find("user-agent: Override that header\r\n")); | 
 | 504 |   EXPECT_NE(string::npos, | 
 | 505 |             delegate.data.find("Authorization: Basic user:passwd\r\n")); | 
 | 506 |  | 
 | 507 |   EXPECT_EQ(string::npos, delegate.data.find("\nAccept:")); | 
 | 508 |   EXPECT_EQ(string::npos, delegate.data.find("X-Foo: Invalid")); | 
 | 509 |   EXPECT_EQ(string::npos, delegate.data.find("X-Bar: I do not")); | 
 | 510 | } | 
 | 511 |  | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 512 | namespace { | 
 | 513 | class PausingHttpFetcherTestDelegate : public HttpFetcherDelegate { | 
 | 514 |  public: | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 515 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 516 |                      const void* /* bytes */, size_t /* length */) override { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 517 |     CHECK(!paused_); | 
 | 518 |     paused_ = true; | 
 | 519 |     fetcher->Pause(); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 520 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 521 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 522 |     MessageLoop::current()->BreakLoop(); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 523 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 524 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 525 |     ADD_FAILURE(); | 
 | 526 |   } | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 527 |   void Unpause() { | 
 | 528 |     CHECK(paused_); | 
 | 529 |     paused_ = false; | 
 | 530 |     fetcher_->Unpause(); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 531 |   } | 
 | 532 |   bool paused_; | 
 | 533 |   HttpFetcher* fetcher_; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 534 | }; | 
 | 535 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 536 | void UnpausingTimeoutCallback(PausingHttpFetcherTestDelegate* delegate, | 
 | 537 |                               MessageLoop::TaskId* my_id) { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 538 |   if (delegate->paused_) | 
 | 539 |     delegate->Unpause(); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 540 |   // Update the task id with the new scheduled callback. | 
 | 541 |   *my_id = MessageLoop::current()->PostDelayedTask( | 
 | 542 |       FROM_HERE, | 
 | 543 |       base::Bind(&UnpausingTimeoutCallback, delegate, my_id), | 
 | 544 |       base::TimeDelta::FromMilliseconds(200)); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 545 | } | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 546 | }  // namespace | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 547 |  | 
 | 548 | TYPED_TEST(HttpFetcherTest, PauseTest) { | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 549 |   PausingHttpFetcherTestDelegate delegate; | 
 | 550 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewLargeFetcher()); | 
 | 551 |   delegate.paused_ = false; | 
 | 552 |   delegate.fetcher_ = fetcher.get(); | 
 | 553 |   fetcher->set_delegate(&delegate); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 554 |  | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 555 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
 | 556 |   ASSERT_TRUE(server->started_); | 
| Andrew de los Reyes | f3ed8e7 | 2011-02-16 10:35:46 -0800 | [diff] [blame] | 557 |  | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 558 |   MessageLoop::TaskId callback_id; | 
 | 559 |   callback_id = this->loop_.PostDelayedTask( | 
 | 560 |       FROM_HERE, | 
 | 561 |       base::Bind(&UnpausingTimeoutCallback, &delegate, &callback_id), | 
 | 562 |       base::TimeDelta::FromMilliseconds(200)); | 
 | 563 |   fetcher->BeginTransfer(this->test_.BigUrl(server->GetPort())); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 564 |  | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 565 |   this->loop_.Run(); | 
 | 566 |   EXPECT_TRUE(this->loop_.CancelTask(callback_id)); | 
 | 567 | } | 
 | 568 |  | 
 | 569 | // This test will pause the fetcher while the download is not yet started | 
 | 570 | // because it is waiting for the proxy to be resolved. | 
 | 571 | TYPED_TEST(HttpFetcherTest, PauseWhileResolvingProxyTest) { | 
 | 572 |   if (this->test_.IsMock()) | 
 | 573 |     return; | 
 | 574 |   MockProxyResolver mock_resolver; | 
 | 575 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewLargeFetcher(&mock_resolver)); | 
 | 576 |  | 
 | 577 |   // Saved arguments from the proxy call. | 
| Alex Deymo | c00ec56 | 2017-02-05 04:36:02 +0000 | [diff] [blame] | 578 |   ProxiesResolvedFn proxy_callback; | 
 | 579 |   EXPECT_CALL(mock_resolver, GetProxiesForUrl("http://fake_url", _)) | 
 | 580 |       .WillOnce(DoAll(SaveArg<1>(&proxy_callback), Return(true))); | 
| Alex Deymo | f285857 | 2016-02-25 11:20:13 -0800 | [diff] [blame] | 581 |   fetcher->BeginTransfer("http://fake_url"); | 
 | 582 |   testing::Mock::VerifyAndClearExpectations(&mock_resolver); | 
 | 583 |  | 
 | 584 |   // Pausing and unpausing while resolving the proxy should not affect anything. | 
 | 585 |   fetcher->Pause(); | 
 | 586 |   fetcher->Unpause(); | 
 | 587 |   fetcher->Pause(); | 
 | 588 |   // Proxy resolver comes back after we paused the fetcher. | 
| Alex Deymo | c00ec56 | 2017-02-05 04:36:02 +0000 | [diff] [blame] | 589 |   ASSERT_FALSE(proxy_callback.is_null()); | 
 | 590 |   proxy_callback.Run({1, kNoProxy}); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 591 | } | 
 | 592 |  | 
 | 593 | namespace { | 
 | 594 | class AbortingHttpFetcherTestDelegate : public HttpFetcherDelegate { | 
 | 595 |  public: | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 596 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 597 |                      const void* bytes, size_t length) override {} | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 598 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 599 |     ADD_FAILURE();  // We should never get here | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 600 |     MessageLoop::current()->BreakLoop(); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 601 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 602 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 603 |     EXPECT_EQ(fetcher, fetcher_.get()); | 
 | 604 |     EXPECT_FALSE(once_); | 
 | 605 |     EXPECT_TRUE(callback_once_); | 
 | 606 |     callback_once_ = false; | 
| Alex Deymo | c4acdf4 | 2014-05-28 21:07:10 -0700 | [diff] [blame] | 607 |     // The fetcher could have a callback scheduled on the ProxyResolver that | 
 | 608 |     // can fire after this callback. We wait until the end of the test to | 
 | 609 |     // delete the fetcher. | 
| Andrew de los Reyes | 819fef2 | 2010-12-17 11:33:58 -0800 | [diff] [blame] | 610 |   } | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 611 |   void TerminateTransfer() { | 
 | 612 |     CHECK(once_); | 
 | 613 |     once_ = false; | 
 | 614 |     fetcher_->TerminateTransfer(); | 
 | 615 |   } | 
 | 616 |   void EndLoop() { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 617 |     MessageLoop::current()->BreakLoop(); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 618 |   } | 
 | 619 |   bool once_; | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 620 |   bool callback_once_; | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 621 |   unique_ptr<HttpFetcher> fetcher_; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 622 | }; | 
 | 623 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 624 | void AbortingTimeoutCallback(AbortingHttpFetcherTestDelegate* delegate, | 
 | 625 |                              MessageLoop::TaskId* my_id) { | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 626 |   if (delegate->once_) { | 
 | 627 |     delegate->TerminateTransfer(); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 628 |     *my_id = MessageLoop::current()->PostTask( | 
 | 629 |         FROM_HERE, | 
 | 630 |         base::Bind(AbortingTimeoutCallback, delegate, my_id)); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 631 |   } else { | 
 | 632 |     delegate->EndLoop(); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 633 |     *my_id = MessageLoop::kTaskIdNull; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 634 |   } | 
 | 635 | } | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 636 | }  // namespace | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 637 |  | 
 | 638 | TYPED_TEST(HttpFetcherTest, AbortTest) { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 639 |   AbortingHttpFetcherTestDelegate delegate; | 
 | 640 |   delegate.fetcher_.reset(this->test_.NewLargeFetcher()); | 
 | 641 |   delegate.once_ = true; | 
 | 642 |   delegate.callback_once_ = true; | 
 | 643 |   delegate.fetcher_->set_delegate(&delegate); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 644 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 645 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
 | 646 |   this->test_.IgnoreServerAborting(server.get()); | 
 | 647 |   ASSERT_TRUE(server->started_); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 648 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 649 |   MessageLoop::TaskId task_id = MessageLoop::kTaskIdNull; | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 650 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 651 |   task_id = this->loop_.PostTask( | 
 | 652 |       FROM_HERE, | 
 | 653 |       base::Bind(AbortingTimeoutCallback, &delegate, &task_id)); | 
 | 654 |   delegate.fetcher_->BeginTransfer(this->test_.BigUrl(server->GetPort())); | 
 | 655 |  | 
 | 656 |   this->loop_.Run(); | 
 | 657 |   CHECK(!delegate.once_); | 
 | 658 |   CHECK(!delegate.callback_once_); | 
 | 659 |   this->loop_.CancelTask(task_id); | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 660 | } | 
 | 661 |  | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 662 | namespace { | 
 | 663 | class FlakyHttpFetcherTestDelegate : public HttpFetcherDelegate { | 
 | 664 |  public: | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 665 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 666 |                      const void* bytes, size_t length) override { | 
 | 667 |     data.append(reinterpret_cast<const char*>(bytes), length); | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 668 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 669 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Andrew de los Reyes | fb4ad7d | 2010-07-19 10:43:46 -0700 | [diff] [blame] | 670 |     EXPECT_TRUE(successful); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 671 |     EXPECT_EQ(kHttpResponsePartialContent, fetcher->http_response_code()); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 672 |     MessageLoop::current()->BreakLoop(); | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 673 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 674 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 675 |     ADD_FAILURE(); | 
 | 676 |   } | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 677 |   string data; | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 678 | }; | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 679 | }  // namespace | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 680 |  | 
 | 681 | TYPED_TEST(HttpFetcherTest, FlakyTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 682 |   if (this->test_.IsMock()) | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 683 |     return; | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 684 |   { | 
 | 685 |     FlakyHttpFetcherTestDelegate delegate; | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 686 |     unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 687 |     fetcher->set_delegate(&delegate); | 
 | 688 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 689 |     unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 690 |     ASSERT_TRUE(server->started_); | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 691 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 692 |     this->loop_.PostTask(FROM_HERE, base::Bind( | 
 | 693 |         &StartTransfer, | 
 | 694 |         fetcher.get(), | 
 | 695 |         LocalServerUrlForPath(server->GetPort(), | 
 | 696 |                               base::StringPrintf("/flaky/%d/%d/%d/%d", | 
 | 697 |                                                  kBigLength, | 
 | 698 |                                                  kFlakyTruncateLength, | 
 | 699 |                                                  kFlakySleepEvery, | 
 | 700 |                                                  kFlakySleepSecs)))); | 
 | 701 |     this->loop_.Run(); | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 702 |  | 
 | 703 |     // verify the data we get back | 
| Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 704 |     ASSERT_EQ(kBigLength, static_cast<int>(delegate.data.size())); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 705 |     for (int i = 0; i < kBigLength; i += 10) { | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 706 |       // Assert so that we don't flood the screen w/ EXPECT errors on failure. | 
 | 707 |       ASSERT_EQ(delegate.data.substr(i, 10), "abcdefghij"); | 
 | 708 |     } | 
 | 709 |   } | 
| adlr@google.com | c98a7ed | 2009-12-04 18:54:03 +0000 | [diff] [blame] | 710 | } | 
 | 711 |  | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 712 | namespace { | 
| Chris Sosa | 0a364bb | 2014-06-10 18:18:24 -0700 | [diff] [blame] | 713 | // This delegate kills the server attached to it after receiving any bytes. | 
 | 714 | // This can be used for testing what happens when you try to fetch data and | 
 | 715 | // the server dies. | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 716 | class FailureHttpFetcherTestDelegate : public HttpFetcherDelegate { | 
 | 717 |  public: | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 718 |   explicit FailureHttpFetcherTestDelegate(PythonHttpServer* server) | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 719 |       : server_(server) {} | 
| Jay Srinivasan | 135a58b | 2012-07-13 12:46:49 -0700 | [diff] [blame] | 720 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 721 |   ~FailureHttpFetcherTestDelegate() override { | 
| Jay Srinivasan | 135a58b | 2012-07-13 12:46:49 -0700 | [diff] [blame] | 722 |     if (server_) { | 
 | 723 |       LOG(INFO) << "Stopping server in destructor"; | 
 | 724 |       delete server_; | 
 | 725 |       LOG(INFO) << "server stopped"; | 
 | 726 |     } | 
 | 727 |   } | 
 | 728 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 729 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 730 |                      const void* bytes, size_t length) override { | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 731 |     if (server_) { | 
| Jay Srinivasan | 135a58b | 2012-07-13 12:46:49 -0700 | [diff] [blame] | 732 |       LOG(INFO) << "Stopping server in ReceivedBytes"; | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 733 |       delete server_; | 
 | 734 |       LOG(INFO) << "server stopped"; | 
| Alex Vakulenko | 88b591f | 2014-08-28 16:48:57 -0700 | [diff] [blame] | 735 |       server_ = nullptr; | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 736 |     } | 
 | 737 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 738 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 739 |     EXPECT_FALSE(successful); | 
| Chris Sosa | 0a364bb | 2014-06-10 18:18:24 -0700 | [diff] [blame] | 740 |     EXPECT_EQ(0, fetcher->http_response_code()); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 741 |     MessageLoop::current()->BreakLoop(); | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 742 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 743 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 744 |     ADD_FAILURE(); | 
 | 745 |   } | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 746 |   PythonHttpServer* server_; | 
 | 747 | }; | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 748 | }  // namespace | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 749 |  | 
 | 750 |  | 
 | 751 | TYPED_TEST(HttpFetcherTest, FailureTest) { | 
| Chris Sosa | 0a364bb | 2014-06-10 18:18:24 -0700 | [diff] [blame] | 752 |   // This test ensures that a fetcher responds correctly when a server isn't | 
 | 753 |   // available at all. | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 754 |   if (this->test_.IsMock()) | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 755 |     return; | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 756 |   { | 
| Alex Vakulenko | 88b591f | 2014-08-28 16:48:57 -0700 | [diff] [blame] | 757 |     FailureHttpFetcherTestDelegate delegate(nullptr); | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 758 |     unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 759 |     fetcher->set_delegate(&delegate); | 
 | 760 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 761 |     this->loop_.PostTask(FROM_HERE, | 
 | 762 |                          base::Bind(StartTransfer, | 
 | 763 |                                     fetcher.get(), | 
 | 764 |                                     "http://host_doesnt_exist99999999")); | 
 | 765 |     this->loop_.Run(); | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 766 |  | 
 | 767 |     // Exiting and testing happens in the delegate | 
 | 768 |   } | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 769 | } | 
 | 770 |  | 
| Alex Deymo | f123ae2 | 2015-09-24 14:59:43 -0700 | [diff] [blame] | 771 | TYPED_TEST(HttpFetcherTest, NoResponseTest) { | 
 | 772 |   // This test starts a new http server but the server doesn't respond and just | 
 | 773 |   // closes the connection. | 
 | 774 |   if (this->test_.IsMock()) | 
 | 775 |     return; | 
 | 776 |  | 
 | 777 |   PythonHttpServer* server = new PythonHttpServer(); | 
 | 778 |   int port = server->GetPort(); | 
 | 779 |   ASSERT_TRUE(server->started_); | 
 | 780 |  | 
 | 781 |   // Handles destruction and claims ownership. | 
 | 782 |   FailureHttpFetcherTestDelegate delegate(server); | 
 | 783 |   unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
 | 784 |   fetcher->set_delegate(&delegate); | 
 | 785 |   // The server will not reply at all, so we can limit the execution time of the | 
 | 786 |   // test by reducing the low-speed timeout to something small. The test will | 
 | 787 |   // finish once the TimeoutCallback() triggers (every second) and the timeout | 
 | 788 |   // expired. | 
 | 789 |   fetcher->set_low_speed_limit(kDownloadLowSpeedLimitBps, 1); | 
 | 790 |  | 
 | 791 |   this->loop_.PostTask(FROM_HERE, base::Bind( | 
 | 792 |       StartTransfer, | 
 | 793 |       fetcher.get(), | 
 | 794 |       LocalServerUrlForPath(port, "/hang"))); | 
 | 795 |   this->loop_.Run(); | 
 | 796 |  | 
 | 797 |   // Check that no other callback runs in the next two seconds. That would | 
 | 798 |   // indicate a leaked callback. | 
 | 799 |   bool timeout = false; | 
 | 800 |   auto callback = base::Bind([&timeout]{ timeout = true;}); | 
 | 801 |   this->loop_.PostDelayedTask(FROM_HERE, callback, | 
 | 802 |                               base::TimeDelta::FromSeconds(2)); | 
 | 803 |   EXPECT_TRUE(this->loop_.RunOnce(true)); | 
 | 804 |   EXPECT_TRUE(timeout); | 
 | 805 | } | 
 | 806 |  | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 807 | TYPED_TEST(HttpFetcherTest, ServerDiesTest) { | 
| Chris Sosa | 0a364bb | 2014-06-10 18:18:24 -0700 | [diff] [blame] | 808 |   // This test starts a new http server and kills it after receiving its first | 
 | 809 |   // set of bytes. It test whether or not our fetcher eventually gives up on | 
 | 810 |   // retries and aborts correctly. | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 811 |   if (this->test_.IsMock()) | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 812 |     return; | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 813 |   { | 
| Chris Sosa | 0a364bb | 2014-06-10 18:18:24 -0700 | [diff] [blame] | 814 |     PythonHttpServer* server = new PythonHttpServer(); | 
 | 815 |     int port = server->GetPort(); | 
 | 816 |     ASSERT_TRUE(server->started_); | 
 | 817 |  | 
 | 818 |     // Handles destruction and claims ownership. | 
 | 819 |     FailureHttpFetcherTestDelegate delegate(server); | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 820 |     unique_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher()); | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 821 |     fetcher->set_delegate(&delegate); | 
 | 822 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 823 |     this->loop_.PostTask(FROM_HERE, base::Bind( | 
 | 824 |         StartTransfer, | 
 | 825 |         fetcher.get(), | 
 | 826 |         LocalServerUrlForPath(port, | 
 | 827 |                               base::StringPrintf("/flaky/%d/%d/%d/%d", | 
 | 828 |                                                  kBigLength, | 
 | 829 |                                                  kFlakyTruncateLength, | 
 | 830 |                                                  kFlakySleepEvery, | 
 | 831 |                                                  kFlakySleepSecs)))); | 
 | 832 |     this->loop_.Run(); | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 833 |  | 
 | 834 |     // Exiting and testing happens in the delegate | 
 | 835 |   } | 
| Andrew de los Reyes | 9bbd187 | 2010-07-16 14:52:29 -0700 | [diff] [blame] | 836 | } | 
 | 837 |  | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 838 | namespace { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 839 | const HttpResponseCode kRedirectCodes[] = { | 
 | 840 |   kHttpResponseMovedPermanently, kHttpResponseFound, kHttpResponseSeeOther, | 
 | 841 |   kHttpResponseTempRedirect | 
 | 842 | }; | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 843 |  | 
 | 844 | class RedirectHttpFetcherTestDelegate : public HttpFetcherDelegate { | 
 | 845 |  public: | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 846 |   explicit RedirectHttpFetcherTestDelegate(bool expected_successful) | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 847 |       : expected_successful_(expected_successful) {} | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 848 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 849 |                      const void* bytes, size_t length) override { | 
 | 850 |     data.append(reinterpret_cast<const char*>(bytes), length); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 851 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 852 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 853 |     EXPECT_EQ(expected_successful_, successful); | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 854 |     if (expected_successful_) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 855 |       EXPECT_EQ(kHttpResponseOk, fetcher->http_response_code()); | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 856 |     } else { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 857 |       EXPECT_GE(fetcher->http_response_code(), kHttpResponseMovedPermanently); | 
 | 858 |       EXPECT_LE(fetcher->http_response_code(), kHttpResponseTempRedirect); | 
| Darin Petkov | cb46621 | 2010-08-26 09:40:11 -0700 | [diff] [blame] | 859 |     } | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 860 |     MessageLoop::current()->BreakLoop(); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 861 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 862 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 863 |     ADD_FAILURE(); | 
 | 864 |   } | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 865 |   bool expected_successful_; | 
 | 866 |   string data; | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 867 | }; | 
 | 868 |  | 
 | 869 | // RedirectTest takes ownership of |http_fetcher|. | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 870 | void RedirectTest(const HttpServer* server, | 
 | 871 |                   bool expected_successful, | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 872 |                   const string& url, | 
 | 873 |                   HttpFetcher* http_fetcher) { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 874 |   RedirectHttpFetcherTestDelegate delegate(expected_successful); | 
 | 875 |   unique_ptr<HttpFetcher> fetcher(http_fetcher); | 
 | 876 |   fetcher->set_delegate(&delegate); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 877 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 878 |   MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 
 | 879 |       StartTransfer, | 
 | 880 |       fetcher.get(), | 
 | 881 |       LocalServerUrlForPath(server->GetPort(), url))); | 
 | 882 |   MessageLoop::current()->Run(); | 
 | 883 |   if (expected_successful) { | 
 | 884 |     // verify the data we get back | 
| Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 885 |     ASSERT_EQ(static_cast<size_t>(kMediumLength), delegate.data.size()); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 886 |     for (int i = 0; i < kMediumLength; i += 10) { | 
 | 887 |       // Assert so that we don't flood the screen w/ EXPECT errors on failure. | 
 | 888 |       ASSERT_EQ(delegate.data.substr(i, 10), "abcdefghij"); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 889 |     } | 
 | 890 |   } | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 891 | } | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 892 | }  // namespace | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 893 |  | 
 | 894 | TYPED_TEST(HttpFetcherTest, SimpleRedirectTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 895 |   if (this->test_.IsMock()) | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 896 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 897 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 898 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 899 |   ASSERT_TRUE(server->started_); | 
 | 900 |  | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 901 |   for (size_t c = 0; c < arraysize(kRedirectCodes); ++c) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 902 |     const string url = base::StringPrintf("/redirect/%d/download/%d", | 
 | 903 |                                           kRedirectCodes[c], | 
 | 904 |                                           kMediumLength); | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 905 |     RedirectTest(server.get(), true, url, this->test_.NewLargeFetcher()); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 906 |   } | 
 | 907 | } | 
 | 908 |  | 
 | 909 | TYPED_TEST(HttpFetcherTest, MaxRedirectTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 910 |   if (this->test_.IsMock()) | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 911 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 912 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 913 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 914 |   ASSERT_TRUE(server->started_); | 
 | 915 |  | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 916 |   string url; | 
| David Zeuthen | 34135a9 | 2013-08-06 11:16:16 -0700 | [diff] [blame] | 917 |   for (int r = 0; r < kDownloadMaxRedirects; r++) { | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 918 |     url += base::StringPrintf("/redirect/%d", | 
 | 919 |                               kRedirectCodes[r % arraysize(kRedirectCodes)]); | 
 | 920 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 921 |   url += base::StringPrintf("/download/%d", kMediumLength); | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 922 |   RedirectTest(server.get(), true, url, this->test_.NewLargeFetcher()); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 923 | } | 
 | 924 |  | 
 | 925 | TYPED_TEST(HttpFetcherTest, BeyondMaxRedirectTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 926 |   if (this->test_.IsMock()) | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 927 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 928 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 929 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 930 |   ASSERT_TRUE(server->started_); | 
 | 931 |  | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 932 |   string url; | 
| David Zeuthen | 34135a9 | 2013-08-06 11:16:16 -0700 | [diff] [blame] | 933 |   for (int r = 0; r < kDownloadMaxRedirects + 1; r++) { | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 934 |     url += base::StringPrintf("/redirect/%d", | 
 | 935 |                               kRedirectCodes[r % arraysize(kRedirectCodes)]); | 
 | 936 |   } | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 937 |   url += base::StringPrintf("/download/%d", kMediumLength); | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 938 |   RedirectTest(server.get(), false, url, this->test_.NewLargeFetcher()); | 
| Darin Petkov | 41c2fcf | 2010-08-25 13:14:48 -0700 | [diff] [blame] | 939 | } | 
 | 940 |  | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 941 | namespace { | 
 | 942 | class MultiHttpFetcherTestDelegate : public HttpFetcherDelegate { | 
 | 943 |  public: | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 944 |   explicit MultiHttpFetcherTestDelegate(int expected_response_code) | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 945 |       : expected_response_code_(expected_response_code) {} | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 946 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 947 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 948 |                      const void* bytes, size_t length) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 949 |     EXPECT_EQ(fetcher, fetcher_.get()); | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 950 |     data.append(reinterpret_cast<const char*>(bytes), length); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 951 |   } | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 952 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 953 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 954 |     EXPECT_EQ(fetcher, fetcher_.get()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 955 |     EXPECT_EQ(expected_response_code_ != kHttpResponseUndefined, successful); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 956 |     if (expected_response_code_ != 0) | 
 | 957 |       EXPECT_EQ(expected_response_code_, fetcher->http_response_code()); | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 958 |     // Destroy the fetcher (because we're allowed to). | 
| Alex Vakulenko | 88b591f | 2014-08-28 16:48:57 -0700 | [diff] [blame] | 959 |     fetcher_.reset(nullptr); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 960 |     MessageLoop::current()->BreakLoop(); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 961 |   } | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 962 |  | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 963 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 964 |     ADD_FAILURE(); | 
 | 965 |   } | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 966 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 967 |   unique_ptr<HttpFetcher> fetcher_; | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 968 |   int expected_response_code_; | 
 | 969 |   string data; | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 970 | }; | 
 | 971 |  | 
 | 972 | void MultiTest(HttpFetcher* fetcher_in, | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 973 |                FakeHardware* fake_hardware, | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 974 |                const string& url, | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 975 |                const vector<pair<off_t, off_t>>& ranges, | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 976 |                const string& expected_prefix, | 
| Alex Deymo | 5fe0c4e | 2016-02-16 18:46:24 -0800 | [diff] [blame] | 977 |                size_t expected_size, | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 978 |                HttpResponseCode expected_response_code) { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 979 |   MultiHttpFetcherTestDelegate delegate(expected_response_code); | 
 | 980 |   delegate.fetcher_.reset(fetcher_in); | 
| Jay Srinivasan | 4348879 | 2012-06-19 00:25:31 -0700 | [diff] [blame] | 981 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 982 |   MultiRangeHttpFetcher* multi_fetcher = | 
| Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 983 |       static_cast<MultiRangeHttpFetcher*>(fetcher_in); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 984 |   ASSERT_TRUE(multi_fetcher); | 
 | 985 |   multi_fetcher->ClearRanges(); | 
 | 986 |   for (vector<pair<off_t, off_t>>::const_iterator it = ranges.begin(), | 
 | 987 |            e = ranges.end(); it != e; ++it) { | 
 | 988 |     string tmp_str = base::StringPrintf("%jd+", it->first); | 
 | 989 |     if (it->second > 0) { | 
 | 990 |       base::StringAppendF(&tmp_str, "%jd", it->second); | 
 | 991 |       multi_fetcher->AddRange(it->first, it->second); | 
 | 992 |     } else { | 
 | 993 |       base::StringAppendF(&tmp_str, "?"); | 
 | 994 |       multi_fetcher->AddRange(it->first); | 
| Andrew de los Reyes | 819fef2 | 2010-12-17 11:33:58 -0800 | [diff] [blame] | 995 |     } | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 996 |     LOG(INFO) << "added range: " << tmp_str; | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 997 |   } | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 998 |   fake_hardware->SetIsOfficialBuild(false); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 999 |   multi_fetcher->set_delegate(&delegate); | 
 | 1000 |  | 
 | 1001 |   MessageLoop::current()->PostTask( | 
 | 1002 |       FROM_HERE, | 
 | 1003 |       base::Bind(StartTransfer, multi_fetcher, url)); | 
 | 1004 |   MessageLoop::current()->Run(); | 
 | 1005 |  | 
 | 1006 |   EXPECT_EQ(expected_size, delegate.data.size()); | 
 | 1007 |   EXPECT_EQ(expected_prefix, | 
 | 1008 |             string(delegate.data.data(), expected_prefix.size())); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1009 | } | 
| Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 1010 | }  // namespace | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1011 |  | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 1012 | TYPED_TEST(HttpFetcherTest, MultiHttpFetcherSimpleTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1013 |   if (!this->test_.IsMulti()) | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1014 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1015 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 1016 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1017 |   ASSERT_TRUE(server->started_); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1018 |  | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 1019 |   vector<pair<off_t, off_t>> ranges; | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1020 |   ranges.push_back(make_pair(0, 25)); | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 1021 |   ranges.push_back(make_pair(99, 0)); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1022 |   MultiTest(this->test_.NewLargeFetcher(), | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1023 |             this->test_.fake_hardware(), | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 1024 |             this->test_.BigUrl(server->GetPort()), | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1025 |             ranges, | 
 | 1026 |             "abcdefghijabcdefghijabcdejabcdefghijabcdef", | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1027 |             kBigLength - (99 - 25), | 
 | 1028 |             kHttpResponsePartialContent); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1029 | } | 
 | 1030 |  | 
 | 1031 | TYPED_TEST(HttpFetcherTest, MultiHttpFetcherLengthLimitTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1032 |   if (!this->test_.IsMulti()) | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1033 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1034 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 1035 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1036 |   ASSERT_TRUE(server->started_); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1037 |  | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 1038 |   vector<pair<off_t, off_t>> ranges; | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1039 |   ranges.push_back(make_pair(0, 24)); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1040 |   MultiTest(this->test_.NewLargeFetcher(), | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1041 |             this->test_.fake_hardware(), | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 1042 |             this->test_.BigUrl(server->GetPort()), | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1043 |             ranges, | 
 | 1044 |             "abcdefghijabcdefghijabcd", | 
 | 1045 |             24, | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 1046 |             kHttpResponsePartialContent); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1047 | } | 
 | 1048 |  | 
 | 1049 | TYPED_TEST(HttpFetcherTest, MultiHttpFetcherMultiEndTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1050 |   if (!this->test_.IsMulti()) | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1051 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1052 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 1053 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1054 |   ASSERT_TRUE(server->started_); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1055 |  | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 1056 |   vector<pair<off_t, off_t>> ranges; | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 1057 |   ranges.push_back(make_pair(kBigLength - 2, 0)); | 
 | 1058 |   ranges.push_back(make_pair(kBigLength - 3, 0)); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1059 |   MultiTest(this->test_.NewLargeFetcher(), | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1060 |             this->test_.fake_hardware(), | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 1061 |             this->test_.BigUrl(server->GetPort()), | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1062 |             ranges, | 
 | 1063 |             "ijhij", | 
 | 1064 |             5, | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1065 |             kHttpResponsePartialContent); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1066 | } | 
 | 1067 |  | 
 | 1068 | TYPED_TEST(HttpFetcherTest, MultiHttpFetcherInsufficientTest) { | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1069 |   if (!this->test_.IsMulti()) | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1070 |     return; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1071 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 1072 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1073 |   ASSERT_TRUE(server->started_); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1074 |  | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 1075 |   vector<pair<off_t, off_t>> ranges; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1076 |   ranges.push_back(make_pair(kBigLength - 2, 4)); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1077 |   for (int i = 0; i < 2; ++i) { | 
| Andrew de los Reyes | 819fef2 | 2010-12-17 11:33:58 -0800 | [diff] [blame] | 1078 |     LOG(INFO) << "i = " << i; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1079 |     MultiTest(this->test_.NewLargeFetcher(), | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1080 |               this->test_.fake_hardware(), | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 1081 |               this->test_.BigUrl(server->GetPort()), | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1082 |               ranges, | 
 | 1083 |               "ij", | 
 | 1084 |               2, | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1085 |               kHttpResponseUndefined); | 
| Andrew de los Reyes | 3fd5d30 | 2010-10-07 20:07:18 -0700 | [diff] [blame] | 1086 |     ranges.push_back(make_pair(0, 5)); | 
 | 1087 |   } | 
 | 1088 | } | 
 | 1089 |  | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1090 | // Issue #18143: when a fetch of a secondary chunk out of a chain, then it | 
 | 1091 | // should retry with other proxies listed before giving up. | 
 | 1092 | // | 
 | 1093 | // (1) successful recovery: The offset fetch will fail twice but succeed with | 
 | 1094 | // the third proxy. | 
 | 1095 | TYPED_TEST(HttpFetcherTest, MultiHttpFetcherErrorIfOffsetRecoverableTest) { | 
 | 1096 |   if (!this->test_.IsMulti()) | 
 | 1097 |     return; | 
 | 1098 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 1099 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1100 |   ASSERT_TRUE(server->started_); | 
 | 1101 |  | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 1102 |   vector<pair<off_t, off_t>> ranges; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1103 |   ranges.push_back(make_pair(0, 25)); | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 1104 |   ranges.push_back(make_pair(99, 0)); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1105 |   MultiTest(this->test_.NewLargeFetcher(3), | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1106 |             this->test_.fake_hardware(), | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 1107 |             LocalServerUrlForPath(server->GetPort(), | 
 | 1108 |                                   base::StringPrintf("/error-if-offset/%d/2", | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1109 |                                                      kBigLength)), | 
 | 1110 |             ranges, | 
 | 1111 |             "abcdefghijabcdefghijabcdejabcdefghijabcdef", | 
 | 1112 |             kBigLength - (99 - 25), | 
 | 1113 |             kHttpResponsePartialContent); | 
 | 1114 | } | 
 | 1115 |  | 
 | 1116 | // (2) unsuccessful recovery: The offset fetch will fail repeatedly.  The | 
 | 1117 | // fetcher will signal a (failed) completed transfer to the delegate. | 
 | 1118 | TYPED_TEST(HttpFetcherTest, MultiHttpFetcherErrorIfOffsetUnrecoverableTest) { | 
 | 1119 |   if (!this->test_.IsMulti()) | 
 | 1120 |     return; | 
 | 1121 |  | 
| Ben Chan | 02f7c1d | 2014-10-18 15:18:02 -0700 | [diff] [blame] | 1122 |   unique_ptr<HttpServer> server(this->test_.CreateServer()); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1123 |   ASSERT_TRUE(server->started_); | 
 | 1124 |  | 
| Ben Chan | f9cb98c | 2014-09-21 18:31:30 -0700 | [diff] [blame] | 1125 |   vector<pair<off_t, off_t>> ranges; | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1126 |   ranges.push_back(make_pair(0, 25)); | 
| Gilad Arnold | e4ad250 | 2011-12-29 17:08:54 -0800 | [diff] [blame] | 1127 |   ranges.push_back(make_pair(99, 0)); | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1128 |   MultiTest(this->test_.NewLargeFetcher(2), | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1129 |             this->test_.fake_hardware(), | 
| Gilad Arnold | b6c562a | 2013-07-01 02:19:26 -0700 | [diff] [blame] | 1130 |             LocalServerUrlForPath(server->GetPort(), | 
 | 1131 |                                   base::StringPrintf("/error-if-offset/%d/3", | 
| Gilad Arnold | 9bedeb5 | 2011-11-17 16:19:57 -0800 | [diff] [blame] | 1132 |                                                      kBigLength)), | 
 | 1133 |             ranges, | 
 | 1134 |             "abcdefghijabcdefghijabcde",  // only received the first chunk | 
 | 1135 |             25, | 
 | 1136 |             kHttpResponseUndefined); | 
 | 1137 | } | 
 | 1138 |  | 
 | 1139 |  | 
 | 1140 |  | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1141 | namespace { | 
| Darin Petkov | fc7a0ce | 2010-10-25 10:38:37 -0700 | [diff] [blame] | 1142 | class BlockedTransferTestDelegate : public HttpFetcherDelegate { | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1143 |  public: | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 1144 |   void ReceivedBytes(HttpFetcher* fetcher, | 
| Alex Vakulenko | f68bbbc | 2015-02-09 12:53:18 -0800 | [diff] [blame] | 1145 |                      const void* bytes, size_t length) override { | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1146 |     ADD_FAILURE(); | 
 | 1147 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 1148 |   void TransferComplete(HttpFetcher* fetcher, bool successful) override { | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1149 |     EXPECT_FALSE(successful); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 1150 |     MessageLoop::current()->BreakLoop(); | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1151 |   } | 
| Alex Deymo | 610277e | 2014-11-11 21:18:11 -0800 | [diff] [blame] | 1152 |   void TransferTerminated(HttpFetcher* fetcher) override { | 
| Darin Petkov | 9ce452b | 2010-11-17 14:33:28 -0800 | [diff] [blame] | 1153 |     ADD_FAILURE(); | 
 | 1154 |   } | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1155 | }; | 
 | 1156 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 1157 | void BlockedTransferTestHelper(AnyHttpFetcherTest* fetcher_test, | 
 | 1158 |                                bool is_official_build) { | 
 | 1159 |   if (fetcher_test->IsMock() || fetcher_test->IsMulti()) | 
 | 1160 |     return; | 
 | 1161 |  | 
 | 1162 |   unique_ptr<HttpServer> server(fetcher_test->CreateServer()); | 
 | 1163 |   ASSERT_TRUE(server->started_); | 
 | 1164 |  | 
 | 1165 |   BlockedTransferTestDelegate delegate; | 
 | 1166 |   unique_ptr<HttpFetcher> fetcher(fetcher_test->NewLargeFetcher()); | 
 | 1167 |   LOG(INFO) << "is_official_build: " << is_official_build; | 
 | 1168 |   // NewLargeFetcher creates the HttpFetcher* with a FakeSystemState. | 
| Alex Deymo | c1c17b4 | 2015-11-23 03:53:15 -0300 | [diff] [blame] | 1169 |   fetcher_test->fake_hardware()->SetIsOfficialBuild(is_official_build); | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 1170 |   fetcher->set_delegate(&delegate); | 
 | 1171 |  | 
 | 1172 |   MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 
 | 1173 |       StartTransfer, | 
 | 1174 |       fetcher.get(), | 
 | 1175 |       LocalServerUrlForPath(server->GetPort(), | 
 | 1176 |                             fetcher_test->SmallUrl(server->GetPort())))); | 
 | 1177 |   MessageLoop::current()->Run(); | 
 | 1178 | } | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1179 | }  // namespace | 
 | 1180 |  | 
| Darin Petkov | fc7a0ce | 2010-10-25 10:38:37 -0700 | [diff] [blame] | 1181 | TYPED_TEST(HttpFetcherTest, BlockedTransferTest) { | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 1182 |   BlockedTransferTestHelper(&this->test_, false); | 
 | 1183 | } | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1184 |  | 
| Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 1185 | TYPED_TEST(HttpFetcherTest, BlockedTransferOfficialBuildTest) { | 
 | 1186 |   BlockedTransferTestHelper(&this->test_, true); | 
| Andrew de los Reyes | d57d147 | 2010-10-21 13:34:08 -0700 | [diff] [blame] | 1187 | } | 
 | 1188 |  | 
| rspangler@google.com | 49fdf18 | 2009-10-10 00:57:34 +0000 | [diff] [blame] | 1189 | }  // namespace chromeos_update_engine |