ZcashLightClientKit/Tests/PerformanceTests/SynchronizerTests.swift

105 lines
4.9 KiB
Swift

//
// SynchronizerTests.swift
//
//
// Created by Lukáš Korba on 13.12.2022.
//
import XCTest
@testable import ZcashLightClientKit
@testable import TestUtils
class SynchronizerTests: XCTestCase {
class MockLatestBlockHeightProvider: LatestBlockHeightProvider {
let birthday: BlockHeight
init(birthday: BlockHeight) {
self.birthday = birthday
}
func latestBlockHeight(streamer: ZcashLightClientKit.CompactTxStreamerNIOClient?) throws -> ZcashLightClientKit.BlockHeight {
self.birthday
}
}
var coordinator: TestCoordinator!
// swiftlint:disable:next line_length
let seedPhrase = "wish puppy smile loan doll curve hole maze file ginger hair nose key relax knife witness cannon grab despair throw review deal slush frame"
var birthday: BlockHeight = 1_730_000
@MainActor
func testHundredBlocksSync() async throws {
let derivationTool = DerivationTool(networkType: .mainnet)
let seedData: Data = Data(base64Encoded: "9VDVOZZZOWWHpZtq1Ebridp3Qeux5C+HwiRR0g7Oi7HgnMs8Gfln83+/Q1NnvClcaSwM4ADFL1uZHxypEWlWXg==")!
let seedBytes = [UInt8](seedData)
let spendingKey = try derivationTool.deriveUnifiedSpendingKey(
seed: seedBytes,
accountIndex: 0
)
let ufvk = try derivationTool.deriveUnifiedFullViewingKey(from: spendingKey)
let network = ZcashNetworkBuilder.network(for: .mainnet)
let endpoint = LightWalletEndpoint(address: "lightwalletd.electriccoin.co", port: 9067, secure: true)
SDKMetrics.shared.enableMetrics()
for _ in 1...5 {
let databases = TemporaryDbBuilder.build()
let initializer = Initializer(
cacheDbURL: databases.cacheDB,
dataDbURL: databases.dataDB,
pendingDbURL: databases.pendingDB,
endpoint: endpoint,
network: network,
spendParamsURL: try __spendParamsURL(),
outputParamsURL: try __outputParamsURL(),
viewingKeys: [ufvk],
walletBirthday: birthday,
alias: "",
loggerProxy: SampleLogger(logLevel: .debug)
)
try? FileManager.default.removeItem(at: databases.cacheDB)
try? FileManager.default.removeItem(at: databases.dataDB)
try? FileManager.default.removeItem(at: databases.pendingDB)
let synchronizer = try SDKSynchronizer(initializer: initializer)
_ = try synchronizer.prepare(with: seedBytes)
let syncSyncedExpectation = XCTestExpectation(description: "synchronizerSynced Expectation")
syncSyncedExpectation.subscribe(to: .synchronizerSynced, object: nil)
let internalSyncProgress = InternalSyncProgress(storage: UserDefaults.standard)
await internalSyncProgress.rewind(to: birthday)
await (synchronizer.blockProcessor.service as? LightWalletGRPCService)?.latestBlockHeightProvider = MockLatestBlockHeightProvider(birthday: self.birthday + 99)
try synchronizer.start()
wait(for: [syncSyncedExpectation], timeout: 100)
SDKMetrics.shared.cumulateReportsAndStartNewSet()
}
if let cumulativeSummary = SDKMetrics.shared.summarizedCumulativeReports() {
let downloadedBlocksReport = cumulativeSummary.downloadedBlocksReport ?? .zero
let validatedBlocksReport = cumulativeSummary.validatedBlocksReport ?? .zero
let scannedBlocksReport = cumulativeSummary.scannedBlocksReport ?? .zero
let enhancementReport = cumulativeSummary.enhancementReport ?? .zero
let fetchUTXOsReport = cumulativeSummary.fetchUTXOsReport ?? .zero
let totalSyncReport = cumulativeSummary.totalSyncReport ?? .zero
LoggerProxy.debug("""
testHundredBlocksSync() SUMMARY min max avg REPORT:
downloadedBlocksTimes: min: \(downloadedBlocksReport.minTime) max: \(downloadedBlocksReport.maxTime) avg: \(downloadedBlocksReport.avgTime)
validatedBlocksTimes: min: \(validatedBlocksReport.minTime) max: \(validatedBlocksReport.maxTime) avg: \(validatedBlocksReport.avgTime)
scannedBlocksTimes: min: \(scannedBlocksReport.minTime) max: \(scannedBlocksReport.maxTime) avg: \(scannedBlocksReport.avgTime)
enhancementTimes: min: \(enhancementReport.minTime) max: \(enhancementReport.maxTime) avg: \(enhancementReport.avgTime)
fetchUTXOsTimes: min: \(fetchUTXOsReport.minTime) max: \(fetchUTXOsReport.maxTime) avg: \(fetchUTXOsReport.avgTime)
totalSyncTimes: min: \(totalSyncReport.minTime) max: \(totalSyncReport.maxTime) avg: \(totalSyncReport.avgTime)
""")
}
SDKMetrics.shared.disableMetrics()
}
}