mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-15 12:20:06 +01:00
Refactor TrezorAddressTest
This commit is contained in:
parent
5819f4016e
commit
0621088f41
1 changed files with 74 additions and 41 deletions
|
@ -163,6 +163,22 @@ class TrezorAddressTest extends BitcoinSWalletTest with EmptyFixture {
|
||||||
addrs: Seq[AddressDb],
|
addrs: Seq[AddressDb],
|
||||||
vector: TestVector)
|
vector: TestVector)
|
||||||
|
|
||||||
|
/** Asserts that the given addresses are gthe same as in the given vector */
|
||||||
|
private def assertSameAddresses(
|
||||||
|
addrs: Seq[AddressDb],
|
||||||
|
vector: TestVector): Seq[Assertion] = {
|
||||||
|
assert(vector.addresses.length == addrs.length)
|
||||||
|
|
||||||
|
val sortedAddresses = addrs.sortBy(_.path.toString)
|
||||||
|
val sortedVectors = vector.addresses.sortBy(_.path.toString)
|
||||||
|
sortedAddresses
|
||||||
|
.zip(sortedVectors)
|
||||||
|
.map {
|
||||||
|
case (foundAddress, expectedAddress) =>
|
||||||
|
assert(foundAddress.address == expectedAddress.address)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private def testAccountType(purpose: HDPurpose): Future[Assertion] = {
|
private def testAccountType(purpose: HDPurpose): Future[Assertion] = {
|
||||||
val confOverride = configForPurpose(purpose)
|
val confOverride = configForPurpose(purpose)
|
||||||
implicit val conf: WalletAppConfig =
|
implicit val conf: WalletAppConfig =
|
||||||
|
@ -175,16 +191,50 @@ class TrezorAddressTest extends BitcoinSWalletTest with EmptyFixture {
|
||||||
case other => fail(s"unknown purpose: $other")
|
case other => fail(s"unknown purpose: $other")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates the wallet accounts needed for this test */
|
||||||
|
def createNeededAccounts(
|
||||||
|
wallet: Wallet,
|
||||||
|
existing: Vector[AccountDb]): Future[Unit] = {
|
||||||
|
val accountsToCreate = existing.length until vectors.length
|
||||||
|
|
||||||
|
FutureUtil
|
||||||
|
.sequentially(accountsToCreate) { _ =>
|
||||||
|
wallet.createNewAccount(purpose)
|
||||||
|
}
|
||||||
|
.map(_ => ())
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterates over the given list of accounts and test vectors, and
|
||||||
|
* fetches all the
|
||||||
|
* addresses needed to verify the test vector
|
||||||
|
*/
|
||||||
|
def getAcccountsWithAddressesAndVectors(
|
||||||
|
wallet: Wallet,
|
||||||
|
accountsWithVectors: Seq[(AccountDb, TestVector)]): Future[
|
||||||
|
Seq[AccountAndAddrsAndVector]] =
|
||||||
|
FutureUtil.sequentially(accountsWithVectors) {
|
||||||
|
case (acc, vec) =>
|
||||||
|
val addrFutures: Future[Seq[AddressDb]] =
|
||||||
|
FutureUtil.sequentially(vec.addresses) { vector =>
|
||||||
|
val addrFut = vector.chain match {
|
||||||
|
case Change => wallet.getNewChangeAddress(acc)
|
||||||
|
case External =>
|
||||||
|
wallet.getNewAddress(acc)
|
||||||
|
}
|
||||||
|
addrFut.flatMap(wallet.addressDAO.findAddress).map {
|
||||||
|
case Some(addr) => addr
|
||||||
|
case None =>
|
||||||
|
fail(s"Did not find address we just generated in DAO!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addrFutures.map(AccountAndAddrsAndVector(acc, _, vec))
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
wallet <- getWallet(conf)
|
wallet <- getWallet(conf)
|
||||||
existingAccounts <- wallet.listAccounts(purpose)
|
existingAccounts <- wallet.listAccounts(purpose)
|
||||||
_ <- {
|
_ <- createNeededAccounts(wallet, existingAccounts)
|
||||||
val accountsToCreate = existingAccounts.length until vectors.length
|
|
||||||
|
|
||||||
FutureUtil.sequentially(accountsToCreate) { _ =>
|
|
||||||
wallet.createNewAccount(purpose)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
accounts <- wallet.listAccounts(purpose)
|
accounts <- wallet.listAccounts(purpose)
|
||||||
|
|
||||||
// we want to find all accounts for the given account type,
|
// we want to find all accounts for the given account type,
|
||||||
|
@ -207,29 +257,15 @@ class TrezorAddressTest extends BitcoinSWalletTest with EmptyFixture {
|
||||||
// here we generate addresses matching the ones found
|
// here we generate addresses matching the ones found
|
||||||
// in the accompanying test vector for each account
|
// in the accompanying test vector for each account
|
||||||
// at the end we group them all together
|
// at the end we group them all together
|
||||||
accountsWithAddrsWithVecs <- {
|
accountsWithAddrsWithVecs <- getAcccountsWithAddressesAndVectors(
|
||||||
FutureUtil.sequentially(accountsWithVectors) {
|
wallet,
|
||||||
case (acc, vec) =>
|
accountsWithVectors)
|
||||||
val addrFutures: Future[Seq[AddressDb]] =
|
|
||||||
FutureUtil.sequentially(vec.addresses) { vector =>
|
|
||||||
val addrFut = vector.chain match {
|
|
||||||
case Change => wallet.getNewChangeAddress(acc)
|
|
||||||
case External =>
|
|
||||||
wallet.getNewAddress(acc)
|
|
||||||
}
|
|
||||||
addrFut.flatMap(wallet.addressDAO.findAddress).map {
|
|
||||||
case Some(addr) => addr
|
|
||||||
case None =>
|
|
||||||
fail(s"Did not find address we just generated in DAO!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addrFutures.map(AccountAndAddrsAndVector(acc, _, vec))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} yield {
|
} yield {
|
||||||
// lastly we loop over all accounts, addresses and vectors
|
// lastly we loop over all accounts, addresses and vectors
|
||||||
// and verify that they are all the same
|
// and verify that they are all the same
|
||||||
accountsWithAddrsWithVecs.foreach {
|
val assertions: Seq[Assertion] = {
|
||||||
|
val nestedAssertions: Seq[Seq[Assertion]] =
|
||||||
|
accountsWithAddrsWithVecs.map {
|
||||||
case AccountAndAddrsAndVector(account, addresses, vec) =>
|
case AccountAndAddrsAndVector(account, addresses, vec) =>
|
||||||
val acctIdx = account.hdAccount.index
|
val acctIdx = account.hdAccount.index
|
||||||
val vec = vectors.find(_.xpub == account.xpub) match {
|
val vec = vectors.find(_.xpub == account.xpub) match {
|
||||||
|
@ -237,16 +273,13 @@ class TrezorAddressTest extends BitcoinSWalletTest with EmptyFixture {
|
||||||
fail(s"Did not find test vector for account $acctIdx")
|
fail(s"Did not find test vector for account $acctIdx")
|
||||||
case Some(v) => v
|
case Some(v) => v
|
||||||
}
|
}
|
||||||
assert(vec.addresses.length == addresses.length)
|
|
||||||
|
|
||||||
val sortedAddresses = addresses.sortBy(_.path.toString)
|
assertSameAddresses(addresses, vec)
|
||||||
val sortedVectors = vec.addresses.sortBy(_.path.toString)
|
|
||||||
sortedAddresses.zip(sortedVectors).foreach {
|
|
||||||
case (foundAddress, expectedAddress) =>
|
|
||||||
assert(foundAddress.address == expectedAddress.address)
|
|
||||||
}
|
}
|
||||||
|
nestedAssertions.flatten
|
||||||
}
|
}
|
||||||
succeed
|
|
||||||
|
assert(assertions.forall(_.isInstanceOf[succeed.type]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue