2019-10-18 11:45:19 -07:00
|
|
|
//
|
|
|
|
// BlockScanOperationTests.swift
|
|
|
|
// ZcashLightClientKitTests
|
|
|
|
//
|
|
|
|
// Created by Francisco Gindre on 10/17/19.
|
|
|
|
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import XCTest
|
|
|
|
import SQLite
|
|
|
|
@testable import ZcashLightClientKit
|
|
|
|
class BlockScanOperationTests: XCTestCase {
|
|
|
|
|
|
|
|
var operationQueue = OperationQueue()
|
|
|
|
var cacheDbURL: URL!
|
|
|
|
var dataDbURL: URL!
|
|
|
|
let rustWelding = ZcashRustBackend.self
|
|
|
|
|
|
|
|
var blockRepository: BlockRepository!
|
|
|
|
override func setUp() {
|
|
|
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
|
|
self.cacheDbURL = try! __cacheDbURL()
|
|
|
|
self.dataDbURL = try! __dataDbURL()
|
2019-10-30 13:18:57 -07:00
|
|
|
deleteDBs()
|
|
|
|
operationQueue.maxConcurrentOperationCount = 1
|
|
|
|
}
|
|
|
|
|
|
|
|
private func deleteDBs() {
|
|
|
|
try? FileManager.default.removeItem(at: cacheDbURL)
|
|
|
|
try? FileManager.default.removeItem(at: dataDbURL)
|
2019-10-18 11:45:19 -07:00
|
|
|
}
|
|
|
|
override func tearDown() {
|
|
|
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
|
|
operationQueue.cancelAllOperations()
|
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
try? FileManager.default.removeItem(at: cacheDbURL)
|
2019-10-18 13:09:13 -07:00
|
|
|
try? FileManager.default.removeItem(at: dataDbURL)
|
2019-10-18 11:45:19 -07:00
|
|
|
}
|
2019-10-30 13:18:57 -07:00
|
|
|
|
2019-10-18 11:45:19 -07:00
|
|
|
func testSingleDownloadAndScanOperation() {
|
2019-11-01 12:59:16 -07:00
|
|
|
XCTAssertNoThrow(try rustWelding.initDataDb(dbData: dataDbURL))
|
2019-10-18 11:45:19 -07:00
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
let downloadStartedExpect = XCTestExpectation(description: self.description + "download started")
|
2019-10-18 11:45:19 -07:00
|
|
|
let downloadExpect = XCTestExpectation(description: self.description + "download")
|
2019-10-30 13:18:57 -07:00
|
|
|
let scanStartedExpect = XCTestExpectation(description: self.description + "scan started")
|
2019-10-18 11:45:19 -07:00
|
|
|
let scanExpect = XCTestExpectation(description: self.description + "scan")
|
2019-10-30 13:18:57 -07:00
|
|
|
let latestScannedBlockExpect = XCTestExpectation(description: self.description + "latestScannedHeight")
|
2019-10-18 11:45:19 -07:00
|
|
|
let service = LightWalletGRPCService(channel: ChannelProvider().channel())
|
|
|
|
let blockCount = 100
|
2020-02-26 08:54:48 -08:00
|
|
|
let range = ZcashSDK.SAPLING_ACTIVATION_HEIGHT ... ZcashSDK.SAPLING_ACTIVATION_HEIGHT + blockCount
|
2019-10-30 13:18:57 -07:00
|
|
|
let downloadOperation = CompactBlockDownloadOperation(downloader: CompactBlockDownloader.sqlDownloader(service: service, at: cacheDbURL)!, range: range)
|
2019-10-18 11:45:19 -07:00
|
|
|
let scanOperation = CompactBlockScanningOperation(rustWelding: rustWelding, cacheDb: cacheDbURL, dataDb: dataDbURL)
|
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
downloadOperation.startedHandler = {
|
|
|
|
downloadStartedExpect.fulfill()
|
|
|
|
}
|
|
|
|
|
|
|
|
downloadOperation.completionHandler = { (finished, cancelled) in
|
2019-10-18 11:45:19 -07:00
|
|
|
downloadExpect.fulfill()
|
|
|
|
XCTAssertTrue(finished)
|
|
|
|
XCTAssertFalse(cancelled)
|
|
|
|
}
|
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
downloadOperation.errorHandler = { (error) in
|
|
|
|
XCTFail("Download Operation failed with Error: \(error)")
|
|
|
|
}
|
|
|
|
|
|
|
|
scanOperation.startedHandler = {
|
|
|
|
scanStartedExpect.fulfill()
|
|
|
|
}
|
|
|
|
|
|
|
|
scanOperation.completionHandler = { (finished, cancelled) in
|
2019-10-18 11:45:19 -07:00
|
|
|
scanExpect.fulfill()
|
|
|
|
XCTAssertFalse(cancelled)
|
|
|
|
XCTAssertTrue(finished)
|
|
|
|
}
|
2019-10-30 13:18:57 -07:00
|
|
|
|
|
|
|
scanOperation.errorHandler = { (error) in
|
|
|
|
XCTFail("Scan Operation failed with Error: \(error)")
|
|
|
|
}
|
|
|
|
|
2019-10-18 11:45:19 -07:00
|
|
|
scanOperation.addDependency(downloadOperation)
|
2019-10-30 13:18:57 -07:00
|
|
|
var latestScannedheight = BlockHeight.empty()
|
|
|
|
let latestScannedBlockOperation = BlockOperation {
|
2019-12-16 14:25:45 -08:00
|
|
|
let repository = BlockSQLDAO(dbProvider: SimpleConnectionProvider.init(path: self.dataDbURL.absoluteString, readonly: true))
|
|
|
|
latestScannedheight = repository.lastScannedBlockHeight()
|
2019-10-30 13:18:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
latestScannedBlockOperation.completionBlock = {
|
|
|
|
latestScannedBlockExpect.fulfill()
|
2020-02-26 08:54:48 -08:00
|
|
|
XCTAssertEqual(latestScannedheight, range.upperBound)
|
2019-10-30 13:18:57 -07:00
|
|
|
}
|
2019-10-18 11:45:19 -07:00
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
latestScannedBlockOperation.addDependency(scanOperation)
|
2019-10-18 11:45:19 -07:00
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
operationQueue.addOperations([downloadOperation,scanOperation,latestScannedBlockOperation], waitUntilFinished: false)
|
|
|
|
|
|
|
|
|
|
|
|
wait(for: [downloadStartedExpect, downloadExpect, scanStartedExpect, scanExpect,latestScannedBlockExpect], timeout: 10, enforceOrder: true)
|
2019-10-18 11:45:19 -07:00
|
|
|
}
|
2019-10-30 13:18:57 -07:00
|
|
|
|
2019-10-18 11:45:19 -07:00
|
|
|
func testPerformanceExample() {
|
|
|
|
// This is an example of a performance test case.
|
|
|
|
self.measure {
|
|
|
|
// Put the code you want to measure the time of here.
|
|
|
|
}
|
|
|
|
}
|
2019-10-30 13:18:57 -07:00
|
|
|
|
2019-10-18 11:45:19 -07:00
|
|
|
}
|