Index: src/platform/update_engine/http_fetcher_unittest.cc |
diff --git a/src/platform/update_engine/http_fetcher_unittest.cc b/src/platform/update_engine/http_fetcher_unittest.cc |
index f1e9c26f1c3f101e7ab6457609b7c5e6f4e7d334..8d9c3f83d3f9311eb4022d936219798d3736b1e9 100644 |
--- a/src/platform/update_engine/http_fetcher_unittest.cc |
+++ b/src/platform/update_engine/http_fetcher_unittest.cc |
@@ -3,13 +3,18 @@ |
// found in the LICENSE file. |
#include <unistd.h> |
+#include <string> |
+#include <vector> |
#include <base/scoped_ptr.h> |
#include <glib.h> |
-#include <base/logging.h> |
#include <gtest/gtest.h> |
+#include "chromeos/obsolete_logging.h" |
#include "update_engine/libcurl_http_fetcher.h" |
#include "update_engine/mock_http_fetcher.h" |
+using std::string; |
+using std::vector; |
+ |
namespace chromeos_update_engine { |
namespace { |
@@ -27,6 +32,7 @@ class HttpFetcherTest : public ::testing::Test { |
HttpFetcher* NewSmallFetcher() = 0; |
string BigUrl() const = 0; |
string SmallUrl() const = 0; |
+ bool IsMock() const = 0; |
}; |
class NullHttpServer { |
@@ -53,13 +59,14 @@ class HttpFetcherTest<MockHttpFetcher> : public ::testing::Test { |
string SmallUrl() const { |
return "unused://unused"; |
} |
+ bool IsMock() const { return true; } |
typedef NullHttpServer HttpServer; |
}; |
class PythonHttpServer { |
public: |
PythonHttpServer() { |
- char *argv[2] = {strdup("./test_http_server.py"), NULL}; |
+ char *argv[2] = {strdup("./test_http_server"), NULL}; |
GError *err; |
started_ = false; |
if (!g_spawn_async(NULL, |
@@ -74,7 +81,6 @@ class PythonHttpServer { |
} |
int rc = 1; |
while (0 != rc) { |
- |
rc = system((string("wget --output-document=/dev/null ") + |
LocalServerUrlForPath("/test")).c_str()); |
usleep(10 * 1000); // 10 ms |
@@ -112,6 +118,7 @@ class HttpFetcherTest<LibcurlHttpFetcher> : public ::testing::Test { |
string SmallUrl() const { |
return LocalServerUrlForPath("/foo"); |
} |
+ bool IsMock() const { return false; } |
typedef PythonHttpServer HttpServer; |
}; |
@@ -121,7 +128,7 @@ TYPED_TEST_CASE(HttpFetcherTest, HttpFetcherTestTypes); |
namespace { |
class HttpFetcherTestDelegate : public HttpFetcherDelegate { |
-public: |
+ public: |
virtual void ReceivedBytes(HttpFetcher* fetcher, |
const char* bytes, int length) { |
char str[length + 1]; |
@@ -133,6 +140,17 @@ public: |
} |
GMainLoop* loop_; |
}; |
+ |
+struct StartTransferArgs { |
+ HttpFetcher *http_fetcher; |
+ string url; |
+}; |
+ |
+gboolean StartTransfer(gpointer data) { |
+ StartTransferArgs *args = reinterpret_cast<StartTransferArgs*>(data); |
+ args->http_fetcher->BeginTransfer(args->url); |
+ return FALSE; |
+} |
} // namespace {} |
TYPED_TEST(HttpFetcherTest, SimpleTest) { |
@@ -146,7 +164,9 @@ TYPED_TEST(HttpFetcherTest, SimpleTest) { |
typename TestFixture::HttpServer server; |
ASSERT_TRUE(server.started_); |
- fetcher->BeginTransfer(this->SmallUrl()); |
+ StartTransferArgs start_xfer_args = {fetcher.get(), this->SmallUrl()}; |
+ |
+ g_timeout_add(0, StartTransfer, &start_xfer_args); |
g_main_loop_run(loop); |
} |
g_main_loop_unref(loop); |
@@ -158,13 +178,11 @@ class PausingHttpFetcherTestDelegate : public HttpFetcherDelegate { |
virtual void ReceivedBytes(HttpFetcher* fetcher, |
const char* bytes, int length) { |
char str[length + 1]; |
- LOG(INFO) << "got " << length << " bytes"; |
memset(str, 0, length + 1); |
memcpy(str, bytes, length); |
CHECK(!paused_); |
paused_ = true; |
fetcher->Pause(); |
- LOG(INFO) << "calling pause"; |
} |
virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { |
g_main_loop_quit(loop_); |
@@ -173,7 +191,6 @@ class PausingHttpFetcherTestDelegate : public HttpFetcherDelegate { |
CHECK(paused_); |
paused_ = false; |
fetcher_->Unpause(); |
- LOG(INFO) << "calling unpause"; |
} |
bool paused_; |
HttpFetcher* fetcher_; |
@@ -274,4 +291,50 @@ TYPED_TEST(HttpFetcherTest, AbortTest) { |
g_main_loop_unref(loop); |
} |
+namespace { |
+class FlakyHttpFetcherTestDelegate : public HttpFetcherDelegate { |
+ public: |
+ virtual void ReceivedBytes(HttpFetcher* fetcher, |
+ const char* bytes, int length) { |
+ data.append(bytes, length); |
+ } |
+ virtual void TransferComplete(HttpFetcher* fetcher, bool successful) { |
+ g_main_loop_quit(loop_); |
+ } |
+ string data; |
+ GMainLoop* loop_; |
+}; |
+} // namespace {} |
+ |
+TYPED_TEST(HttpFetcherTest, FlakyTest) { |
+ if (this->IsMock()) |
+ return; |
+ GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE); |
+ { |
+ FlakyHttpFetcherTestDelegate delegate; |
+ delegate.loop_ = loop; |
+ scoped_ptr<HttpFetcher> fetcher(this->NewSmallFetcher()); |
+ fetcher->set_delegate(&delegate); |
+ |
+ typename TestFixture::HttpServer server; |
+ ASSERT_TRUE(server.started_); |
+ |
+ StartTransferArgs start_xfer_args = { |
+ fetcher.get(), |
+ LocalServerUrlForPath("/flaky") |
+ }; |
+ |
+ g_timeout_add(0, StartTransfer, &start_xfer_args); |
+ g_main_loop_run(loop); |
+ |
+ // verify the data we get back |
+ ASSERT_EQ(100000, delegate.data.size()); |
+ for (int i = 0; i < 100000; i += 10) { |
+ // Assert so that we don't flood the screen w/ EXPECT errors on failure. |
+ ASSERT_EQ(delegate.data.substr(i, 10), "abcdefghij"); |
+ } |
+ } |
+ g_main_loop_unref(loop); |
+} |
+ |
} // namespace chromeos_update_engine |