http_fetcher_unittest.cc revision 9bbd18757660a09fb8831147b17916df8a3212e5
149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Copyright (c) 2009 The Chromium OS Authors. All rights reserved. 249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Use of this source code is governed by a BSD-style license that can be 349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// found in the LICENSE file. 449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <unistd.h> 6c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#include <string> 7c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#include <vector> 849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <base/scoped_ptr.h> 949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <glib.h> 1049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <gtest/gtest.h> 11c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#include "chromeos/obsolete_logging.h" 1249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "update_engine/libcurl_http_fetcher.h" 1349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "update_engine/mock_http_fetcher.h" 1449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 15c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comusing std::string; 16c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comusing std::vector; 17c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 1849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine { 1949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace { 2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// WARNING, if you update this, you must also update test_http_server.py 2249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comconst char* const kServerPort = "8080"; 2349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comstring LocalServerUrlForPath(const string& path) { 2449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return string("http://127.0.0.1:") + kServerPort + path; 2549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 2649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 2749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 2849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comtemplate <typename T> 2949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass HttpFetcherTest : public ::testing::Test { 3049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 3149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* NewLargeFetcher() = 0; 3249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* NewSmallFetcher() = 0; 3349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com string BigUrl() const = 0; 3449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com string SmallUrl() const = 0; 35c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com bool IsMock() const = 0; 3649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 3749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass NullHttpServer { 3949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 4049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com NullHttpServer() : started_(true) {} 4149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ~NullHttpServer() {} 4249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com bool started_; 4349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 4449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 4549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 4649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comtemplate <> 4749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass HttpFetcherTest<MockHttpFetcher> : public ::testing::Test { 4849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 4949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* NewLargeFetcher() { 5049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com vector<char> big_data(1000000); 5149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return new MockHttpFetcher(big_data.data(), big_data.size()); 5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 5349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* NewSmallFetcher() { 5449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return new MockHttpFetcher("x", 1); 5549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 5649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com string BigUrl() const { 5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return "unused://unused"; 5849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 5949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com string SmallUrl() const { 6049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return "unused://unused"; 6149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 62c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com bool IsMock() const { return true; } 6349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com typedef NullHttpServer HttpServer; 6408c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes void IgnoreServerAborting(HttpServer* server) const {} 6549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 6649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 6749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass PythonHttpServer { 6849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 6949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com PythonHttpServer() { 70c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com char *argv[2] = {strdup("./test_http_server"), NULL}; 7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GError *err; 7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com started_ = false; 7308c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes validate_quit_ = true; 7449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com if (!g_spawn_async(NULL, 7549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com argv, 7649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com NULL, 7749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com G_SPAWN_DO_NOT_REAP_CHILD, 7849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com NULL, 7949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com NULL, 8049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com &pid_, 8149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com &err)) { 8249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return; 8349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 8449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com int rc = 1; 853270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes int tries = 10; 863270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes started_ = true; 8749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com while (0 != rc) { 883270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes LOG(INFO) << "running wget to start"; 8949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com rc = system((string("wget --output-document=/dev/null ") + 9049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com LocalServerUrlForPath("/test")).c_str()); 913270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes LOG(INFO) << "done running wget to start"; 9249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com usleep(10 * 1000); // 10 ms 933270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes tries--; 943270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes if (tries == 0) { 953270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes LOG(ERROR) << "Unable to start server."; 963270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes started_ = false; 973270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes break; 983270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes } 9949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 10049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com free(argv[0]); 10149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return; 10249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 10349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ~PythonHttpServer() { 10449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com if (!started_) 10549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return; 10649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // request that the server exit itself 1073270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes LOG(INFO) << "running wget to exit"; 10808c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes int rc = system((string("wget -t 1 --output-document=/dev/null ") + 1099bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes LocalServerUrlForPath("/quitquitquit")).c_str()); 1103270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes LOG(INFO) << "done running wget to exit"; 11108c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes if (validate_quit_) 11208c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes EXPECT_EQ(0, rc); 11349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com waitpid(pid_, NULL, 0); 11449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 11549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GPid pid_; 11649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com bool started_; 11708c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes bool validate_quit_; 11849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 11949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 12049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comtemplate <> 12149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass HttpFetcherTest<LibcurlHttpFetcher> : public ::testing::Test { 12249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 12349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* NewLargeFetcher() { 12449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com LibcurlHttpFetcher *ret = new LibcurlHttpFetcher; 1253270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes ret->set_idle_ms(1000); // speeds up test execution 12649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return ret; 12749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 12849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* NewSmallFetcher() { 12949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return NewLargeFetcher(); 13049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 13149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com string BigUrl() const { 13249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return LocalServerUrlForPath("/big"); 13349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 13449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com string SmallUrl() const { 13549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return LocalServerUrlForPath("/foo"); 13649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 137c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com bool IsMock() const { return false; } 13849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com typedef PythonHttpServer HttpServer; 13908c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes void IgnoreServerAborting(HttpServer* server) const { 14008c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes PythonHttpServer *pyserver = reinterpret_cast<PythonHttpServer*>(server); 14108c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes pyserver->validate_quit_ = false; 14208c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes } 14349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 14449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 14549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comtypedef ::testing::Types<LibcurlHttpFetcher, MockHttpFetcher> 14649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcherTestTypes; 14749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTYPED_TEST_CASE(HttpFetcherTest, HttpFetcherTestTypes); 14849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 14949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace { 15049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass HttpFetcherTestDelegate : public HttpFetcherDelegate { 151c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com public: 15249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void ReceivedBytes(HttpFetcher* fetcher, 15349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com const char* bytes, int length) { 15449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com char str[length + 1]; 15549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com memset(str, 0, length + 1); 15649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com memcpy(str, bytes, length); 15749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 15849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { 15949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_quit(loop_); 16049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 16149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GMainLoop* loop_; 16249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 163c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 164c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comstruct StartTransferArgs { 165c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com HttpFetcher *http_fetcher; 166c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com string url; 167c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com}; 168c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 169c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comgboolean StartTransfer(gpointer data) { 170c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com StartTransferArgs *args = reinterpret_cast<StartTransferArgs*>(data); 171c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com args->http_fetcher->BeginTransfer(args->url); 172c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com return FALSE; 173c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com} 17449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} // namespace {} 17549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 17649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTYPED_TEST(HttpFetcherTest, SimpleTest) { 1779bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 17849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com { 17949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcherTestDelegate delegate; 18049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.loop_ = loop; 18149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com scoped_ptr<HttpFetcher> fetcher(this->NewSmallFetcher()); 18249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher->set_delegate(&delegate); 18349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 18449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com typename TestFixture::HttpServer server; 18549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ASSERT_TRUE(server.started_); 18649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 187c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com StartTransferArgs start_xfer_args = {fetcher.get(), this->SmallUrl()}; 188c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 189c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com g_timeout_add(0, StartTransfer, &start_xfer_args); 19049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_run(loop); 19149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 19249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_unref(loop); 19349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 19449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 1953270f7411f55b872db385d0edffdfed18a684121Andrew de los ReyesTYPED_TEST(HttpFetcherTest, SimpleBigTest) { 1969bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 1973270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes { 1983270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes HttpFetcherTestDelegate delegate; 1993270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes delegate.loop_ = loop; 2003270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes scoped_ptr<HttpFetcher> fetcher(this->NewLargeFetcher()); 2013270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes fetcher->set_delegate(&delegate); 2023270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes 2033270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes typename TestFixture::HttpServer server; 2043270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes ASSERT_TRUE(server.started_); 2053270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes 2063270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes StartTransferArgs start_xfer_args = {fetcher.get(), this->BigUrl()}; 2073270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes 2083270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes g_timeout_add(0, StartTransfer, &start_xfer_args); 2093270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes g_main_loop_run(loop); 2103270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes } 2113270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes g_main_loop_unref(loop); 2123270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes} 2133270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes 21449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace { 21549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass PausingHttpFetcherTestDelegate : public HttpFetcherDelegate { 21649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 21749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void ReceivedBytes(HttpFetcher* fetcher, 21849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com const char* bytes, int length) { 21949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com char str[length + 1]; 22049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com memset(str, 0, length + 1); 22149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com memcpy(str, bytes, length); 22249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com CHECK(!paused_); 22349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com paused_ = true; 22449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher->Pause(); 22549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 22649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { 22749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_quit(loop_); 22849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 22949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com void Unpause() { 23049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com CHECK(paused_); 23149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com paused_ = false; 23249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher_->Unpause(); 23349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 23449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com bool paused_; 23549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* fetcher_; 23649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GMainLoop* loop_; 23749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 23849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 23949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comgboolean UnpausingTimeoutCallback(gpointer data) { 24049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com PausingHttpFetcherTestDelegate *delegate = 24149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com reinterpret_cast<PausingHttpFetcherTestDelegate*>(data); 24249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com if (delegate->paused_) 24349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate->Unpause(); 24449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return TRUE; 24549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 24649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} // namespace {} 24749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 24849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTYPED_TEST(HttpFetcherTest, PauseTest) { 2499bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 25049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com { 25149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com PausingHttpFetcherTestDelegate delegate; 25249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com scoped_ptr<HttpFetcher> fetcher(this->NewLargeFetcher()); 25349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.paused_ = false; 25449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.loop_ = loop; 25549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.fetcher_ = fetcher.get(); 25649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher->set_delegate(&delegate); 25749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 25849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com typename TestFixture::HttpServer server; 25949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ASSERT_TRUE(server.started_); 26049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GSource* timeout_source_; 26149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com timeout_source_ = g_timeout_source_new(0); // ms 26249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_source_set_callback(timeout_source_, UnpausingTimeoutCallback, &delegate, 26349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com NULL); 26449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_source_attach(timeout_source_, NULL); 26549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher->BeginTransfer(this->BigUrl()); 26649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 26749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_run(loop); 26849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_source_destroy(timeout_source_); 26949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 27049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_unref(loop); 27149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 27249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 27349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace { 27449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass AbortingHttpFetcherTestDelegate : public HttpFetcherDelegate { 27549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 27649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void ReceivedBytes(HttpFetcher* fetcher, 27749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com const char* bytes, int length) {} 27849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { 27949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com CHECK(false); // We should never get here 28049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_quit(loop_); 28149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 28249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com void TerminateTransfer() { 28349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com CHECK(once_); 28449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com once_ = false; 28549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher_->TerminateTransfer(); 28649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 28749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com void EndLoop() { 28849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_quit(loop_); 28949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 29049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com bool once_; 29149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com HttpFetcher* fetcher_; 29249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GMainLoop* loop_; 29349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 29449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 29549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comgboolean AbortingTimeoutCallback(gpointer data) { 29649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com AbortingHttpFetcherTestDelegate *delegate = 29749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com reinterpret_cast<AbortingHttpFetcherTestDelegate*>(data); 29849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com if (delegate->once_) { 29949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate->TerminateTransfer(); 30049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return TRUE; 30149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } else { 30249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate->EndLoop(); 30349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return FALSE; 30449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 30549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 30649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} // namespace {} 30749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 30849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTYPED_TEST(HttpFetcherTest, AbortTest) { 3099bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 31049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com { 31149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com AbortingHttpFetcherTestDelegate delegate; 31249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com scoped_ptr<HttpFetcher> fetcher(this->NewLargeFetcher()); 31349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.once_ = true; 31449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.loop_ = loop; 31549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate.fetcher_ = fetcher.get(); 31649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher->set_delegate(&delegate); 31749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 31849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com typename TestFixture::HttpServer server; 31908c4e27baaa7b40732b99642e1f21bf889d022efAndrew de los Reyes this->IgnoreServerAborting(&server); 32049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ASSERT_TRUE(server.started_); 32149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com GSource* timeout_source_; 32249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com timeout_source_ = g_timeout_source_new(0); // ms 32349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_source_set_callback(timeout_source_, AbortingTimeoutCallback, &delegate, 32449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com NULL); 32549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_source_attach(timeout_source_, NULL); 32649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com fetcher->BeginTransfer(this->BigUrl()); 32749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 32849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_run(loop); 32949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_source_destroy(timeout_source_); 33049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 33149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com g_main_loop_unref(loop); 33249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 33349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 334c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comnamespace { 335c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comclass FlakyHttpFetcherTestDelegate : public HttpFetcherDelegate { 336c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com public: 337c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com virtual void ReceivedBytes(HttpFetcher* fetcher, 338c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com const char* bytes, int length) { 339c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com data.append(bytes, length); 340c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com } 341c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { 342c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com g_main_loop_quit(loop_); 343c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com } 344c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com string data; 345c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com GMainLoop* loop_; 346c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com}; 347c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com} // namespace {} 348c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 349c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.comTYPED_TEST(HttpFetcherTest, FlakyTest) { 350c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com if (this->IsMock()) 351c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com return; 3529bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 353c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com { 354c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com FlakyHttpFetcherTestDelegate delegate; 355c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com delegate.loop_ = loop; 356c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com scoped_ptr<HttpFetcher> fetcher(this->NewSmallFetcher()); 357c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com fetcher->set_delegate(&delegate); 358c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 359c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com typename TestFixture::HttpServer server; 360c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com ASSERT_TRUE(server.started_); 361c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 362c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com StartTransferArgs start_xfer_args = { 363c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com fetcher.get(), 364c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com LocalServerUrlForPath("/flaky") 365c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com }; 366c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 367c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com g_timeout_add(0, StartTransfer, &start_xfer_args); 368c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com g_main_loop_run(loop); 369c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 370c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com // verify the data we get back 371c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com ASSERT_EQ(100000, delegate.data.size()); 372c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com for (int i = 0; i < 100000; i += 10) { 373c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com // Assert so that we don't flood the screen w/ EXPECT errors on failure. 374c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com ASSERT_EQ(delegate.data.substr(i, 10), "abcdefghij"); 375c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com } 376c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com } 377c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com g_main_loop_unref(loop); 378c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com} 379c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com 3809bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyesnamespace { 3819bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyesclass FailureHttpFetcherTestDelegate : public HttpFetcherDelegate { 3829bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes public: 3839bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes FailureHttpFetcherTestDelegate() : loop_(NULL), server_(NULL) {} 3849bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes virtual void ReceivedBytes(HttpFetcher* fetcher, 3859bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes const char* bytes, int length) { 3869bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes if (server_) { 3879bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes LOG(INFO) << "Stopping server"; 3889bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes delete server_; 3899bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes LOG(INFO) << "server stopped"; 3909bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes server_ = NULL; 3919bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes } 3929bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes } 3939bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { 3949bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes EXPECT_FALSE(successful); 3959bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_main_loop_quit(loop_); 3969bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes } 3979bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop_; 3989bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes PythonHttpServer* server_; 3999bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes}; 4009bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes} // namespace {} 4019bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4029bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4039bbd18757660a09fb8831147b17916df8a3212e5Andrew de los ReyesTYPED_TEST(HttpFetcherTest, FailureTest) { 4049bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes if (this->IsMock()) 4059bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes return; 4069bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 4079bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes { 4089bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes FailureHttpFetcherTestDelegate delegate; 4099bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes delegate.loop_ = loop; 4109bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes scoped_ptr<HttpFetcher> fetcher(this->NewSmallFetcher()); 4119bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes fetcher->set_delegate(&delegate); 4129bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4139bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes StartTransferArgs start_xfer_args = { 4149bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes fetcher.get(), 4159bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes LocalServerUrlForPath(this->SmallUrl()) 4169bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes }; 4179bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4189bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_timeout_add(0, StartTransfer, &start_xfer_args); 4199bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_main_loop_run(loop); 4209bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4219bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes // Exiting and testing happens in the delegate 4229bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes } 4239bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_main_loop_unref(loop); 4249bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes} 4259bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4269bbd18757660a09fb8831147b17916df8a3212e5Andrew de los ReyesTYPED_TEST(HttpFetcherTest, ServerDiesTest) { 4279bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes if (this->IsMock()) 4289bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes return; 4299bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 4309bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes { 4319bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes FailureHttpFetcherTestDelegate delegate; 4329bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes delegate.loop_ = loop; 4339bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes delegate.server_ = new PythonHttpServer; 4349bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes scoped_ptr<HttpFetcher> fetcher(this->NewSmallFetcher()); 4359bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes fetcher->set_delegate(&delegate); 4369bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4379bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes StartTransferArgs start_xfer_args = { 4389bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes fetcher.get(), 4399bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes LocalServerUrlForPath("/flaky") 4409bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes }; 4419bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4429bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_timeout_add(0, StartTransfer, &start_xfer_args); 4439bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_main_loop_run(loop); 4449bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 4459bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes // Exiting and testing happens in the delegate 4469bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes } 4479bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes g_main_loop_unref(loop); 4489bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes} 4499bbd18757660a09fb8831147b17916df8a3212e5Andrew de los Reyes 45049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} // namespace chromeos_update_engine 451