TwitterNetworkLayerTests/TNLContentEncodingTests.m (114 lines of code) (raw):
//
// TNLContentEncodingTests.m
// TwitterNetworkLayer
//
// Created on 11/21/16.
// Copyright © 2020 Twitter. All rights reserved.
//
#import <TwitterNetworkLayer/TwitterNetworkLayer.h>
#import <XCTest/XCTest.h>
#import "TNLXContentEncoding.h"
@interface TNLContentEncodingTests : XCTestCase
@end
static NSData *sJSONData = nil;
static NSData *sBase64Data = nil;
static NSURL *sJSONURL = nil;
static NSURL *sBase64URL = nil;
static TNLMutableRequestConfiguration *sConfig = nil;
static id<TNLContentEncoder> sBase64Encoder = nil;
static id<TNLContentDecoder> sBase64Decoder = nil;
@implementation TNLContentEncodingTests
+ (void)setUp
{
NSBundle *bundle = [NSBundle bundleForClass:self];
NSString *jsonDataPath = [bundle pathForResource:@"BingResults" ofType:@"json"];
NSString *base64DataPath = [bundle pathForResource:@"BingResults.json" ofType:@"base64"];
sJSONData = [NSData dataWithContentsOfFile:jsonDataPath];
sBase64Data = [NSData dataWithContentsOfFile:base64DataPath];
sBase64URL = [NSURL URLWithString:@"https://www.dummy.com/base64"];
sJSONURL = [NSURL URLWithString:@"https://www.dummy.com/json"];
NSHTTPURLResponse *base64Response = [[NSHTTPURLResponse alloc] initWithURL:sBase64URL statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:@{ @"Content-Encoding" : @"base64", @"Content-Type" : TNLHTTPContentTypeJSON, @"Content-Length" : @(sBase64Data.length).stringValue }];
NSHTTPURLResponse *jsonResponse = [[NSHTTPURLResponse alloc] initWithURL:sJSONURL statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:@{ @"Content-Type" : TNLHTTPContentTypeJSON, @"Content-Length" : @(sJSONData.length).stringValue }];
TNLPseudoURLResponseConfig *pseudoConfig = [[TNLPseudoURLResponseConfig alloc] init];
pseudoConfig.bps = 500000;
pseudoConfig.latency = 5;
[TNLPseudoURLProtocol registerURLResponse:base64Response body:sBase64Data config:pseudoConfig withEndpoint:sBase64URL];
[TNLPseudoURLProtocol registerURLResponse:jsonResponse body:sJSONData config:pseudoConfig withEndpoint:sJSONURL];
sConfig = [TNLMutableRequestConfiguration defaultConfiguration];
sConfig.attemptTimeout = NSTimeIntervalSince1970;
sConfig.idleTimeout = NSTimeIntervalSince1970;
sConfig.operationTimeout = NSTimeIntervalSince1970;
sConfig.protocolOptions = TNLRequestProtocolOptionPseudo;
sBase64Encoder = [TNLXContentEncoding Base64ContentEncoder];
sBase64Decoder = [TNLXContentEncoding Base64ContentDecoder];
}
+ (void)tearDown
{
sJSONData = nil;
sBase64Data = nil;
sJSONURL = nil;
sBase64URL = nil;
sConfig = nil;
sBase64Decoder = nil;
sBase64Encoder = nil;
[TNLPseudoURLProtocol unregisterAllEndpoints];
}
- (void)tearDown
{
sConfig.additionalContentDecoders = nil;
sConfig.contentEncoder = nil;
[super tearDown];
}
- (void)testBase64Encoding
{
TNLRequestOperation *op = nil;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
request.HTTPMethod = @"POST";
NSArray<NSString *> *knownCodecs;
if ([NSURLSessionConfiguration tnl_URLSessionSupportsDecodingBrotliContentEncoding]) {
knownCodecs = @[ @"br", @"deflate", @"gzip" ];
} else {
knownCodecs = @[ @"deflate", @"gzip" ];
}
// unencoded JSON in
// unencoded JSON out
request.URL = sJSONURL;
request.HTTPBody = sJSONData;
op = [TNLRequestOperation operationWithRequest:request configuration:sConfig delegate:nil];
[[TNLRequestOperationQueue defaultOperationQueue] enqueueRequestOperation:op];
[op waitUntilFinishedWithoutBlockingRunLoop];
XCTAssertEqual(op.response.info.statusCode, 200);
XCTAssertNil(op.response.info.allHTTPHeaderFields[@"Content-Encoding"]);
XCTAssertNotNil(op.response.info.data);
XCTAssertEqualObjects(op.response.info.data, sJSONData);
XCTAssertEqualObjects(op.hydratedURLRequest.HTTPBody, sJSONData);
// unencoded JSON in
// encoded JSON out
request.URL = sBase64URL;
request.HTTPBody = sJSONData;
op = [TNLRequestOperation operationWithRequest:request configuration:sConfig delegate:nil];
[[TNLRequestOperationQueue defaultOperationQueue] enqueueRequestOperation:op];
[op waitUntilFinishedWithoutBlockingRunLoop];
XCTAssertEqual(op.response.info.statusCode, 200);
XCTAssertEqualObjects(op.response.info.allHTTPHeaderFields[@"Content-Encoding"], @"base64");
XCTAssertNotNil(op.response.info.data);
XCTAssertEqualObjects(op.response.info.data, sBase64Data);
XCTAssertEqualObjects(op.hydratedURLRequest.HTTPBody, sJSONData);
// unencoded JSON in
// decoded JSON out
sConfig.additionalContentDecoders = @[ sBase64Decoder ];
request.URL = sBase64URL;
request.HTTPBody = sJSONData;
op = [TNLRequestOperation operationWithRequest:request configuration:sConfig delegate:nil];
[[TNLRequestOperationQueue defaultOperationQueue] enqueueRequestOperation:op];
[op waitUntilFinishedWithoutBlockingRunLoop];
XCTAssertEqual(op.response.info.statusCode, 200);
XCTAssertEqualObjects(op.response.info.allHTTPHeaderFields[@"Content-Encoding"], @"base64");
NSArray<NSString *> *acceptEncodings = [@[ @"base64" ] arrayByAddingObjectsFromArray:knownCodecs];
XCTAssertEqualObjects([op.hydratedURLRequest valueForHTTPHeaderField:@"Accept-Encoding"], [acceptEncodings componentsJoinedByString:@", "]);
XCTAssertNotNil(op.response.info.data);
XCTAssertEqualObjects(op.response.info.data, sJSONData);
XCTAssertEqualObjects(op.hydratedURLRequest.HTTPBody, sJSONData);
// encoded JSON in
// decoded JSON out (Accept-Encoding overridden)
sConfig.contentEncoder = sBase64Encoder;
request.URL = sBase64URL;
request.HTTPBody = sJSONData;
[request setValue:@"base64;q=0.8, base32;q=0.4, gzip;q=1.0" forHTTPHeaderField:@"Accept-Encoding"];
op = [TNLRequestOperation operationWithRequest:request configuration:sConfig delegate:nil];
[[TNLRequestOperationQueue defaultOperationQueue] enqueueRequestOperation:op];
[op waitUntilFinishedWithoutBlockingRunLoop];
XCTAssertEqual(op.response.info.statusCode, 200);
XCTAssertEqualObjects(op.response.info.allHTTPHeaderFields[@"Content-Encoding"], @"base64");
XCTAssertEqualObjects([op.hydratedURLRequest valueForHTTPHeaderField:@"Accept-Encoding"], @"base64;q=0.8, base32;q=0.4, gzip;q=1.0");
XCTAssertNotNil(op.response.info.data);
XCTAssertEqualObjects(op.response.info.data, sJSONData);
NSData *decoded = [[NSData alloc] initWithBase64EncodedData:op.hydratedURLRequest.HTTPBody options:NSDataBase64DecodingIgnoreUnknownCharacters];
XCTAssertEqualObjects(decoded ?: op.hydratedURLRequest.HTTPBody, sJSONData);
}
@end