Merge pull request #592 from zcash/fix_tests
Fix various tests and deleted some that are not useful anymore
This commit is contained in:
commit
b41f03c3bf
|
@ -140,7 +140,8 @@
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
|
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "9ca1958bb4d7755b7d3ca29d176483b4127f1259"
|
"revision" : "4043e011f4d6a39b7671d48ca4a54c0085603b76",
|
||||||
|
"version" : "0.1.0-beta.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -86,7 +86,8 @@
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
|
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "b9915d53cf563a31722e70a4388e9dce72ea6194"
|
"revision" : "4043e011f4d6a39b7671d48ca4a54c0085603b76",
|
||||||
|
"version" : "0.1.0-beta.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -16,7 +16,7 @@ let package = Package(
|
||||||
dependencies: [
|
dependencies: [
|
||||||
.package(url: "https://github.com/grpc/grpc-swift.git", from: "1.8.0"),
|
.package(url: "https://github.com/grpc/grpc-swift.git", from: "1.8.0"),
|
||||||
.package(url: "https://github.com/stephencelis/SQLite.swift.git", from: "0.13.0"),
|
.package(url: "https://github.com/stephencelis/SQLite.swift.git", from: "0.13.0"),
|
||||||
.package(name:"libzcashlc", url: "https://github.com/zcash-hackworks/zcash-light-client-ffi", revision: "b9915d53cf563a31722e70a4388e9dce72ea6194")
|
.package(name:"libzcashlc", url: "https://github.com/zcash-hackworks/zcash-light-client-ffi", from: "0.1.0-beta.1")
|
||||||
],
|
],
|
||||||
targets: [
|
targets: [
|
||||||
.target(
|
.target(
|
||||||
|
|
|
@ -870,6 +870,11 @@ public class CompactBlockProcessor {
|
||||||
)
|
)
|
||||||
setState(.synced)
|
setState(.synced)
|
||||||
setTimer()
|
setTimer()
|
||||||
|
NotificationCenter.default.post(
|
||||||
|
name: Notification.Name.blockProcessorIdle,
|
||||||
|
object: self,
|
||||||
|
userInfo: nil
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func setTimer() {
|
private func setTimer() {
|
||||||
|
|
|
@ -255,14 +255,7 @@ public class SDKSynchronizer: Synchronizer {
|
||||||
name: Notification.Name.blockProcessorFailed,
|
name: Notification.Name.blockProcessorFailed,
|
||||||
object: processor
|
object: processor
|
||||||
)
|
)
|
||||||
|
|
||||||
center.addObserver(
|
|
||||||
self,
|
|
||||||
selector: #selector(processorIdle(_:)),
|
|
||||||
name: Notification.Name.blockProcessorIdle,
|
|
||||||
object: processor
|
|
||||||
)
|
|
||||||
|
|
||||||
center.addObserver(
|
center.addObserver(
|
||||||
self,
|
self,
|
||||||
selector: #selector(processorFinished(_:)),
|
selector: #selector(processorFinished(_:)),
|
||||||
|
@ -435,13 +428,6 @@ public class SDKSynchronizer: Synchronizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func processorIdle(_ notification: Notification) {
|
|
||||||
DispatchQueue.main.async { [weak self] in
|
|
||||||
guard let self = self else { return }
|
|
||||||
self.status = .disconnected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc func processorFinished(_ notification: Notification) {
|
@objc func processorFinished(_ notification: Notification) {
|
||||||
// FIX: Pending transaction updates fail if done from another thread. Improvement needed: explicitly define queues for sql repositories see: https://github.com/zcash/ZcashLightClientKit/issues/450
|
// FIX: Pending transaction updates fail if done from another thread. Improvement needed: explicitly define queues for sql repositories see: https://github.com/zcash/ZcashLightClientKit/issues/450
|
||||||
if let blockHeight = notification.userInfo?[CompactBlockProcessorNotificationKey.latestScannedBlockHeight] as? BlockHeight {
|
if let blockHeight = notification.userInfo?[CompactBlockProcessorNotificationKey.latestScannedBlockHeight] as? BlockHeight {
|
||||||
|
|
|
@ -962,7 +962,7 @@ class BalanceTests: XCTestCase {
|
||||||
*/
|
*/
|
||||||
XCTAssertEqual(confirmedTx.value, self.sendAmount)
|
XCTAssertEqual(confirmedTx.value, self.sendAmount)
|
||||||
XCTAssertEqual(confirmedTx.toAddress, self.testRecipientAddress)
|
XCTAssertEqual(confirmedTx.toAddress, self.testRecipientAddress)
|
||||||
let confirmedMemo = try confirmedTx.memo.intoMemoBytes().intoMemo()
|
let confirmedMemo = try confirmedTx.memo?.intoMemoBytes()?.intoMemo()
|
||||||
XCTAssertEqual(confirmedMemo, memo)
|
XCTAssertEqual(confirmedMemo, memo)
|
||||||
|
|
||||||
guard let transactionId = confirmedTx.rawTransactionId else {
|
guard let transactionId = confirmedTx.rawTransactionId else {
|
||||||
|
|
|
@ -1,538 +0,0 @@
|
||||||
//
|
|
||||||
// NetworkUpgradeTests.swift
|
|
||||||
// ZcashLightClientKit-Unit-Tests
|
|
||||||
//
|
|
||||||
// Created by Francisco Gindre on 10/30/20.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
@testable import TestUtils
|
|
||||||
@testable import ZcashLightClientKit
|
|
||||||
|
|
||||||
// swiftlint:disable implicitly_unwrapped_optional type_body_length force_unwrapping
|
|
||||||
class NetworkUpgradeTests: XCTestCase {
|
|
||||||
let activationHeight: BlockHeight = 1028500
|
|
||||||
let spendingKey =
|
|
||||||
// swiftlint:disable:next line_length
|
|
||||||
"secret-extended-key-test1qv2vf437qqqqpqpfc0arpv55ncq33p2p895hlcx0ra6d0g739v93luqdjpxun3kt050j9qnrqjyp8d7fdxgedfyxpjmuyha2ulxa6hmqvm2gnvuc3tvs3enpxwuz768qfkd286vr3jgyrgr5ddx2ukrdl95ak3tzqylzjeqw3pnmgtmwsvemrj3sk6vqgwxm9khlv46wccn33ayw52prr233ea069c9u8m3839dvw30sdf6k32xddhpte6p6qsuxval6usyh6lr55pgypkgtz"
|
|
||||||
|
|
||||||
// TODO: Parameterize this from environment
|
|
||||||
let testRecipientAddress = "ztestsapling12k9m98wmpjts2m56wc60qzhgsfvlpxcwah268xk5yz4h942sd58jy3jamqyxjwums6hw7kfa4cc"
|
|
||||||
let sendAmount = Zatoshi(1000)
|
|
||||||
let branchID = "2bb40e60"
|
|
||||||
let chainName = "main"
|
|
||||||
|
|
||||||
var birthday: BlockHeight = 1013250
|
|
||||||
var coordinator: TestCoordinator!
|
|
||||||
var network = ZcashNetworkBuilder.network(for: .testnet)
|
|
||||||
|
|
||||||
override func setUpWithError() throws {
|
|
||||||
try super.setUpWithError()
|
|
||||||
try coordinator.reset(saplingActivation: birthday, branchID: branchID, chainName: chainName)
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tearDownWithError() throws {
|
|
||||||
try super.tearDownWithError()
|
|
||||||
NotificationCenter.default.removeObserver(self)
|
|
||||||
try coordinator.stop()
|
|
||||||
try? FileManager.default.removeItem(at: coordinator.databases.cacheDB)
|
|
||||||
try? FileManager.default.removeItem(at: coordinator.databases.dataDB)
|
|
||||||
try? FileManager.default.removeItem(at: coordinator.databases.pendingDB)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Given that a wallet had funds prior to activation it can spend them after activation
|
|
||||||
*/
|
|
||||||
func testSpendPriorFundsAfterActivation() async throws {
|
|
||||||
try FakeChainBuilder.buildChain(
|
|
||||||
darksideWallet: coordinator.service,
|
|
||||||
birthday: birthday,
|
|
||||||
networkActivationHeight: activationHeight,
|
|
||||||
branchID: branchID,
|
|
||||||
chainName: chainName,
|
|
||||||
length: 15300
|
|
||||||
)
|
|
||||||
|
|
||||||
let firstSyncExpectation = XCTestExpectation(description: "first sync")
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight - ZcashSDK.defaultStaleTolerance)
|
|
||||||
sleep(5)
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
firstSyncExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wait(for: [firstSyncExpectation], timeout: 120)
|
|
||||||
let verifiedBalance: Zatoshi = coordinator.synchronizer.initializer.getVerifiedBalance()
|
|
||||||
guard verifiedBalance > network.constants.defaultFee(for: activationHeight) else {
|
|
||||||
XCTFail("not enough balance to continue test")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 1)
|
|
||||||
sleep(2)
|
|
||||||
|
|
||||||
let sendExpectation = XCTestExpectation(description: "send expectation")
|
|
||||||
var pendingEntity: PendingTransactionEntity?
|
|
||||||
let spendAmount = Zatoshi(10000)
|
|
||||||
|
|
||||||
/*
|
|
||||||
send transaction to recipient address
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
let pendingTx = try await coordinator.synchronizer.sendToAddress(
|
|
||||||
spendingKey: self.coordinator.spendingKeys!.first!,
|
|
||||||
zatoshi: spendAmount,
|
|
||||||
toAddress: try Recipient(testRecipientAddress, network: self.network.networkType),
|
|
||||||
memo: try Memo(string: "this is a test")
|
|
||||||
)
|
|
||||||
pendingEntity = pendingTx
|
|
||||||
sendExpectation.fulfill()
|
|
||||||
} catch {
|
|
||||||
self.handleError(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [sendExpectation], timeout: 11)
|
|
||||||
|
|
||||||
guard pendingEntity != nil else {
|
|
||||||
XCTFail("no pending transaction after sending")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
getIncomingTransaction
|
|
||||||
*/
|
|
||||||
guard let incomingTx = try coordinator.getIncomingTransactions()?.first else {
|
|
||||||
XCTFail("no incoming transaction")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let sentTxHeight: BlockHeight = activationHeight + 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
stage transaction at sentTxHeight
|
|
||||||
*/
|
|
||||||
try coordinator.stageTransaction(incomingTx, at: sentTxHeight)
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 20)
|
|
||||||
sleep(1)
|
|
||||||
let afterSendExpectation = XCTestExpectation(description: "aftersend")
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
afterSendExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [afterSendExpectation], timeout: 10)
|
|
||||||
|
|
||||||
XCTAssertEqual(coordinator.synchronizer.initializer.getVerifiedBalance(), verifiedBalance - spendAmount)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Given that a wallet receives funds after activation it can spend them when confirmed
|
|
||||||
*/
|
|
||||||
func testSpendPostActivationFundsAfterConfirmation() async throws {
|
|
||||||
try FakeChainBuilder.buildChainPostActivationFunds(
|
|
||||||
darksideWallet: coordinator.service,
|
|
||||||
birthday: birthday,
|
|
||||||
networkActivationHeight: activationHeight,
|
|
||||||
length: 15300
|
|
||||||
)
|
|
||||||
|
|
||||||
let firstSyncExpectation = XCTestExpectation(description: "first sync")
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 10)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
firstSyncExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [firstSyncExpectation], timeout: 120)
|
|
||||||
guard try !coordinator.synchronizer.allReceivedTransactions().filter({ $0.minedHeight > activationHeight }).isEmpty else {
|
|
||||||
XCTFail("this test requires funds received after activation height")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 20)
|
|
||||||
sleep(2)
|
|
||||||
|
|
||||||
let sendExpectation = XCTestExpectation(description: "send expectation")
|
|
||||||
var pendingEntity: PendingTransactionEntity?
|
|
||||||
let spendAmount = Zatoshi(10000)
|
|
||||||
|
|
||||||
/*
|
|
||||||
send transaction to recipient address
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
let pendingTx = try await coordinator.synchronizer.sendToAddress(
|
|
||||||
spendingKey: self.coordinator.spendingKeys!.first!,
|
|
||||||
zatoshi: spendAmount,
|
|
||||||
toAddress: try Recipient(testRecipientAddress, network: self.network.networkType),
|
|
||||||
memo: try Memo(string: "this is a test")
|
|
||||||
)
|
|
||||||
pendingEntity = pendingTx
|
|
||||||
sendExpectation.fulfill()
|
|
||||||
} catch {
|
|
||||||
self.handleError(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [sendExpectation], timeout: 11)
|
|
||||||
|
|
||||||
guard pendingEntity != nil else {
|
|
||||||
XCTFail("no pending transaction after sending")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 1 + 10)
|
|
||||||
|
|
||||||
let afterSendExpectation = XCTestExpectation(description: "aftersend")
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
afterSendExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [afterSendExpectation], timeout: 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Given that a wallet sends funds some between (activation - expiry_height) and activation, those funds are shown as sent if mined.
|
|
||||||
*/
|
|
||||||
func testSpendMinedSpendThatExpiresOnActivation() async throws {
|
|
||||||
try FakeChainBuilder.buildChain(
|
|
||||||
darksideWallet: coordinator.service,
|
|
||||||
birthday: birthday,
|
|
||||||
networkActivationHeight: activationHeight,
|
|
||||||
branchID: branchID,
|
|
||||||
chainName: chainName,
|
|
||||||
length: 15300
|
|
||||||
)
|
|
||||||
|
|
||||||
let firstSyncExpectation = XCTestExpectation(description: "first sync")
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight - 10)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
firstSyncExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [firstSyncExpectation], timeout: 120)
|
|
||||||
let verifiedBalance: Zatoshi = coordinator.synchronizer.initializer.getVerifiedBalance()
|
|
||||||
XCTAssertTrue(verifiedBalance > network.constants.defaultFee(for: activationHeight))
|
|
||||||
|
|
||||||
let sendExpectation = XCTestExpectation(description: "send expectation")
|
|
||||||
var pendingEntity: PendingTransactionEntity?
|
|
||||||
let spendAmount = Zatoshi(10000)
|
|
||||||
|
|
||||||
/*
|
|
||||||
send transaction to recipient address
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
let pendingTx = try await coordinator.synchronizer.sendToAddress(
|
|
||||||
spendingKey: self.coordinator.spendingKeys!.first!,
|
|
||||||
zatoshi: spendAmount,
|
|
||||||
toAddress: try Recipient(testRecipientAddress, network: self.network.networkType),
|
|
||||||
memo: try Memo(string: "this is a test")
|
|
||||||
)
|
|
||||||
pendingEntity = pendingTx
|
|
||||||
sendExpectation.fulfill()
|
|
||||||
} catch {
|
|
||||||
self.handleError(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [sendExpectation], timeout: 11)
|
|
||||||
|
|
||||||
guard let pendingTx = pendingEntity else {
|
|
||||||
XCTFail("no pending transaction after sending")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
getIncomingTransaction
|
|
||||||
*/
|
|
||||||
guard let incomingTx = try coordinator.getIncomingTransactions()?.first else {
|
|
||||||
XCTFail("no incoming transaction")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let sentTxHeight: BlockHeight = activationHeight - 5
|
|
||||||
|
|
||||||
/*
|
|
||||||
stage transaction at sentTxHeight
|
|
||||||
*/
|
|
||||||
try coordinator.stageTransaction(incomingTx, at: sentTxHeight)
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 5)
|
|
||||||
sleep(2)
|
|
||||||
|
|
||||||
let afterSendExpectation = XCTestExpectation(description: "aftersend")
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
afterSendExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [afterSendExpectation], timeout: 10)
|
|
||||||
|
|
||||||
guard
|
|
||||||
let confirmedTx = try coordinator.synchronizer.allConfirmedTransactions(from: nil, limit: Int.max)?
|
|
||||||
.first(where: { $0.rawTransactionId == pendingTx.rawTransactionId })
|
|
||||||
else {
|
|
||||||
XCTFail("the sent transaction is not listed as a confirmed transaction")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
XCTAssertEqual(confirmedTx.minedHeight, sentTxHeight)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Given that a wallet sends funds somewhere between (activation - expiry_height) and activation, those funds are available if expired after expiration height.
|
|
||||||
*/
|
|
||||||
func testExpiredSpendAfterActivation() async throws {
|
|
||||||
try FakeChainBuilder.buildChain(
|
|
||||||
darksideWallet: coordinator.service,
|
|
||||||
birthday: birthday,
|
|
||||||
networkActivationHeight: activationHeight,
|
|
||||||
branchID: branchID,
|
|
||||||
chainName: chainName,
|
|
||||||
length: 15300
|
|
||||||
)
|
|
||||||
|
|
||||||
let firstSyncExpectation = XCTestExpectation(description: "first sync")
|
|
||||||
let offset = 5
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight - 10)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
let verifiedBalancePreActivation: Zatoshi = coordinator.synchronizer.initializer.getVerifiedBalance()
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
firstSyncExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [firstSyncExpectation], timeout: 120)
|
|
||||||
let verifiedBalance: Zatoshi = coordinator.synchronizer.initializer.getVerifiedBalance()
|
|
||||||
guard verifiedBalance > network.constants.defaultFee(for: activationHeight) else {
|
|
||||||
XCTFail("balance is not enough to continue with this test")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let sendExpectation = XCTestExpectation(description: "send expectation")
|
|
||||||
var pendingEntity: PendingTransactionEntity?
|
|
||||||
let spendAmount = Zatoshi(10000)
|
|
||||||
|
|
||||||
/*
|
|
||||||
send transaction to recipient address
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
let pendingTx = try await coordinator.synchronizer.sendToAddress(
|
|
||||||
spendingKey: self.coordinator.spendingKeys!.first!,
|
|
||||||
zatoshi: spendAmount,
|
|
||||||
toAddress: try Recipient(testRecipientAddress, network: self.network.networkType),
|
|
||||||
memo: try Memo(string: "this is a test")
|
|
||||||
)
|
|
||||||
pendingEntity = pendingTx
|
|
||||||
sendExpectation.fulfill()
|
|
||||||
} catch {
|
|
||||||
self.handleError(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [sendExpectation], timeout: 11)
|
|
||||||
|
|
||||||
guard let pendingTx = pendingEntity else {
|
|
||||||
XCTFail("no pending transaction after sending")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
getIncomingTransaction
|
|
||||||
*/
|
|
||||||
guard try coordinator.getIncomingTransactions()?.first != nil else {
|
|
||||||
XCTFail("no incoming transaction")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
don't stage transaction
|
|
||||||
*/
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + offset)
|
|
||||||
sleep(2)
|
|
||||||
|
|
||||||
let afterSendExpectation = XCTestExpectation(description: "aftersend")
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
afterSendExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [afterSendExpectation], timeout: 10)
|
|
||||||
|
|
||||||
guard
|
|
||||||
try coordinator.synchronizer.allConfirmedTransactions(from: nil, limit: Int.max)?
|
|
||||||
.first(where: { $0.rawTransactionId == pendingTx.rawTransactionId }) == nil
|
|
||||||
else {
|
|
||||||
XCTFail("the sent transaction should not be not listed as a confirmed transaction")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
XCTAssertEqual(verifiedBalancePreActivation, coordinator.synchronizer.initializer.getVerifiedBalance())
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Given that a wallet has notes both received prior and after activation these can be combined to supply a larger amount spend.
|
|
||||||
*/
|
|
||||||
func testCombinePreActivationNotesAndPostActivationNotesOnSpend() async throws {
|
|
||||||
try FakeChainBuilder.buildChainMixedFunds(
|
|
||||||
darksideWallet: coordinator.service,
|
|
||||||
birthday: birthday,
|
|
||||||
networkActivationHeight: activationHeight,
|
|
||||||
branchID: branchID,
|
|
||||||
chainName: chainName,
|
|
||||||
length: 15300
|
|
||||||
)
|
|
||||||
|
|
||||||
let firstSyncExpectation = XCTestExpectation(description: "first sync")
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight - 1)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
firstSyncExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [firstSyncExpectation], timeout: 120)
|
|
||||||
|
|
||||||
let preActivationBalance: Zatoshi = coordinator.synchronizer.initializer.getVerifiedBalance()
|
|
||||||
|
|
||||||
try coordinator.applyStaged(blockheight: activationHeight + 30)
|
|
||||||
sleep(2)
|
|
||||||
|
|
||||||
let secondSyncExpectation = XCTestExpectation(description: "second sync")
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
|
||||||
do {
|
|
||||||
try coordinator.sync(completion: { synchronizer in
|
|
||||||
secondSyncExpectation.fulfill()
|
|
||||||
continuation.resume()
|
|
||||||
}, error: self.handleError)
|
|
||||||
} catch {
|
|
||||||
continuation.resume(throwing: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [secondSyncExpectation], timeout: 10)
|
|
||||||
guard try !coordinator.synchronizer.allReceivedTransactions().filter({ $0.minedHeight > activationHeight }).isEmpty else {
|
|
||||||
XCTFail("this test requires funds received after activation height")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let postActivationBalance: Zatoshi = coordinator.synchronizer.initializer.getVerifiedBalance()
|
|
||||||
|
|
||||||
XCTAssertTrue(preActivationBalance < postActivationBalance, "This test requires that funds post activation are greater that pre activation")
|
|
||||||
let sendExpectation = XCTestExpectation(description: "send expectation")
|
|
||||||
var pendingEntity: PendingTransactionEntity?
|
|
||||||
|
|
||||||
// spend all the funds
|
|
||||||
let spendAmount = Zatoshi(
|
|
||||||
postActivationBalance.amount - Int64(network.constants.defaultFee(for: activationHeight).amount)
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
send transaction to recipient address
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
let pendingTx = try await coordinator.synchronizer.sendToAddress(
|
|
||||||
spendingKey: self.coordinator.spendingKeys!.first!,
|
|
||||||
zatoshi: spendAmount,
|
|
||||||
toAddress: try Recipient(testRecipientAddress, network: self.network.networkType),
|
|
||||||
memo: try Memo(string: "this is a test")
|
|
||||||
)
|
|
||||||
pendingEntity = pendingTx
|
|
||||||
sendExpectation.fulfill()
|
|
||||||
} catch {
|
|
||||||
self.handleError(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(for: [sendExpectation], timeout: 15)
|
|
||||||
|
|
||||||
guard pendingEntity != nil else {
|
|
||||||
XCTFail("no pending transaction after sending")
|
|
||||||
try coordinator.stop()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
XCTAssertEqual(coordinator.synchronizer.initializer.getVerifiedBalance(), .zero)
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleError(_ error: Error?) {
|
|
||||||
_ = try? coordinator.stop()
|
|
||||||
guard let testError = error else {
|
|
||||||
XCTFail("failed with nil error")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
XCTFail("Failed with error: \(testError)")
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,6 +9,7 @@ import XCTest
|
||||||
@testable import TestUtils
|
@testable import TestUtils
|
||||||
@testable import ZcashLightClientKit
|
@testable import ZcashLightClientKit
|
||||||
|
|
||||||
|
// FIXME: disabled until this is resolved https://github.com/zcash/ZcashLightClientKit/issues/586
|
||||||
// swiftlint:disable type_body_length implicitly_unwrapped_optional force_try
|
// swiftlint:disable type_body_length implicitly_unwrapped_optional force_try
|
||||||
class RewindRescanTests: XCTestCase {
|
class RewindRescanTests: XCTestCase {
|
||||||
// TODO: Parameterize this from environment?
|
// TODO: Parameterize this from environment?
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
import XCTest
|
import XCTest
|
||||||
@testable import TestUtils
|
@testable import TestUtils
|
||||||
@testable import ZcashLightClientKit
|
@testable import ZcashLightClientKit
|
||||||
|
// FIXME: disabled until https://github.com/zcash/ZcashLightClientKit/issues/587 fixed
|
||||||
class ShieldFundsTests: XCTestCase {
|
class ShieldFundsTests: XCTestCase {
|
||||||
// TODO: Parameterize this from environment?
|
// TODO: Parameterize this from environment?
|
||||||
// swiftlint:disable:next line_length
|
// swiftlint:disable:next line_length
|
||||||
|
|
|
@ -63,6 +63,8 @@ class TransactionEnhancementTests: XCTestCase {
|
||||||
try? FileManager.default.removeItem(at: processorConfig.cacheDb)
|
try? FileManager.default.removeItem(at: processorConfig.cacheDb)
|
||||||
try? FileManager.default.removeItem(at: processorConfig.dataDb)
|
try? FileManager.default.removeItem(at: processorConfig.dataDb)
|
||||||
|
|
||||||
|
let dbInit = try rustBackend.initDataDb(dbData: processorConfig.dataDb, seed: nil, networkType: network.networkType)
|
||||||
|
|
||||||
let ufvks = [
|
let ufvks = [
|
||||||
try DerivationTool(networkType: network.networkType)
|
try DerivationTool(networkType: network.networkType)
|
||||||
.deriveUnifiedSpendingKey(seed: TestSeed().seed(), accountIndex: 0)
|
.deriveUnifiedSpendingKey(seed: TestSeed().seed(), accountIndex: 0)
|
||||||
|
@ -81,7 +83,7 @@ class TransactionEnhancementTests: XCTestCase {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let dbInit = try rustBackend.initDataDb(dbData: processorConfig.dataDb, seed: nil, networkType: network.networkType)
|
|
||||||
|
|
||||||
guard case .success = dbInit else {
|
guard case .success = dbInit else {
|
||||||
XCTFail("Failed to initDataDb. Expected `.success` got: \(String(describing: dbInit))")
|
XCTFail("Failed to initDataDb. Expected `.success` got: \(String(describing: dbInit))")
|
||||||
|
@ -143,26 +145,23 @@ class TransactionEnhancementTests: XCTestCase {
|
||||||
startedValidatingNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedValidating, object: processor)
|
startedValidatingNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedValidating, object: processor)
|
||||||
startedScanningNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedScanning, object: processor)
|
startedScanningNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedScanning, object: processor)
|
||||||
|
|
||||||
|
txFoundNotificationExpectation.subscribe(to: .blockProcessorFoundTransactions, object: processor)
|
||||||
|
idleNotificationExpectation.subscribe(to: .blockProcessorIdle, object: processor)
|
||||||
try processor.start()
|
try processor.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
func testBasicEnhacement() throws {
|
func testBasicEnhacement() throws {
|
||||||
let targetLatestHeight = BlockHeight(663250)
|
let targetLatestHeight = BlockHeight(663200)
|
||||||
let walletBirthday = Checkpoint.birthday(with: 663151, network: network).height
|
|
||||||
|
|
||||||
try basicEnhancementTest(latestHeight: targetLatestHeight, walletBirthday: walletBirthday)
|
|
||||||
}
|
|
||||||
|
|
||||||
func basicEnhancementTest(latestHeight: BlockHeight, walletBirthday: BlockHeight) throws {
|
|
||||||
do {
|
do {
|
||||||
try darksideWalletService.reset(saplingActivation: 663150, branchID: branchID, chainName: chainName)
|
try FakeChainBuilder.buildChain(darksideWallet: darksideWalletService, branchID: branchID, chainName: chainName)
|
||||||
try darksideWalletService.useDataset(DarksideDataset.beforeReOrg.rawValue)
|
|
||||||
try darksideWalletService.applyStaged(nextLatestHeight: 663200)
|
try darksideWalletService.applyStaged(nextLatestHeight: targetLatestHeight)
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Error: \(error)")
|
XCTFail("Error: \(error)")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(3)
|
sleep(3)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -175,7 +174,7 @@ class TransactionEnhancementTests: XCTestCase {
|
||||||
XCTFail("Error: \(error)")
|
XCTFail("Error: \(error)")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
download and sync blocks from walletBirthday to firstLatestHeight
|
download and sync blocks from walletBirthday to firstLatestHeight
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -69,7 +69,7 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
self.foundTransactionsExpectation.fulfill()
|
self.foundTransactionsExpectation.fulfill()
|
||||||
}
|
}
|
||||||
|
|
||||||
func testFoundTransactions() async throws {
|
func testSendingZ2TWithMemoFails() async throws {
|
||||||
subscribeToFoundTransactions()
|
subscribeToFoundTransactions()
|
||||||
try FakeChainBuilder.buildChain(darksideWallet: self.coordinator.service, branchID: branchID, chainName: chainName)
|
try FakeChainBuilder.buildChain(darksideWallet: self.coordinator.service, branchID: branchID, chainName: chainName)
|
||||||
let receivedTxHeight: BlockHeight = 663188
|
let receivedTxHeight: BlockHeight = 663188
|
||||||
|
@ -97,6 +97,59 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
}
|
}
|
||||||
wait(for: [preTxExpectation, foundTransactionsExpectation], timeout: 5)
|
wait(for: [preTxExpectation, foundTransactionsExpectation], timeout: 5)
|
||||||
|
|
||||||
|
let sendExpectation = XCTestExpectation(description: "sendToAddress")
|
||||||
|
let sendAmount = Zatoshi(10000)
|
||||||
|
/*
|
||||||
|
4. create transaction
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
let _ = try await coordinator.synchronizer.sendToAddress(
|
||||||
|
spendingKey: coordinator.spendingKeys!.first!,
|
||||||
|
zatoshi: sendAmount,
|
||||||
|
toAddress: try! Recipient(testRecipientAddress, network: self.network.networkType),
|
||||||
|
memo: try Memo(string: "test transaction")
|
||||||
|
)
|
||||||
|
|
||||||
|
XCTFail("Should have thrown error")
|
||||||
|
} catch {
|
||||||
|
sendExpectation.fulfill()
|
||||||
|
if case let SynchronizerError.generalError(message) = error {
|
||||||
|
XCTAssertEqual(message, "Memos can't be sent to transparent addresses.")
|
||||||
|
} else {
|
||||||
|
XCTFail("expected SynchronizerError.genericError(\"Memos can't be sent to transparent addresses.\") but received \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testFoundTransactions() async throws {
|
||||||
|
subscribeToFoundTransactions()
|
||||||
|
try FakeChainBuilder.buildChain(darksideWallet: self.coordinator.service, branchID: branchID, chainName: chainName)
|
||||||
|
let receivedTxHeight: BlockHeight = 663188
|
||||||
|
|
||||||
|
/*
|
||||||
|
2. applyStaged(received_Tx_height)
|
||||||
|
*/
|
||||||
|
try coordinator.applyStaged(blockheight: receivedTxHeight)
|
||||||
|
|
||||||
|
sleep(2)
|
||||||
|
let preTxExpectation = XCTestExpectation(description: "pre receive")
|
||||||
|
|
||||||
|
/*
|
||||||
|
3. sync up to received_Tx_height
|
||||||
|
*/
|
||||||
|
try await withCheckedThrowingContinuation { continuation in
|
||||||
|
do {
|
||||||
|
try coordinator.sync(completion: { synchronizer in
|
||||||
|
preTxExpectation.fulfill()
|
||||||
|
continuation.resume()
|
||||||
|
}, error: self.handleError)
|
||||||
|
} catch {
|
||||||
|
continuation.resume(throwing: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait(for: [preTxExpectation, foundTransactionsExpectation], timeout: 5)
|
||||||
|
|
||||||
let sendExpectation = XCTestExpectation(description: "sendToAddress")
|
let sendExpectation = XCTestExpectation(description: "sendToAddress")
|
||||||
var pendingEntity: PendingTransactionEntity?
|
var pendingEntity: PendingTransactionEntity?
|
||||||
var testError: Error?
|
var testError: Error?
|
||||||
|
@ -109,7 +162,7 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
spendingKey: coordinator.spendingKeys!.first!,
|
spendingKey: coordinator.spendingKeys!.first!,
|
||||||
zatoshi: sendAmount,
|
zatoshi: sendAmount,
|
||||||
toAddress: try! Recipient(testRecipientAddress, network: self.network.networkType),
|
toAddress: try! Recipient(testRecipientAddress, network: self.network.networkType),
|
||||||
memo: try Memo(string: "test transaction")
|
memo: nil
|
||||||
)
|
)
|
||||||
pendingEntity = pending
|
pendingEntity = pending
|
||||||
sendExpectation.fulfill()
|
sendExpectation.fulfill()
|
||||||
|
@ -118,19 +171,19 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
wait(for: [sendExpectation], timeout: 12)
|
wait(for: [sendExpectation], timeout: 12)
|
||||||
|
|
||||||
guard pendingEntity != nil else {
|
guard pendingEntity != nil else {
|
||||||
XCTFail("error sending to address. Error: \(String(describing: testError))")
|
XCTFail("error sending to address. Error: \(String(describing: testError))")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
5. stage 10 empty blocks
|
5. stage 10 empty blocks
|
||||||
*/
|
*/
|
||||||
try coordinator.stageBlockCreate(height: receivedTxHeight + 1, count: 10)
|
try coordinator.stageBlockCreate(height: receivedTxHeight + 1, count: 10)
|
||||||
|
|
||||||
let sentTxHeight = receivedTxHeight + 1
|
let sentTxHeight = receivedTxHeight + 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
6. stage sent tx at sentTxHeight
|
6. stage sent tx at sentTxHeight
|
||||||
*/
|
*/
|
||||||
|
@ -140,12 +193,12 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
try coordinator.stageTransaction(sentTx, at: sentTxHeight)
|
try coordinator.stageTransaction(sentTx, at: sentTxHeight)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
6a. applyheight(sentTxHeight + 1 )
|
6a. applyheight(sentTxHeight + 1 )
|
||||||
*/
|
*/
|
||||||
try coordinator.applyStaged(blockheight: sentTxHeight + 1)
|
try coordinator.applyStaged(blockheight: sentTxHeight + 1)
|
||||||
|
|
||||||
sleep(2)
|
sleep(2)
|
||||||
self.foundTransactionsExpectation = XCTestExpectation(description: "inbound expectation")
|
self.foundTransactionsExpectation = XCTestExpectation(description: "inbound expectation")
|
||||||
|
|
||||||
|
@ -153,13 +206,13 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
7. sync to sentTxHeight + 1
|
7. sync to sentTxHeight + 1
|
||||||
*/
|
*/
|
||||||
let sentTxSyncExpectation = XCTestExpectation(description: "sent tx sync expectation")
|
let sentTxSyncExpectation = XCTestExpectation(description: "sent tx sync expectation")
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { continuation in
|
try await withCheckedThrowingContinuation { continuation in
|
||||||
do {
|
do {
|
||||||
try coordinator.sync(completion: { synchronizer in
|
try coordinator.sync(completion: { synchronizer in
|
||||||
let pMinedHeight = synchronizer.pendingTransactions.first?.minedHeight
|
let pMinedHeight = synchronizer.pendingTransactions.first?.minedHeight
|
||||||
XCTAssertEqual(pMinedHeight, sentTxHeight)
|
XCTAssertEqual(pMinedHeight, sentTxHeight)
|
||||||
|
|
||||||
sentTxSyncExpectation.fulfill()
|
sentTxSyncExpectation.fulfill()
|
||||||
continuation.resume()
|
continuation.resume()
|
||||||
}, error: self.handleError)
|
}, error: self.handleError)
|
||||||
|
@ -170,7 +223,7 @@ class Z2TReceiveTests: XCTestCase {
|
||||||
|
|
||||||
wait(for: [sentTxSyncExpectation, foundTransactionsExpectation], timeout: 5)
|
wait(for: [sentTxSyncExpectation, foundTransactionsExpectation], timeout: 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleError(_ error: Error?) {
|
func handleError(_ error: Error?) {
|
||||||
_ = try? coordinator.stop()
|
_ = try? coordinator.stop()
|
||||||
guard let testError = error else {
|
guard let testError = error else {
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
//
|
|
||||||
// ZcashLightClientKitTests.swift
|
|
||||||
// ZcashLightClientKitTests
|
|
||||||
//
|
|
||||||
// Created by Jack Grigg on 5/8/19.
|
|
||||||
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
import GRPC
|
|
||||||
@testable import TestUtils
|
|
||||||
@testable import ZcashLightClientKit
|
|
||||||
|
|
||||||
// swiftlint:disable implicitly_unwrapped_optional force_try force_unwrapping
|
|
||||||
class ZcashLightClientKitTests: XCTestCase {
|
|
||||||
var latestBlockHeight: BlockHeight!
|
|
||||||
var service: LightWalletGRPCService!
|
|
||||||
|
|
||||||
override func setUp() {
|
|
||||||
super.setUp()
|
|
||||||
service = LightWalletGRPCService(endpoint: LightWalletEndpoint(address: Constants.address, port: 9067))
|
|
||||||
|
|
||||||
latestBlockHeight = try! service.latestBlock().compactBlockHeight()!
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tearDown() {
|
|
||||||
super.tearDown()
|
|
||||||
service = nil
|
|
||||||
latestBlockHeight = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func testEnvironmentLaunch() {
|
|
||||||
let address = Constants.address
|
|
||||||
|
|
||||||
XCTAssertFalse(address.isEmpty, "Your \'\(Environment.lightwalletdKey)\' key is missing from your launch environment variables")
|
|
||||||
}
|
|
||||||
|
|
||||||
func testService() {
|
|
||||||
// and that it has a non-zero size
|
|
||||||
XCTAssert(latestBlockHeight > 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testBlockRangeServiceTilLastest() {
|
|
||||||
let expectedCount: BlockHeight = 99
|
|
||||||
var count: BlockHeight = 0
|
|
||||||
|
|
||||||
let startHeight = latestBlockHeight - expectedCount
|
|
||||||
let endHeight = latestBlockHeight!
|
|
||||||
var blocks: [CompactBlock] = []
|
|
||||||
guard let call = try? service!.blockRange(startHeight: startHeight, endHeight: endHeight, result: {
|
|
||||||
blocks.append($0)
|
|
||||||
count += 1
|
|
||||||
}) else {
|
|
||||||
XCTFail("failed to create getBlockRange( \(startHeight) ..<= \(endHeight)")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = try! call.status.wait()
|
|
||||||
XCTAssertEqual(expectedCount + 1, count)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -111,11 +111,12 @@ class CompactBlockProcessorTests: XCTestCase {
|
||||||
updatedNotificationExpectation.subscribe(to: Notification.Name.blockProcessorUpdated, object: processor)
|
updatedNotificationExpectation.subscribe(to: Notification.Name.blockProcessorUpdated, object: processor)
|
||||||
startedValidatingNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedValidating, object: processor)
|
startedValidatingNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedValidating, object: processor)
|
||||||
startedScanningNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedScanning, object: processor)
|
startedScanningNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedScanning, object: processor)
|
||||||
idleNotificationExpectation.subscribe(to: Notification.Name.blockProcessorFinished, object: processor)
|
idleNotificationExpectation.subscribe(to: Notification.Name.blockProcessorIdle, object: processor)
|
||||||
|
|
||||||
XCTAssertNoThrow(try processor.start())
|
XCTAssertNoThrow(try processor.start())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: disabled see https://github.com/zcash/ZcashLightClientKit/issues/590
|
||||||
func testStartNotifiesSuscriptors() {
|
func testStartNotifiesSuscriptors() {
|
||||||
startProcessing()
|
startProcessing()
|
||||||
|
|
||||||
|
@ -127,10 +128,11 @@ class CompactBlockProcessorTests: XCTestCase {
|
||||||
idleNotificationExpectation
|
idleNotificationExpectation
|
||||||
],
|
],
|
||||||
timeout: 30,
|
timeout: 30,
|
||||||
enforceOrder: true
|
enforceOrder: false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: disabled see https://github.com/zcash/ZcashLightClientKit/issues/590
|
||||||
func testProgressNotifications() {
|
func testProgressNotifications() {
|
||||||
let expectedUpdates = expectedBatches(
|
let expectedUpdates = expectedBatches(
|
||||||
currentHeight: processorConfig.walletBirthday,
|
currentHeight: processorConfig.walletBirthday,
|
||||||
|
|
|
@ -185,13 +185,6 @@ class ZcashRustBackendTests: XCTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uAddresses.append(
|
|
||||||
try ZcashRustBackend.getCurrentAddress(
|
|
||||||
dbData: tempDBs.dataDB,
|
|
||||||
account: 0,
|
|
||||||
networkType: network
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
XCTAssertEqual(
|
XCTAssertEqual(
|
||||||
uAddresses,
|
uAddresses,
|
|
@ -55,6 +55,14 @@ extension LightWalletServiceMockResponse {
|
||||||
}
|
}
|
||||||
|
|
||||||
class MockRustBackend: ZcashRustBackendWelding {
|
class MockRustBackend: ZcashRustBackendWelding {
|
||||||
|
static func createToAddress(dbData: URL, usk: ZcashLightClientKit.UnifiedSpendingKey, to address: String, value: Int64, memo: ZcashLightClientKit.MemoBytes?, spendParamsPath: String, outputParamsPath: String, networkType: ZcashLightClientKit.NetworkType) -> Int64 {
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
|
||||||
|
static func shieldFunds(dbCache: URL, dbData: URL, usk: ZcashLightClientKit.UnifiedSpendingKey, memo: ZcashLightClientKit.MemoBytes?, spendParamsPath: String, outputParamsPath: String, networkType: ZcashLightClientKit.NetworkType) -> Int64 {
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
|
||||||
static func getAddressMetadata(_ address: String) -> ZcashLightClientKit.AddressMetadata? {
|
static func getAddressMetadata(_ address: String) -> ZcashLightClientKit.AddressMetadata? {
|
||||||
nil
|
nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ Pod::Spec.new do |s|
|
||||||
s.ios.deployment_target = '13.0'
|
s.ios.deployment_target = '13.0'
|
||||||
s.dependency 'gRPC-Swift', '~> 1.8.0'
|
s.dependency 'gRPC-Swift', '~> 1.8.0'
|
||||||
s.dependency 'SQLite.swift', '~> 0.13'
|
s.dependency 'SQLite.swift', '~> 0.13'
|
||||||
s.dependency 'libzcashlc', '0.0.3'
|
s.dependency 'libzcashlc', '0.1.0-beta.1'
|
||||||
s.static_framework = true
|
s.static_framework = true
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue