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