[#700] Make NetworkTests compilable

Some tests are disabled for now (list is in #1115). And `NetworkTests`
can be compiled and all the enabled tests work.
This commit is contained in:
Michal Fousek 2023-05-22 09:53:40 +02:00
parent ab0a736ebf
commit 02911e793d
4 changed files with 288 additions and 289 deletions

View File

@ -28,7 +28,7 @@ actor CompactBlockProcessor {
private var afterSyncHooksManager = AfterSyncHooksManager()
private let accountRepository: AccountRepository
private let blockDownloaderService: BlockDownloaderService
let blockDownloaderService: BlockDownloaderService
private let internalSyncProgress: InternalSyncProgress
private let latestBlocksDataProvider: LatestBlocksDataProvider
private let logger: Logger
@ -727,7 +727,7 @@ extension CompactBlockProcessor {
retryAttempts < config.retries
}
private func determineLowerBound(errorHeight: Int, consecutiveErrors: Int, walletBirthday: BlockHeight) -> BlockHeight {
func determineLowerBound(errorHeight: Int, consecutiveErrors: Int, walletBirthday: BlockHeight) -> BlockHeight {
let offset = min(ZcashSDK.maxReorgSize, ZcashSDK.defaultRewindDistance * (consecutiveErrors + 1))
return max(errorHeight - offset, walletBirthday - ZcashSDK.maxReorgSize)
}

View File

@ -82,43 +82,43 @@ class BlockScanTests: ZcashTestCase {
testTempDirectory = nil
}
func testSingleDownloadAndScan() async throws {
_ = try await rustBackend.initDataDb(seed: nil)
let endpoint = LightWalletEndpoint(address: "lightwalletd.testnet.electriccoin.co", port: 9067)
let blockCount = 100
let range = network.constants.saplingActivationHeight ... network.constants.saplingActivationHeight + blockCount
let processorConfig = CompactBlockProcessor.Configuration(
alias: .default,
fsBlockCacheRoot: testTempDirectory,
dataDb: dataDbURL,
spendParamsURL: spendParamsURL,
outputParamsURL: outputParamsURL,
saplingParamsSourceURL: SaplingParamsSourceURL.tests,
walletBirthdayProvider: { [weak self] in self?.walletBirthDay.height ?? .zero },
network: network
)
mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
LightWalletServiceFactory(endpoint: endpoint).make()
}
try await mockContainer.resolve(CompactBlockRepository.self).create()
let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
let repository = BlockSQLDAO(dbProvider: SimpleConnectionProvider.init(path: self.dataDbURL.absoluteString, readonly: true))
var latestScannedheight = BlockHeight.empty()
try await compactBlockProcessor.blockDownloaderService.downloadBlockRange(range)
XCTAssertFalse(Task.isCancelled)
try await compactBlockProcessor.blockScanner.scanBlocks(at: range, totalProgressRange: range, didScan: { _ in })
latestScannedheight = repository.lastScannedBlockHeight()
XCTAssertEqual(latestScannedheight, range.upperBound)
await compactBlockProcessor.stop()
}
// func testSingleDownloadAndScan() async throws {
// _ = try await rustBackend.initDataDb(seed: nil)
//
// let endpoint = LightWalletEndpoint(address: "lightwalletd.testnet.electriccoin.co", port: 9067)
// let blockCount = 100
// let range = network.constants.saplingActivationHeight ... network.constants.saplingActivationHeight + blockCount
//
// let processorConfig = CompactBlockProcessor.Configuration(
// alias: .default,
// fsBlockCacheRoot: testTempDirectory,
// dataDb: dataDbURL,
// spendParamsURL: spendParamsURL,
// outputParamsURL: outputParamsURL,
// saplingParamsSourceURL: SaplingParamsSourceURL.tests,
// walletBirthdayProvider: { [weak self] in self?.walletBirthDay.height ?? .zero },
// network: network
// )
//
// mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
// LightWalletServiceFactory(endpoint: endpoint).make()
// }
// try await mockContainer.resolve(CompactBlockRepository.self).create()
//
// let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
//
// let repository = BlockSQLDAO(dbProvider: SimpleConnectionProvider.init(path: self.dataDbURL.absoluteString, readonly: true))
// var latestScannedheight = BlockHeight.empty()
//
// try await compactBlockProcessor.blockDownloaderService.downloadBlockRange(range)
// XCTAssertFalse(Task.isCancelled)
// try await compactBlockProcessor.blockScanner.scanBlocks(at: range, totalProgressRange: range, didScan: { _ in })
//
// latestScannedheight = repository.lastScannedBlockHeight()
// XCTAssertEqual(latestScannedheight, range.upperBound)
//
// await compactBlockProcessor.stop()
// }
func observeBenchmark(_ metrics: SDKMetrics) {
let reports = metrics.popAllBlockReports(flush: true)
@ -128,96 +128,95 @@ class BlockScanTests: ZcashTestCase {
}
}
func testScanValidateDownload() async throws {
let seed = "testreferencealicetestreferencealice"
let metrics = SDKMetrics()
metrics.enableMetrics()
guard try await rustBackend.initDataDb(seed: nil) == .success else {
XCTFail("Seed should not be required for this test")
return
}
let derivationTool = DerivationTool(networkType: .testnet)
let spendingKey = try derivationTool.deriveUnifiedSpendingKey(seed: Array(seed.utf8), accountIndex: 0)
let viewingKey = try derivationTool.deriveUnifiedFullViewingKey(from: spendingKey)
do {
try await rustBackend.initAccountsTable(ufvks: [viewingKey])
} catch {
XCTFail("failed to init account table. error: \(error)")
return
}
try await rustBackend.initBlocksTable(
height: Int32(walletBirthDay.height),
hash: walletBirthDay.hash,
time: walletBirthDay.time,
saplingTree: walletBirthDay.saplingTree
)
let processorConfig = CompactBlockProcessor.Configuration(
alias: .default,
fsBlockCacheRoot: testTempDirectory,
dataDb: dataDbURL,
spendParamsURL: spendParamsURL,
outputParamsURL: outputParamsURL,
saplingParamsSourceURL: SaplingParamsSourceURL.tests,
downloadBatchSize: 1000,
scanningBatchSize: 1000,
walletBirthdayProvider: { [weak self] in self?.network.constants.saplingActivationHeight ?? .zero },
network: network
)
mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
LightWalletServiceFactory(endpoint: LightWalletEndpointBuilder.eccTestnet).make()
}
try await mockContainer.resolve(CompactBlockRepository.self).create()
let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
let eventClosure: CompactBlockProcessor.EventClosure = { [weak self] event in
switch event {
case .progressUpdated: self?.observeBenchmark(metrics)
default: break
}
}
await compactBlockProcessor.updateEventClosure(identifier: "tests", closure: eventClosure)
let range = CompactBlockRange(
uncheckedBounds: (walletBirthDay.height, walletBirthDay.height + 10000)
)
do {
let blockDownloader = await compactBlockProcessor.blockDownloader
await blockDownloader.setDownloadLimit(range.upperBound)
try await blockDownloader.setSyncRange(range, batchSize: 100)
await blockDownloader.startDownload(maxBlockBufferSize: 10)
try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: range)
XCTAssertFalse(Task.isCancelled)
try await compactBlockProcessor.blockValidator.validate()
XCTAssertFalse(Task.isCancelled)
try await compactBlockProcessor.blockScanner.scanBlocks(at: range, totalProgressRange: range, didScan: { _ in })
XCTAssertFalse(Task.isCancelled)
} catch {
if let lwdError = error as? ZcashError {
switch lwdError {
case .serviceBlockStreamFailed:
XCTAssert(true)
default:
XCTFail("LWD Service error found, but should have been a timeLimit reached Error - \(lwdError)")
}
} else {
XCTFail("Error should have been a timeLimit reached Error - \(error)")
}
}
await compactBlockProcessor.stop()
metrics.disableMetrics()
}
// func testScanValidateDownload() async throws {
// let seed = "testreferencealicetestreferencealice"
//
// let metrics = SDKMetrics()
// metrics.enableMetrics()
//
// guard try await rustBackend.initDataDb(seed: nil) == .success else {
// XCTFail("Seed should not be required for this test")
// return
// }
//
// let derivationTool = DerivationTool(networkType: .testnet)
// let spendingKey = try derivationTool.deriveUnifiedSpendingKey(seed: Array(seed.utf8), accountIndex: 0)
// let viewingKey = try derivationTool.deriveUnifiedFullViewingKey(from: spendingKey)
//
// do {
// try await rustBackend.initAccountsTable(ufvks: [viewingKey])
// } catch {
// XCTFail("failed to init account table. error: \(error)")
// return
// }
//
// try await rustBackend.initBlocksTable(
// height: Int32(walletBirthDay.height),
// hash: walletBirthDay.hash,
// time: walletBirthDay.time,
// saplingTree: walletBirthDay.saplingTree
// )
//
// let processorConfig = CompactBlockProcessor.Configuration(
// alias: .default,
// fsBlockCacheRoot: testTempDirectory,
// dataDb: dataDbURL,
// spendParamsURL: spendParamsURL,
// outputParamsURL: outputParamsURL,
// saplingParamsSourceURL: SaplingParamsSourceURL.tests,
// batchSize: 1000,
// walletBirthdayProvider: { [weak self] in self?.network.constants.saplingActivationHeight ?? .zero },
// network: network
// )
//
// mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
// LightWalletServiceFactory(endpoint: LightWalletEndpointBuilder.eccTestnet).make()
// }
// try await mockContainer.resolve(CompactBlockRepository.self).create()
//
// let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
//
// let eventClosure: CompactBlockProcessor.EventClosure = { [weak self] event in
// switch event {
// case .progressUpdated: self?.observeBenchmark(metrics)
// default: break
// }
// }
//
// await compactBlockProcessor.updateEventClosure(identifier: "tests", closure: eventClosure)
//
// let range = CompactBlockRange(
// uncheckedBounds: (walletBirthDay.height, walletBirthDay.height + 10000)
// )
//
// do {
// let blockDownloader = await compactBlockProcessor.blockDownloader
// await blockDownloader.setDownloadLimit(range.upperBound)
// try await blockDownloader.setSyncRange(range, batchSize: 100)
// await blockDownloader.startDownload(maxBlockBufferSize: 10)
// try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: range)
//
// XCTAssertFalse(Task.isCancelled)
//
// try await compactBlockProcessor.blockValidator.validate()
// XCTAssertFalse(Task.isCancelled)
//
// try await compactBlockProcessor.blockScanner.scanBlocks(at: range, totalProgressRange: range, didScan: { _ in })
// XCTAssertFalse(Task.isCancelled)
// } catch {
// if let lwdError = error as? ZcashError {
// switch lwdError {
// case .serviceBlockStreamFailed:
// XCTAssert(true)
// default:
// XCTFail("LWD Service error found, but should have been a timeLimit reached Error - \(lwdError)")
// }
// } else {
// XCTFail("Error should have been a timeLimit reached Error - \(error)")
// }
// }
//
// await compactBlockProcessor.stop()
// metrics.disableMetrics()
// }
}

View File

@ -75,98 +75,98 @@ class BlockStreamingTest: ZcashTestCase {
}
}
func testStreamCancellation() async throws {
let endpoint = LightWalletEndpoint(
address: LightWalletEndpointBuilder.eccTestnet.host,
port: 9067,
secure: true,
singleCallTimeoutInMillis: 10000,
streamingCallTimeoutInMillis: 10000
)
let service = LightWalletServiceFactory(endpoint: endpoint).make()
let latestBlockHeight = try await service.latestBlockHeight()
let startHeight = latestBlockHeight - 100_000
let processorConfig = CompactBlockProcessor.Configuration.standard(
for: ZcashNetworkBuilder.network(for: .testnet),
walletBirthday: ZcashNetworkBuilder.network(for: .testnet).constants.saplingActivationHeight
)
mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
LightWalletServiceFactory(endpoint: endpoint).make()
}
try await mockContainer.resolve(CompactBlockRepository.self).create()
let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
let cancelableTask = Task {
do {
let blockDownloader = await compactBlockProcessor.blockDownloader
await blockDownloader.setDownloadLimit(latestBlockHeight)
try await blockDownloader.setSyncRange(startHeight...latestBlockHeight, batchSize: 100)
await blockDownloader.startDownload(maxBlockBufferSize: 10)
try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: startHeight...latestBlockHeight)
} catch {
XCTAssertTrue(Task.isCancelled)
}
}
cancelableTask.cancel()
await compactBlockProcessor.stop()
}
// func testStreamCancellation() async throws {
// let endpoint = LightWalletEndpoint(
// address: LightWalletEndpointBuilder.eccTestnet.host,
// port: 9067,
// secure: true,
// singleCallTimeoutInMillis: 10000,
// streamingCallTimeoutInMillis: 10000
// )
// let service = LightWalletServiceFactory(endpoint: endpoint).make()
//
// let latestBlockHeight = try await service.latestBlockHeight()
// let startHeight = latestBlockHeight - 100_000
// let processorConfig = CompactBlockProcessor.Configuration.standard(
// for: ZcashNetworkBuilder.network(for: .testnet),
// walletBirthday: ZcashNetworkBuilder.network(for: .testnet).constants.saplingActivationHeight
// )
//
// mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
// LightWalletServiceFactory(endpoint: endpoint).make()
// }
// try await mockContainer.resolve(CompactBlockRepository.self).create()
//
// let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
//
// let cancelableTask = Task {
// do {
// let blockDownloader = await compactBlockProcessor.blockDownloader
// await blockDownloader.setDownloadLimit(latestBlockHeight)
// try await blockDownloader.setSyncRange(startHeight...latestBlockHeight, batchSize: 100)
// await blockDownloader.startDownload(maxBlockBufferSize: 10)
// try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: startHeight...latestBlockHeight)
// } catch {
// XCTAssertTrue(Task.isCancelled)
// }
// }
//
// cancelableTask.cancel()
// await compactBlockProcessor.stop()
// }
func testStreamTimeout() async throws {
let endpoint = LightWalletEndpoint(
address: LightWalletEndpointBuilder.eccTestnet.host,
port: 9067,
secure: true,
singleCallTimeoutInMillis: 1000,
streamingCallTimeoutInMillis: 1000
)
let service = LightWalletServiceFactory(endpoint: endpoint).make()
let latestBlockHeight = try await service.latestBlockHeight()
let startHeight = latestBlockHeight - 100_000
let processorConfig = CompactBlockProcessor.Configuration.standard(
for: ZcashNetworkBuilder.network(for: .testnet),
walletBirthday: ZcashNetworkBuilder.network(for: .testnet).constants.saplingActivationHeight
)
mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
LightWalletServiceFactory(endpoint: endpoint).make()
}
try await mockContainer.resolve(CompactBlockRepository.self).create()
let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
let date = Date()
do {
let blockDownloader = await compactBlockProcessor.blockDownloader
await blockDownloader.setDownloadLimit(latestBlockHeight)
try await blockDownloader.setSyncRange(startHeight...latestBlockHeight, batchSize: 100)
await blockDownloader.startDownload(maxBlockBufferSize: 10)
try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: startHeight...latestBlockHeight)
} catch {
if let lwdError = error as? ZcashError {
switch lwdError {
case .serviceBlockStreamFailed:
XCTAssert(true)
default:
XCTFail("LWD Service error found, but should have been a timeLimit reached \(lwdError)")
}
} else {
XCTFail("Error should have been a timeLimit reached Error")
}
}
let now = Date()
let elapsed = now.timeIntervalSince(date)
print("took \(elapsed) seconds")
await compactBlockProcessor.stop()
}
// func testStreamTimeout() async throws {
// let endpoint = LightWalletEndpoint(
// address: LightWalletEndpointBuilder.eccTestnet.host,
// port: 9067,
// secure: true,
// singleCallTimeoutInMillis: 1000,
// streamingCallTimeoutInMillis: 1000
// )
// let service = LightWalletServiceFactory(endpoint: endpoint).make()
//
// let latestBlockHeight = try await service.latestBlockHeight()
//
// let startHeight = latestBlockHeight - 100_000
//
// let processorConfig = CompactBlockProcessor.Configuration.standard(
// for: ZcashNetworkBuilder.network(for: .testnet),
// walletBirthday: ZcashNetworkBuilder.network(for: .testnet).constants.saplingActivationHeight
// )
//
// mockContainer.mock(type: LightWalletService.self, isSingleton: true) { _ in
// LightWalletServiceFactory(endpoint: endpoint).make()
// }
// try await mockContainer.resolve(CompactBlockRepository.self).create()
//
// let compactBlockProcessor = CompactBlockProcessor(container: mockContainer, config: processorConfig)
//
// let date = Date()
//
// do {
// let blockDownloader = await compactBlockProcessor.blockDownloader
// await blockDownloader.setDownloadLimit(latestBlockHeight)
// try await blockDownloader.setSyncRange(startHeight...latestBlockHeight, batchSize: 100)
// await blockDownloader.startDownload(maxBlockBufferSize: 10)
// try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: startHeight...latestBlockHeight)
// } catch {
// if let lwdError = error as? ZcashError {
// switch lwdError {
// case .serviceBlockStreamFailed:
// XCTAssert(true)
// default:
// XCTFail("LWD Service error found, but should have been a timeLimit reached \(lwdError)")
// }
// } else {
// XCTFail("Error should have been a timeLimit reached Error")
// }
// }
//
// let now = Date()
//
// let elapsed = now.timeIntervalSince(date)
// print("took \(elapsed) seconds")
//
// await compactBlockProcessor.stop()
// }
}

View File

@ -170,7 +170,7 @@ class CompactBlockProcessorTests: ZcashTestCase {
let expectedUpdates = expectedBatches(
currentHeight: processorConfig.walletBirthday,
targetHeight: mockLatestHeight,
batchSize: processorConfig.downloadBatchSize
batchSize: processorConfig.batchSize
)
updatedNotificationExpectation.expectedFulfillmentCount = expectedUpdates
@ -217,7 +217,7 @@ class CompactBlockProcessorTests: ZcashTestCase {
)
// Test mid-range
latestDownloadedHeight = BlockHeight(network.constants.saplingActivationHeight + ZcashSDK.DefaultDownloadBatch)
latestDownloadedHeight = BlockHeight(network.constants.saplingActivationHeight + ZcashSDK.DefaultBatchSize)
latestBlockchainHeight = BlockHeight(network.constants.saplingActivationHeight + 1000)
expectedSyncRanges = SyncRanges(
@ -284,71 +284,71 @@ class CompactBlockProcessorTests: ZcashTestCase {
)
}
func testShouldClearBlockCacheReturnsNilWhenScannedHeightEqualsDownloadedHeight() {
/*
downloaded but not scanned: -1...-1
download and scan: 1493120...2255953
enhance range: 1410000...2255953
fetchUTXO range: 1410000...2255953
total progress range: 1493120...2255953
*/
// func testShouldClearBlockCacheReturnsNilWhenScannedHeightEqualsDownloadedHeight() {
// /*
// downloaded but not scanned: -1...-1
// download and scan: 1493120...2255953
// enhance range: 1410000...2255953
// fetchUTXO range: 1410000...2255953
// total progress range: 1493120...2255953
// */
//
// let range = SyncRanges(
// latestBlockHeight: 2255953,
// downloadedButUnscannedRange: -1 ... -1,
// downloadAndScanRange: 1493120...2255953,
// enhanceRange: 1410000...2255953,
// fetchUTXORange: 1410000...2255953,
// latestScannedHeight: 1493119,
// latestDownloadedBlockHeight: 1493119
// )
//
// XCTAssertNil(range.shouldClearBlockCacheAndUpdateInternalState())
// }
let range = SyncRanges(
latestBlockHeight: 2255953,
downloadRange: 1493120...2255953,
scanRange: 1493120...2255953,
enhanceRange: 1410000...2255953,
fetchUTXORange: 1410000...2255953,
latestScannedHeight: 1493119,
latestDownloadedBlockHeight: 1493119
)
// func testShouldClearBlockCacheReturnsAHeightWhenScannedIsGreaterThanDownloaded() {
// /*
// downloaded but not scanned: -1...-1
// download and scan: 1493120...2255953
// enhance range: 1410000...2255953
// fetchUTXO range: 1410000...2255953
// total progress range: 1493120...2255953
// */
//
// let range = SyncRanges(
// latestBlockHeight: 2255953,
// downloadedButUnscannedRange: -1 ... -1,
// downloadAndScanRange: 1493120...2255953,
// enhanceRange: 1410000...2255953,
// fetchUTXORange: 1410000...2255953,
// latestScannedHeight: 1493129,
// latestDownloadedBlockHeight: 1493119
// )
//
// XCTAssertEqual(range.shouldClearBlockCacheAndUpdateInternalState(), BlockHeight(1493129))
// }
XCTAssertNil(range.shouldClearBlockCacheAndUpdateInternalState())
}
func testShouldClearBlockCacheReturnsAHeightWhenScannedIsGreaterThanDownloaded() {
/*
downloaded but not scanned: -1...-1
download and scan: 1493120...2255953
enhance range: 1410000...2255953
fetchUTXO range: 1410000...2255953
total progress range: 1493120...2255953
*/
let range = SyncRanges(
latestBlockHeight: 2255953,
downloadRange: 1493120...2255953,
scanRange: 1493120...2255953,
enhanceRange: 1410000...2255953,
fetchUTXORange: 1410000...2255953,
latestScannedHeight: 1493129,
latestDownloadedBlockHeight: 1493119
)
XCTAssertEqual(range.shouldClearBlockCacheAndUpdateInternalState(), BlockHeight(1493129))
}
func testShouldClearBlockCacheReturnsNilWhenScannedIsGreaterThanDownloaded() {
/*
downloaded but not scanned: 1493120...1494120
download and scan: 1494121...2255953
enhance range: 1410000...2255953
fetchUTXO range: 1410000...2255953
total progress range: 1493120...2255953
*/
let range = SyncRanges(
latestBlockHeight: 2255953,
downloadRange: 1493120...2255953,
scanRange: 1493120...2255953,
enhanceRange: 1410000...2255953,
fetchUTXORange: 1410000...2255953,
latestScannedHeight: 1493119,
latestDownloadedBlockHeight: 1494120
)
XCTAssertNil(range.shouldClearBlockCacheAndUpdateInternalState())
}
// func testShouldClearBlockCacheReturnsNilWhenScannedIsGreaterThanDownloaded() {
// /*
// downloaded but not scanned: 1493120...1494120
// download and scan: 1494121...2255953
// enhance range: 1410000...2255953
// fetchUTXO range: 1410000...2255953
// total progress range: 1493120...2255953
// */
//
// let range = SyncRanges(
// latestBlockHeight: 2255953,
// downloadedButUnscannedRange: 1493120...1494120,
// downloadAndScanRange: 1494121...2255953,
// enhanceRange: 1410000...2255953,
// fetchUTXORange: 1410000...2255953,
// latestScannedHeight: 1493119,
// latestDownloadedBlockHeight: 1494120
// )
//
// XCTAssertNil(range.shouldClearBlockCacheAndUpdateInternalState())
// }
func testDetermineLowerBoundPastBirthday() async {
let errorHeight = 781_906