@@ -194,6 +194,9 @@ - (void)assertCallbacksReleasedForFetcher:(GTMSessionFetcher *)fetcher {
194194 XCTAssertNil (fetcher.downloadProgressBlock );
195195 XCTAssertNil (fetcher.willCacheURLResponseBlock );
196196 XCTAssertNil (fetcher.retryBlock );
197+ if (@available (iOS 10.0 , macOS 10.12 , tvOS 10.0 , watchOS 3.0 , *)) {
198+ XCTAssertNil (fetcher.metricsCollectionBlock );
199+ }
197200 XCTAssertNil (fetcher.testBlock );
198201
199202 if ([fetcher isKindOfClass: [GTMSessionUploadFetcher class ]]) {
@@ -1849,6 +1852,120 @@ - (void)testInsecureRequests_WithoutFetcherService {
18491852 [self testInsecureRequests ];
18501853}
18511854
1855+ - (void )testCollectingMetrics_WithSuccessfulFetch API_AVAILABLE(ios(10.0 ), macosx(10.12 ),
1856+ tvos (10.0 ), watchos(3.0 )) {
1857+ if (!_isServerRunning) return ;
1858+
1859+ NSString *localURLString = [self localURLStringToTestFileName: kGTMGettysburgFileName ];
1860+ GTMSessionFetcher *fetcher = [self fetcherWithURLString: localURLString];
1861+ __block NSURLSessionTaskMetrics *collectedMetrics = nil ;
1862+
1863+ fetcher.metricsCollectionBlock = ^(NSURLSessionTaskMetrics *_Nonnull metrics) {
1864+ collectedMetrics = metrics;
1865+ };
1866+
1867+ [fetcher beginFetchWithCompletionHandler: ^(NSData *data, NSError *error) {
1868+ [self assertSuccessfulGettysburgFetchWithFetcher: fetcher data: data error: error];
1869+ }];
1870+ XCTAssertTrue ([fetcher waitForCompletionWithTimeout: _timeoutInterval], @" timed out" );
1871+ [self assertCallbacksReleasedForFetcher: fetcher];
1872+
1873+ XCTAssertNotNil (collectedMetrics);
1874+ XCTAssertEqual (collectedMetrics.transactionMetrics .count , 1 );
1875+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].fetchStartDate );
1876+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].connectStartDate );
1877+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].connectEndDate );
1878+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].requestStartDate );
1879+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].requestEndDate );
1880+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].responseStartDate );
1881+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].responseEndDate );
1882+ }
1883+
1884+ - (void )testCollectingMetrics_WithSuccessfulFetch_WithoutFetcherService API_AVAILABLE(
1885+ ios (10.0 ), macosx(10.12 ), tvos(10.0 ), watchos(3.0 )) {
1886+ _fetcherService = nil ;
1887+ [self testCollectingMetrics_WithSuccessfulFetch ];
1888+ }
1889+
1890+ - (void )testCollectingMetrics_WithWrongFetch_FaildToConnect API_AVAILABLE(ios(10.0 ), macosx(10.12 ),
1891+ tvos (10.0 ),
1892+ watchos(3.0 )) {
1893+ if (!_isServerRunning) return ;
1894+
1895+ // Fetch a live, invalid URL
1896+ NSString *badURLString = @" http://localhost:86/" ;
1897+
1898+ GTMSessionFetcher *fetcher = [self fetcherWithURLString: badURLString];
1899+
1900+ __block NSURLSessionTaskMetrics *collectedMetrics = nil ;
1901+ fetcher.metricsCollectionBlock = ^(NSURLSessionTaskMetrics *_Nonnull metrics) {
1902+ collectedMetrics = metrics;
1903+ };
1904+
1905+ [fetcher beginFetchWithCompletionHandler: ^(NSData *data, NSError *error) {
1906+ XCTAssertNotNil (error);
1907+ }];
1908+ XCTAssertTrue ([fetcher waitForCompletionWithTimeout: _timeoutInterval], @" timed out" );
1909+ [self assertCallbacksReleasedForFetcher: fetcher];
1910+
1911+ XCTAssertNotNil (collectedMetrics);
1912+ XCTAssertEqual (collectedMetrics.transactionMetrics .count , 1 );
1913+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].fetchStartDate );
1914+
1915+ // Connetion not established, and therefore the following metrics do not exist.
1916+ XCTAssertNil (collectedMetrics.transactionMetrics [0 ].connectStartDate );
1917+ XCTAssertNil (collectedMetrics.transactionMetrics [0 ].connectEndDate );
1918+ XCTAssertNil (collectedMetrics.transactionMetrics [0 ].requestStartDate );
1919+ XCTAssertNil (collectedMetrics.transactionMetrics [0 ].requestEndDate );
1920+ XCTAssertNil (collectedMetrics.transactionMetrics [0 ].responseStartDate );
1921+ XCTAssertNil (collectedMetrics.transactionMetrics [0 ].responseEndDate );
1922+ }
1923+
1924+ - (void )testCollectingMetrics_WithWrongFetch_FaildToConnect_WithoutFetcherService API_AVAILABLE(
1925+ ios (10.0 ), macosx(10.12 ), tvos(10.0 ), watchos(3.0 )) {
1926+ _fetcherService = nil ;
1927+ [self testCollectingMetrics_WithWrongFetch_FaildToConnect ];
1928+ }
1929+
1930+ - (void )testCollectingMetrics_WithWrongFetch_BadStatusCode API_AVAILABLE(ios(10.0 ), macosx(10.12 ),
1931+ tvos (10.0 ), watchos(3.0 )) {
1932+ if (!_isServerRunning) return ;
1933+
1934+ NSString *statusURLString = [self localURLStringToTestFileName: kGTMGettysburgFileName
1935+ parameters: @{@" status" : @" 400" }];
1936+
1937+ GTMSessionFetcher *fetcher = [self fetcherWithURLString: statusURLString];
1938+
1939+ __block NSURLSessionTaskMetrics *collectedMetrics = nil ;
1940+ fetcher.metricsCollectionBlock = ^(NSURLSessionTaskMetrics *_Nonnull metrics) {
1941+ collectedMetrics = metrics;
1942+ };
1943+
1944+ [fetcher beginFetchWithCompletionHandler: ^(NSData *data, NSError *error) {
1945+ XCTAssertNotNil (error);
1946+ }];
1947+ XCTAssertTrue ([fetcher waitForCompletionWithTimeout: _timeoutInterval], @" timed out" );
1948+ [self assertCallbacksReleasedForFetcher: fetcher];
1949+
1950+ XCTAssertNotNil (collectedMetrics);
1951+ XCTAssertEqual (collectedMetrics.transactionMetrics .count , 1 );
1952+
1953+ // A 400 HTTP response is still a complete response, and therefore these metrics exist.
1954+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].fetchStartDate );
1955+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].connectStartDate );
1956+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].connectEndDate );
1957+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].requestStartDate );
1958+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].requestEndDate );
1959+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].responseStartDate );
1960+ XCTAssertNotNil (collectedMetrics.transactionMetrics [0 ].responseEndDate );
1961+ }
1962+
1963+ - (void )testCollectingMetrics_WithWrongFetch_BadStatusCode_WithoutFetcherService API_AVAILABLE(
1964+ ios (10.0 ), macosx(10.12 ), tvos(10.0 ), watchos(3.0 )) {
1965+ _fetcherService = nil ;
1966+ [self testCollectingMetrics_WithWrongFetch_BadStatusCode ];
1967+ }
1968+
18521969#pragma mark - TestBlock Tests
18531970
18541971- (void )testFetcherTestBlock {
0 commit comments