@@ -491,6 +491,71 @@ final class GenerativeModelVertexAITests: XCTestCase {
491491 XCTAssertEqual ( usageMetadata. toolUsePromptTokenCount, 371 )
492492 }
493493
494+ func testGenerateContent_success_urlContext( ) async throws {
495+ MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
496+ forResource: " unary-success-url-context " ,
497+ withExtension: " json " ,
498+ subdirectory: vertexSubdirectory
499+ )
500+
501+ let response = try await model. generateContent ( testPrompt)
502+
503+ XCTAssertEqual ( response. candidates. count, 1 )
504+ let candidate = try XCTUnwrap ( response. candidates. first)
505+ let urlContextMetadata = try XCTUnwrap ( candidate. urlContextMetadata)
506+ XCTAssertEqual ( urlContextMetadata. urlMetadata. count, 1 )
507+ let urlMetadata = try XCTUnwrap ( urlContextMetadata. urlMetadata. first)
508+ let retrievedURL = try XCTUnwrap ( urlMetadata. retrievedURL)
509+ XCTAssertEqual (
510+ retrievedURL,
511+ URL ( string: " https://berkshirehathaway.com " )
512+ )
513+ XCTAssertEqual ( urlMetadata. retrievalStatus, . success)
514+ let usageMetadata = try XCTUnwrap ( response. usageMetadata)
515+ XCTAssertEqual ( usageMetadata. toolUsePromptTokenCount, 34 )
516+ XCTAssertEqual ( usageMetadata. thoughtsTokenCount, 36 )
517+ }
518+
519+ func testGenerateContent_success_urlContext_mixedValidity( ) async throws {
520+ MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
521+ forResource: " unary-success-url-context-mixed-validity " ,
522+ withExtension: " json " ,
523+ subdirectory: vertexSubdirectory
524+ )
525+
526+ let response = try await model. generateContent ( testPrompt)
527+
528+ let candidate = try XCTUnwrap ( response. candidates. first)
529+ let urlContextMetadata = try XCTUnwrap ( candidate. urlContextMetadata)
530+ XCTAssertEqual ( urlContextMetadata. urlMetadata. count, 3 )
531+
532+ let paywallURLMetadata = urlContextMetadata. urlMetadata [ 0 ]
533+ XCTAssertEqual ( paywallURLMetadata. retrievalStatus, . error)
534+
535+ let successURLMetadata = urlContextMetadata. urlMetadata [ 1 ]
536+ XCTAssertEqual ( successURLMetadata. retrievalStatus, . success)
537+
538+ let errorURLMetadata = urlContextMetadata. urlMetadata [ 2 ]
539+ XCTAssertEqual ( errorURLMetadata. retrievalStatus, . error)
540+ }
541+
542+ func testGenerateContent_success_urlContext_retrievedURLPresentOnErrorStatus( ) async throws {
543+ MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
544+ forResource: " unary-success-url-context-missing-retrievedurl " ,
545+ withExtension: " json " ,
546+ subdirectory: vertexSubdirectory
547+ )
548+
549+ let response = try await model. generateContent ( testPrompt)
550+
551+ let candidate = try XCTUnwrap ( response. candidates. first)
552+ let urlContextMetadata = try XCTUnwrap ( candidate. urlContextMetadata)
553+ let urlMetadata = try XCTUnwrap ( urlContextMetadata. urlMetadata. first)
554+ let retrievedURL = try XCTUnwrap ( urlMetadata. retrievedURL)
555+ XCTAssertEqual ( retrievedURL. absoluteString, " https://example.com/8 " )
556+ XCTAssertEqual ( urlMetadata. retrievalStatus, . error)
557+ }
558+
494559 func testGenerateContent_success_image_invalidSafetyRatingsIgnored( ) async throws {
495560 MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
496561 forResource: " unary-success-image-invalid-safety-ratings " ,
@@ -1720,6 +1785,29 @@ final class GenerativeModelVertexAITests: XCTestCase {
17201785 XCTAssertEqual ( responses, 1 )
17211786 }
17221787
1788+ func testGenerateContentStream_success_urlContext( ) async throws {
1789+ MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
1790+ forResource: " streaming-success-url-context " ,
1791+ withExtension: " txt " ,
1792+ subdirectory: vertexSubdirectory
1793+ )
1794+
1795+ var responses = [ GenerateContentResponse] ( )
1796+ let stream = try model. generateContentStream ( testPrompt)
1797+ for try await response in stream {
1798+ responses. append ( response)
1799+ }
1800+
1801+ let firstResponse = try XCTUnwrap ( responses. first)
1802+ let candidate = try XCTUnwrap ( firstResponse. candidates. first)
1803+ let urlContextMetadata = try XCTUnwrap ( candidate. urlContextMetadata)
1804+ XCTAssertEqual ( urlContextMetadata. urlMetadata. count, 1 )
1805+ let urlMetadata = try XCTUnwrap ( urlContextMetadata. urlMetadata. first)
1806+ let retrievedURL = try XCTUnwrap ( urlMetadata. retrievedURL)
1807+ XCTAssertEqual ( retrievedURL, URL ( string: " https://google.com " ) )
1808+ XCTAssertEqual ( urlMetadata. retrievalStatus, . success)
1809+ }
1810+
17231811 // MARK: - Count Tokens
17241812
17251813 func testCountTokens_succeeds( ) async throws {
0 commit comments