Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: chrome/browser/sync/glue/http_bridge_unittest.cc

Issue 160598: Add files to browser/sync. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/sync/glue/http_bridge.cc ('k') | chrome/browser/sync/glue/model_associator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 #ifdef CHROME_PERSONALIZATION
5
6 #include "base/thread.h"
7 #include "chrome/browser/sync/glue/http_bridge.h"
8 #include "net/url_request/url_request_unittest.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 using browser_sync::HttpBridge;
12
13 namespace {
14 // TODO(timsteele): Should use PathService here. See Chromium Issue 3113.
15 const char16 kDocRoot[] = L"chrome/test/data";
16 }
17
18 class HttpBridgeTest : public testing::Test {
19 public:
20 HttpBridgeTest() : io_thread_("HttpBridgeTest IO thread") {
21 }
22
23 virtual void SetUp() {
24 base::Thread::Options options;
25 options.message_loop_type = MessageLoop::TYPE_IO;
26 io_thread_.StartWithOptions(options);
27 }
28
29 virtual void TearDown() {
30 io_thread_.Stop();
31 }
32
33 HttpBridge* BuildBridge() {
34 if (!request_context_) {
35 request_context_ = new HttpBridge::RequestContext(
36 new TestURLRequestContext());
37 }
38 HttpBridge* bridge = new HttpBridge(request_context_,
39 io_thread_.message_loop());
40 bridge->use_io_loop_for_testing_ = true;
41 return bridge;
42 }
43
44 MessageLoop* io_thread_loop() { return io_thread_.message_loop(); }
45 private:
46 // Separate thread for IO used by the HttpBridge.
47 scoped_refptr<HttpBridge::RequestContext> request_context_;
48 base::Thread io_thread_;
49 };
50
51 // An HttpBridge that doesn't actually make network requests and just calls
52 // back with dummy response info.
53 class ShuntedHttpBridge : public HttpBridge {
54 public:
55 ShuntedHttpBridge(const URLRequestContext* baseline_context,
56 MessageLoop* io_loop, HttpBridgeTest* test)
57 : HttpBridge(new HttpBridge::RequestContext(baseline_context),
58 io_loop), test_(test) { }
59 protected:
60 virtual void MakeAsynchronousPost() {
61 ASSERT_TRUE(MessageLoop::current() == test_->io_thread_loop());
62 // We don't actually want to make a request for this test, so just callback
63 // as if it completed.
64 test_->io_thread_loop()->PostTask(FROM_HERE,
65 NewRunnableMethod(this, &ShuntedHttpBridge::CallOnURLFetchComplete));
66 }
67 private:
68 void CallOnURLFetchComplete() {
69 ASSERT_TRUE(MessageLoop::current() == test_->io_thread_loop());
70 // We return one cookie and a dummy content response.
71 ResponseCookies cookies;
72 cookies.push_back("cookie1");
73 std::string response_content = "success!";
74 OnURLFetchComplete(NULL, GURL("www.google.com"), URLRequestStatus(),
75 200, cookies, response_content);
76 }
77 HttpBridgeTest* test_;
78 };
79
80 // Test the HttpBridge without actually making any network requests.
81 TEST_F(HttpBridgeTest, TestMakeSynchronousPostShunted) {
82 scoped_refptr<HttpBridge> http_bridge(new ShuntedHttpBridge(
83 new TestURLRequestContext(), io_thread_loop(), this));
84 http_bridge->SetUserAgent("bob");
85 http_bridge->SetURL("http://www.google.com", 9999);
86 http_bridge->SetPostPayload("text/plain", 2, " ");
87
88 int os_error = 0;
89 int response_code = 0;
90 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
91 EXPECT_TRUE(success);
92 EXPECT_EQ(200, response_code);
93 EXPECT_EQ(0, os_error);
94 EXPECT_EQ(1, http_bridge->GetResponseCookieCount());
95 // TODO(timsteele): This is a valid test condition, it's just temporarily
96 // broken so that HttpBridge satisfies the ServerConnectionManager.
97 #if FIXED_SYNC_BACKEND_COOKIE_PARSING
98 EXPECT_EQ(std::string("cookie1"),
99 std::string(http_bridge->GetResponseCookieAt(0)));
100 #endif
101 EXPECT_EQ(8, http_bridge->GetResponseContentLength());
102 EXPECT_EQ(std::string("success!"),
103 std::string(http_bridge->GetResponseContent()));
104 }
105
106 // Full round-trip test of the HttpBridge, using default UA string and
107 // no request cookies.
108 TEST_F(HttpBridgeTest, TestMakeSynchronousPostLiveWithPayload) {
109 scoped_refptr<HTTPTestServer> server = HTTPTestServer::CreateServer(kDocRoot,
110 NULL);
111 ASSERT_TRUE(NULL != server.get());
112
113 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
114
115 std::string payload = "this should be echoed back";
116 GURL echo = server->TestServerPage("echo");
117 http_bridge->SetURL(echo.spec().c_str(), echo.IntPort());
118 http_bridge->SetPostPayload("application/x-www-form-urlencoded",
119 payload.length() + 1, payload.c_str());
120 int os_error = 0;
121 int response_code = 0;
122 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
123 EXPECT_TRUE(success);
124 EXPECT_EQ(200, response_code);
125 EXPECT_EQ(0, os_error);
126 EXPECT_EQ(0, http_bridge->GetResponseCookieCount());
127 EXPECT_EQ(payload.length() + 1, http_bridge->GetResponseContentLength());
128 EXPECT_EQ(payload, std::string(http_bridge->GetResponseContent()));
129 }
130
131 // Full round-trip test of the HttpBridge, using custom UA string and
132 // multiple request cookies.
133 TEST_F(HttpBridgeTest, TestMakeSynchronousPostLiveComprehensive) {
134 scoped_refptr<HTTPTestServer> server = HTTPTestServer::CreateServer(kDocRoot,
135 NULL);
136 ASSERT_TRUE(NULL != server.get());
137 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
138
139 GURL echo_header = server->TestServerPage("echoall");
140 http_bridge->SetUserAgent("bob");
141 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort());
142 http_bridge->AddCookieForRequest("foo=bar");
143 http_bridge->AddCookieForRequest("baz=boo");
144 std::string test_payload = "###TEST PAYLOAD###";
145 http_bridge->SetPostPayload("text/html", test_payload.length() + 1,
146 test_payload.c_str());
147
148 int os_error = 0;
149 int response_code = 0;
150 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
151 EXPECT_TRUE(success);
152 EXPECT_EQ(200, response_code);
153 EXPECT_EQ(0, os_error);
154 EXPECT_EQ(0, http_bridge->GetResponseCookieCount());
155 std::string response = http_bridge->GetResponseContent();
156 // TODO(timsteele): This is a valid test condition, it's just temporarily
157 // broken so that HttpBridge satisfies the ServerConnectionManager; the format
158 // seems to be surprising the TestServer, because it isn't echoing the headers
159 // properly.
160 #if FIXED_SYNCER_BACKEND_COOKIE_PARSING
161 EXPECT_NE(std::string::npos, response.find("Cookie: foo=bar; baz=boo"));
162 EXPECT_NE(std::string::npos, response.find("User-Agent: bob"));
163 #endif
164 EXPECT_NE(std::string::npos, response.find(test_payload.c_str()));
165 }
166
167 #endif // CHROME_PERSONALIZATION
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/http_bridge.cc ('k') | chrome/browser/sync/glue/model_associator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698