EMASCurlTests/EMASCurlDNSResolverTest.m (81 lines of code) (raw):

// // EMASCurlDNSResolverTest.m // EMASCurlTests // // Created by xuyecan on 2024/12/17. // #import <XCTest/XCTest.h> #import <EMASCurl/EMASCurl.h> #import "EMASCurlTestConstants.h" static NSURLSession *session; @interface TestDNSResolver : NSObject <EMASCurlProtocolDNSResolver> @end @implementation TestDNSResolver + (nullable NSString *)resolveDomain:(nonnull NSString *)domain { if ([domain isEqualToString:@"test.emascurl.local"]) { return @"127.0.0.1"; } return nil; } @end @interface EMASCurlDNSResolverTestBase : XCTestCase @property (nonatomic, strong) NSMutableData *receivedData; @end @implementation EMASCurlDNSResolverTestBase - (void)setUp { [super setUp]; self.receivedData = [NSMutableData data]; } - (void)tearDown { [super tearDown]; } - (void)verifyCustomDNSResolutionWithEndpoint:(NSString *)endpoint { NSString *testURL = [NSString stringWithFormat:@"%@%@", endpoint, PATH_DOWNLOAD_1MB_DATA_AT_200KBPS_SPEED]; testURL = [testURL stringByReplacingOccurrencesOfString:@"127.0.0.1" withString:@"test.emascurl.local"]; NSURL *url = [NSURL URLWithString:testURL]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { XCTAssertNil(error, @"Download failed with error: %@", error); XCTAssertNotNil(response, @"No response received"); NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; XCTAssertEqual(httpResponse.statusCode, 200, @"Expected 200 status code"); XCTAssertEqual(1024 * 1024, [data length], @"Expected 1MB of data"); dispatch_semaphore_signal(semaphore); }]; [dataTask resume]; XCTAssertEqual(dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC)), 0, @"Request timed out"); } - (void)verifyCustomDNSResolutionWithInvalidDomainAndEndpoint:(NSString *)endpoint { NSString *testURL = [NSString stringWithFormat:@"%@%@", endpoint, PATH_DOWNLOAD_1MB_DATA_AT_200KBPS_SPEED]; testURL = [testURL stringByReplacingOccurrencesOfString:@"127.0.0.1" withString:@"invalid.emascurl.local"]; NSURL *url = [NSURL URLWithString:testURL]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.timeoutInterval = 10; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { XCTAssertNotNil(error, @"Expected an error for invalid domain"); XCTAssertNil(data, @"Should not receive any data"); dispatch_semaphore_signal(semaphore); }]; [dataTask resume]; XCTAssertEqual(dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 15 * NSEC_PER_SEC)), 0, @"Request timed out"); } @end @interface EMASCurlDNSResolverTestHttp11 : EMASCurlDNSResolverTestBase @end @implementation EMASCurlDNSResolverTestHttp11 + (void)setUp { [EMASCurlProtocol setDebugLogEnabled:YES]; [EMASCurlProtocol setDNSResolver:[TestDNSResolver class]]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; [EMASCurlProtocol installIntoSessionConfiguration:config]; session = [NSURLSession sessionWithConfiguration:config]; } - (void)testCustomDNSResolution { [self verifyCustomDNSResolutionWithEndpoint:HTTP11_ENDPOINT]; } - (void)testCustomDNSResolutionWithInvalidDomain { [self verifyCustomDNSResolutionWithInvalidDomainAndEndpoint:HTTP11_ENDPOINT]; } @end @interface EMASCurlDNSResolverTestHttp2 : EMASCurlDNSResolverTestBase @end @implementation EMASCurlDNSResolverTestHttp2 /// MockServer用的证书没有把域名签进去,只签了127.0.0.1,先不测 @end