summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/glue/http_bridge_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/glue/http_bridge_unittest.cc')
-rw-r--r--chrome/browser/sync/glue/http_bridge_unittest.cc167
1 files changed, 167 insertions, 0 deletions
diff --git a/chrome/browser/sync/glue/http_bridge_unittest.cc b/chrome/browser/sync/glue/http_bridge_unittest.cc
new file mode 100644
index 0000000..4dd9a9b
--- /dev/null
+++ b/chrome/browser/sync/glue/http_bridge_unittest.cc
@@ -0,0 +1,167 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#ifdef CHROME_PERSONALIZATION
+
+#include "base/thread.h"
+#include "chrome/browser/sync/glue/http_bridge.h"
+#include "net/url_request/url_request_unittest.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using browser_sync::HttpBridge;
+
+namespace {
+// TODO(timsteele): Should use PathService here. See Chromium Issue 3113.
+const char16 kDocRoot[] = L"chrome/test/data";
+}
+
+class HttpBridgeTest : public testing::Test {
+ public:
+ HttpBridgeTest() : io_thread_("HttpBridgeTest IO thread") {
+ }
+
+ virtual void SetUp() {
+ base::Thread::Options options;
+ options.message_loop_type = MessageLoop::TYPE_IO;
+ io_thread_.StartWithOptions(options);
+ }
+
+ virtual void TearDown() {
+ io_thread_.Stop();
+ }
+
+ HttpBridge* BuildBridge() {
+ if (!request_context_) {
+ request_context_ = new HttpBridge::RequestContext(
+ new TestURLRequestContext());
+ }
+ HttpBridge* bridge = new HttpBridge(request_context_,
+ io_thread_.message_loop());
+ bridge->use_io_loop_for_testing_ = true;
+ return bridge;
+ }
+
+ MessageLoop* io_thread_loop() { return io_thread_.message_loop(); }
+ private:
+ // Separate thread for IO used by the HttpBridge.
+ scoped_refptr<HttpBridge::RequestContext> request_context_;
+ base::Thread io_thread_;
+};
+
+// An HttpBridge that doesn't actually make network requests and just calls
+// back with dummy response info.
+class ShuntedHttpBridge : public HttpBridge {
+ public:
+ ShuntedHttpBridge(const URLRequestContext* baseline_context,
+ MessageLoop* io_loop, HttpBridgeTest* test)
+ : HttpBridge(new HttpBridge::RequestContext(baseline_context),
+ io_loop), test_(test) { }
+ protected:
+ virtual void MakeAsynchronousPost() {
+ ASSERT_TRUE(MessageLoop::current() == test_->io_thread_loop());
+ // We don't actually want to make a request for this test, so just callback
+ // as if it completed.
+ test_->io_thread_loop()->PostTask(FROM_HERE,
+ NewRunnableMethod(this, &ShuntedHttpBridge::CallOnURLFetchComplete));
+ }
+ private:
+ void CallOnURLFetchComplete() {
+ ASSERT_TRUE(MessageLoop::current() == test_->io_thread_loop());
+ // We return one cookie and a dummy content response.
+ ResponseCookies cookies;
+ cookies.push_back("cookie1");
+ std::string response_content = "success!";
+ OnURLFetchComplete(NULL, GURL("www.google.com"), URLRequestStatus(),
+ 200, cookies, response_content);
+ }
+ HttpBridgeTest* test_;
+};
+
+// Test the HttpBridge without actually making any network requests.
+TEST_F(HttpBridgeTest, TestMakeSynchronousPostShunted) {
+ scoped_refptr<HttpBridge> http_bridge(new ShuntedHttpBridge(
+ new TestURLRequestContext(), io_thread_loop(), this));
+ http_bridge->SetUserAgent("bob");
+ http_bridge->SetURL("http://www.google.com", 9999);
+ http_bridge->SetPostPayload("text/plain", 2, " ");
+
+ int os_error = 0;
+ int response_code = 0;
+ bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(200, response_code);
+ EXPECT_EQ(0, os_error);
+ EXPECT_EQ(1, http_bridge->GetResponseCookieCount());
+ // TODO(timsteele): This is a valid test condition, it's just temporarily
+ // broken so that HttpBridge satisfies the ServerConnectionManager.
+#if FIXED_SYNC_BACKEND_COOKIE_PARSING
+ EXPECT_EQ(std::string("cookie1"),
+ std::string(http_bridge->GetResponseCookieAt(0)));
+#endif
+ EXPECT_EQ(8, http_bridge->GetResponseContentLength());
+ EXPECT_EQ(std::string("success!"),
+ std::string(http_bridge->GetResponseContent()));
+}
+
+// Full round-trip test of the HttpBridge, using default UA string and
+// no request cookies.
+TEST_F(HttpBridgeTest, TestMakeSynchronousPostLiveWithPayload) {
+ scoped_refptr<HTTPTestServer> server = HTTPTestServer::CreateServer(kDocRoot,
+ NULL);
+ ASSERT_TRUE(NULL != server.get());
+
+ scoped_refptr<HttpBridge> http_bridge(BuildBridge());
+
+ std::string payload = "this should be echoed back";
+ GURL echo = server->TestServerPage("echo");
+ http_bridge->SetURL(echo.spec().c_str(), echo.IntPort());
+ http_bridge->SetPostPayload("application/x-www-form-urlencoded",
+ payload.length() + 1, payload.c_str());
+ int os_error = 0;
+ int response_code = 0;
+ bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(200, response_code);
+ EXPECT_EQ(0, os_error);
+ EXPECT_EQ(0, http_bridge->GetResponseCookieCount());
+ EXPECT_EQ(payload.length() + 1, http_bridge->GetResponseContentLength());
+ EXPECT_EQ(payload, std::string(http_bridge->GetResponseContent()));
+}
+
+// Full round-trip test of the HttpBridge, using custom UA string and
+// multiple request cookies.
+TEST_F(HttpBridgeTest, TestMakeSynchronousPostLiveComprehensive) {
+ scoped_refptr<HTTPTestServer> server = HTTPTestServer::CreateServer(kDocRoot,
+ NULL);
+ ASSERT_TRUE(NULL != server.get());
+ scoped_refptr<HttpBridge> http_bridge(BuildBridge());
+
+ GURL echo_header = server->TestServerPage("echoall");
+ http_bridge->SetUserAgent("bob");
+ http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort());
+ http_bridge->AddCookieForRequest("foo=bar");
+ http_bridge->AddCookieForRequest("baz=boo");
+ std::string test_payload = "###TEST PAYLOAD###";
+ http_bridge->SetPostPayload("text/html", test_payload.length() + 1,
+ test_payload.c_str());
+
+ int os_error = 0;
+ int response_code = 0;
+ bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(200, response_code);
+ EXPECT_EQ(0, os_error);
+ EXPECT_EQ(0, http_bridge->GetResponseCookieCount());
+ std::string response = http_bridge->GetResponseContent();
+// TODO(timsteele): This is a valid test condition, it's just temporarily
+// broken so that HttpBridge satisfies the ServerConnectionManager; the format
+// seems to be surprising the TestServer, because it isn't echoing the headers
+// properly.
+#if FIXED_SYNCER_BACKEND_COOKIE_PARSING
+ EXPECT_NE(std::string::npos, response.find("Cookie: foo=bar; baz=boo"));
+ EXPECT_NE(std::string::npos, response.find("User-Agent: bob"));
+#endif
+ EXPECT_NE(std::string::npos, response.find(test_payload.c_str()));
+}
+
+#endif // CHROME_PERSONALIZATION \ No newline at end of file