Fix various tests and deleted some that are not useful anymore
Closes #588 Closes #584 Closes #589 Closes #591
This commit is contained in:
parent
c2177fe83f
commit
b5d659e8a8
|
@ -140,7 +140,8 @@
|
|||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
|
||||
"state" : {
|
||||
"revision" : "9ca1958bb4d7755b7d3ca29d176483b4127f1259"
|
||||
"revision" : "4043e011f4d6a39b7671d48ca4a54c0085603b76",
|
||||
"version" : "0.1.0-beta.1"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -86,7 +86,8 @@
|
|||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
|
||||
"state" : {
|
||||
"revision" : "b9915d53cf563a31722e70a4388e9dce72ea6194"
|
||||
"revision" : "4043e011f4d6a39b7671d48ca4a54c0085603b76",
|
||||
"version" : "0.1.0-beta.1"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -16,7 +16,7 @@ let package = Package(
|
|||
dependencies: [
|
||||
.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(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: [
|
||||
.target(
|
||||
|
|
|
@ -870,6 +870,11 @@ public class CompactBlockProcessor {
|
|||
)
|
||||
setState(.synced)
|
||||
setTimer()
|
||||
NotificationCenter.default.post(
|
||||
name: Notification.Name.blockProcessorIdle,
|
||||
object: self,
|
||||
userInfo: nil
|
||||
)
|
||||
}
|
||||
|
||||
private func setTimer() {
|
||||
|
|
|
@ -255,14 +255,7 @@ public class SDKSynchronizer: Synchronizer {
|
|||
name: Notification.Name.blockProcessorFailed,
|
||||
object: processor
|
||||
)
|
||||
|
||||
center.addObserver(
|
||||
self,
|
||||
selector: #selector(processorIdle(_:)),
|
||||
name: Notification.Name.blockProcessorIdle,
|
||||
object: processor
|
||||
)
|
||||
|
||||
|
||||
center.addObserver(
|
||||
self,
|
||||
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) {
|
||||
// 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 {
|
||||
|
|
|
@ -962,7 +962,7 @@ class BalanceTests: XCTestCase {
|
|||
*/
|
||||
XCTAssertEqual(confirmedTx.value, self.sendAmount)
|
||||
XCTAssertEqual(confirmedTx.toAddress, self.testRecipientAddress)
|
||||
let confirmedMemo = try confirmedTx.memo.intoMemoBytes().intoMemo()
|
||||
let confirmedMemo = try confirmedTx.memo?.intoMemoBytes()?.intoMemo()
|
||||
XCTAssertEqual(confirmedMemo, memo)
|
||||
|
||||
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 ZcashLightClientKit
|
||||
|
||||
// FIXME: disabled until this is resolved https://github.com/zcash/ZcashLightClientKit/issues/586
|
||||
// swiftlint:disable type_body_length implicitly_unwrapped_optional force_try
|
||||
class RewindRescanTests: XCTestCase {
|
||||
// TODO: Parameterize this from environment?
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
import XCTest
|
||||
@testable import TestUtils
|
||||
@testable import ZcashLightClientKit
|
||||
|
||||
// FIXME: disabled until https://github.com/zcash/ZcashLightClientKit/issues/587 fixed
|
||||
class ShieldFundsTests: XCTestCase {
|
||||
// TODO: Parameterize this from environment?
|
||||
// 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.dataDb)
|
||||
|
||||
let dbInit = try rustBackend.initDataDb(dbData: processorConfig.dataDb, seed: nil, networkType: network.networkType)
|
||||
|
||||
let ufvks = [
|
||||
try DerivationTool(networkType: network.networkType)
|
||||
.deriveUnifiedSpendingKey(seed: TestSeed().seed(), accountIndex: 0)
|
||||
|
@ -81,7 +83,7 @@ class TransactionEnhancementTests: XCTestCase {
|
|||
return
|
||||
}
|
||||
|
||||
let dbInit = try rustBackend.initDataDb(dbData: processorConfig.dataDb, seed: nil, networkType: network.networkType)
|
||||
|
||||
|
||||
guard case .success = dbInit else {
|
||||
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)
|
||||
startedScanningNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedScanning, object: processor)
|
||||
|
||||
txFoundNotificationExpectation.subscribe(to: .blockProcessorFoundTransactions, object: processor)
|
||||
idleNotificationExpectation.subscribe(to: .blockProcessorIdle, object: processor)
|
||||
try processor.start()
|
||||
}
|
||||
|
||||
func testBasicEnhacement() throws {
|
||||
let targetLatestHeight = BlockHeight(663250)
|
||||
let walletBirthday = Checkpoint.birthday(with: 663151, network: network).height
|
||||
let targetLatestHeight = BlockHeight(663200)
|
||||
|
||||
try basicEnhancementTest(latestHeight: targetLatestHeight, walletBirthday: walletBirthday)
|
||||
}
|
||||
|
||||
func basicEnhancementTest(latestHeight: BlockHeight, walletBirthday: BlockHeight) throws {
|
||||
do {
|
||||
try darksideWalletService.reset(saplingActivation: 663150, branchID: branchID, chainName: chainName)
|
||||
try darksideWalletService.useDataset(DarksideDataset.beforeReOrg.rawValue)
|
||||
try darksideWalletService.applyStaged(nextLatestHeight: 663200)
|
||||
try FakeChainBuilder.buildChain(darksideWallet: darksideWalletService, branchID: branchID, chainName: chainName)
|
||||
|
||||
try darksideWalletService.applyStaged(nextLatestHeight: targetLatestHeight)
|
||||
} catch {
|
||||
XCTFail("Error: \(error)")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
sleep(3)
|
||||
|
||||
/**
|
||||
|
@ -175,7 +174,7 @@ class TransactionEnhancementTests: XCTestCase {
|
|||
XCTFail("Error: \(error)")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
download and sync blocks from walletBirthday to firstLatestHeight
|
||||
*/
|
||||
|
|
|
@ -69,7 +69,7 @@ class Z2TReceiveTests: XCTestCase {
|
|||
self.foundTransactionsExpectation.fulfill()
|
||||
}
|
||||
|
||||
func testFoundTransactions() async throws {
|
||||
func testSendingZ2TWithMemoFails() async throws {
|
||||
subscribeToFoundTransactions()
|
||||
try FakeChainBuilder.buildChain(darksideWallet: self.coordinator.service, branchID: branchID, chainName: chainName)
|
||||
let receivedTxHeight: BlockHeight = 663188
|
||||
|
@ -97,6 +97,59 @@ class Z2TReceiveTests: XCTestCase {
|
|||
}
|
||||
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")
|
||||
var pendingEntity: PendingTransactionEntity?
|
||||
var testError: Error?
|
||||
|
@ -109,7 +162,7 @@ class Z2TReceiveTests: XCTestCase {
|
|||
spendingKey: coordinator.spendingKeys!.first!,
|
||||
zatoshi: sendAmount,
|
||||
toAddress: try! Recipient(testRecipientAddress, network: self.network.networkType),
|
||||
memo: try Memo(string: "test transaction")
|
||||
memo: nil
|
||||
)
|
||||
pendingEntity = pending
|
||||
sendExpectation.fulfill()
|
||||
|
@ -118,19 +171,19 @@ class Z2TReceiveTests: XCTestCase {
|
|||
}
|
||||
|
||||
wait(for: [sendExpectation], timeout: 12)
|
||||
|
||||
|
||||
guard pendingEntity != nil else {
|
||||
XCTFail("error sending to address. Error: \(String(describing: testError))")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
5. stage 10 empty blocks
|
||||
*/
|
||||
try coordinator.stageBlockCreate(height: receivedTxHeight + 1, count: 10)
|
||||
|
||||
|
||||
let sentTxHeight = receivedTxHeight + 1
|
||||
|
||||
|
||||
/*
|
||||
6. stage sent tx at sentTxHeight
|
||||
*/
|
||||
|
@ -140,12 +193,12 @@ class Z2TReceiveTests: XCTestCase {
|
|||
}
|
||||
|
||||
try coordinator.stageTransaction(sentTx, at: sentTxHeight)
|
||||
|
||||
|
||||
/*
|
||||
6a. applyheight(sentTxHeight + 1 )
|
||||
*/
|
||||
try coordinator.applyStaged(blockheight: sentTxHeight + 1)
|
||||
|
||||
|
||||
sleep(2)
|
||||
self.foundTransactionsExpectation = XCTestExpectation(description: "inbound expectation")
|
||||
|
||||
|
@ -153,13 +206,13 @@ class Z2TReceiveTests: XCTestCase {
|
|||
7. sync to sentTxHeight + 1
|
||||
*/
|
||||
let sentTxSyncExpectation = XCTestExpectation(description: "sent tx sync expectation")
|
||||
|
||||
|
||||
try await withCheckedThrowingContinuation { continuation in
|
||||
do {
|
||||
try coordinator.sync(completion: { synchronizer in
|
||||
let pMinedHeight = synchronizer.pendingTransactions.first?.minedHeight
|
||||
XCTAssertEqual(pMinedHeight, sentTxHeight)
|
||||
|
||||
|
||||
sentTxSyncExpectation.fulfill()
|
||||
continuation.resume()
|
||||
}, error: self.handleError)
|
||||
|
@ -170,7 +223,7 @@ class Z2TReceiveTests: XCTestCase {
|
|||
|
||||
wait(for: [sentTxSyncExpectation, foundTransactionsExpectation], timeout: 5)
|
||||
}
|
||||
|
||||
|
||||
func handleError(_ error: Error?) {
|
||||
_ = try? coordinator.stop()
|
||||
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)
|
||||
startedValidatingNotificationExpectation.subscribe(to: Notification.Name.blockProcessorStartedValidating, 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())
|
||||
}
|
||||
|
||||
|
||||
// FIXME: disabled see https://github.com/zcash/ZcashLightClientKit/issues/590
|
||||
func testStartNotifiesSuscriptors() {
|
||||
startProcessing()
|
||||
|
||||
|
@ -127,10 +128,11 @@ class CompactBlockProcessorTests: XCTestCase {
|
|||
idleNotificationExpectation
|
||||
],
|
||||
timeout: 30,
|
||||
enforceOrder: true
|
||||
enforceOrder: false
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
// FIXME: disabled see https://github.com/zcash/ZcashLightClientKit/issues/590
|
||||
func testProgressNotifications() {
|
||||
let expectedUpdates = expectedBatches(
|
||||
currentHeight: processorConfig.walletBirthday,
|
||||
|
|
|
@ -185,13 +185,6 @@ class ZcashRustBackendTests: XCTestCase {
|
|||
}
|
||||
}
|
||||
|
||||
uAddresses.append(
|
||||
try ZcashRustBackend.getCurrentAddress(
|
||||
dbData: tempDBs.dataDB,
|
||||
account: 0,
|
||||
networkType: network
|
||||
)
|
||||
)
|
||||
|
||||
XCTAssertEqual(
|
||||
uAddresses,
|
|
@ -55,6 +55,14 @@ extension LightWalletServiceMockResponse {
|
|||
}
|
||||
|
||||
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? {
|
||||
nil
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ Pod::Spec.new do |s|
|
|||
s.ios.deployment_target = '13.0'
|
||||
s.dependency 'gRPC-Swift', '~> 1.8.0'
|
||||
s.dependency 'SQLite.swift', '~> 0.13'
|
||||
s.dependency 'libzcashlc', '0.0.3'
|
||||
s.dependency 'libzcashlc', '0.1.0-beta.1'
|
||||
s.static_framework = true
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue