| Index: chrome/browser/google_apis/test_server/http_server_unittest.cc
|
| diff --git a/chrome/browser/google_apis/test_server/http_server_unittest.cc b/chrome/browser/google_apis/test_server/http_server_unittest.cc
|
| index 2fd1f51ff5ee6abe813b2b090166ec937f2f0cb3..cc665134bd3b9102e87b724fc675ba89d2a3ff89 100644
|
| --- a/chrome/browser/google_apis/test_server/http_server_unittest.cc
|
| +++ b/chrome/browser/google_apis/test_server/http_server_unittest.cc
|
| @@ -4,9 +4,12 @@
|
|
|
| #include "chrome/browser/google_apis/test_server/http_server.h"
|
|
|
| +#include "base/stringprintf.h"
|
| #include "base/threading/thread.h"
|
| +#include "chrome/browser/google_apis/test_util.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| +#include "net/http/http_response_headers.h"
|
| #include "net/url_request/url_fetcher.h"
|
| #include "net/url_request/url_fetcher_delegate.h"
|
| #include "net/url_request/url_request_test_util.h"
|
| @@ -17,23 +20,35 @@ namespace test_server {
|
|
|
| namespace {
|
|
|
| -// Helper function to receive content of a response returned after invoking
|
| -// |fetcher|.
|
| -std::string GetFetcherResponseContent(const net::URLFetcher* fetcher) {
|
| +// Gets the content from the given URLFetcher.
|
| +std::string GetContentFromFetcher(const net::URLFetcher& fetcher) {
|
| std::string result;
|
| - const bool success = fetcher->GetResponseAsString(&result);
|
| + const bool success = fetcher.GetResponseAsString(&result);
|
| EXPECT_TRUE(success);
|
| return result;
|
| }
|
|
|
| +// Gets the content type from the given URLFetcher.
|
| +std::string GetContentTypeFromFetcher(const net::URLFetcher& fetcher) {
|
| + const net::HttpResponseHeaders* headers = fetcher.GetResponseHeaders();
|
| + if (headers) {
|
| + std::string content_type;
|
| + if (headers->GetMimeType(&content_type))
|
| + return content_type;
|
| + }
|
| + return "";
|
| +}
|
| +
|
| } // namespace
|
|
|
| class HttpServerTest : public testing::Test,
|
| public net::URLFetcherDelegate {
|
| public:
|
| HttpServerTest()
|
| - : ui_thread_(content::BrowserThread::UI, &message_loop_),
|
| - io_thread_(content::BrowserThread::IO) {
|
| + : num_responses_received_(0),
|
| + num_responses_expected_(0),
|
| + ui_thread_(content::BrowserThread::UI, &message_loop_),
|
| + io_thread_(content::BrowserThread::IO) {
|
| }
|
|
|
| virtual void SetUp() OVERRIDE {
|
| @@ -43,102 +58,188 @@ class HttpServerTest : public testing::Test,
|
| content::BrowserThread::GetMessageLoopProxyForThread(
|
| content::BrowserThread::IO));
|
|
|
| - server_.reset(new HttpServer());
|
| - ASSERT_TRUE(server_->InitializeAndWaitUntilReady());
|
| + ASSERT_TRUE(server_.InitializeAndWaitUntilReady());
|
| }
|
|
|
| virtual void TearDown() OVERRIDE {
|
| - server_->ShutdownAndWaitUntilComplete();
|
| + server_.ShutdownAndWaitUntilComplete();
|
| }
|
|
|
| // net::URLFetcherDelegate override.
|
| virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE {
|
| - MessageLoop::current()->Quit();
|
| + ++num_responses_received_;
|
| + if (num_responses_received_ == num_responses_expected_)
|
| + message_loop_.Quit();
|
| + }
|
| +
|
| + // Waits until the specified number of responses are received.
|
| + void WaitForResponses(int num_responses) {
|
| + num_responses_received_ = 0;
|
| + num_responses_expected_ = num_responses;
|
| + message_loop_.Run(); // Will be terminated in OnURLFetchComplete().
|
| }
|
|
|
| protected:
|
| + int num_responses_received_;
|
| + int num_responses_expected_;
|
| MessageLoopForUI message_loop_;
|
| content::TestBrowserThread ui_thread_;
|
| content::TestBrowserThread io_thread_;
|
| scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
|
| - scoped_ptr<HttpServer> server_;
|
| + HttpServer server_;
|
| };
|
|
|
| -TEST_F(HttpServerTest, TextRequest) {
|
| - // The simplest text response with an auto generated url.
|
| - GURL url1 = server_->RegisterTextResponse("test1",
|
| - "Raspberry chocolate",
|
| - "text/html",
|
| - SUCCESS);
|
| - ASSERT_NE("", url1.spec());
|
| -
|
| - GURL url2 = server_->RegisterTextResponse("test2",
|
| - "Vanilla chocolate",
|
| - "text/html",
|
| - SUCCESS);
|
| - ASSERT_NE("", url2.spec());
|
| -
|
| - // Response with a specified url and response code.
|
| - GURL url3 = server_->RegisterTextResponse(
|
| - "chocolate/bar.html", // URL
|
| - "No chocolates", // Dummy response text.
|
| - "text/plain", // Content type.
|
| - NOT_FOUND); // Response code (404 here).
|
| - ASSERT_NE("", url3.spec());
|
| -
|
| - // Set up fetchers.
|
| - scoped_ptr<net::URLFetcher> fetcher1 = scoped_ptr<net::URLFetcher>(
|
| - net::URLFetcher::Create(url1,
|
| - net::URLFetcher::GET,
|
| - this));
|
| - fetcher1->SetRequestContext(request_context_getter_.get());
|
| - scoped_ptr<net::URLFetcher> fetcher2 = scoped_ptr<net::URLFetcher>(
|
| - net::URLFetcher::Create(url2,
|
| +TEST_F(HttpServerTest, GetBaseURL) {
|
| + EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%d/", server_.port()),
|
| + server_.GetBaseURL().spec());
|
| +}
|
| +
|
| +TEST_F(HttpServerTest, GetURL) {
|
| + EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%d/path?query=foo",
|
| + server_.port()),
|
| + server_.GetURL("/path?query=foo").spec());
|
| +}
|
| +
|
| +TEST_F(HttpServerTest, RegisterDefaultResponse) {
|
| + HttpResponse http_response;
|
| + // MOVED is chosen here, as it's rather an unusual code.
|
| + http_response.set_code(MOVED);
|
| + http_response.set_content("<b>Moved!</b>");
|
| + http_response.set_content_type("text/html");
|
| + http_response.AddCustomHeader("Server", "test server");
|
| + server_.RegisterDefaultResponse("/test", http_response);
|
| +
|
| + scoped_ptr<net::URLFetcher> fetcher(
|
| + net::URLFetcher::Create(server_.GetURL("/test"),
|
| net::URLFetcher::GET,
|
| this));
|
| - fetcher2->SetRequestContext(request_context_getter_.get());
|
| - scoped_ptr<net::URLFetcher> fetcher3 = scoped_ptr<net::URLFetcher>(
|
| - net::URLFetcher::Create(url3,
|
| + fetcher->SetRequestContext(request_context_getter_.get());
|
| + fetcher->Start();
|
| + WaitForResponses(1);
|
| +
|
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
|
| + EXPECT_EQ(MOVED, fetcher->GetResponseCode());
|
| + EXPECT_EQ("<b>Moved!</b>", GetContentFromFetcher(*fetcher));
|
| + EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher));
|
| + const net::HttpResponseHeaders* headers = fetcher->GetResponseHeaders();
|
| + ASSERT_TRUE(headers);
|
| + ASSERT_TRUE(headers->HasHeaderValue("Server", "test server"));
|
| +}
|
| +
|
| +TEST_F(HttpServerTest, RegisterTextResponse) {
|
| + server_.RegisterTextResponse("/test",
|
| + "Raspberry chocolate",
|
| + "text/plain",
|
| + SUCCESS);
|
| +
|
| + scoped_ptr<net::URLFetcher> fetcher(
|
| + net::URLFetcher::Create(server_.GetURL("/test"),
|
| net::URLFetcher::GET,
|
| this));
|
| - fetcher3->SetRequestContext(request_context_getter_.get());
|
| + fetcher->SetRequestContext(request_context_getter_.get());
|
| + fetcher->Start();
|
| + WaitForResponses(1);
|
|
|
| - // Test.
|
| - fetcher1->Start();
|
| - MessageLoop::current()->Run();
|
| - EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status());
|
| - EXPECT_EQ(200, fetcher1->GetResponseCode());
|
| - EXPECT_EQ("Raspberry chocolate", GetFetcherResponseContent(fetcher1.get()));
|
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
|
| + EXPECT_EQ(SUCCESS, fetcher->GetResponseCode());
|
| + EXPECT_EQ("Raspberry chocolate", GetContentFromFetcher(*fetcher));
|
| + EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher));
|
| +}
|
|
|
| - fetcher2->Start();
|
| - MessageLoop::current()->Run();
|
| - EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status());
|
| - EXPECT_EQ(200, fetcher2->GetResponseCode());
|
| - EXPECT_EQ("Vanilla chocolate", GetFetcherResponseContent(fetcher2.get()));
|
| +// Test files cannot be opened on Android.
|
| +#if !defined(OS_ANDROID)
|
|
|
| - fetcher3->Start();
|
| - MessageLoop::current()->Run();
|
| - EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status());
|
| - EXPECT_EQ(404, fetcher3->GetResponseCode());
|
| - EXPECT_EQ("No chocolates", GetFetcherResponseContent(fetcher3.get()));
|
| +TEST_F(HttpServerTest, RegisterFileResponse) {
|
| + server_.RegisterFileResponse(
|
| + "/test",
|
| + test_util::GetTestFilePath("gdata/testfile.txt"),
|
| + "text/plain",
|
| + SUCCESS);
|
| +
|
| + scoped_ptr<net::URLFetcher> fetcher(
|
| + net::URLFetcher::Create(server_.GetURL("/test"),
|
| + net::URLFetcher::GET,
|
| + this));
|
| + fetcher->SetRequestContext(request_context_getter_.get());
|
| + fetcher->Start();
|
| + WaitForResponses(1);
|
| +
|
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
|
| + EXPECT_EQ(SUCCESS, fetcher->GetResponseCode());
|
| + // Trim the trailing whitespace as it can be CRLF on Windows...
|
| + const std::string content = GetContentFromFetcher(*fetcher);
|
| + std::string trimmed;
|
| + TrimWhitespaceASCII(content, TRIM_TRAILING, &trimmed);
|
| + EXPECT_EQ("test file", trimmed);
|
| + EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher));
|
| }
|
|
|
| -TEST_F(HttpServerTest, DefaultNotFoundResponse) {
|
| - ASSERT_NE("", server_->GetBaseURL().spec());
|
| +#endif // !defined(OS_ANDROID)
|
|
|
| - scoped_ptr<net::URLFetcher> fetcher = scoped_ptr<net::URLFetcher>(
|
| - net::URLFetcher::Create(server_->GetBaseURL(),
|
| +TEST_F(HttpServerTest, DefaultNotFoundResponse) {
|
| + scoped_ptr<net::URLFetcher> fetcher(
|
| + net::URLFetcher::Create(server_.GetURL("/non-existent"),
|
| net::URLFetcher::GET,
|
| this));
|
| fetcher->SetRequestContext(request_context_getter_.get());
|
|
|
| fetcher->Start();
|
| - MessageLoop::current()->Run();
|
| + WaitForResponses(1);
|
| EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
|
| - EXPECT_EQ(404, fetcher->GetResponseCode());
|
| + EXPECT_EQ(NOT_FOUND, fetcher->GetResponseCode());
|
| }
|
|
|
| -// TODO(mtomasz): Write a test for a file response.
|
| +TEST_F(HttpServerTest, ConcurrentFetches) {
|
| + server_.RegisterTextResponse("/test1",
|
| + "Raspberry chocolate",
|
| + "text/html",
|
| + SUCCESS);
|
| + server_.RegisterTextResponse("/test2",
|
| + "Vanilla chocolate",
|
| + "text/html",
|
| + SUCCESS);
|
| + server_.RegisterTextResponse("/test3",
|
| + "No chocolates",
|
| + "text/plain",
|
| + NOT_FOUND);
|
| +
|
| + scoped_ptr<net::URLFetcher> fetcher1 = scoped_ptr<net::URLFetcher>(
|
| + net::URLFetcher::Create(server_.GetURL("/test1"),
|
| + net::URLFetcher::GET,
|
| + this));
|
| + fetcher1->SetRequestContext(request_context_getter_.get());
|
| + scoped_ptr<net::URLFetcher> fetcher2 = scoped_ptr<net::URLFetcher>(
|
| + net::URLFetcher::Create(server_.GetURL("/test2"),
|
| + net::URLFetcher::GET,
|
| + this));
|
| + fetcher2->SetRequestContext(request_context_getter_.get());
|
| + scoped_ptr<net::URLFetcher> fetcher3 = scoped_ptr<net::URLFetcher>(
|
| + net::URLFetcher::Create(server_.GetURL("/test3"),
|
| + net::URLFetcher::GET,
|
| + this));
|
| + fetcher3->SetRequestContext(request_context_getter_.get());
|
| +
|
| + // Fetch the three URLs concurrently.
|
| + fetcher1->Start();
|
| + fetcher2->Start();
|
| + fetcher3->Start();
|
| + WaitForResponses(3);
|
| +
|
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status());
|
| + EXPECT_EQ(SUCCESS, fetcher1->GetResponseCode());
|
| + EXPECT_EQ("Raspberry chocolate", GetContentFromFetcher(*fetcher1));
|
| + EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher1));
|
| +
|
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher2->GetStatus().status());
|
| + EXPECT_EQ(SUCCESS, fetcher2->GetResponseCode());
|
| + EXPECT_EQ("Vanilla chocolate", GetContentFromFetcher(*fetcher2));
|
| + EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2));
|
| +
|
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher3->GetStatus().status());
|
| + EXPECT_EQ(NOT_FOUND,fetcher3->GetResponseCode());
|
| + EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3));
|
| + EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3));
|
| +}
|
|
|
| } // namespace test_server
|
| } // namespace google_apis
|
|
|