Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[V3] Remove the ability to create a V2 client #420

Merged
merged 4 commits into from
Nov 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
433 changes: 121 additions & 312 deletions README.md

Large diffs are not rendered by default.

213 changes: 84 additions & 129 deletions Sources/XMTPTestHelpers/TestHelpers.swift
Original file line number Diff line number Diff line change
@@ -1,145 +1,100 @@
//
// TestHelpers.swift
//
//
// Created by Pat Nakajima on 12/6/22.
//

#if canImport(XCTest)
import Combine
import CryptoKit
import XCTest
@testable import XMTPiOS
import LibXMTP

public struct TestConfig {
static let TEST_SERVER_ENABLED = _env("TEST_SERVER_ENABLED") == "true"
// TODO: change Client constructor to accept these explicitly (so we can config CI):
// static let TEST_SERVER_HOST = _env("TEST_SERVER_HOST") ?? "127.0.0.1"
// static let TEST_SERVER_PORT = Int(_env("TEST_SERVER_PORT")) ?? 5556
// static let TEST_SERVER_IS_SECURE = _env("TEST_SERVER_IS_SECURE") == "true"

static private func _env(_ key: String) -> String? {
ProcessInfo.processInfo.environment[key]
}

static public func skipIfNotRunningLocalNodeTests() throws {
try XCTSkipIf(!TEST_SERVER_ENABLED, "requires local node")
}

static public func skip(because: String) throws {
try XCTSkipIf(true, because)
}
}

// Helper for tests gathering transcripts in a background task.
public actor TestTranscript {
public var messages: [String] = []
public init() {}
public func add(_ message: String) {
messages.append(message)
}
}

public struct FakeWallet: SigningKey {
public static func generate() throws -> FakeWallet {
let key = try PrivateKey.generate()
return FakeWallet(key)
import Combine
import CryptoKit
import XCTest
@testable import XMTPiOS
import LibXMTP

public struct TestConfig {
static let TEST_SERVER_ENABLED = _env("TEST_SERVER_ENABLED") == "true"
// TODO: change Client constructor to accept these explicitly (so we can config CI):
// static let TEST_SERVER_HOST = _env("TEST_SERVER_HOST") ?? "127.0.0.1"
// static let TEST_SERVER_PORT = Int(_env("TEST_SERVER_PORT")) ?? 5556
// static let TEST_SERVER_IS_SECURE = _env("TEST_SERVER_IS_SECURE") == "true"

static private func _env(_ key: String) -> String? {
ProcessInfo.processInfo.environment[key]
}

static public func skipIfNotRunningLocalNodeTests() throws {
try XCTSkipIf(!TEST_SERVER_ENABLED, "requires local node")
}

static public func skip(because: String) throws {
try XCTSkipIf(true, because)
}
}

public var address: String {
key.walletAddress
// Helper for tests gathering transcripts in a background task.
public actor TestTranscript {
public var messages: [String] = []
public init() {}
public func add(_ message: String) {
messages.append(message)
}
}

public func sign(_ data: Data) async throws -> XMTPiOS.Signature {
let signature = try await key.sign(data)
return signature
}
public struct FakeWallet: SigningKey {
public static func generate() throws -> FakeWallet {
let key = try PrivateKey.generate()
return FakeWallet(key)
}

public func sign(message: String) async throws -> XMTPiOS.Signature {
let signature = try await key.sign(message: message)
return signature
}
public var address: String {
key.walletAddress
}

public var key: PrivateKey
public func sign(_ data: Data) async throws -> XMTPiOS.Signature {
let signature = try await key.sign(data)
return signature
}

public init(_ key: PrivateKey) {
self.key = key
}
}

public struct FakeSCWWallet: SigningKey {
public var walletAddress: String
private var internalSignature: String

public init() throws {
// Simulate a wallet address (could be derived from a hash of some internal data)
self.walletAddress = UUID().uuidString // Using UUID for uniqueness in this fake example
self.internalSignature = Data(repeating: 0x01, count: 64).toHex // Fake internal signature
}

public var address: String {
walletAddress
}
public func sign(message: String) async throws -> XMTPiOS.Signature {
let signature = try await key.sign(message: message)
return signature
}

public var type: WalletType {
WalletType.SCW
}

public var chainId: Int64? {
1
}

public static func generate() throws -> FakeSCWWallet {
return try FakeSCWWallet()
}

public func signSCW(message: String) async throws -> Data {
// swiftlint:disable force_unwrapping
let digest = SHA256.hash(data: message.data(using: .utf8)!)
// swiftlint:enable force_unwrapping
return Data(digest)
}
}

@available(iOS 15, *)
public struct Fixtures {
public var alice: PrivateKey!
public var aliceClient: Client!

public var bob: PrivateKey!
public var bobClient: Client!
public let clientOptions: ClientOptions? = ClientOptions(
api: ClientOptions.Api(env: XMTPEnvironment.local, isSecure: false)
)

init() async throws {
alice = try PrivateKey.generate()
bob = try PrivateKey.generate()
public var key: PrivateKey

aliceClient = try await Client.create(account: alice, options: clientOptions)
bobClient = try await Client.create(account: bob, options: clientOptions)
public init(_ key: PrivateKey) {
self.key = key
}
}

public func publishLegacyContact(client: Client) async throws {
var contactBundle = ContactBundle()
contactBundle.v1.keyBundle = try client.v1keys.toPublicKeyBundle()

var envelope = Envelope()
envelope.contentTopic = Topic.contact(client.address).description
envelope.timestampNs = UInt64(Date().millisecondsSinceEpoch * 1_000_000)
envelope.message = try contactBundle.serializedData()

try await client.publish(envelopes: [envelope])
@available(iOS 15, *)
public struct Fixtures {
public var alix: PrivateKey!
public var alixClient: Client!
public var bo: PrivateKey!
public var boClient: Client!
public var caro: PrivateKey!
public var caroClient: Client!

init() async throws {
alix = try PrivateKey.generate()
bo = try PrivateKey.generate()
caro = try PrivateKey.generate()

let key = try Crypto.secureRandomBytes(count: 32)
let clientOptions: ClientOptions = ClientOptions(
api: ClientOptions.Api(
env: XMTPEnvironment.local, isSecure: false),
dbEncryptionKey: key
)

alixClient = try await Client.create(
account: alix, options: clientOptions)
boClient = try await Client.create(
account: bo, options: clientOptions)
caroClient = try await Client.create(
account: caro, options: clientOptions)
}
}
}

public extension XCTestCase {
@available(iOS 15, *)
func fixtures() async -> Fixtures {
// swiftlint:disable force_try
return try! await Fixtures()
// swiftlint:enable force_try
extension XCTestCase {
@available(iOS 15, *)
public func fixtures() async throws -> Fixtures {
return try await Fixtures()
}
}
}
#endif
Loading
Loading