From 36aee483a7157c0632492da88d372b20bda6b5d5 Mon Sep 17 00:00:00 2001 From: Vladimir Frolov Date: Mon, 24 Jun 2024 12:55:43 +0300 Subject: [PATCH] add request data for uploading task --- .../SBTUITestTunnel_Tests/MonitorTests.swift | 56 +++++++++++++++++++ .../SBTMonitoredNetworkRequest.m | 2 + .../include/SBTMonitoredNetworkRequest.h | 1 + .../private/SBTProxyURLProtocol.m | 8 +++ 4 files changed, 67 insertions(+) diff --git a/Example/SBTUITestTunnel_Tests/MonitorTests.swift b/Example/SBTUITestTunnel_Tests/MonitorTests.swift index e44eeaa6..17326b22 100644 --- a/Example/SBTUITestTunnel_Tests/MonitorTests.swift +++ b/Example/SBTUITestTunnel_Tests/MonitorTests.swift @@ -261,6 +261,62 @@ class MonitorTests: XCTestCase { XCTAssert(app.monitorRequestRemoveAll()) } + func testMonitorUploadRequestWithHTTPBodyShouldHaveRequestData() { + app.monitorRequests(matching: SBTRequestMatch(url: "httpbin.org", method: "POST")) + + let largeBody = String(repeating: "a", count: 200) + + _ = request.uploadTaskNetwork(urlString: "https://httpbin.org/post", data: largeBody.data(using: .utf8)) + + let requests = app.monitoredRequestsFlushAll() + XCTAssertEqual(requests.count, 1) + print(requests.map(\.debugDescription)) + + for request in requests { + guard let httpBody = request.requestData else { + XCTFail("Missing http body") + continue + } + + XCTAssertEqual(String(data: httpBody, encoding: .utf8), largeBody) + + XCTAssert((request.responseString()!).contains("httpbin.org")) + XCTAssert(request.timestamp > 0.0) + XCTAssert(request.requestTime > 0.0) + } + + XCTAssert(app.stubRequestsRemoveAll()) + XCTAssert(app.monitorRequestRemoveAll()) + } + + func testMonitorUploadRequestWithLargeHTTPBodyShouldHaveRequestData() { + app.monitorRequests(matching: SBTRequestMatch(url: "httpbin.org", method: "POST")) + + let largeBody = String(repeating: "a", count: 20000) + + _ = request.uploadTaskNetwork(urlString: "https://httpbin.org/post", data: largeBody.data(using: .utf8)) + + let requests = app.monitoredRequestsFlushAll() + XCTAssertEqual(requests.count, 1) + print(requests.map(\.debugDescription)) + + for request in requests { + guard let httpBody = request.requestData else { + XCTFail("Missing http body") + continue + } + + XCTAssertEqual(String(data: httpBody, encoding: .utf8), largeBody) + + XCTAssert((request.responseString()!).contains("httpbin.org")) + XCTAssert(request.timestamp > 0.0) + XCTAssert(request.requestTime > 0.0) + } + + XCTAssert(app.stubRequestsRemoveAll()) + XCTAssert(app.monitorRequestRemoveAll()) + } + func testSyncWaitForMonitoredRequestsDoesNotTimeout() { app.monitorRequests(matching: SBTRequestMatch(url: "httpbin.org")) diff --git a/Sources/SBTUITestTunnelCommon/SBTMonitoredNetworkRequest.m b/Sources/SBTUITestTunnelCommon/SBTMonitoredNetworkRequest.m index 7b90d1bd..0ecfc3ad 100644 --- a/Sources/SBTUITestTunnelCommon/SBTMonitoredNetworkRequest.m +++ b/Sources/SBTUITestTunnelCommon/SBTMonitoredNetworkRequest.m @@ -37,6 +37,7 @@ - (instancetype)initWithCoder:(NSCoder *)decoder self.responseData = [decoder decodeObjectOfClass:[NSData class] forKey:NSStringFromSelector(@selector(responseData))]; self.isStubbed = [decoder decodeBoolForKey:NSStringFromSelector(@selector(isStubbed))]; self.isRewritten = [decoder decodeBoolForKey:NSStringFromSelector(@selector(isRewritten))]; + self.requestData = [decoder decodeObjectOfClass:[NSData class] forKey:NSStringFromSelector(@selector(requestData))]; } return self; @@ -57,6 +58,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder [encoder encodeObject:self.response forKey:NSStringFromSelector(@selector(response))]; [encoder encodeObject:self.responseData forKey:NSStringFromSelector(@selector(responseData))]; + [encoder encodeObject:self.requestData forKey:NSStringFromSelector(@selector(requestData))]; [encoder encodeBool:self.isStubbed forKey:NSStringFromSelector(@selector(isStubbed))]; [encoder encodeBool:self.isRewritten forKey:NSStringFromSelector(@selector(isRewritten))]; } diff --git a/Sources/SBTUITestTunnelCommon/include/SBTMonitoredNetworkRequest.h b/Sources/SBTUITestTunnelCommon/include/SBTMonitoredNetworkRequest.h index 58d62e1a..62e090be 100644 --- a/Sources/SBTUITestTunnelCommon/include/SBTMonitoredNetworkRequest.h +++ b/Sources/SBTUITestTunnelCommon/include/SBTMonitoredNetworkRequest.h @@ -36,6 +36,7 @@ @property (nullable, nonatomic, strong) NSHTTPURLResponse *response; @property (nullable, nonatomic, strong) NSData *responseData; +@property (nullable, nonatomic, strong) NSData *requestData; @property (nonatomic, assign) BOOL isStubbed; @property (nonatomic, assign) BOOL isRewritten; diff --git a/Sources/SBTUITestTunnelServer/private/SBTProxyURLProtocol.m b/Sources/SBTUITestTunnelServer/private/SBTProxyURLProtocol.m index 783ea2a2..9d5641e4 100644 --- a/Sources/SBTUITestTunnelServer/private/SBTProxyURLProtocol.m +++ b/Sources/SBTUITestTunnelServer/private/SBTProxyURLProtocol.m @@ -432,6 +432,10 @@ - (void)startLoading monitoredRequest.isStubbed = YES; monitoredRequest.isRewritten = NO; + NSData *bodyData = ([monitoredRequest.originalRequest sbt_isUploadTaskRequest]) ? [monitoredRequest.originalRequest sbt_uploadHTTPBody] : monitoredRequest.originalRequest.HTTPBody; + + monitoredRequest.requestData = bodyData; + dispatch_sync([SBTProxyURLProtocol sharedInstance].monitoredRequestsSyncQueue, ^{ [[SBTProxyURLProtocol sharedInstance].monitoredRequests addObject:monitoredRequest]; }); @@ -603,6 +607,10 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didComp monitoredRequest.isStubbed = NO; monitoredRequest.isRewritten = isRequestRewritten; + NSData *bodyData = ([monitoredRequest.originalRequest sbt_isUploadTaskRequest]) ? [monitoredRequest.originalRequest sbt_uploadHTTPBody] : monitoredRequest.originalRequest.HTTPBody; + + monitoredRequest.requestData = bodyData; + dispatch_sync([SBTProxyURLProtocol sharedInstance].monitoredRequestsSyncQueue, ^{ [[SBTProxyURLProtocol sharedInstance].monitoredRequests addObject:monitoredRequest]; });