| // Copyright 2014 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #import <Foundation/Foundation.h> | 
 |  | 
 | #import <memory> | 
 | #import <string> | 
 |  | 
 | #import "base/base_paths.h" | 
 | #import "base/path_service.h" | 
 | #import "base/strings/sys_string_conversions.h" | 
 | #import "base/test/ios/wait_util.h" | 
 | #import "base/test/test_timeouts.h" | 
 | #import "ios/web/public/test/http_server/http_server.h" | 
 | #import "ios/web/public/test/http_server/string_response_provider.h" | 
 | #import "ios/web/test/web_int_test.h" | 
 | #import "net/base/apple/url_conversions.h" | 
 | #import "net/http/http_response_headers.h" | 
 | #import "testing/gtest/include/gtest/gtest.h" | 
 | #import "testing/gtest_mac.h" | 
 |  | 
 | namespace { | 
 |  | 
 | // Resonse body for requests sent to web::test::HttpServer. | 
 | const char kHelloWorld[] = "Hello World"; | 
 |  | 
 | }  // namespace | 
 |  | 
 | using web::test::HttpServer; | 
 |  | 
 | // A test fixture for verifying the behavior of web::test::HttpServer. | 
 | class HttpServerTest : public web::WebIntTest { | 
 |  protected: | 
 |   void SetUp() override { | 
 |     web::WebIntTest::SetUp(); | 
 |  | 
 |     std::unique_ptr<web::StringResponseProvider> provider( | 
 |         new web::StringResponseProvider(kHelloWorld)); | 
 |  | 
 |     HttpServer& server = HttpServer::GetSharedInstance(); | 
 |     base::FilePath test_data_dir; | 
 |     ASSERT_TRUE( | 
 |         base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &test_data_dir)); | 
 |     server.StartOrDie(test_data_dir.Append(".")); | 
 |     server.AddResponseProvider(std::move(provider)); | 
 |   } | 
 |  | 
 |   ~HttpServerTest() override { | 
 |     HttpServer& server = HttpServer::GetSharedInstance(); | 
 |     if (server.IsRunning()) { | 
 |       server.Stop(); | 
 |     } | 
 |   } | 
 | }; | 
 |  | 
 | // Tests that a web::test::HttpServer can be started and can send and receive | 
 | // requests and response from `TestResponseProvider`. | 
 | TEST_F(HttpServerTest, StartAndInterfaceWithResponseProvider) { | 
 |   __block NSString* page_result; | 
 |   id completion_handler = | 
 |       ^(NSData* data, NSURLResponse* response, NSError* error) { | 
 |         page_result = [[NSString alloc] initWithData:data | 
 |                                             encoding:NSUTF8StringEncoding]; | 
 |       }; | 
 |   GURL url = HttpServer::GetSharedInstance().MakeUrl("http://whatever"); | 
 |   NSURLSessionDataTask* data_task = | 
 |       [[NSURLSession sharedSession] dataTaskWithURL:net::NSURLWithGURL(url) | 
 |                                   completionHandler:completion_handler]; | 
 |   [data_task resume]; | 
 |   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( | 
 |       TestTimeouts::action_timeout(), ^bool() { | 
 |         return page_result; | 
 |       })); | 
 |   EXPECT_NSEQ(page_result, base::SysUTF8ToNSString(kHelloWorld)); | 
 | } |