@@ -491,6 +491,71 @@ final class GenerativeModelVertexAITests: XCTestCase {
491
491
XCTAssertEqual ( usageMetadata. toolUsePromptTokenCount, 371 )
492
492
}
493
493
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
+
494
559
func testGenerateContent_success_image_invalidSafetyRatingsIgnored( ) async throws {
495
560
MockURLProtocol . requestHandler = try GenerativeModelTestUtil . httpRequestHandler (
496
561
forResource: " unary-success-image-invalid-safety-ratings " ,
@@ -1720,6 +1785,29 @@ final class GenerativeModelVertexAITests: XCTestCase {
1720
1785
XCTAssertEqual ( responses, 1 )
1721
1786
}
1722
1787
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
+
1723
1811
// MARK: - Count Tokens
1724
1812
1725
1813
func testCountTokens_succeeds( ) async throws {
0 commit comments