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

Side by Side Diff: sync/internal_api/http_bridge_unittest.cc

Issue 1282923005: Remove Android filter file for sync_unit_tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: SyncHttpBridgeTest Created 5 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/metrics/field_trial.h" 5 #include "base/metrics/field_trial.h"
6 #include "base/strings/stringprintf.h" 6 #include "base/strings/stringprintf.h"
7 #include "base/synchronization/waitable_event.h" 7 #include "base/synchronization/waitable_event.h"
8 #include "base/test/mock_entropy_provider.h" 8 #include "base/test/mock_entropy_provider.h"
9 #include "base/threading/thread.h" 9 #include "base/threading/thread.h"
10 #include "net/http/http_response_headers.h" 10 #include "net/http/http_response_headers.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 output->swap(uncompressed_output); 99 output->swap(uncompressed_output);
100 return true; 100 return true;
101 } 101 }
102 return false; 102 return false;
103 } 103 }
104 104
105 } // namespace 105 } // namespace
106 106
107 const char kUserAgent[] = "user-agent"; 107 const char kUserAgent[] = "user-agent";
108 108
109 class SyncHttpBridgeTest : public testing::Test { 109 #if defined(OS_ANDROID)
110 #define MAYBE_SyncHttpBridgeTest DISABLED_SyncHttpBridgeTest
111 #else
112 #define MAYBE_SyncHttpBridgeTest SyncHttpBridgeTest
113 #endif // defined(OS_ANDROID)
114 class MAYBE_SyncHttpBridgeTest : public testing::Test {
110 public: 115 public:
111 SyncHttpBridgeTest() 116 MAYBE_SyncHttpBridgeTest()
112 : test_server_(net::SpawnedTestServer::TYPE_HTTP, 117 : test_server_(net::SpawnedTestServer::TYPE_HTTP,
113 net::SpawnedTestServer::kLocalhost, 118 net::SpawnedTestServer::kLocalhost,
114 base::FilePath(kDocRoot)), 119 base::FilePath(kDocRoot)),
115 fake_default_request_context_getter_(NULL), 120 fake_default_request_context_getter_(NULL),
116 bridge_for_race_test_(NULL), 121 bridge_for_race_test_(NULL),
117 io_thread_("IO thread") { 122 io_thread_("IO thread") {
118 } 123 }
119 124
120 void SetUp() override { 125 void SetUp() override {
121 base::Thread::Options options; 126 base::Thread::Options options;
(...skipping 26 matching lines...) Expand all
148 static void Abort(HttpBridge* bridge) { 153 static void Abort(HttpBridge* bridge) {
149 bridge->Abort(); 154 bridge->Abort();
150 } 155 }
151 156
152 // Used by AbortAndReleaseBeforeFetchCompletes to test an interesting race 157 // Used by AbortAndReleaseBeforeFetchCompletes to test an interesting race
153 // condition. 158 // condition.
154 void RunSyncThreadBridgeUseTest(base::WaitableEvent* signal_when_created, 159 void RunSyncThreadBridgeUseTest(base::WaitableEvent* signal_when_created,
155 base::WaitableEvent* signal_when_released); 160 base::WaitableEvent* signal_when_released);
156 161
157 static void TestSameHttpNetworkSession(base::MessageLoop* main_message_loop, 162 static void TestSameHttpNetworkSession(base::MessageLoop* main_message_loop,
158 SyncHttpBridgeTest* test) { 163 MAYBE_SyncHttpBridgeTest* test) {
159 scoped_refptr<HttpBridge> http_bridge(test->BuildBridge()); 164 scoped_refptr<HttpBridge> http_bridge(test->BuildBridge());
160 EXPECT_TRUE(test->GetTestRequestContextGetter()); 165 EXPECT_TRUE(test->GetTestRequestContextGetter());
161 net::HttpNetworkSession* test_session = 166 net::HttpNetworkSession* test_session =
162 test->GetTestRequestContextGetter()->GetURLRequestContext()-> 167 test->GetTestRequestContextGetter()->GetURLRequestContext()->
163 http_transaction_factory()->GetSession(); 168 http_transaction_factory()->GetSession();
164 EXPECT_EQ(test_session, 169 EXPECT_EQ(test_session,
165 http_bridge->GetRequestContextGetterForTest()-> 170 http_bridge->GetRequestContextGetterForTest()->
166 GetURLRequestContext()-> 171 GetURLRequestContext()->
167 http_transaction_factory()->GetSession()); 172 http_transaction_factory()->GetSession());
168 main_message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 173 main_message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
(...skipping 26 matching lines...) Expand all
195 200
196 // An HttpBridge that doesn't actually make network requests and just calls 201 // An HttpBridge that doesn't actually make network requests and just calls
197 // back with dummy response info. 202 // back with dummy response info.
198 // TODO(tim): Instead of inheriting here we should inject a component 203 // TODO(tim): Instead of inheriting here we should inject a component
199 // responsible for the MakeAsynchronousPost bit. 204 // responsible for the MakeAsynchronousPost bit.
200 class ShuntedHttpBridge : public HttpBridge { 205 class ShuntedHttpBridge : public HttpBridge {
201 public: 206 public:
202 // If |never_finishes| is true, the simulated request never actually 207 // If |never_finishes| is true, the simulated request never actually
203 // returns. 208 // returns.
204 ShuntedHttpBridge(net::URLRequestContextGetter* baseline_context_getter, 209 ShuntedHttpBridge(net::URLRequestContextGetter* baseline_context_getter,
205 SyncHttpBridgeTest* test, bool never_finishes) 210 MAYBE_SyncHttpBridgeTest* test, bool never_finishes)
206 : HttpBridge(kUserAgent, 211 : HttpBridge(kUserAgent,
207 baseline_context_getter, 212 baseline_context_getter,
208 NetworkTimeUpdateCallback()), 213 NetworkTimeUpdateCallback()),
209 test_(test), never_finishes_(never_finishes) { } 214 test_(test), never_finishes_(never_finishes) { }
210 protected: 215 protected:
211 void MakeAsynchronousPost() override { 216 void MakeAsynchronousPost() override {
212 ASSERT_TRUE(base::MessageLoop::current() == test_->GetIOThreadLoop()); 217 ASSERT_TRUE(base::MessageLoop::current() == test_->GetIOThreadLoop());
213 if (never_finishes_) 218 if (never_finishes_)
214 return; 219 return;
215 220
(...skipping 13 matching lines...) Expand all
229 std::string response_content = "success!"; 234 std::string response_content = "success!";
230 net::TestURLFetcher fetcher(0, GURL("http://www.google.com"), NULL); 235 net::TestURLFetcher fetcher(0, GURL("http://www.google.com"), NULL);
231 scoped_refptr<net::HttpResponseHeaders> response_headers( 236 scoped_refptr<net::HttpResponseHeaders> response_headers(
232 new net::HttpResponseHeaders("")); 237 new net::HttpResponseHeaders(""));
233 fetcher.set_response_code(200); 238 fetcher.set_response_code(200);
234 fetcher.set_cookies(cookies); 239 fetcher.set_cookies(cookies);
235 fetcher.SetResponseString(response_content); 240 fetcher.SetResponseString(response_content);
236 fetcher.set_response_headers(response_headers); 241 fetcher.set_response_headers(response_headers);
237 OnURLFetchComplete(&fetcher); 242 OnURLFetchComplete(&fetcher);
238 } 243 }
239 SyncHttpBridgeTest* test_; 244 MAYBE_SyncHttpBridgeTest* test_;
240 bool never_finishes_; 245 bool never_finishes_;
241 }; 246 };
242 247
243 void SyncHttpBridgeTest::RunSyncThreadBridgeUseTest( 248 void MAYBE_SyncHttpBridgeTest::RunSyncThreadBridgeUseTest(
244 base::WaitableEvent* signal_when_created, 249 base::WaitableEvent* signal_when_created,
245 base::WaitableEvent* signal_when_released) { 250 base::WaitableEvent* signal_when_released) {
246 scoped_refptr<net::URLRequestContextGetter> ctx_getter( 251 scoped_refptr<net::URLRequestContextGetter> ctx_getter(
247 new net::TestURLRequestContextGetter(io_thread_.task_runner())); 252 new net::TestURLRequestContextGetter(io_thread_.task_runner()));
248 { 253 {
249 scoped_refptr<ShuntedHttpBridge> bridge( 254 scoped_refptr<ShuntedHttpBridge> bridge(
250 new ShuntedHttpBridge(ctx_getter.get(), this, true)); 255 new ShuntedHttpBridge(ctx_getter.get(), this, true));
251 bridge->SetURL("http://www.google.com", 9999); 256 bridge->SetURL("http://www.google.com", 9999);
252 bridge->SetPostPayload("text/plain", 2, " "); 257 bridge->SetPostPayload("text/plain", 2, " ");
253 bridge_for_race_test_ = bridge.get(); 258 bridge_for_race_test_ = bridge.get();
254 signal_when_created->Signal(); 259 signal_when_created->Signal();
255 260
256 int os_error = 0; 261 int os_error = 0;
257 int response_code = 0; 262 int response_code = 0;
258 bridge->MakeSynchronousPost(&os_error, &response_code); 263 bridge->MakeSynchronousPost(&os_error, &response_code);
259 bridge_for_race_test_ = NULL; 264 bridge_for_race_test_ = NULL;
260 } 265 }
261 signal_when_released->Signal(); 266 signal_when_released->Signal();
262 } 267 }
263 268
264 TEST_F(SyncHttpBridgeTest, TestUsesSameHttpNetworkSession) { 269 TEST_F(MAYBE_SyncHttpBridgeTest, TestUsesSameHttpNetworkSession) {
265 // Run this test on the IO thread because we can only call 270 // Run this test on the IO thread because we can only call
266 // URLRequestContextGetter::GetURLRequestContext on the IO thread. 271 // URLRequestContextGetter::GetURLRequestContext on the IO thread.
267 io_thread()->message_loop() 272 io_thread()->message_loop()->PostTask(
268 ->PostTask(FROM_HERE, 273 FROM_HERE,
269 base::Bind(&SyncHttpBridgeTest::TestSameHttpNetworkSession, 274 base::Bind(&MAYBE_SyncHttpBridgeTest::TestSameHttpNetworkSession,
270 base::MessageLoop::current(), 275 base::MessageLoop::current(), this));
271 this));
272 base::MessageLoop::current()->Run(); 276 base::MessageLoop::current()->Run();
273 } 277 }
274 278
275 // Test the HttpBridge without actually making any network requests. 279 // Test the HttpBridge without actually making any network requests.
276 TEST_F(SyncHttpBridgeTest, TestMakeSynchronousPostShunted) { 280 TEST_F(MAYBE_SyncHttpBridgeTest, TestMakeSynchronousPostShunted) {
277 scoped_refptr<net::URLRequestContextGetter> ctx_getter( 281 scoped_refptr<net::URLRequestContextGetter> ctx_getter(
278 new net::TestURLRequestContextGetter(io_thread()->task_runner())); 282 new net::TestURLRequestContextGetter(io_thread()->task_runner()));
279 scoped_refptr<HttpBridge> http_bridge( 283 scoped_refptr<HttpBridge> http_bridge(
280 new ShuntedHttpBridge(ctx_getter.get(), this, false)); 284 new ShuntedHttpBridge(ctx_getter.get(), this, false));
281 http_bridge->SetURL("http://www.google.com", 9999); 285 http_bridge->SetURL("http://www.google.com", 9999);
282 http_bridge->SetPostPayload("text/plain", 2, " "); 286 http_bridge->SetPostPayload("text/plain", 2, " ");
283 287
284 int os_error = 0; 288 int os_error = 0;
285 int response_code = 0; 289 int response_code = 0;
286 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code); 290 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
287 EXPECT_TRUE(success); 291 EXPECT_TRUE(success);
288 EXPECT_EQ(200, response_code); 292 EXPECT_EQ(200, response_code);
289 EXPECT_EQ(0, os_error); 293 EXPECT_EQ(0, os_error);
290 294
291 EXPECT_EQ(8, http_bridge->GetResponseContentLength()); 295 EXPECT_EQ(8, http_bridge->GetResponseContentLength());
292 EXPECT_EQ(std::string("success!"), 296 EXPECT_EQ(std::string("success!"),
293 std::string(http_bridge->GetResponseContent())); 297 std::string(http_bridge->GetResponseContent()));
294 } 298 }
295 299
296 // Full round-trip test of the HttpBridge, using default UA string and 300 // Full round-trip test of the HttpBridge, using default UA string and
297 // no request cookies. 301 // no request cookies.
298 TEST_F(SyncHttpBridgeTest, TestMakeSynchronousPostLiveWithPayload) { 302 TEST_F(MAYBE_SyncHttpBridgeTest, TestMakeSynchronousPostLiveWithPayload) {
299 ASSERT_TRUE(test_server_.Start()); 303 ASSERT_TRUE(test_server_.Start());
300 304
301 scoped_refptr<HttpBridge> http_bridge(BuildBridge()); 305 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
302 306
303 std::string payload = "this should be echoed back"; 307 std::string payload = "this should be echoed back";
304 GURL echo = test_server_.GetURL("echo"); 308 GURL echo = test_server_.GetURL("echo");
305 http_bridge->SetURL(echo.spec().c_str(), echo.IntPort()); 309 http_bridge->SetURL(echo.spec().c_str(), echo.IntPort());
306 http_bridge->SetPostPayload("application/x-www-form-urlencoded", 310 http_bridge->SetPostPayload("application/x-www-form-urlencoded",
307 payload.length() + 1, payload.c_str()); 311 payload.length() + 1, payload.c_str());
308 int os_error = 0; 312 int os_error = 0;
309 int response_code = 0; 313 int response_code = 0;
310 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code); 314 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
311 EXPECT_TRUE(success); 315 EXPECT_TRUE(success);
312 EXPECT_EQ(200, response_code); 316 EXPECT_EQ(200, response_code);
313 EXPECT_EQ(0, os_error); 317 EXPECT_EQ(0, os_error);
314 318
315 EXPECT_EQ(payload.length() + 1, 319 EXPECT_EQ(payload.length() + 1,
316 static_cast<size_t>(http_bridge->GetResponseContentLength())); 320 static_cast<size_t>(http_bridge->GetResponseContentLength()));
317 EXPECT_EQ(payload, std::string(http_bridge->GetResponseContent())); 321 EXPECT_EQ(payload, std::string(http_bridge->GetResponseContent()));
318 } 322 }
319 323
320 // Full round-trip test of the HttpBridge with compressed data, check if the 324 // Full round-trip test of the HttpBridge with compressed data, check if the
321 // data is correctly compressed. 325 // data is correctly compressed.
322 TEST_F(SyncHttpBridgeTest, CompressedRequestPayloadCheck) { 326 TEST_F(MAYBE_SyncHttpBridgeTest, CompressedRequestPayloadCheck) {
323 ASSERT_TRUE(test_server_.Start()); 327 ASSERT_TRUE(test_server_.Start());
324 328
325 scoped_refptr<HttpBridge> http_bridge(BuildBridge()); 329 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
326 330
327 std::string payload = "this should be echoed back"; 331 std::string payload = "this should be echoed back";
328 GURL echo = test_server_.GetURL("echo"); 332 GURL echo = test_server_.GetURL("echo");
329 http_bridge->SetURL(echo.spec().c_str(), echo.IntPort()); 333 http_bridge->SetURL(echo.spec().c_str(), echo.IntPort());
330 http_bridge->SetPostPayload("application/x-www-form-urlencoded", 334 http_bridge->SetPostPayload("application/x-www-form-urlencoded",
331 payload.length(), payload.c_str()); 335 payload.length(), payload.c_str());
332 int os_error = 0; 336 int os_error = 0;
(...skipping 11 matching lines...) Expand all
344 std::string compressed_payload(http_bridge->GetResponseContent(), 348 std::string compressed_payload(http_bridge->GetResponseContent(),
345 http_bridge->GetResponseContentLength()); 349 http_bridge->GetResponseContentLength());
346 std::string uncompressed_payload; 350 std::string uncompressed_payload;
347 GzipUncompress(compressed_payload, &uncompressed_payload); 351 GzipUncompress(compressed_payload, &uncompressed_payload);
348 EXPECT_EQ(payload, uncompressed_payload); 352 EXPECT_EQ(payload, uncompressed_payload);
349 } 353 }
350 354
351 // Full round-trip test of the HttpBridge with compression, check if header 355 // Full round-trip test of the HttpBridge with compression, check if header
352 // fields("Content-Encoding" ,"Accept-Encoding" and user agent) are set 356 // fields("Content-Encoding" ,"Accept-Encoding" and user agent) are set
353 // correctly. 357 // correctly.
354 TEST_F(SyncHttpBridgeTest, CompressedRequestHeaderCheck) { 358 TEST_F(MAYBE_SyncHttpBridgeTest, CompressedRequestHeaderCheck) {
355 ASSERT_TRUE(test_server_.Start()); 359 ASSERT_TRUE(test_server_.Start());
356 360
357 scoped_refptr<HttpBridge> http_bridge(BuildBridge()); 361 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
358 362
359 GURL echo_header = test_server_.GetURL("echoall"); 363 GURL echo_header = test_server_.GetURL("echoall");
360 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort()); 364 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort());
361 365
362 std::string test_payload = "###TEST PAYLOAD###"; 366 std::string test_payload = "###TEST PAYLOAD###";
363 http_bridge->SetPostPayload("text/html", test_payload.length() + 1, 367 http_bridge->SetPostPayload("text/html", test_payload.length() + 1,
364 test_payload.c_str()); 368 test_payload.c_str());
(...skipping 14 matching lines...) Expand all
379 EXPECT_NE(std::string::npos, 383 EXPECT_NE(std::string::npos,
380 response.find(base::StringPrintf( 384 response.find(base::StringPrintf(
381 "%s: %s", net::HttpRequestHeaders::kAcceptEncoding, 385 "%s: %s", net::HttpRequestHeaders::kAcceptEncoding,
382 "gzip, deflate"))); 386 "gzip, deflate")));
383 EXPECT_NE(std::string::npos, 387 EXPECT_NE(std::string::npos,
384 response.find(base::StringPrintf( 388 response.find(base::StringPrintf(
385 "%s: %s", net::HttpRequestHeaders::kUserAgent, kUserAgent))); 389 "%s: %s", net::HttpRequestHeaders::kUserAgent, kUserAgent)));
386 } 390 }
387 391
388 // Full round-trip test of the HttpBridge. 392 // Full round-trip test of the HttpBridge.
389 TEST_F(SyncHttpBridgeTest, TestMakeSynchronousPostLiveComprehensive) { 393 TEST_F(MAYBE_SyncHttpBridgeTest, TestMakeSynchronousPostLiveComprehensive) {
390 ASSERT_TRUE(test_server_.Start()); 394 ASSERT_TRUE(test_server_.Start());
391 395
392 scoped_refptr<HttpBridge> http_bridge(BuildBridge()); 396 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
393 397
394 GURL echo_header = test_server_.GetURL("echoall"); 398 GURL echo_header = test_server_.GetURL("echoall");
395 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort()); 399 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort());
396 400
397 std::string test_payload = "###TEST PAYLOAD###"; 401 std::string test_payload = "###TEST PAYLOAD###";
398 http_bridge->SetPostPayload("text/html", test_payload.length() + 1, 402 http_bridge->SetPostPayload("text/html", test_payload.length() + 1,
399 test_payload.c_str()); 403 test_payload.c_str());
(...skipping 11 matching lines...) Expand all
411 EXPECT_NE(std::string::npos, 415 EXPECT_NE(std::string::npos,
412 response.find(base::StringPrintf( 416 response.find(base::StringPrintf(
413 "%s: %s", net::HttpRequestHeaders::kAcceptEncoding, 417 "%s: %s", net::HttpRequestHeaders::kAcceptEncoding,
414 "deflate"))); 418 "deflate")));
415 EXPECT_NE(std::string::npos, 419 EXPECT_NE(std::string::npos,
416 response.find(base::StringPrintf("%s: %s", 420 response.find(base::StringPrintf("%s: %s",
417 net::HttpRequestHeaders::kUserAgent, kUserAgent))); 421 net::HttpRequestHeaders::kUserAgent, kUserAgent)));
418 EXPECT_NE(std::string::npos, response.find(test_payload.c_str())); 422 EXPECT_NE(std::string::npos, response.find(test_payload.c_str()));
419 } 423 }
420 424
421 TEST_F(SyncHttpBridgeTest, TestExtraRequestHeaders) { 425 TEST_F(MAYBE_SyncHttpBridgeTest, TestExtraRequestHeaders) {
422 ASSERT_TRUE(test_server_.Start()); 426 ASSERT_TRUE(test_server_.Start());
423 427
424 scoped_refptr<HttpBridge> http_bridge(BuildBridge()); 428 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
425 429
426 GURL echo_header = test_server_.GetURL("echoall"); 430 GURL echo_header = test_server_.GetURL("echoall");
427 431
428 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort()); 432 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort());
429 http_bridge->SetExtraRequestHeaders("test:fnord"); 433 http_bridge->SetExtraRequestHeaders("test:fnord");
430 434
431 std::string test_payload = "###TEST PAYLOAD###"; 435 std::string test_payload = "###TEST PAYLOAD###";
432 http_bridge->SetPostPayload("text/html", test_payload.length() + 1, 436 http_bridge->SetPostPayload("text/html", test_payload.length() + 1,
433 test_payload.c_str()); 437 test_payload.c_str());
434 438
435 int os_error = 0; 439 int os_error = 0;
436 int response_code = 0; 440 int response_code = 0;
437 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code); 441 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
438 EXPECT_TRUE(success); 442 EXPECT_TRUE(success);
439 EXPECT_EQ(200, response_code); 443 EXPECT_EQ(200, response_code);
440 EXPECT_EQ(0, os_error); 444 EXPECT_EQ(0, os_error);
441 445
442 std::string response(http_bridge->GetResponseContent(), 446 std::string response(http_bridge->GetResponseContent(),
443 http_bridge->GetResponseContentLength()); 447 http_bridge->GetResponseContentLength());
444 448
445 EXPECT_NE(std::string::npos, response.find("fnord")); 449 EXPECT_NE(std::string::npos, response.find("fnord"));
446 EXPECT_NE(std::string::npos, response.find(test_payload.c_str())); 450 EXPECT_NE(std::string::npos, response.find(test_payload.c_str()));
447 } 451 }
448 452
449 TEST_F(SyncHttpBridgeTest, TestResponseHeader) { 453 TEST_F(MAYBE_SyncHttpBridgeTest, TestResponseHeader) {
450 ASSERT_TRUE(test_server_.Start()); 454 ASSERT_TRUE(test_server_.Start());
451 455
452 scoped_refptr<HttpBridge> http_bridge(BuildBridge()); 456 scoped_refptr<HttpBridge> http_bridge(BuildBridge());
453 457
454 GURL echo_header = test_server_.GetURL("echoall"); 458 GURL echo_header = test_server_.GetURL("echoall");
455 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort()); 459 http_bridge->SetURL(echo_header.spec().c_str(), echo_header.IntPort());
456 460
457 std::string test_payload = "###TEST PAYLOAD###"; 461 std::string test_payload = "###TEST PAYLOAD###";
458 http_bridge->SetPostPayload("text/html", test_payload.length() + 1, 462 http_bridge->SetPostPayload("text/html", test_payload.length() + 1,
459 test_payload.c_str()); 463 test_payload.c_str());
460 464
461 int os_error = 0; 465 int os_error = 0;
462 int response_code = 0; 466 int response_code = 0;
463 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code); 467 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
464 EXPECT_TRUE(success); 468 EXPECT_TRUE(success);
465 EXPECT_EQ(200, response_code); 469 EXPECT_EQ(200, response_code);
466 EXPECT_EQ(0, os_error); 470 EXPECT_EQ(0, os_error);
467 471
468 EXPECT_EQ(http_bridge->GetResponseHeaderValue("Content-type"), "text/html"); 472 EXPECT_EQ(http_bridge->GetResponseHeaderValue("Content-type"), "text/html");
469 EXPECT_TRUE(http_bridge->GetResponseHeaderValue("invalid-header").empty()); 473 EXPECT_TRUE(http_bridge->GetResponseHeaderValue("invalid-header").empty());
470 } 474 }
471 475
472 TEST_F(SyncHttpBridgeTest, Abort) { 476 TEST_F(MAYBE_SyncHttpBridgeTest, Abort) {
473 scoped_refptr<net::URLRequestContextGetter> ctx_getter( 477 scoped_refptr<net::URLRequestContextGetter> ctx_getter(
474 new net::TestURLRequestContextGetter(io_thread()->task_runner())); 478 new net::TestURLRequestContextGetter(io_thread()->task_runner()));
475 scoped_refptr<ShuntedHttpBridge> http_bridge( 479 scoped_refptr<ShuntedHttpBridge> http_bridge(
476 new ShuntedHttpBridge(ctx_getter.get(), this, true)); 480 new ShuntedHttpBridge(ctx_getter.get(), this, true));
477 http_bridge->SetURL("http://www.google.com", 9999); 481 http_bridge->SetURL("http://www.google.com", 9999);
478 http_bridge->SetPostPayload("text/plain", 2, " "); 482 http_bridge->SetPostPayload("text/plain", 2, " ");
479 483
480 int os_error = 0; 484 int os_error = 0;
481 int response_code = 0; 485 int response_code = 0;
482 486
483 io_thread()->task_runner()->PostTask( 487 io_thread()->task_runner()->PostTask(
484 FROM_HERE, 488 FROM_HERE,
485 base::Bind(&SyncHttpBridgeTest::Abort, http_bridge)); 489 base::Bind(&MAYBE_SyncHttpBridgeTest::Abort, http_bridge));
486 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code); 490 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
487 EXPECT_FALSE(success); 491 EXPECT_FALSE(success);
488 EXPECT_EQ(net::ERR_ABORTED, os_error); 492 EXPECT_EQ(net::ERR_ABORTED, os_error);
489 } 493 }
490 494
491 TEST_F(SyncHttpBridgeTest, AbortLate) { 495 TEST_F(MAYBE_SyncHttpBridgeTest, AbortLate) {
492 scoped_refptr<net::URLRequestContextGetter> ctx_getter( 496 scoped_refptr<net::URLRequestContextGetter> ctx_getter(
493 new net::TestURLRequestContextGetter(io_thread()->task_runner())); 497 new net::TestURLRequestContextGetter(io_thread()->task_runner()));
494 scoped_refptr<ShuntedHttpBridge> http_bridge( 498 scoped_refptr<ShuntedHttpBridge> http_bridge(
495 new ShuntedHttpBridge(ctx_getter.get(), this, false)); 499 new ShuntedHttpBridge(ctx_getter.get(), this, false));
496 http_bridge->SetURL("http://www.google.com", 9999); 500 http_bridge->SetURL("http://www.google.com", 9999);
497 http_bridge->SetPostPayload("text/plain", 2, " "); 501 http_bridge->SetPostPayload("text/plain", 2, " ");
498 502
499 int os_error = 0; 503 int os_error = 0;
500 int response_code = 0; 504 int response_code = 0;
501 505
502 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code); 506 bool success = http_bridge->MakeSynchronousPost(&os_error, &response_code);
503 ASSERT_TRUE(success); 507 ASSERT_TRUE(success);
504 http_bridge->Abort(); 508 http_bridge->Abort();
505 // Ensures no double-free of URLFetcher, etc. 509 // Ensures no double-free of URLFetcher, etc.
506 } 510 }
507 511
508 // Tests an interesting case where code using the HttpBridge aborts the fetch 512 // Tests an interesting case where code using the HttpBridge aborts the fetch
509 // and releases ownership before a pending fetch completed callback is issued by 513 // and releases ownership before a pending fetch completed callback is issued by
510 // the underlying URLFetcher (and before that URLFetcher is destroyed, which 514 // the underlying URLFetcher (and before that URLFetcher is destroyed, which
511 // would cancel the callback). 515 // would cancel the callback).
512 TEST_F(SyncHttpBridgeTest, AbortAndReleaseBeforeFetchComplete) { 516 TEST_F(MAYBE_SyncHttpBridgeTest, AbortAndReleaseBeforeFetchComplete) {
513 base::Thread sync_thread("SyncThread"); 517 base::Thread sync_thread("SyncThread");
514 sync_thread.Start(); 518 sync_thread.Start();
515 519
516 // First, block the sync thread on the post. 520 // First, block the sync thread on the post.
517 base::WaitableEvent signal_when_created(false, false); 521 base::WaitableEvent signal_when_created(false, false);
518 base::WaitableEvent signal_when_released(false, false); 522 base::WaitableEvent signal_when_released(false, false);
519 sync_thread.message_loop()->PostTask(FROM_HERE, 523 sync_thread.message_loop()->PostTask(FROM_HERE,
520 base::Bind(&SyncHttpBridgeTest::RunSyncThreadBridgeUseTest, 524 base::Bind(&MAYBE_SyncHttpBridgeTest::RunSyncThreadBridgeUseTest,
521 base::Unretained(this), 525 base::Unretained(this),
522 &signal_when_created, 526 &signal_when_created,
523 &signal_when_released)); 527 &signal_when_released));
524 528
525 // Stop IO so we can control order of operations. 529 // Stop IO so we can control order of operations.
526 base::WaitableEvent io_waiter(false, false); 530 base::WaitableEvent io_waiter(false, false);
527 ASSERT_TRUE(io_thread()->task_runner()->PostTask( 531 ASSERT_TRUE(io_thread()->task_runner()->PostTask(
528 FROM_HERE, 532 FROM_HERE,
529 base::Bind(&base::WaitableEvent::Wait, base::Unretained(&io_waiter)))); 533 base::Bind(&base::WaitableEvent::Wait, base::Unretained(&io_waiter))));
530 534
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 } 592 }
589 593
590 void WaitOnIOThread(base::WaitableEvent* signal_wait_start, 594 void WaitOnIOThread(base::WaitableEvent* signal_wait_start,
591 base::WaitableEvent* wait_done) { 595 base::WaitableEvent* wait_done) {
592 signal_wait_start->Signal(); 596 signal_wait_start->Signal();
593 wait_done->Wait(); 597 wait_done->Wait();
594 } 598 }
595 599
596 // Tests RequestContextGetter is properly released on IO thread even when 600 // Tests RequestContextGetter is properly released on IO thread even when
597 // IO thread stops before sync thread. 601 // IO thread stops before sync thread.
598 TEST_F(SyncHttpBridgeTest, RequestContextGetterReleaseOrder) { 602 TEST_F(MAYBE_SyncHttpBridgeTest, RequestContextGetterReleaseOrder) {
599 base::Thread sync_thread("SyncThread"); 603 base::Thread sync_thread("SyncThread");
600 sync_thread.Start(); 604 sync_thread.Start();
601 605
602 syncer::HttpPostProviderFactory* factory = NULL; 606 syncer::HttpPostProviderFactory* factory = NULL;
603 syncer::HttpPostProviderInterface* bridge = NULL; 607 syncer::HttpPostProviderInterface* bridge = NULL;
604 608
605 scoped_refptr<net::URLRequestContextGetter> baseline_context_getter( 609 scoped_refptr<net::URLRequestContextGetter> baseline_context_getter(
606 new net::TestURLRequestContextGetter(io_thread()->task_runner())); 610 new net::TestURLRequestContextGetter(io_thread()->task_runner()));
607 611
608 base::WaitableEvent signal_when_created(false, false); 612 base::WaitableEvent signal_when_created(false, false);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 wait_done.Signal(); 645 wait_done.Signal();
642 io_thread()->Stop(); 646 io_thread()->Stop();
643 647
644 // Unblock and stop sync thread. 648 // Unblock and stop sync thread.
645 wait_for_shutdown.Signal(); 649 wait_for_shutdown.Signal();
646 sync_thread.Stop(); 650 sync_thread.Stop();
647 } 651 }
648 652
649 // Attempt to release the URLRequestContextGetter before the HttpBridgeFactory 653 // Attempt to release the URLRequestContextGetter before the HttpBridgeFactory
650 // is initialized. 654 // is initialized.
651 TEST_F(SyncHttpBridgeTest, EarlyAbortFactory) { 655 TEST_F(MAYBE_SyncHttpBridgeTest, EarlyAbortFactory) {
652 // In a real scenario, the following would happen on many threads. For 656 // In a real scenario, the following would happen on many threads. For
653 // simplicity, this test uses only one thread. 657 // simplicity, this test uses only one thread.
654 658
655 scoped_refptr<net::URLRequestContextGetter> baseline_context_getter( 659 scoped_refptr<net::URLRequestContextGetter> baseline_context_getter(
656 new net::TestURLRequestContextGetter(io_thread()->task_runner())); 660 new net::TestURLRequestContextGetter(io_thread()->task_runner()));
657 CancelationSignal release_request_context_signal; 661 CancelationSignal release_request_context_signal;
658 662
659 // UI Thread: Initialize the HttpBridgeFactory. The next step would be to 663 // UI Thread: Initialize the HttpBridgeFactory. The next step would be to
660 // post a task to SBH::Core to have it initialized. 664 // post a task to SBH::Core to have it initialized.
661 scoped_ptr<syncer::HttpBridgeFactory> factory( 665 scoped_ptr<syncer::HttpBridgeFactory> factory(
662 new HttpBridgeFactory(baseline_context_getter.get(), 666 new HttpBridgeFactory(baseline_context_getter.get(),
663 NetworkTimeUpdateCallback(), 667 NetworkTimeUpdateCallback(),
664 &release_request_context_signal)); 668 &release_request_context_signal));
665 669
666 // UI Thread: A very early shutdown request arrives and executes on the UI 670 // UI Thread: A very early shutdown request arrives and executes on the UI
667 // thread before the posted sync thread task is run. 671 // thread before the posted sync thread task is run.
668 release_request_context_signal.Signal(); 672 release_request_context_signal.Signal();
669 673
670 // Sync thread: Finally run the posted task, only to find that our 674 // Sync thread: Finally run the posted task, only to find that our
671 // HttpBridgeFactory has been neutered. Should not crash. 675 // HttpBridgeFactory has been neutered. Should not crash.
672 factory->Init("TestUserAgent"); 676 factory->Init("TestUserAgent");
673 677
674 // At this point, attempting to use the factory would trigger a crash. Both 678 // At this point, attempting to use the factory would trigger a crash. Both
675 // this test and the real world code should make sure this never happens. 679 // this test and the real world code should make sure this never happens.
676 }; 680 };
677 681
678 } // namespace syncer 682 } // namespace syncer
OLDNEW
« no previous file with comments | « build/android/pylib/gtest/filter/sync_unit_tests_disabled ('k') | sync/syncable/syncable_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698