blob: 9750067c370b404bfe65da6804f44b2f1d7a300c [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
rspangler@google.com49fdf182009-10-10 00:57:34 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <unistd.h>
Darin Petkov41c2fcf2010-08-25 13:14:48 -07006
adlr@google.comc98a7ed2009-12-04 18:54:03 +00007#include <string>
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07008#include <utility>
adlr@google.comc98a7ed2009-12-04 18:54:03 +00009#include <vector>
Darin Petkov41c2fcf2010-08-25 13:14:48 -070010
Andrew de los Reyes45168102010-11-22 11:13:50 -080011#include <base/logging.h>
Chris Masoned903c3b2011-05-12 15:35:46 -070012#include <base/memory/scoped_ptr.h>
Andrew de los Reyes45168102010-11-22 11:13:50 -080013#include <base/string_util.h>
Mike Frysinger8155d082012-04-06 15:23:18 -040014#include <base/stringprintf.h>
Jay Srinivasan43488792012-06-19 00:25:31 -070015#include <chromeos/dbus/service_constants.h>
Andrew de los Reyes45168102010-11-22 11:13:50 -080016#include <glib.h>
17#include <gtest/gtest.h>
18
Gilad Arnold9bedeb52011-11-17 16:19:57 -080019#include "update_engine/http_common.h"
20#include "update_engine/http_fetcher_unittest.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000021#include "update_engine/libcurl_http_fetcher.h"
Jay Srinivasan43488792012-06-19 00:25:31 -070022#include "update_engine/mock_connection_manager.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000023#include "update_engine/mock_http_fetcher.h"
Jay Srinivasan08fce042012-06-07 16:31:01 -070024#include "update_engine/mock_system_state.h"
Andrew de los Reyes819fef22010-12-17 11:33:58 -080025#include "update_engine/multi_range_http_fetcher.h"
Andrew de los Reyes45168102010-11-22 11:13:50 -080026#include "update_engine/proxy_resolver.h"
Jay Srinivasan08fce042012-06-07 16:31:01 -070027#include "update_engine/utils.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000028
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -070029using std::make_pair;
Andrew de los Reyes819fef22010-12-17 11:33:58 -080030using std::pair;
adlr@google.comc98a7ed2009-12-04 18:54:03 +000031using std::string;
32using std::vector;
33
Jay Srinivasan43488792012-06-19 00:25:31 -070034using testing::_;
35using testing::SetArgumentPointee;
36using testing::DoAll;
37using testing::Return;
38
Gilad Arnold9bedeb52011-11-17 16:19:57 -080039namespace {
40
41const int kBigLength = 100000;
42const int kMediumLength = 1000;
Gilad Arnold34bf1ee2012-02-09 16:16:02 -080043const int kFlakyTruncateLength = 29000;
44const int kFlakySleepEvery = 3;
Gilad Arnold9bedeb52011-11-17 16:19:57 -080045const int kFlakySleepSecs = 10;
46
47} // namespace
48
rspangler@google.com49fdf182009-10-10 00:57:34 +000049namespace chromeos_update_engine {
50
Gilad Arnold9bedeb52011-11-17 16:19:57 -080051static const char *kUnusedUrl = "unused://unused";
52
53static inline string LocalServerUrlForPath(const string& path) {
Jay Srinivasan43488792012-06-19 00:25:31 -070054 return base::StringPrintf("http://127.0.0.1:%d%s", kServerPort, path.c_str());
rspangler@google.com49fdf182009-10-10 00:57:34 +000055}
56
Gilad Arnold9bedeb52011-11-17 16:19:57 -080057//
58// Class hierarchy for HTTP server implementations.
59//
60
61class HttpServer {
rspangler@google.com49fdf182009-10-10 00:57:34 +000062 public:
Gilad Arnold9bedeb52011-11-17 16:19:57 -080063 // This makes it an abstract class (dirty but works).
64 virtual ~HttpServer() = 0;
65
rspangler@google.com49fdf182009-10-10 00:57:34 +000066 bool started_;
67};
68
Gilad Arnold9bedeb52011-11-17 16:19:57 -080069HttpServer::~HttpServer() {}
rspangler@google.com49fdf182009-10-10 00:57:34 +000070
Gilad Arnold9bedeb52011-11-17 16:19:57 -080071
72class NullHttpServer : public HttpServer {
rspangler@google.com49fdf182009-10-10 00:57:34 +000073 public:
Gilad Arnold9bedeb52011-11-17 16:19:57 -080074 NullHttpServer() {
75 started_ = true;
rspangler@google.com49fdf182009-10-10 00:57:34 +000076 }
rspangler@google.com49fdf182009-10-10 00:57:34 +000077};
78
Gilad Arnold9bedeb52011-11-17 16:19:57 -080079
80class PythonHttpServer : public HttpServer {
rspangler@google.com49fdf182009-10-10 00:57:34 +000081 public:
82 PythonHttpServer() {
adlr@google.comc98a7ed2009-12-04 18:54:03 +000083 char *argv[2] = {strdup("./test_http_server"), NULL};
rspangler@google.com49fdf182009-10-10 00:57:34 +000084 GError *err;
85 started_ = false;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -070086 validate_quit_ = true;
rspangler@google.com49fdf182009-10-10 00:57:34 +000087 if (!g_spawn_async(NULL,
88 argv,
89 NULL,
90 G_SPAWN_DO_NOT_REAP_CHILD,
91 NULL,
92 NULL,
93 &pid_,
94 &err)) {
Jay Srinivasan135a58b2012-07-13 12:46:49 -070095 LOG(INFO) << "unable to spawn http server process";
rspangler@google.com49fdf182009-10-10 00:57:34 +000096 return;
97 }
Jay Srinivasan135a58b2012-07-13 12:46:49 -070098 LOG(INFO) << "started http server with pid " << pid_;
rspangler@google.com49fdf182009-10-10 00:57:34 +000099 int rc = 1;
Andrew de los Reyese7dcc2a2011-08-19 10:50:37 -0700100 const uint64_t kMaxSleep = 60UL * 60UL * 1000UL * 1000UL; // 60 min
101 uint64_t timeout = 15 * 1000; // 15 ms
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700102 started_ = true;
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700103 while (rc && timeout < kMaxSleep) {
104 // Wait before the first attempt also as it takes a while for the
105 // test_http_server to be ready.
106 LOG(INFO) << "waiting for " << timeout / 1000 << " ms";
107 if (timeout < (1000 * 1000)) // sub 1-second sleep, use usleep
108 usleep(static_cast<useconds_t>(timeout));
109 else
110 sleep(static_cast<unsigned int>(timeout / (1000 * 1000)));
111 timeout *= 2;
112
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700113 LOG(INFO) << "running wget to start";
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700114 // rc should be 0 if we're able to successfully talk to the server.
rspangler@google.com49fdf182009-10-10 00:57:34 +0000115 rc = system((string("wget --output-document=/dev/null ") +
116 LocalServerUrlForPath("/test")).c_str());
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700117 LOG(INFO) << "done running wget to start, rc = " << rc;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000118 }
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700119
120 if (rc) {
121 LOG(ERROR) << "Http server is not responding to wget.";
122 // TODO(jaysri): Currently we're overloading two things in
123 // started_ flag. One is that the process is running and other
124 // is that the process is responsive. We should separate these
125 // two so that we can do cleanup appropriately in each case.
126 started_ = false;
127 }
128
rspangler@google.com49fdf182009-10-10 00:57:34 +0000129 free(argv[0]);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700130 LOG(INFO) << "gdb attach now!";
rspangler@google.com49fdf182009-10-10 00:57:34 +0000131 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800132
rspangler@google.com49fdf182009-10-10 00:57:34 +0000133 ~PythonHttpServer() {
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700134 if (!started_) {
135 LOG(INFO) << "not waiting for http server with pid " << pid_
136 << " to terminate, as it's not responding.";
137 // TODO(jaysri): Kill the process if it's really running but
138 // wgets or failing for some reason. Or if it's not running,
139 // add code to get rid of the defunct process.
rspangler@google.com49fdf182009-10-10 00:57:34 +0000140 return;
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700141 }
142
rspangler@google.com49fdf182009-10-10 00:57:34 +0000143 // request that the server exit itself
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700144 LOG(INFO) << "running wget to exit";
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700145 int rc = system((string("wget -t 1 --output-document=/dev/null ") +
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700146 LocalServerUrlForPath("/quitquitquit")).c_str());
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700147 LOG(INFO) << "done running wget to exit";
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700148 if (validate_quit_)
149 EXPECT_EQ(0, rc);
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700150 LOG(INFO) << "waiting for http server with pid " << pid_ << " to terminate";
151 int status;
152 waitpid(pid_, &status, 0);
153 LOG(INFO) << "http server with pid " << pid_
154 << " terminated with status " << status;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000155 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800156
rspangler@google.com49fdf182009-10-10 00:57:34 +0000157 GPid pid_;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700158 bool validate_quit_;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000159};
160
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800161//
162// Class hierarchy for HTTP fetcher test wrappers.
163//
164
165class AnyHttpFetcherTest {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000166 public:
Jay Srinivasan43488792012-06-19 00:25:31 -0700167 AnyHttpFetcherTest()
168 : mock_connection_manager_(&mock_system_state_) {
169 mock_system_state_.SetConnectionManager(&mock_connection_manager_);
170 }
171
172 virtual HttpFetcher* NewLargeFetcher(size_t num_proxies) = 0;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800173 HttpFetcher* NewLargeFetcher() {
174 return NewLargeFetcher(1);
175 }
176
177 virtual HttpFetcher* NewSmallFetcher(size_t num_proxies) = 0;
178 HttpFetcher* NewSmallFetcher() {
179 return NewSmallFetcher(1);
180 }
181
182 virtual string BigUrl() const { return kUnusedUrl; }
183 virtual string SmallUrl() const { return kUnusedUrl; }
184 virtual string ErrorUrl() const { return kUnusedUrl; }
185
186 virtual bool IsMock() const = 0;
187 virtual bool IsMulti() const = 0;
188
189 virtual void IgnoreServerAborting(HttpServer* server) const {}
190
191 virtual HttpServer *CreateServer() = 0;
192
193 protected:
194 DirectProxyResolver proxy_resolver_;
Jay Srinivasan43488792012-06-19 00:25:31 -0700195 MockSystemState mock_system_state_;
196 MockConnectionManager mock_connection_manager_;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800197};
198
199class MockHttpFetcherTest : public AnyHttpFetcherTest {
200 public:
201 // Necessary to unhide the definition in the base class.
202 using AnyHttpFetcherTest::NewLargeFetcher;
203 virtual HttpFetcher* NewLargeFetcher(size_t num_proxies) {
204 vector<char> big_data(1000000);
205 CHECK(num_proxies > 0);
206 proxy_resolver_.set_num_proxies(num_proxies);
207 return new MockHttpFetcher(
208 big_data.data(),
209 big_data.size(),
210 reinterpret_cast<ProxyResolver*>(&proxy_resolver_));
211 }
212
213 // Necessary to unhide the definition in the base class.
214 using AnyHttpFetcherTest::NewSmallFetcher;
215 virtual HttpFetcher* NewSmallFetcher(size_t num_proxies) {
216 CHECK(num_proxies > 0);
217 proxy_resolver_.set_num_proxies(num_proxies);
218 return new MockHttpFetcher(
219 "x",
220 1,
221 reinterpret_cast<ProxyResolver*>(&proxy_resolver_));
222 }
223
224 virtual bool IsMock() const { return true; }
225 virtual bool IsMulti() const { return false; }
226
227 virtual HttpServer *CreateServer() {
228 return new NullHttpServer;
229 }
230};
231
232class LibcurlHttpFetcherTest : public AnyHttpFetcherTest {
233 public:
234 // Necessary to unhide the definition in the base class.
235 using AnyHttpFetcherTest::NewLargeFetcher;
236 virtual HttpFetcher* NewLargeFetcher(size_t num_proxies) {
237 CHECK(num_proxies > 0);
238 proxy_resolver_.set_num_proxies(num_proxies);
Andrew de los Reyes45168102010-11-22 11:13:50 -0800239 LibcurlHttpFetcher *ret = new
Jay Srinivasan08fce042012-06-07 16:31:01 -0700240 LibcurlHttpFetcher(reinterpret_cast<ProxyResolver*>(&proxy_resolver_),
Gilad Arnold7c04e762012-05-23 10:54:02 -0700241 &mock_system_state_, false);
Darin Petkovb83371f2010-08-17 09:34:49 -0700242 // Speed up test execution.
243 ret->set_idle_seconds(1);
244 ret->set_retry_seconds(1);
Darin Petkovfc7a0ce2010-10-25 10:38:37 -0700245 ret->SetBuildType(false);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000246 return ret;
247 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800248
249 // Necessary to unhide the definition in the base class.
250 using AnyHttpFetcherTest::NewSmallFetcher;
251 virtual HttpFetcher* NewSmallFetcher(size_t num_proxies) {
252 return NewLargeFetcher(num_proxies);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000253 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800254
255 virtual string BigUrl() const {
256 return LocalServerUrlForPath(base::StringPrintf("/download/%d",
257 kBigLength));
rspangler@google.com49fdf182009-10-10 00:57:34 +0000258 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800259 virtual string SmallUrl() const {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000260 return LocalServerUrlForPath("/foo");
261 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800262 virtual string ErrorUrl() const {
Gilad Arnold48085ba2011-11-16 09:36:08 -0800263 return LocalServerUrlForPath("/error");
264 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800265
266 virtual bool IsMock() const { return false; }
267 virtual bool IsMulti() const { return false; }
268
269 virtual void IgnoreServerAborting(HttpServer* server) const {
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700270 PythonHttpServer *pyserver = reinterpret_cast<PythonHttpServer*>(server);
271 pyserver->validate_quit_ = false;
272 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800273
274 virtual HttpServer *CreateServer() {
275 return new PythonHttpServer;
276 }
rspangler@google.com49fdf182009-10-10 00:57:34 +0000277};
278
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800279class MultiRangeHttpFetcherTest : public LibcurlHttpFetcherTest {
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700280 public:
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800281 // Necessary to unhide the definition in the base class.
282 using AnyHttpFetcherTest::NewLargeFetcher;
283 virtual HttpFetcher* NewLargeFetcher(size_t num_proxies) {
284 CHECK(num_proxies > 0);
285 proxy_resolver_.set_num_proxies(num_proxies);
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800286 ProxyResolver* resolver =
287 reinterpret_cast<ProxyResolver*>(&proxy_resolver_);
Gilad Arnold7c04e762012-05-23 10:54:02 -0700288 MultiRangeHttpFetcher *ret =
289 new MultiRangeHttpFetcher(
290 new LibcurlHttpFetcher(resolver, &mock_system_state_, false));
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800291 ret->ClearRanges();
Gilad Arnolde4ad2502011-12-29 17:08:54 -0800292 ret->AddRange(0);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700293 // Speed up test execution.
294 ret->set_idle_seconds(1);
295 ret->set_retry_seconds(1);
Darin Petkovfc7a0ce2010-10-25 10:38:37 -0700296 ret->SetBuildType(false);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700297 return ret;
298 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800299
300 // Necessary to unhide the definition in the base class.
301 using AnyHttpFetcherTest::NewSmallFetcher;
302 virtual HttpFetcher* NewSmallFetcher(size_t num_proxies) {
303 return NewLargeFetcher(num_proxies);
304 }
305
306 virtual bool IsMulti() const { return true; }
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700307};
308
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800309
310//
311// Infrastructure for type tests of HTTP fetcher.
312// See: http://code.google.com/p/googletest/wiki/AdvancedGuide#Typed_Tests
313//
314
315// Fixture class template. We use an explicit constraint to guarantee that it
316// can only be instantiated with an AnyHttpFetcherTest type, see:
317// http://www2.research.att.com/~bs/bs_faq2.html#constraints
318template <typename T>
319class HttpFetcherTest : public ::testing::Test {
320 public:
321 T test_;
322
323 private:
324 static void TypeConstraint(T *a) {
325 AnyHttpFetcherTest *b = a;
326 }
327};
328
329// Test case types list.
330typedef ::testing::Types<LibcurlHttpFetcherTest,
331 MockHttpFetcherTest,
332 MultiRangeHttpFetcherTest> HttpFetcherTestTypes;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000333TYPED_TEST_CASE(HttpFetcherTest, HttpFetcherTestTypes);
334
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800335
rspangler@google.com49fdf182009-10-10 00:57:34 +0000336namespace {
337class HttpFetcherTestDelegate : public HttpFetcherDelegate {
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000338 public:
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800339 HttpFetcherTestDelegate() :
Gilad Arnold48085ba2011-11-16 09:36:08 -0800340 is_expect_error_(false), times_transfer_complete_called_(0),
341 times_transfer_terminated_called_(0), times_received_bytes_called_(0) {}
342
rspangler@google.com49fdf182009-10-10 00:57:34 +0000343 virtual void ReceivedBytes(HttpFetcher* fetcher,
344 const char* bytes, int length) {
345 char str[length + 1];
346 memset(str, 0, length + 1);
347 memcpy(str, bytes, length);
Gilad Arnold48085ba2011-11-16 09:36:08 -0800348
349 // Update counters
350 times_received_bytes_called_++;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000351 }
Gilad Arnold48085ba2011-11-16 09:36:08 -0800352
rspangler@google.com49fdf182009-10-10 00:57:34 +0000353 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
Gilad Arnold48085ba2011-11-16 09:36:08 -0800354 if (is_expect_error_)
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800355 EXPECT_EQ(kHttpResponseNotFound, fetcher->http_response_code());
Gilad Arnold48085ba2011-11-16 09:36:08 -0800356 else
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800357 EXPECT_EQ(kHttpResponseOk, fetcher->http_response_code());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000358 g_main_loop_quit(loop_);
Gilad Arnold48085ba2011-11-16 09:36:08 -0800359
360 // Update counter
361 times_transfer_complete_called_++;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000362 }
Gilad Arnold48085ba2011-11-16 09:36:08 -0800363
Darin Petkov9ce452b2010-11-17 14:33:28 -0800364 virtual void TransferTerminated(HttpFetcher* fetcher) {
365 ADD_FAILURE();
Gilad Arnold48085ba2011-11-16 09:36:08 -0800366 times_transfer_terminated_called_++;
Darin Petkov9ce452b2010-11-17 14:33:28 -0800367 }
Gilad Arnold48085ba2011-11-16 09:36:08 -0800368
rspangler@google.com49fdf182009-10-10 00:57:34 +0000369 GMainLoop* loop_;
Gilad Arnold48085ba2011-11-16 09:36:08 -0800370
371 // Are we expecting an error response? (default: no)
372 bool is_expect_error_;
373
374 // Counters for callback invocations.
375 int times_transfer_complete_called_;
376 int times_transfer_terminated_called_;
377 int times_received_bytes_called_;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000378};
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000379
380struct StartTransferArgs {
381 HttpFetcher *http_fetcher;
382 string url;
383};
384
385gboolean StartTransfer(gpointer data) {
386 StartTransferArgs *args = reinterpret_cast<StartTransferArgs*>(data);
387 args->http_fetcher->BeginTransfer(args->url);
388 return FALSE;
389}
rspangler@google.com49fdf182009-10-10 00:57:34 +0000390} // namespace {}
391
392TYPED_TEST(HttpFetcherTest, SimpleTest) {
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700393 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000394 {
395 HttpFetcherTestDelegate delegate;
396 delegate.loop_ = loop;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800397 scoped_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000398 fetcher->set_delegate(&delegate);
399
Jay Srinivasan43488792012-06-19 00:25:31 -0700400 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
401 fetcher->GetSystemState()->GetConnectionManager());
402 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
403 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetWifi), Return(true)));
404 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetWifi))
405 .WillRepeatedly(Return(true));
406 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetWifi))
407 .WillRepeatedly(Return(flimflam::kTypeWifi));
408
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800409 scoped_ptr<HttpServer> server(this->test_.CreateServer());
410 ASSERT_TRUE(server->started_);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000411
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800412 StartTransferArgs start_xfer_args = {fetcher.get(), this->test_.SmallUrl()};
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000413
414 g_timeout_add(0, StartTransfer, &start_xfer_args);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000415 g_main_loop_run(loop);
416 }
417 g_main_loop_unref(loop);
418}
419
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700420TYPED_TEST(HttpFetcherTest, SimpleBigTest) {
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700421 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700422 {
423 HttpFetcherTestDelegate delegate;
424 delegate.loop_ = loop;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800425 scoped_ptr<HttpFetcher> fetcher(this->test_.NewLargeFetcher());
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700426 fetcher->set_delegate(&delegate);
427
Jay Srinivasan43488792012-06-19 00:25:31 -0700428 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
429 fetcher->GetSystemState()->GetConnectionManager());
430 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
431 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet), Return(true)));
432 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetEthernet))
433 .WillRepeatedly(Return(true));
434 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetEthernet))
435 .WillRepeatedly(Return(flimflam::kTypeEthernet));
436
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800437 scoped_ptr<HttpServer> server(this->test_.CreateServer());
438 ASSERT_TRUE(server->started_);
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700439
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800440 StartTransferArgs start_xfer_args = {fetcher.get(), this->test_.BigUrl()};
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700441
442 g_timeout_add(0, StartTransfer, &start_xfer_args);
443 g_main_loop_run(loop);
444 }
445 g_main_loop_unref(loop);
446}
447
Gilad Arnold48085ba2011-11-16 09:36:08 -0800448// Issue #9648: when server returns an error HTTP response, the fetcher needs to
449// terminate transfer prematurely, rather than try to process the error payload.
450TYPED_TEST(HttpFetcherTest, ErrorTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800451 if (this->test_.IsMock() || this->test_.IsMulti())
Gilad Arnold48085ba2011-11-16 09:36:08 -0800452 return;
453 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
454 {
455 HttpFetcherTestDelegate delegate;
456 delegate.loop_ = loop;
457
458 // Delegate should expect an error response.
459 delegate.is_expect_error_ = true;
460
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800461 scoped_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher());
Gilad Arnold48085ba2011-11-16 09:36:08 -0800462 fetcher->set_delegate(&delegate);
463
Jay Srinivasan43488792012-06-19 00:25:31 -0700464 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
465 fetcher->GetSystemState()->GetConnectionManager());
466 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
467 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetWimax), Return(true)));
468 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetWimax))
469 .WillRepeatedly(Return(true));
470 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetWimax))
471 .WillRepeatedly(Return(flimflam::kTypeWimax));
472
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800473 scoped_ptr<HttpServer> server(this->test_.CreateServer());
474 ASSERT_TRUE(server->started_);
Gilad Arnold48085ba2011-11-16 09:36:08 -0800475
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800476 StartTransferArgs start_xfer_args = {
477 fetcher.get(),
478 this->test_.ErrorUrl()
479 };
Gilad Arnold48085ba2011-11-16 09:36:08 -0800480
481 g_timeout_add(0, StartTransfer, &start_xfer_args);
482 g_main_loop_run(loop);
483
484 // Make sure that no bytes were received.
485 CHECK_EQ(delegate.times_received_bytes_called_, 0);
Mike Frysinger0f9547d2012-02-16 12:11:37 -0500486 CHECK_EQ(fetcher->GetBytesDownloaded(), static_cast<size_t>(0));
Gilad Arnold48085ba2011-11-16 09:36:08 -0800487
488 // Make sure that transfer completion was signaled once, and no termination
489 // was signaled.
490 CHECK_EQ(delegate.times_transfer_complete_called_, 1);
491 CHECK_EQ(delegate.times_transfer_terminated_called_, 0);
492 }
493 g_main_loop_unref(loop);
494}
495
rspangler@google.com49fdf182009-10-10 00:57:34 +0000496namespace {
497class PausingHttpFetcherTestDelegate : public HttpFetcherDelegate {
498 public:
499 virtual void ReceivedBytes(HttpFetcher* fetcher,
500 const char* bytes, int length) {
501 char str[length + 1];
rspangler@google.com49fdf182009-10-10 00:57:34 +0000502 memset(str, 0, length + 1);
503 memcpy(str, bytes, length);
504 CHECK(!paused_);
505 paused_ = true;
506 fetcher->Pause();
rspangler@google.com49fdf182009-10-10 00:57:34 +0000507 }
508 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
509 g_main_loop_quit(loop_);
510 }
Darin Petkov9ce452b2010-11-17 14:33:28 -0800511 virtual void TransferTerminated(HttpFetcher* fetcher) {
512 ADD_FAILURE();
513 }
rspangler@google.com49fdf182009-10-10 00:57:34 +0000514 void Unpause() {
515 CHECK(paused_);
516 paused_ = false;
517 fetcher_->Unpause();
rspangler@google.com49fdf182009-10-10 00:57:34 +0000518 }
519 bool paused_;
520 HttpFetcher* fetcher_;
521 GMainLoop* loop_;
522};
523
524gboolean UnpausingTimeoutCallback(gpointer data) {
525 PausingHttpFetcherTestDelegate *delegate =
526 reinterpret_cast<PausingHttpFetcherTestDelegate*>(data);
527 if (delegate->paused_)
528 delegate->Unpause();
529 return TRUE;
530}
531} // namespace {}
532
533TYPED_TEST(HttpFetcherTest, PauseTest) {
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700534 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000535 {
536 PausingHttpFetcherTestDelegate delegate;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800537 scoped_ptr<HttpFetcher> fetcher(this->test_.NewLargeFetcher());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000538 delegate.paused_ = false;
539 delegate.loop_ = loop;
540 delegate.fetcher_ = fetcher.get();
541 fetcher->set_delegate(&delegate);
542
Jay Srinivasan43488792012-06-19 00:25:31 -0700543 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
544 fetcher->GetSystemState()->GetConnectionManager());
545 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
546 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetCellular), Return(true)));
547 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetCellular))
548 .WillRepeatedly(Return(true));
549 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetCellular))
550 .WillRepeatedly(Return(flimflam::kTypeCellular));
551
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800552 scoped_ptr<HttpServer> server(this->test_.CreateServer());
553 ASSERT_TRUE(server->started_);
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -0800554
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800555 guint callback_id = g_timeout_add(kHttpResponseInternalServerError,
556 UnpausingTimeoutCallback, &delegate);
557 fetcher->BeginTransfer(this->test_.BigUrl());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000558
559 g_main_loop_run(loop);
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -0800560 g_source_remove(callback_id);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000561 }
562 g_main_loop_unref(loop);
563}
564
565namespace {
566class AbortingHttpFetcherTestDelegate : public HttpFetcherDelegate {
567 public:
568 virtual void ReceivedBytes(HttpFetcher* fetcher,
569 const char* bytes, int length) {}
570 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
Darin Petkov9ce452b2010-11-17 14:33:28 -0800571 ADD_FAILURE(); // We should never get here
rspangler@google.com49fdf182009-10-10 00:57:34 +0000572 g_main_loop_quit(loop_);
573 }
Darin Petkov9ce452b2010-11-17 14:33:28 -0800574 virtual void TransferTerminated(HttpFetcher* fetcher) {
575 EXPECT_EQ(fetcher, fetcher_.get());
576 EXPECT_FALSE(once_);
577 EXPECT_TRUE(callback_once_);
578 callback_once_ = false;
579 // |fetcher| can be destroyed during this callback.
580 fetcher_.reset(NULL);
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800581 }
rspangler@google.com49fdf182009-10-10 00:57:34 +0000582 void TerminateTransfer() {
583 CHECK(once_);
584 once_ = false;
585 fetcher_->TerminateTransfer();
586 }
587 void EndLoop() {
588 g_main_loop_quit(loop_);
589 }
590 bool once_;
Darin Petkov9ce452b2010-11-17 14:33:28 -0800591 bool callback_once_;
592 scoped_ptr<HttpFetcher> fetcher_;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000593 GMainLoop* loop_;
594};
595
596gboolean AbortingTimeoutCallback(gpointer data) {
597 AbortingHttpFetcherTestDelegate *delegate =
598 reinterpret_cast<AbortingHttpFetcherTestDelegate*>(data);
599 if (delegate->once_) {
600 delegate->TerminateTransfer();
601 return TRUE;
602 } else {
603 delegate->EndLoop();
604 return FALSE;
605 }
606}
607} // namespace {}
608
609TYPED_TEST(HttpFetcherTest, AbortTest) {
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700610 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000611 {
612 AbortingHttpFetcherTestDelegate delegate;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800613 delegate.fetcher_.reset(this->test_.NewLargeFetcher());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000614 delegate.once_ = true;
Darin Petkov9ce452b2010-11-17 14:33:28 -0800615 delegate.callback_once_ = true;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000616 delegate.loop_ = loop;
Darin Petkov9ce452b2010-11-17 14:33:28 -0800617 delegate.fetcher_->set_delegate(&delegate);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000618
Jay Srinivasan43488792012-06-19 00:25:31 -0700619 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
620 delegate.fetcher_->GetSystemState()->GetConnectionManager());
621 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
622 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetWifi), Return(true)));
623 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetWifi))
624 .WillRepeatedly(Return(true));
625 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetWifi))
626 .WillRepeatedly(Return(flimflam::kTypeWifi));
627
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800628 scoped_ptr<HttpServer> server(this->test_.CreateServer());
629 this->test_.IgnoreServerAborting(server.get());
630 ASSERT_TRUE(server->started_);
631
rspangler@google.com49fdf182009-10-10 00:57:34 +0000632 GSource* timeout_source_;
633 timeout_source_ = g_timeout_source_new(0); // ms
634 g_source_set_callback(timeout_source_, AbortingTimeoutCallback, &delegate,
635 NULL);
636 g_source_attach(timeout_source_, NULL);
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800637 delegate.fetcher_->BeginTransfer(this->test_.BigUrl());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000638
639 g_main_loop_run(loop);
Darin Petkov9ce452b2010-11-17 14:33:28 -0800640 CHECK(!delegate.once_);
641 CHECK(!delegate.callback_once_);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000642 g_source_destroy(timeout_source_);
643 }
644 g_main_loop_unref(loop);
645}
646
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000647namespace {
648class FlakyHttpFetcherTestDelegate : public HttpFetcherDelegate {
649 public:
650 virtual void ReceivedBytes(HttpFetcher* fetcher,
651 const char* bytes, int length) {
652 data.append(bytes, length);
653 }
654 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
Andrew de los Reyesfb4ad7d2010-07-19 10:43:46 -0700655 EXPECT_TRUE(successful);
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800656 EXPECT_EQ(kHttpResponsePartialContent, fetcher->http_response_code());
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000657 g_main_loop_quit(loop_);
658 }
Darin Petkov9ce452b2010-11-17 14:33:28 -0800659 virtual void TransferTerminated(HttpFetcher* fetcher) {
660 ADD_FAILURE();
661 }
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000662 string data;
663 GMainLoop* loop_;
664};
665} // namespace {}
666
667TYPED_TEST(HttpFetcherTest, FlakyTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800668 if (this->test_.IsMock())
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000669 return;
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700670 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000671 {
672 FlakyHttpFetcherTestDelegate delegate;
673 delegate.loop_ = loop;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800674 scoped_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher());
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000675 fetcher->set_delegate(&delegate);
676
Jay Srinivasan43488792012-06-19 00:25:31 -0700677 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
678 fetcher->GetSystemState()->GetConnectionManager());
679 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
680 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetWifi), Return(true)));
681 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetWifi))
682 .WillRepeatedly(Return(true));
683 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetWifi))
684 .WillRepeatedly(Return(flimflam::kTypeWifi));
685
686
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800687 scoped_ptr<HttpServer> server(this->test_.CreateServer());
688 ASSERT_TRUE(server->started_);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000689
690 StartTransferArgs start_xfer_args = {
691 fetcher.get(),
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800692 LocalServerUrlForPath(StringPrintf("/flaky/%d/%d/%d/%d", kBigLength,
693 kFlakyTruncateLength,
694 kFlakySleepEvery,
695 kFlakySleepSecs))
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000696 };
697
698 g_timeout_add(0, StartTransfer, &start_xfer_args);
699 g_main_loop_run(loop);
700
701 // verify the data we get back
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800702 ASSERT_EQ(kBigLength, delegate.data.size());
703 for (int i = 0; i < kBigLength; i += 10) {
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000704 // Assert so that we don't flood the screen w/ EXPECT errors on failure.
705 ASSERT_EQ(delegate.data.substr(i, 10), "abcdefghij");
706 }
707 }
708 g_main_loop_unref(loop);
709}
710
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700711namespace {
712class FailureHttpFetcherTestDelegate : public HttpFetcherDelegate {
713 public:
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700714 FailureHttpFetcherTestDelegate(PythonHttpServer* server)
715 : loop_(NULL),
716 server_(server) {}
717
718 virtual ~FailureHttpFetcherTestDelegate() {
719 if (server_) {
720 LOG(INFO) << "Stopping server in destructor";
721 delete server_;
722 LOG(INFO) << "server stopped";
723 }
724 }
725
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700726 virtual void ReceivedBytes(HttpFetcher* fetcher,
727 const char* bytes, int length) {
728 if (server_) {
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700729 LOG(INFO) << "Stopping server in ReceivedBytes";
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700730 delete server_;
731 LOG(INFO) << "server stopped";
732 server_ = NULL;
733 }
734 }
735 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
736 EXPECT_FALSE(successful);
Darin Petkovcb466212010-08-26 09:40:11 -0700737 EXPECT_EQ(0, fetcher->http_response_code());
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700738 g_main_loop_quit(loop_);
739 }
Darin Petkov9ce452b2010-11-17 14:33:28 -0800740 virtual void TransferTerminated(HttpFetcher* fetcher) {
741 ADD_FAILURE();
742 }
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700743 GMainLoop* loop_;
744 PythonHttpServer* server_;
745};
746} // namespace {}
747
748
749TYPED_TEST(HttpFetcherTest, FailureTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800750 if (this->test_.IsMock())
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700751 return;
752 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
753 {
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700754 FailureHttpFetcherTestDelegate delegate(NULL);
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700755 delegate.loop_ = loop;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800756 scoped_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher());
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700757 fetcher->set_delegate(&delegate);
758
Jay Srinivasan43488792012-06-19 00:25:31 -0700759 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
760 fetcher->GetSystemState()->GetConnectionManager());
761 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
762 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet), Return(true)));
763 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetEthernet))
764 .WillRepeatedly(Return(true));
765 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetEthernet))
766 .WillRepeatedly(Return(flimflam::kTypeEthernet));
767
768
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700769 StartTransferArgs start_xfer_args = {
770 fetcher.get(),
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800771 LocalServerUrlForPath(this->test_.SmallUrl())
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700772 };
773
774 g_timeout_add(0, StartTransfer, &start_xfer_args);
775 g_main_loop_run(loop);
776
777 // Exiting and testing happens in the delegate
778 }
779 g_main_loop_unref(loop);
780}
781
782TYPED_TEST(HttpFetcherTest, ServerDiesTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800783 if (this->test_.IsMock())
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700784 return;
785 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
786 {
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700787 FailureHttpFetcherTestDelegate delegate(new PythonHttpServer);
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700788 delegate.loop_ = loop;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800789 scoped_ptr<HttpFetcher> fetcher(this->test_.NewSmallFetcher());
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700790 fetcher->set_delegate(&delegate);
791
792 StartTransferArgs start_xfer_args = {
793 fetcher.get(),
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800794 LocalServerUrlForPath(StringPrintf("/flaky/%d/%d/%d/%d", kBigLength,
795 kFlakyTruncateLength,
796 kFlakySleepEvery,
797 kFlakySleepSecs))
Andrew de los Reyes9bbd1872010-07-16 14:52:29 -0700798 };
799
800 g_timeout_add(0, StartTransfer, &start_xfer_args);
801 g_main_loop_run(loop);
802
803 // Exiting and testing happens in the delegate
804 }
805 g_main_loop_unref(loop);
806}
807
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700808namespace {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800809const HttpResponseCode kRedirectCodes[] = {
810 kHttpResponseMovedPermanently, kHttpResponseFound, kHttpResponseSeeOther,
811 kHttpResponseTempRedirect
812};
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700813
814class RedirectHttpFetcherTestDelegate : public HttpFetcherDelegate {
815 public:
816 RedirectHttpFetcherTestDelegate(bool expected_successful)
817 : expected_successful_(expected_successful) {}
818 virtual void ReceivedBytes(HttpFetcher* fetcher,
819 const char* bytes, int length) {
820 data.append(bytes, length);
821 }
822 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
823 EXPECT_EQ(expected_successful_, successful);
Darin Petkovcb466212010-08-26 09:40:11 -0700824 if (expected_successful_)
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800825 EXPECT_EQ(kHttpResponseOk, fetcher->http_response_code());
Darin Petkovcb466212010-08-26 09:40:11 -0700826 else {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800827 EXPECT_GE(fetcher->http_response_code(), kHttpResponseMovedPermanently);
828 EXPECT_LE(fetcher->http_response_code(), kHttpResponseTempRedirect);
Darin Petkovcb466212010-08-26 09:40:11 -0700829 }
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700830 g_main_loop_quit(loop_);
831 }
Darin Petkov9ce452b2010-11-17 14:33:28 -0800832 virtual void TransferTerminated(HttpFetcher* fetcher) {
833 ADD_FAILURE();
834 }
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700835 bool expected_successful_;
836 string data;
837 GMainLoop* loop_;
838};
839
840// RedirectTest takes ownership of |http_fetcher|.
841void RedirectTest(bool expected_successful,
842 const string& url,
843 HttpFetcher* http_fetcher) {
844 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700845 {
846 RedirectHttpFetcherTestDelegate delegate(expected_successful);
847 delegate.loop_ = loop;
848 scoped_ptr<HttpFetcher> fetcher(http_fetcher);
849 fetcher->set_delegate(&delegate);
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700850
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700851 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
852 fetcher->GetSystemState()->GetConnectionManager());
853 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
854 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet), Return(true)));
855 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetEthernet))
856 .WillRepeatedly(Return(true));
857 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetEthernet))
858 .WillRepeatedly(Return(flimflam::kTypeEthernet));
Jay Srinivasan43488792012-06-19 00:25:31 -0700859
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700860 StartTransferArgs start_xfer_args =
861 { fetcher.get(), LocalServerUrlForPath(url) };
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700862
Jay Srinivasan135a58b2012-07-13 12:46:49 -0700863 g_timeout_add(0, StartTransfer, &start_xfer_args);
864 g_main_loop_run(loop);
865 if (expected_successful) {
866 // verify the data we get back
867 ASSERT_EQ(kMediumLength, delegate.data.size());
868 for (int i = 0; i < kMediumLength; i += 10) {
869 // Assert so that we don't flood the screen w/ EXPECT errors on failure.
870 ASSERT_EQ(delegate.data.substr(i, 10), "abcdefghij");
871 }
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700872 }
873 }
874 g_main_loop_unref(loop);
875}
876} // namespace {}
877
878TYPED_TEST(HttpFetcherTest, SimpleRedirectTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800879 if (this->test_.IsMock())
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700880 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800881
882 scoped_ptr<HttpServer> server(this->test_.CreateServer());
883 ASSERT_TRUE(server->started_);
884
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700885 for (size_t c = 0; c < arraysize(kRedirectCodes); ++c) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800886 const string url = base::StringPrintf("/redirect/%d/download/%d",
887 kRedirectCodes[c],
888 kMediumLength);
889 RedirectTest(true, url, this->test_.NewLargeFetcher());
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700890 }
891}
892
893TYPED_TEST(HttpFetcherTest, MaxRedirectTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800894 if (this->test_.IsMock())
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700895 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800896
897 scoped_ptr<HttpServer> server(this->test_.CreateServer());
898 ASSERT_TRUE(server->started_);
899
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700900 string url;
901 for (int r = 0; r < LibcurlHttpFetcher::kMaxRedirects; r++) {
902 url += base::StringPrintf("/redirect/%d",
903 kRedirectCodes[r % arraysize(kRedirectCodes)]);
904 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800905 url += base::StringPrintf("/download/%d", kMediumLength);
906 RedirectTest(true, url, this->test_.NewLargeFetcher());
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700907}
908
909TYPED_TEST(HttpFetcherTest, BeyondMaxRedirectTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800910 if (this->test_.IsMock())
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700911 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800912
913 scoped_ptr<HttpServer> server(this->test_.CreateServer());
914 ASSERT_TRUE(server->started_);
915
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700916 string url;
917 for (int r = 0; r < LibcurlHttpFetcher::kMaxRedirects + 1; r++) {
918 url += base::StringPrintf("/redirect/%d",
919 kRedirectCodes[r % arraysize(kRedirectCodes)]);
920 }
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800921 url += base::StringPrintf("/download/%d", kMediumLength);
922 RedirectTest(false, url, this->test_.NewLargeFetcher());
Darin Petkov41c2fcf2010-08-25 13:14:48 -0700923}
924
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700925namespace {
926class MultiHttpFetcherTestDelegate : public HttpFetcherDelegate {
927 public:
928 MultiHttpFetcherTestDelegate(int expected_response_code)
929 : expected_response_code_(expected_response_code) {}
Gilad Arnolde4ad2502011-12-29 17:08:54 -0800930
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700931 virtual void ReceivedBytes(HttpFetcher* fetcher,
932 const char* bytes, int length) {
Darin Petkov9ce452b2010-11-17 14:33:28 -0800933 EXPECT_EQ(fetcher, fetcher_.get());
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700934 data.append(bytes, length);
935 }
Gilad Arnolde4ad2502011-12-29 17:08:54 -0800936
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700937 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
Darin Petkov9ce452b2010-11-17 14:33:28 -0800938 EXPECT_EQ(fetcher, fetcher_.get());
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800939 EXPECT_EQ(expected_response_code_ != kHttpResponseUndefined, successful);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700940 if (expected_response_code_ != 0)
941 EXPECT_EQ(expected_response_code_, fetcher->http_response_code());
Darin Petkov9ce452b2010-11-17 14:33:28 -0800942 // Destroy the fetcher (because we're allowed to).
943 fetcher_.reset(NULL);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700944 g_main_loop_quit(loop_);
945 }
Gilad Arnolde4ad2502011-12-29 17:08:54 -0800946
Darin Petkov9ce452b2010-11-17 14:33:28 -0800947 virtual void TransferTerminated(HttpFetcher* fetcher) {
948 ADD_FAILURE();
949 }
Gilad Arnolde4ad2502011-12-29 17:08:54 -0800950
Darin Petkov9ce452b2010-11-17 14:33:28 -0800951 scoped_ptr<HttpFetcher> fetcher_;
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700952 int expected_response_code_;
953 string data;
954 GMainLoop* loop_;
955};
956
957void MultiTest(HttpFetcher* fetcher_in,
958 const string& url,
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800959 const vector<pair<off_t, off_t> >& ranges,
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700960 const string& expected_prefix,
961 off_t expected_size,
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800962 HttpResponseCode expected_response_code) {
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700963 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
964 {
965 MultiHttpFetcherTestDelegate delegate(expected_response_code);
966 delegate.loop_ = loop;
Darin Petkov9ce452b2010-11-17 14:33:28 -0800967 delegate.fetcher_.reset(fetcher_in);
Jay Srinivasan43488792012-06-19 00:25:31 -0700968
969 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
970 fetcher_in->GetSystemState()->GetConnectionManager());
971 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
972 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetWifi), Return(true)));
973 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetWifi))
974 .WillRepeatedly(Return(true));
975 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetWifi))
976 .WillRepeatedly(Return(flimflam::kTypeWifi));
977
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800978 MultiRangeHttpFetcher* multi_fetcher =
979 dynamic_cast<MultiRangeHttpFetcher*>(fetcher_in);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700980 ASSERT_TRUE(multi_fetcher);
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800981 multi_fetcher->ClearRanges();
982 for (vector<pair<off_t, off_t> >::const_iterator it = ranges.begin(),
983 e = ranges.end(); it != e; ++it) {
Gilad Arnolde4ad2502011-12-29 17:08:54 -0800984 std::string tmp_str = StringPrintf("%jd+", it->first);
985 if (it->second > 0) {
986 base::StringAppendF(&tmp_str, "%jd", it->second);
987 multi_fetcher->AddRange(it->first, it->second);
988 } else {
989 base::StringAppendF(&tmp_str, "?");
990 multi_fetcher->AddRange(it->first);
991 }
992 LOG(INFO) << "added range: " << tmp_str;
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800993 }
Darin Petkovfc7a0ce2010-10-25 10:38:37 -0700994 multi_fetcher->SetBuildType(false);
Darin Petkov9ce452b2010-11-17 14:33:28 -0800995 multi_fetcher->set_delegate(&delegate);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700996
Darin Petkov9ce452b2010-11-17 14:33:28 -0800997 StartTransferArgs start_xfer_args = {multi_fetcher, url};
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -0700998
999 g_timeout_add(0, StartTransfer, &start_xfer_args);
1000 g_main_loop_run(loop);
1001
1002 EXPECT_EQ(expected_size, delegate.data.size());
1003 EXPECT_EQ(expected_prefix,
1004 string(delegate.data.data(), expected_prefix.size()));
1005 }
1006 g_main_loop_unref(loop);
1007}
1008} // namespace {}
1009
Darin Petkov9ce452b2010-11-17 14:33:28 -08001010TYPED_TEST(HttpFetcherTest, MultiHttpFetcherSimpleTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001011 if (!this->test_.IsMulti())
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001012 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001013
1014 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1015 ASSERT_TRUE(server->started_);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001016
Andrew de los Reyes819fef22010-12-17 11:33:58 -08001017 vector<pair<off_t, off_t> > ranges;
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001018 ranges.push_back(make_pair(0, 25));
Gilad Arnolde4ad2502011-12-29 17:08:54 -08001019 ranges.push_back(make_pair(99, 0));
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001020 MultiTest(this->test_.NewLargeFetcher(),
1021 this->test_.BigUrl(),
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001022 ranges,
1023 "abcdefghijabcdefghijabcdejabcdefghijabcdef",
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001024 kBigLength - (99 - 25),
1025 kHttpResponsePartialContent);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001026}
1027
1028TYPED_TEST(HttpFetcherTest, MultiHttpFetcherLengthLimitTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001029 if (!this->test_.IsMulti())
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001030 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001031
1032 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1033 ASSERT_TRUE(server->started_);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001034
Andrew de los Reyes819fef22010-12-17 11:33:58 -08001035 vector<pair<off_t, off_t> > ranges;
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001036 ranges.push_back(make_pair(0, 24));
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001037 MultiTest(this->test_.NewLargeFetcher(),
1038 this->test_.BigUrl(),
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001039 ranges,
1040 "abcdefghijabcdefghijabcd",
1041 24,
Gilad Arnolde4ad2502011-12-29 17:08:54 -08001042 kHttpResponsePartialContent);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001043}
1044
1045TYPED_TEST(HttpFetcherTest, MultiHttpFetcherMultiEndTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001046 if (!this->test_.IsMulti())
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001047 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001048
1049 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1050 ASSERT_TRUE(server->started_);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001051
Andrew de los Reyes819fef22010-12-17 11:33:58 -08001052 vector<pair<off_t, off_t> > ranges;
Gilad Arnolde4ad2502011-12-29 17:08:54 -08001053 ranges.push_back(make_pair(kBigLength - 2, 0));
1054 ranges.push_back(make_pair(kBigLength - 3, 0));
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001055 MultiTest(this->test_.NewLargeFetcher(),
1056 this->test_.BigUrl(),
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001057 ranges,
1058 "ijhij",
1059 5,
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001060 kHttpResponsePartialContent);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001061}
1062
1063TYPED_TEST(HttpFetcherTest, MultiHttpFetcherInsufficientTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001064 if (!this->test_.IsMulti())
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001065 return;
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001066
1067 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1068 ASSERT_TRUE(server->started_);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001069
Andrew de los Reyes819fef22010-12-17 11:33:58 -08001070 vector<pair<off_t, off_t> > ranges;
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001071 ranges.push_back(make_pair(kBigLength - 2, 4));
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001072 for (int i = 0; i < 2; ++i) {
Andrew de los Reyes819fef22010-12-17 11:33:58 -08001073 LOG(INFO) << "i = " << i;
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001074 MultiTest(this->test_.NewLargeFetcher(),
1075 this->test_.BigUrl(),
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001076 ranges,
1077 "ij",
1078 2,
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001079 kHttpResponseUndefined);
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -07001080 ranges.push_back(make_pair(0, 5));
1081 }
1082}
1083
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001084// Issue #18143: when a fetch of a secondary chunk out of a chain, then it
1085// should retry with other proxies listed before giving up.
1086//
1087// (1) successful recovery: The offset fetch will fail twice but succeed with
1088// the third proxy.
1089TYPED_TEST(HttpFetcherTest, MultiHttpFetcherErrorIfOffsetRecoverableTest) {
1090 if (!this->test_.IsMulti())
1091 return;
1092
1093 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1094 ASSERT_TRUE(server->started_);
1095
1096 vector<pair<off_t, off_t> > ranges;
1097 ranges.push_back(make_pair(0, 25));
Gilad Arnolde4ad2502011-12-29 17:08:54 -08001098 ranges.push_back(make_pair(99, 0));
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001099 MultiTest(this->test_.NewLargeFetcher(3),
1100 LocalServerUrlForPath(base::StringPrintf("/error-if-offset/%d/2",
1101 kBigLength)),
1102 ranges,
1103 "abcdefghijabcdefghijabcdejabcdefghijabcdef",
1104 kBigLength - (99 - 25),
1105 kHttpResponsePartialContent);
1106}
1107
1108// (2) unsuccessful recovery: The offset fetch will fail repeatedly. The
1109// fetcher will signal a (failed) completed transfer to the delegate.
1110TYPED_TEST(HttpFetcherTest, MultiHttpFetcherErrorIfOffsetUnrecoverableTest) {
1111 if (!this->test_.IsMulti())
1112 return;
1113
1114 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1115 ASSERT_TRUE(server->started_);
1116
1117 vector<pair<off_t, off_t> > ranges;
1118 ranges.push_back(make_pair(0, 25));
Gilad Arnolde4ad2502011-12-29 17:08:54 -08001119 ranges.push_back(make_pair(99, 0));
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001120 MultiTest(this->test_.NewLargeFetcher(2),
1121 LocalServerUrlForPath(base::StringPrintf("/error-if-offset/%d/3",
1122 kBigLength)),
1123 ranges,
1124 "abcdefghijabcdefghijabcde", // only received the first chunk
1125 25,
1126 kHttpResponseUndefined);
1127}
1128
1129
1130
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001131namespace {
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001132class BlockedTransferTestDelegate : public HttpFetcherDelegate {
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001133 public:
1134 virtual void ReceivedBytes(HttpFetcher* fetcher,
1135 const char* bytes, int length) {
1136 ADD_FAILURE();
1137 }
1138 virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
1139 EXPECT_FALSE(successful);
1140 g_main_loop_quit(loop_);
1141 }
Darin Petkov9ce452b2010-11-17 14:33:28 -08001142 virtual void TransferTerminated(HttpFetcher* fetcher) {
1143 ADD_FAILURE();
1144 }
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001145 GMainLoop* loop_;
1146};
1147
1148} // namespace
1149
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001150TYPED_TEST(HttpFetcherTest, BlockedTransferTest) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001151 if (this->test_.IsMock() || this->test_.IsMulti())
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001152 return;
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001153
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001154 for (int i = 0; i < 2; i++) {
Gilad Arnold9bedeb52011-11-17 16:19:57 -08001155 scoped_ptr<HttpServer> server(this->test_.CreateServer());
1156 ASSERT_TRUE(server->started_);
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001157
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001158 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
Jay Srinivasan135a58b2012-07-13 12:46:49 -07001159 {
1160 BlockedTransferTestDelegate delegate;
1161 delegate.loop_ = loop;
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001162
Jay Srinivasan135a58b2012-07-13 12:46:49 -07001163 bool is_allowed = (i != 0);
1164 scoped_ptr<HttpFetcher> fetcher(this->test_.NewLargeFetcher());
1165 MockConnectionManager* mock_cm = dynamic_cast<MockConnectionManager*>(
1166 fetcher->GetSystemState()->GetConnectionManager());
1167 EXPECT_CALL(*mock_cm, GetConnectionType(_,_))
1168 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetWifi), Return(true)));
1169 EXPECT_CALL(*mock_cm, IsUpdateAllowedOver(kNetWifi))
1170 .WillRepeatedly(Return(is_allowed));
1171 EXPECT_CALL(*mock_cm, StringForConnectionType(kNetWifi))
1172 .WillRepeatedly(Return(flimflam::kTypeWifi));
Jay Srinivasan43488792012-06-19 00:25:31 -07001173
Jay Srinivasan135a58b2012-07-13 12:46:49 -07001174 bool is_official_build = (i == 1);
1175 LOG(INFO) << "is_update_allowed_over_connection: " << is_allowed;
1176 LOG(INFO) << "is_official_build: " << is_official_build;
1177 fetcher->SetBuildType(is_official_build);
1178 fetcher->set_delegate(&delegate);
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001179
Jay Srinivasan135a58b2012-07-13 12:46:49 -07001180 StartTransferArgs start_xfer_args =
1181 { fetcher.get(), LocalServerUrlForPath(this->test_.SmallUrl()) };
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001182
Jay Srinivasan135a58b2012-07-13 12:46:49 -07001183 g_timeout_add(0, StartTransfer, &start_xfer_args);
1184 g_main_loop_run(loop);
1185 }
Darin Petkovfc7a0ce2010-10-25 10:38:37 -07001186 g_main_loop_unref(loop);
1187 }
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001188}
1189
rspangler@google.com49fdf182009-10-10 00:57:34 +00001190} // namespace chromeos_update_engine