| Index: components/cronet/ios/test/cronet_http_test.mm
|
| diff --git a/ios/crnet/test/crnet_http_tests.mm b/components/cronet/ios/test/cronet_http_test.mm
|
| similarity index 52%
|
| copy from ios/crnet/test/crnet_http_tests.mm
|
| copy to components/cronet/ios/test/cronet_http_test.mm
|
| index 7ab9b39dcda06b764eeeef5104e9d8c6a1d498bd..4b3e7465b530f5373aab28c06d654fde0e48ebf8 100644
|
| --- a/ios/crnet/test/crnet_http_tests.mm
|
| +++ b/components/cronet/ios/test/cronet_http_test.mm
|
| @@ -2,19 +2,22 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#import <Cronet/Cronet.h>
|
| #import <Foundation/Foundation.h>
|
| -#include <stdint.h>
|
|
|
| -#import <CrNet/CrNet.h>
|
| +#include <stdint.h>
|
|
|
| #include "base/logging.h"
|
| #include "base/mac/scoped_nsobject.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| -#import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServer.h"
|
| -#import "ios/third_party/gcdwebserver/src/GCDWebServer/Responses/GCDWebServerDataResponse.h"
|
| +#include "components/cronet/ios/test/quic_test_server.h"
|
| +#include "components/cronet/ios/test/test_server.h"
|
| #include "net/base/mac/url_conversions.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/cert/mock_cert_verifier.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "testing/gtest_mac.h"
|
| +
|
| #include "url/gurl.h"
|
|
|
| @interface TestDelegate : NSObject<NSURLSessionDataDelegate,
|
| @@ -26,8 +29,8 @@
|
| // signals this semaphore.
|
| @property(assign, nonatomic) dispatch_semaphore_t semaphore;
|
|
|
| -// Total count of bytes received by the request this delegate is attached to.
|
| -@property(nonatomic) unsigned long receivedBytes;
|
| +// Body of response received by the request this delegate is attached to.
|
| +@property(retain, nonatomic) NSString* responseBody;
|
|
|
| // Error the request this delegate is attached to failed with, if any.
|
| @property(retain, nonatomic) NSError* error;
|
| @@ -36,7 +39,7 @@
|
|
|
| @implementation TestDelegate
|
| @synthesize semaphore = _semaphore;
|
| -@synthesize receivedBytes = _receivedBytes;
|
| +@synthesize responseBody = _responseBody;
|
| @synthesize error = _error;
|
|
|
| - (id)init {
|
| @@ -84,7 +87,13 @@
|
| - (void)URLSession:(NSURLSession*)session
|
| dataTask:(NSURLSessionDataTask*)dataTask
|
| didReceiveData:(NSData*)data {
|
| - _receivedBytes += (unsigned long)data.length;
|
| + NSString* stringData =
|
| + [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
| + if (_responseBody == nil) {
|
| + _responseBody = stringData;
|
| + } else {
|
| + _responseBody = [_responseBody stringByAppendingString:stringData];
|
| + }
|
| }
|
|
|
| - (void)URLSession:(NSURLSession*)session
|
| @@ -97,10 +106,14 @@
|
|
|
| @end
|
|
|
| +namespace cronet {
|
| // base::TimeDelta would normally be ideal for this but it does not support
|
| // nanosecond resolution.
|
| static const int64_t ns_in_second = 1000000000LL;
|
| -const char kUserAgent[] = "CrNetTest/1.0.0.0";
|
| +const char kUserAgent[] = "CronetTest/1.0.0.0";
|
| +
|
| +// TODO(mef): Create common header file to declare this.
|
| +void StartCronetIfNecessary();
|
|
|
| class HttpTest : public ::testing::Test {
|
| protected:
|
| @@ -108,11 +121,10 @@ class HttpTest : public ::testing::Test {
|
| ~HttpTest() override {}
|
|
|
| void SetUp() override {
|
| - [CrNet setUserAgent:base::SysUTF8ToNSString(kUserAgent) partial:NO];
|
| - [CrNet install];
|
| + StartCronetIfNecessary();
|
| NSURLSessionConfiguration* config =
|
| [NSURLSessionConfiguration ephemeralSessionConfiguration];
|
| - [CrNet installIntoSessionConfiguration:config];
|
| + [Cronet installIntoSessionConfiguration:config];
|
| delegate_.reset([[TestDelegate alloc] init]);
|
| NSURLSession* session = [NSURLSession sessionWithConfiguration:config
|
| delegate:delegate_
|
| @@ -120,40 +132,13 @@ class HttpTest : public ::testing::Test {
|
| // Take a reference to the session and store it so it doesn't get
|
| // deallocated until this object does.
|
| session_.reset([session retain]);
|
| - web_server_.reset([[GCDWebServer alloc] init]);
|
| + StartQuicTestServer();
|
| + TestServer::Start();
|
| }
|
|
|
| void TearDown() override {
|
| - [CrNet uninstall];
|
| - [web_server_ stop];
|
| - }
|
| -
|
| - // Starts a GCDWebServer instance on localhost port 8080, and remembers the
|
| - // root URL for later; tests can use GetURL() to produce a URL referring to a
|
| - // specific resource under the root URL.
|
| - void StartWebServer() {
|
| - [web_server_ startWithPort:8080 bonjourName:nil];
|
| - server_root_ = net::GURLWithNSURL([web_server_ serverURL]);
|
| - }
|
| -
|
| - // Registers a fixed response |text| to be returned to requests for |path|,
|
| - // which is relative to |server_root_|.
|
| - void RegisterPathText(const std::string& path, const std::string& text) {
|
| - NSString* nspath = base::SysUTF8ToNSString(path);
|
| - NSData* data = [NSData dataWithBytes:text.c_str() length:text.length()];
|
| - [web_server_ addGETHandlerForPath:nspath
|
| - staticData:data
|
| - contentType:@"text/plain"
|
| - cacheAge:30];
|
| - }
|
| -
|
| - void RegisterPathHandler(const std::string& path,
|
| - GCDWebServerProcessBlock handler) {
|
| - NSString* nspath = base::SysUTF8ToNSString(path);
|
| - [web_server_ addHandlerForMethod:@"GET"
|
| - path:nspath
|
| - requestClass:NSClassFromString(@"GCDWebServerRequest")
|
| - processBlock:handler];
|
| + ShutdownQuicTestServer();
|
| + TestServer::Shutdown();
|
| }
|
|
|
| // Launches the supplied |task| and blocks until it completes, with a timeout
|
| @@ -165,82 +150,56 @@ class HttpTest : public ::testing::Test {
|
| dispatch_time(DISPATCH_TIME_NOW, deadline_ns));
|
| }
|
|
|
| - // Returns a URL to refer to the resource named |path| served by the test
|
| - // server. If |path| starts with a /, the leading / will be stripped.
|
| - GURL GetURL(const std::string& path) {
|
| - std::string real_path = path[0] == '/' ? path.substr(1) : path;
|
| - return server_root_.Resolve(real_path);
|
| - }
|
| -
|
| - // Some convenience functions for working with GCDWebServerRequest and
|
| - // GCDWebServerResponse.
|
| -
|
| - // Returns true if the value for the request header |header| is not nil and
|
| - // contains the string |target|.
|
| - bool HeaderValueContains(GCDWebServerRequest* request,
|
| - const std::string& header,
|
| - const std::string& target) {
|
| - NSString* key = base::SysUTF8ToNSString(header);
|
| - NSString* needle = base::SysUTF8ToNSString(target);
|
| - NSString* haystack = request.headers[key];
|
| - if (!haystack)
|
| - return false;
|
| - return [haystack rangeOfString:needle].location != NSNotFound;
|
| - }
|
| -
|
| base::scoped_nsobject<NSURLSession> session_;
|
| base::scoped_nsobject<TestDelegate> delegate_;
|
| -
|
| - private:
|
| - base::scoped_nsobject<GCDWebServer> web_server_;
|
| - GURL server_root_;
|
| };
|
|
|
| TEST_F(HttpTest, NSURLSessionReceivesData) {
|
| - const char kPath[] = "/foo";
|
| - const char kData[] = "foobar";
|
| - RegisterPathText(kPath, kData);
|
| - StartWebServer();
|
| + NSURL* url = net::NSURLWithGURL(GURL(kTestServerUrl));
|
| + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
|
| + StartDataTaskAndWaitForCompletion(task);
|
| + EXPECT_EQ(nil, [delegate_ error]);
|
| + EXPECT_STREQ(kHelloBodyValue, [[delegate_ responseBody] UTF8String]);
|
| +}
|
| +
|
| +TEST_F(HttpTest, GetGlobalMetricsDeltas) {
|
| + NSData* delta1 = [Cronet getGlobalMetricsDeltas];
|
|
|
| - NSURL* url = net::NSURLWithGURL(GetURL(kPath));
|
| + NSURL* url = net::NSURLWithGURL(GURL(kTestServerUrl));
|
| NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
|
| StartDataTaskAndWaitForCompletion(task);
|
| EXPECT_EQ(nil, [delegate_ error]);
|
| - EXPECT_EQ(strlen(kData), [delegate_ receivedBytes]);
|
| + EXPECT_STREQ(kHelloBodyValue, [[delegate_ responseBody] UTF8String]);
|
| +
|
| + NSData* delta2 = [Cronet getGlobalMetricsDeltas];
|
| + EXPECT_FALSE([delta2 isEqualToData:delta1]);
|
| }
|
|
|
| TEST_F(HttpTest, SdchDisabledByDefault) {
|
| - const char kPath[] = "/sdchtest";
|
| - RegisterPathHandler(kPath,
|
| - ^GCDWebServerResponse* (GCDWebServerRequest* req) {
|
| - EXPECT_FALSE(HeaderValueContains(req, "Accept-Encoding", "sdch"));
|
| - return [GCDWebServerDataResponse responseWithText:@"woot!"];
|
| - });
|
| - StartWebServer();
|
| - NSURL* url = net::NSURLWithGURL(GetURL(kPath));
|
| + NSURL* url =
|
| + net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Encoding")));
|
| + NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
|
| + StartDataTaskAndWaitForCompletion(task);
|
| + EXPECT_EQ(nil, [delegate_ error]);
|
| + EXPECT_FALSE([[delegate_ responseBody] containsString:@"sdch"]);
|
| +}
|
| +
|
| +TEST_F(HttpTest, NSURLSessionAcceptLanguage) {
|
| + NSURL* url =
|
| + net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Language")));
|
| NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
|
| StartDataTaskAndWaitForCompletion(task);
|
| EXPECT_EQ(nil, [delegate_ error]);
|
| - EXPECT_TRUE([delegate_ receivedBytes]);
|
| + ASSERT_STREQ("en-US,en", [[delegate_ responseBody] UTF8String]);
|
| }
|
|
|
| TEST_F(HttpTest, SetUserAgentIsExact) {
|
| - const char kPath[] = "/uatest";
|
| - RegisterPathHandler(kPath, ^GCDWebServerResponse*(GCDWebServerRequest* req) {
|
| - EXPECT_STREQ(kUserAgent,
|
| - [[req.headers valueForKey:@"User-Agent"] UTF8String]);
|
| - return [GCDWebServerDataResponse responseWithText:@"yay!"];
|
| - });
|
| - StartWebServer();
|
| - NSURL* url = net::NSURLWithGURL(GetURL(kPath));
|
| + NSURL* url =
|
| + net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("User-Agent")));
|
| NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
|
| StartDataTaskAndWaitForCompletion(task);
|
| EXPECT_EQ(nil, [delegate_ error]);
|
| - EXPECT_TRUE([delegate_ receivedBytes]);
|
| + EXPECT_STREQ(kUserAgent, [[delegate_ responseBody] UTF8String]);
|
| }
|
|
|
| -// TODO(ellyjones): There needs to be a test that enabling SDCH works, but
|
| -// because CrNet is static and 'uninstall' only disables it, there is no way to
|
| -// have an individual test enable or disable SDCH.
|
| -// Probably there is a way to get gtest tests to run in a separate process, but
|
| -// I'm not sure what it is.
|
| +} // namespace cronet
|
|
|