diff --git a/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements b/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements
index ee95ab7e582..225aa48bc8c 100644
--- a/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements
+++ b/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements
@@ -6,5 +6,7 @@
com.apple.security.network.client
+ keychain-access-groups
+
diff --git a/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift b/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift
index deaa0985310..b9c266f7ca3 100644
--- a/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift
+++ b/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift
@@ -12,19 +12,25 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import XCTest
-
import FirebaseAI
-
-final class ServerPromptTemplateIntegrationTests: XCTestCase {
- override func setUp() {
- super.setUp()
- continueAfterFailure = false
- }
-
- func testGenerateContentWithText() async throws {
- let model = FirebaseAI.firebaseAI(backend: .vertexAI(location: "global"))
- .templateGenerativeModel()
+import Testing
+#if canImport(UIKit)
+ import UIKit
+#endif
+
+struct ServerPromptTemplateIntegrationTests {
+ private static let testConfigs: [InstanceConfig] = [
+ .vertexAI_v1beta,
+ .vertexAI_v1beta_global,
+ ]
+ private static let imageGenerationTestConfigs: [InstanceConfig] = [.vertexAI_v1beta]
+
+ @Test(arguments: [
+ // The "greeting2" template is only available in the `global` location.
+ InstanceConfig.vertexAI_v1beta_global,
+ ])
+ func generateContentWithText(_ config: InstanceConfig) async throws {
+ let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
let userName = "paul"
let response = try await model.generateContent(
template: "greeting2",
@@ -33,12 +39,13 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
"language": "Spanish",
]
)
- let text = try XCTUnwrap(response.text)
- XCTAssert(text.contains("Paul"))
+ let text = try #require(response.text)
+ #expect(text.contains("Paul"))
}
- func testGenerateContentStream() async throws {
- let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
+ @Test(arguments: testConfigs)
+ func generateContentStream(_ config: InstanceConfig) async throws {
+ let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
let userName = "paul"
let stream = try model.generateContentStream(
template: "greeting.prompt",
@@ -53,11 +60,12 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
resultText += text
}
}
- XCTAssert(resultText.contains("Paul"))
+ #expect(resultText.contains("Paul"))
}
- func testGenerateImages() async throws {
- let imagenModel = FirebaseAI.firebaseAI(backend: .vertexAI()).templateImagenModel()
+ @Test(arguments: imageGenerationTestConfigs)
+ func generateImages(_ config: InstanceConfig) async throws {
+ let imagenModel = FirebaseAI.componentInstance(config).templateImagenModel()
let imagenPrompt = "A cat picture"
let response = try await imagenModel.generateImages(
template: "generate_images.prompt",
@@ -65,13 +73,17 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
"prompt": imagenPrompt,
]
)
- XCTAssertEqual(response.images.count, 3)
+ #expect(response.images.count == 3)
}
- func testGenerateContentWithMedia() async throws {
- let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
- let image = UIImage(systemName: "photo")!
- if let imageBytes = image.jpegData(compressionQuality: 0.8) {
+ #if canImport(UIKit)
+ @Test(arguments: testConfigs)
+ func generateContentWithMedia(_ config: InstanceConfig) async throws {
+ let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
+ let image = UIImage(systemName: "photo")!
+ let imageBytes = try #require(
+ image.jpegData(compressionQuality: 0.8), "Could not get image data."
+ )
let base64Image = imageBytes.base64EncodedString()
let response = try await model.generateContent(
@@ -84,16 +96,19 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
],
]
)
- XCTAssert(response.text?.isEmpty == false)
- } else {
- XCTFail("Could not get image data.")
+ let text = try #require(response.text)
+ #expect(!text.isEmpty)
}
- }
-
- func testGenerateContentStreamWithMedia() async throws {
- let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
- let image = UIImage(systemName: "photo")!
- if let imageBytes = image.jpegData(compressionQuality: 0.8) {
+ #endif // canImport(UIKit)
+
+ #if canImport(UIKit)
+ @Test(arguments: testConfigs)
+ func generateContentStreamWithMedia(_ config: InstanceConfig) async throws {
+ let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
+ let image = UIImage(systemName: "photo")!
+ let imageBytes = try #require(
+ image.jpegData(compressionQuality: 0.8), "Could not get image data."
+ )
let base64Image = imageBytes.base64EncodedString()
let stream = try model.generateContentStream(
@@ -112,14 +127,13 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
resultText += text
}
}
- XCTAssert(resultText.isEmpty == false)
- } else {
- XCTFail("Could not get image data.")
+ #expect(!resultText.isEmpty)
}
- }
+ #endif // canImport(UIKit)
- func testChat() async throws {
- let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
+ @Test(arguments: testConfigs)
+ func chat(_ config: InstanceConfig) async throws {
+ let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
let initialHistory = [
ModelContent(role: "user", parts: "Hello!"),
ModelContent(role: "model", parts: "Hi there! How can I help?"),
@@ -132,13 +146,16 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
userMessage,
variables: ["message": userMessage]
)
- XCTAssert(response.text?.isEmpty == false)
- XCTAssertEqual(chatSession.history.count, 4)
- XCTAssertEqual((chatSession.history[2].parts.first as? TextPart)?.text, userMessage)
+ let text = try #require(response.text)
+ #expect(!text.isEmpty)
+ #expect(chatSession.history.count == 4)
+ let textPart = try #require(chatSession.history[2].parts.first as? TextPart)
+ #expect(textPart.text == userMessage)
}
- func testChatStream() async throws {
- let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
+ @Test(arguments: testConfigs)
+ func chatStream(_ config: InstanceConfig) async throws {
+ let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
let initialHistory = [
ModelContent(role: "user", parts: "Hello!"),
ModelContent(role: "model", parts: "Hi there! How can I help?"),
@@ -157,8 +174,9 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
resultText += text
}
}
- XCTAssert(resultText.isEmpty == false)
- XCTAssertEqual(chatSession.history.count, 4)
- XCTAssertEqual((chatSession.history[2].parts.first as? TextPart)?.text, userMessage)
+ #expect(!resultText.isEmpty)
+ #expect(chatSession.history.count == 4)
+ let textPart = try #require(chatSession.history[2].parts.first as? TextPart)
+ #expect(textPart.text == userMessage)
}
}