160 lines
6.7 KiB
Swift
160 lines
6.7 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import CodexBarCore
|
|
|
|
struct AntigravityOAuthCredentialsStoreTests {
|
|
@Test
|
|
func `oauth client discovery reads renamed legacy bundle`() throws {
|
|
let root = FileManager.default.temporaryDirectory
|
|
.appendingPathComponent(UUID().uuidString, isDirectory: true)
|
|
defer { try? FileManager.default.removeItem(at: root) }
|
|
|
|
let legacyClient = AntigravityOAuthClient(
|
|
clientID: self.googleClientID("legacy"),
|
|
clientSecret: self.googleClientSecret(repeating: "a"))
|
|
try self.writeAntigravityApp(
|
|
named: "Antigravity 2.app",
|
|
under: root,
|
|
bundleIdentifier: "com.google.antigravity-ide",
|
|
artifactRelativePath: "Contents/Resources/app/out/main.js",
|
|
artifactData: Data("""
|
|
out-build/vs/platform/cloudCode/common/oauthClient.js
|
|
clientId="\(legacyClient.clientID)";
|
|
clientSecret="\(legacyClient.clientSecret)";
|
|
""".utf8))
|
|
|
|
#expect(
|
|
AntigravityOAuthConfig.discoverClientFromInstalledApp(
|
|
applicationRoots: [root]) == legacyClient)
|
|
}
|
|
|
|
@Test
|
|
func `oauth client discovery reads standalone antigravity 2 bundle`() throws {
|
|
let root = FileManager.default.temporaryDirectory
|
|
.appendingPathComponent(UUID().uuidString, isDirectory: true)
|
|
defer { try? FileManager.default.removeItem(at: root) }
|
|
|
|
let standaloneClient = AntigravityOAuthClient(
|
|
clientID: self.googleClientID("standalone"),
|
|
clientSecret: self.googleClientSecret(repeating: "b"))
|
|
let alternateClient = AntigravityOAuthClient(
|
|
clientID: self.googleClientID("alternate"),
|
|
clientSecret: self.googleClientSecret(repeating: "c"))
|
|
var artifactData = Data([0xFF])
|
|
artifactData.append(Data(
|
|
"""
|
|
\u{0}\(alternateClient.clientSecret)\u{0}\(standaloneClient.clientSecret)\
|
|
\u{0}oauth_data\(standaloneClient.clientID)\u{0}\(alternateClient.clientID)\u{0}
|
|
""".utf8))
|
|
try self.writeAntigravityApp(
|
|
named: "Antigravity.app",
|
|
under: root,
|
|
artifactRelativePath: "Contents/Resources/bin/language_server",
|
|
artifactData: artifactData)
|
|
|
|
#expect(
|
|
AntigravityOAuthConfig.discoverClientFromInstalledApp(
|
|
applicationRoots: [root]) == standaloneClient)
|
|
}
|
|
|
|
@Test
|
|
func `oauth client discovery reads antigravity extension language server`() throws {
|
|
let root = FileManager.default.temporaryDirectory
|
|
.appendingPathComponent(UUID().uuidString, isDirectory: true)
|
|
defer { try? FileManager.default.removeItem(at: root) }
|
|
|
|
let extensionClient = AntigravityOAuthClient(
|
|
clientID: self.googleClientID("extension"),
|
|
clientSecret: self.googleClientSecret(repeating: "d"))
|
|
let staleClient = AntigravityOAuthClient(
|
|
clientID: self.googleClientID("stale"),
|
|
clientSecret: self.googleClientSecret(repeating: "e"))
|
|
try self.writeAntigravityApp(
|
|
named: "Antigravity IDE.app",
|
|
under: root,
|
|
bundleIdentifier: "com.google.antigravity-ide",
|
|
artifactRelativePath: "Contents/Resources/app/out/main.js",
|
|
artifactData: Data("""
|
|
out-build/vs/platform/cloudCode/common/oauthClient.js
|
|
clientId="\(staleClient.clientID)";
|
|
clientSecret="\(staleClient.clientSecret)";
|
|
""".utf8))
|
|
var artifactData = Data([0xFF])
|
|
artifactData.append(Data(
|
|
"""
|
|
\u{0}\(extensionClient.clientSecret)\u{0}oauth_data\u{0}\(extensionClient.clientID)\u{0}
|
|
""".utf8))
|
|
try self.writeAntigravityApp(
|
|
named: "Antigravity IDE.app",
|
|
under: root,
|
|
bundleIdentifier: "com.google.antigravity-ide",
|
|
artifactRelativePath: "Contents/Resources/app/extensions/antigravity/bin/language_server_macos_arm",
|
|
artifactData: artifactData)
|
|
|
|
#expect(
|
|
AntigravityOAuthConfig.discoverClientFromInstalledApp(
|
|
applicationRoots: [root]) == extensionClient)
|
|
}
|
|
|
|
@Test
|
|
func `oauth client discovery pairs lone binary secret with trailing client id`() throws {
|
|
let root = FileManager.default.temporaryDirectory
|
|
.appendingPathComponent(UUID().uuidString, isDirectory: true)
|
|
defer { try? FileManager.default.removeItem(at: root) }
|
|
|
|
let standaloneClient = AntigravityOAuthClient(
|
|
clientID: self.googleClientID("standalone"),
|
|
clientSecret: self.googleClientSecret(repeating: "b"))
|
|
let alternateClientID = self.googleClientID("alternate")
|
|
var artifactData = Data([0xFF])
|
|
artifactData.append(Data(
|
|
"""
|
|
\u{0}\(standaloneClient.clientSecret)\u{0}oauth_data\
|
|
\u{0}\(alternateClientID)\u{0}\(standaloneClient.clientID)\u{0}
|
|
""".utf8))
|
|
try self.writeAntigravityApp(
|
|
named: "Antigravity.app",
|
|
under: root,
|
|
artifactRelativePath: "Contents/Resources/bin/language_server",
|
|
artifactData: artifactData)
|
|
|
|
#expect(
|
|
AntigravityOAuthConfig.discoverClientFromInstalledApp(
|
|
applicationRoots: [root]) == standaloneClient)
|
|
}
|
|
|
|
private func writeAntigravityApp(
|
|
named name: String,
|
|
under root: URL,
|
|
bundleIdentifier: String = "com.google.antigravity",
|
|
artifactRelativePath: String,
|
|
artifactData: Data) throws
|
|
{
|
|
let appURL = root.appendingPathComponent(name, isDirectory: true)
|
|
let contentsURL = appURL.appendingPathComponent("Contents", isDirectory: true)
|
|
try FileManager.default.createDirectory(
|
|
at: contentsURL,
|
|
withIntermediateDirectories: true)
|
|
let infoURL = contentsURL.appendingPathComponent("Info.plist")
|
|
let infoData = try PropertyListSerialization.data(
|
|
fromPropertyList: ["CFBundleIdentifier": bundleIdentifier],
|
|
format: .xml,
|
|
options: 0)
|
|
try infoData.write(to: infoURL)
|
|
|
|
let artifactURL = appURL.appendingPathComponent(artifactRelativePath)
|
|
try FileManager.default.createDirectory(
|
|
at: artifactURL.deletingLastPathComponent(),
|
|
withIntermediateDirectories: true)
|
|
try artifactData.write(to: artifactURL)
|
|
}
|
|
|
|
private func googleClientID(_ name: String) -> String {
|
|
"123456789012-" + name + ".apps" + ".googleusercontent.com"
|
|
}
|
|
|
|
private func googleClientSecret(repeating character: Character) -> String {
|
|
"GOC" + "SPX-" + String(repeating: character, count: 28)
|
|
}
|
|
}
|