Chromium Code Reviews| 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..9e5492ae416b3625999429d82ea765236a3b0ae8 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,179 @@ 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. |
| +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; |
| + http_response.set_code(MOVED); |
|
hashimoto
2012/11/16 05:38:10
Please add a brief description about why you chose
satorux1
2012/11/16 05:56:44
Done.
|
| + http_response.set_content("<b>Moved!</b>"); |
|
hashimoto
2012/11/16 05:38:10
How about making this data a constant?
The same go
satorux1
2012/11/16 05:56:44
It's rather repetitive, but I think just using str
|
| + http_response.set_content_type("text/html"); |
|
hashimoto
2012/11/16 05:38:10
ditto.
|
| + http_response.AddCustomHeader("Server", "test server"); |
|
hashimoto
2012/11/16 05:38:10
ditto.
|
| + server_.RegisterDefaultResponse("/test", http_response); |
|
hashimoto
2012/11/16 05:38:10
ditto.
|
| + |
| + 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(301, fetcher->GetResponseCode()); |
|
hashimoto
2012/11/16 05:38:10
Why are you using MOVED above and 301 here?
The sa
satorux1
2012/11/16 05:56:44
Done.
|
| + 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")); |
| + |
|
hashimoto
2012/11/16 05:38:10
nit: No need have a blank line here.
satorux1
2012/11/16 05:56:44
Done.
|
| +} |
| + |
| +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)); |
| + fetcher->SetRequestContext(request_context_getter_.get()); |
| + fetcher->Start(); |
| + WaitForResponses(1); |
| + |
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); |
| + EXPECT_EQ(200, fetcher->GetResponseCode()); |
| + EXPECT_EQ("Raspberry chocolate", GetContentFromFetcher(*fetcher)); |
| + EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher)); |
| +} |
| + |
| +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(200, fetcher->GetResponseCode()); |
| + EXPECT_EQ("test file\n", GetContentFromFetcher(*fetcher)); |
| + EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher)); |
| +} |
| + |
| +TEST_F(HttpServerTest, DefaultNotFoundResponse) { |
| + scoped_ptr<net::URLFetcher> fetcher( |
| + net::URLFetcher::Create(server_.GetBaseURL(), |
|
hashimoto
2012/11/16 05:38:10
Instead of GetBaseURL, how about using something l
satorux1
2012/11/16 05:56:44
Done.
|
| + net::URLFetcher::GET, |
| + this)); |
| + fetcher->SetRequestContext(request_context_getter_.get()); |
| + |
| + fetcher->Start(); |
| + WaitForResponses(1); |
| + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); |
| + EXPECT_EQ(404, fetcher->GetResponseCode()); |
| +} |
| + |
| +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(url1, |
| + 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(url2, |
| + 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(url3, |
| + net::URLFetcher::Create(server_.GetURL("/test3"), |
| net::URLFetcher::GET, |
| this)); |
| fetcher3->SetRequestContext(request_context_getter_.get()); |
| - // Test. |
| + // Fetch the three URLs concurrently. |
| fetcher1->Start(); |
| - MessageLoop::current()->Run(); |
| + fetcher2->Start(); |
| + fetcher3->Start(); |
| + WaitForResponses(3); |
| + |
| EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status()); |
| EXPECT_EQ(200, fetcher1->GetResponseCode()); |
| - EXPECT_EQ("Raspberry chocolate", GetFetcherResponseContent(fetcher1.get())); |
| + EXPECT_EQ("Raspberry chocolate", GetContentFromFetcher(*fetcher1)); |
| + EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher1)); |
| - fetcher2->Start(); |
| - MessageLoop::current()->Run(); |
| EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status()); |
|
hashimoto
2012/11/16 05:38:10
fetcher2?
satorux1
2012/11/16 05:56:44
Good catch! Done.
|
| EXPECT_EQ(200, fetcher2->GetResponseCode()); |
| - EXPECT_EQ("Vanilla chocolate", GetFetcherResponseContent(fetcher2.get())); |
| + EXPECT_EQ("Vanilla chocolate", GetContentFromFetcher(*fetcher2)); |
| + EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); |
| - fetcher3->Start(); |
| - MessageLoop::current()->Run(); |
| EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher1->GetStatus().status()); |
|
hashimoto
2012/11/16 05:38:10
fetcher3?
satorux1
2012/11/16 05:56:44
Done.
|
| EXPECT_EQ(404, fetcher3->GetResponseCode()); |
| - EXPECT_EQ("No chocolates", GetFetcherResponseContent(fetcher3.get())); |
| -} |
| - |
| -TEST_F(HttpServerTest, DefaultNotFoundResponse) { |
| - ASSERT_NE("", server_->GetBaseURL().spec()); |
| - |
| - scoped_ptr<net::URLFetcher> fetcher = scoped_ptr<net::URLFetcher>( |
| - net::URLFetcher::Create(server_->GetBaseURL(), |
| - net::URLFetcher::GET, |
| - this)); |
| - fetcher->SetRequestContext(request_context_getter_.get()); |
| - |
| - fetcher->Start(); |
| - MessageLoop::current()->Run(); |
| - EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); |
| - EXPECT_EQ(404, fetcher->GetResponseCode()); |
| + EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); |
| + EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); |
| } |
| -// TODO(mtomasz): Write a test for a file response. |
| - |
| } // namespace test_server |
| } // namespace google_apis |