mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-15 20:30:17 +01:00
Re-enable NeutrinoNodeWithWalletTest for Linux (#1366)
* Re-enable NeutrinoNodeWithWalletTest with it disabled for mac * Change to only Linux * Only disable for CI runs * Move IsCI to BitcoinSUtil * Fix compile issue for earlier versions * Fix syncing compact filters to not skip last filter * Fix test to be compatible with new start state * Use correct isCI * Fix compile issue * set CI env
This commit is contained in:
parent
2a785388bf
commit
b8331d4cf1
6 changed files with 65 additions and 51 deletions
|
@ -4,6 +4,7 @@ import org.bitcoins.core.protocol.NetworkElement
|
||||||
import scodec.bits.{BitVector, ByteVector}
|
import scodec.bits.{BitVector, ByteVector}
|
||||||
|
|
||||||
import scala.math.BigInt
|
import scala.math.BigInt
|
||||||
|
import scala.util.Properties
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by chris on 2/26/16.
|
* Created by chris on 2/26/16.
|
||||||
|
@ -94,6 +95,15 @@ trait BitcoinSUtil {
|
||||||
h.foldLeft(ByteVector.empty)(_ ++ _.bytes)
|
h.foldLeft(ByteVector.empty)(_ ++ _.bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val osName = System.getProperty("os.name")
|
||||||
|
|
||||||
|
lazy val isLinux: Boolean = osName.startsWith("Linux")
|
||||||
|
|
||||||
|
lazy val isMac: Boolean = osName.startsWith("Mac")
|
||||||
|
|
||||||
|
lazy val isWindows: Boolean = osName.startsWith("Windows")
|
||||||
|
|
||||||
|
lazy val isCI: Boolean = Properties.envOrNone("CI").contains("1")
|
||||||
}
|
}
|
||||||
|
|
||||||
object BitcoinSUtil extends BitcoinSUtil
|
object BitcoinSUtil extends BitcoinSUtil
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.bitcoins.node
|
package org.bitcoins.node
|
||||||
|
|
||||||
import org.bitcoins.core.currency._
|
import org.bitcoins.core.currency._
|
||||||
|
import org.bitcoins.core.util.BitcoinSUtil
|
||||||
import org.bitcoins.core.wallet.fee.SatoshisPerByte
|
import org.bitcoins.core.wallet.fee.SatoshisPerByte
|
||||||
import org.bitcoins.node.networking.peer.DataMessageHandler
|
import org.bitcoins.node.networking.peer.DataMessageHandler
|
||||||
import org.bitcoins.node.networking.peer.DataMessageHandler.OnCompactFiltersReceived
|
import org.bitcoins.node.networking.peer.DataMessageHandler.OnCompactFiltersReceived
|
||||||
|
@ -13,12 +14,10 @@ import org.bitcoins.testkit.node.NodeUnitTest.NeutrinoNodeFundedWalletBitcoind
|
||||||
import org.bitcoins.testkit.node.{NodeTestUtil, NodeUnitTest}
|
import org.bitcoins.testkit.node.{NodeTestUtil, NodeUnitTest}
|
||||||
import org.bitcoins.testkit.wallet.BitcoinSWalletTest
|
import org.bitcoins.testkit.wallet.BitcoinSWalletTest
|
||||||
import org.bitcoins.wallet.api.UnlockedWalletApi
|
import org.bitcoins.wallet.api.UnlockedWalletApi
|
||||||
import org.bitcoins.wallet.config.WalletAppConfig
|
import org.scalatest.FutureOutcome
|
||||||
import org.scalatest.{DoNotDiscover, FutureOutcome}
|
|
||||||
|
|
||||||
import scala.concurrent.{Future, Promise}
|
import scala.concurrent.{Future, Promise}
|
||||||
|
|
||||||
@DoNotDiscover
|
|
||||||
class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
|
|
||||||
/** Wallet config with data directory set to user temp directory */
|
/** Wallet config with data directory set to user temp directory */
|
||||||
|
@ -28,9 +27,16 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
override type FixtureParam = NeutrinoNodeFundedWalletBitcoind
|
override type FixtureParam = NeutrinoNodeFundedWalletBitcoind
|
||||||
|
|
||||||
def withFixture(test: OneArgAsyncTest): FutureOutcome = {
|
def withFixture(test: OneArgAsyncTest): FutureOutcome = {
|
||||||
withNeutrinoNodeFundedWalletBitcoind(test,
|
// We need to disable the test on non-linux CI runs
|
||||||
callbacks,
|
// because we do not have a mac binary of the BIP 157
|
||||||
Some(BitcoindVersion.Experimental))
|
// compatible version of bitcoin core
|
||||||
|
if (BitcoinSUtil.isCI && !BitcoinSUtil.isLinux) {
|
||||||
|
FutureOutcome.succeeded
|
||||||
|
} else {
|
||||||
|
withNeutrinoNodeFundedWalletBitcoind(test,
|
||||||
|
callbacks,
|
||||||
|
Some(BitcoindVersion.Experimental))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var walletP: Promise[UnlockedWalletApi] = Promise()
|
private var walletP: Promise[UnlockedWalletApi] = Promise()
|
||||||
|
@ -55,7 +61,7 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
_ <- wallet.processBlock(block)
|
_ <- wallet.processBlock(block)
|
||||||
} yield ()
|
} yield ()
|
||||||
}
|
}
|
||||||
val onCompactFilter: OnCompactFiltersReceived = { blockFilters =>
|
val onCompactFilters: OnCompactFiltersReceived = { blockFilters =>
|
||||||
for {
|
for {
|
||||||
wallet <- walletF
|
wallet <- walletF
|
||||||
_ <- wallet.processCompactFilters(blockFilters)
|
_ <- wallet.processCompactFilters(blockFilters)
|
||||||
|
@ -64,7 +70,7 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
|
|
||||||
NodeCallbacks(
|
NodeCallbacks(
|
||||||
onBlockReceived = Seq(onBlock),
|
onBlockReceived = Seq(onBlock),
|
||||||
onCompactFiltersReceived = Seq(onCompactFilter)
|
onCompactFiltersReceived = Seq(onCompactFilters)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,17 +101,17 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
val condition1 = () => {
|
val condition1 = () => {
|
||||||
condition(
|
condition(
|
||||||
expectedConfirmedAmount = 0.sats,
|
expectedConfirmedAmount = 0.sats,
|
||||||
expectedUnconfirmedAmount = BitcoinSWalletTest.initialFunds - TestAmount - TestFees,
|
expectedUnconfirmedAmount = BitcoinSWalletTest.expectedDefaultAmt - TestAmount - TestFees,
|
||||||
expectedUtxos = 1,
|
expectedUtxos = 3,
|
||||||
expectedAddresses = 2
|
expectedAddresses = 7
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
val condition2 = { () =>
|
val condition2 = { () =>
|
||||||
condition(
|
condition(
|
||||||
expectedConfirmedAmount = TestAmount,
|
expectedConfirmedAmount = 0.sats,
|
||||||
expectedUnconfirmedAmount = BitcoinSWalletTest.initialFunds - TestAmount - TestFees,
|
expectedUnconfirmedAmount = BitcoinSWalletTest.expectedDefaultAmt - TestFees,
|
||||||
expectedUtxos = 2,
|
expectedUtxos = 4,
|
||||||
expectedAddresses = 3
|
expectedAddresses = 8
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,12 +153,12 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
|
|
||||||
def condition(): Future[Boolean] = {
|
def condition(): Future[Boolean] = {
|
||||||
for {
|
for {
|
||||||
balance <- wallet.getConfirmedBalance()
|
balance <- wallet.getBalance()
|
||||||
addresses <- wallet.listAddresses()
|
addresses <- wallet.listAddresses()
|
||||||
utxos <- wallet.listUtxos()
|
utxos <- wallet.listUtxos()
|
||||||
} yield {
|
} yield {
|
||||||
balance == BitcoinSWalletTest.initialFunds + TestAmount &&
|
balance == BitcoinSWalletTest.expectedDefaultAmt + TestAmount &&
|
||||||
utxos.size == 2 &&
|
utxos.size == 4 &&
|
||||||
addresses.map(_.scriptPubKey.hex).sorted == utxos
|
addresses.map(_.scriptPubKey.hex).sorted == utxos
|
||||||
.map(_.output.scriptPubKey.hex)
|
.map(_.output.scriptPubKey.hex)
|
||||||
.sorted
|
.sorted
|
||||||
|
@ -162,8 +168,8 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
for {
|
for {
|
||||||
addresses <- wallet.listAddresses()
|
addresses <- wallet.listAddresses()
|
||||||
utxos <- wallet.listUtxos()
|
utxos <- wallet.listUtxos()
|
||||||
_ = assert(addresses.size == 1)
|
_ = assert(addresses.size == 6)
|
||||||
_ = assert(utxos.size == 1)
|
_ = assert(utxos.size == 3)
|
||||||
|
|
||||||
_ <- node.sync()
|
_ <- node.sync()
|
||||||
_ <- NodeTestUtil.awaitSync(node, bitcoind)
|
_ <- NodeTestUtil.awaitSync(node, bitcoind)
|
||||||
|
@ -175,24 +181,22 @@ class NeutrinoNodeWithWalletTest extends NodeUnitTest {
|
||||||
|
|
||||||
addresses <- wallet.listAddresses()
|
addresses <- wallet.listAddresses()
|
||||||
utxos <- wallet.listUtxos()
|
utxos <- wallet.listUtxos()
|
||||||
_ = assert(addresses.size == 2)
|
_ = assert(addresses.size == 7)
|
||||||
_ = assert(utxos.size == 1)
|
_ = assert(utxos.size == 3)
|
||||||
|
|
||||||
_ <- wallet.clearUtxosAndAddresses()
|
_ <- wallet.clearAllUtxosAndAddresses()
|
||||||
|
|
||||||
addresses <- wallet.listAddresses()
|
addresses <- wallet.listAddresses()
|
||||||
utxos <- wallet.listUtxos()
|
utxos <- wallet.listUtxos()
|
||||||
_ = assert(addresses.size == 2)
|
_ = assert(addresses.isEmpty)
|
||||||
_ = assert(utxos.size == 0)
|
_ = assert(utxos.isEmpty)
|
||||||
|
|
||||||
_ <- bitcoind.getNewAddress
|
_ <- bitcoind.getNewAddress
|
||||||
.flatMap(bitcoind.generateToAddress(1, _))
|
.flatMap(bitcoind.generateToAddress(1, _))
|
||||||
_ <- NodeTestUtil.awaitSync(node, bitcoind)
|
_ <- NodeTestUtil.awaitSync(node, bitcoind)
|
||||||
_ <- NodeTestUtil.awaitCompactFiltersSync(node, bitcoind)
|
_ <- NodeTestUtil.awaitCompactFiltersSync(node, bitcoind)
|
||||||
|
|
||||||
_ <- wallet.rescanNeutrinoWallet(startOpt = None,
|
_ <- wallet.fullRescanNeutrinoWallet(addressBatchSize = 7)
|
||||||
endOpt = None,
|
|
||||||
addressBatchSize = 2)
|
|
||||||
|
|
||||||
_ <- AsyncUtil.awaitConditionF(condition)
|
_ <- AsyncUtil.awaitConditionF(condition)
|
||||||
} yield succeed
|
} yield succeed
|
||||||
|
|
|
@ -100,8 +100,8 @@ case class DataMessageHandler(
|
||||||
}
|
}
|
||||||
newChainApi <- chainApi.processFilter(filter)
|
newChainApi <- chainApi.processFilter(filter)
|
||||||
// If we are not syncing or our filter batch is full, process the filters
|
// If we are not syncing or our filter batch is full, process the filters
|
||||||
_ <- if (!syncing || batchSizeFull) {
|
_ <- if (!newSyncing || batchSizeFull) {
|
||||||
val blockFilters = currentFilterBatch.map { filter =>
|
val blockFilters = newBatch.map { filter =>
|
||||||
(filter.blockHash,
|
(filter.blockHash,
|
||||||
BlockFilter.fromBytes(filter.filterBytes, filter.blockHash))
|
BlockFilter.fromBytes(filter.filterBytes, filter.blockHash))
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ import org.bitcoins.core.protocol.transaction.{
|
||||||
TransactionInput,
|
TransactionInput,
|
||||||
TransactionOutPoint
|
TransactionOutPoint
|
||||||
}
|
}
|
||||||
import org.bitcoins.core.util.BitcoinSLogger
|
import org.bitcoins.core.util.{BitcoinSLogger, BitcoinSUtil}
|
||||||
import org.bitcoins.rpc.BitcoindException
|
import org.bitcoins.rpc.BitcoindException
|
||||||
import org.bitcoins.rpc.client.common.BitcoindVersion.{
|
import org.bitcoins.rpc.client.common.BitcoindVersion.{
|
||||||
Unknown,
|
Unknown,
|
||||||
|
@ -982,8 +982,7 @@ object BitcoindRpcTestUtil extends BitcoindRpcTestUtil {
|
||||||
* Used for long running async tasks
|
* Used for long running async tasks
|
||||||
*/
|
*/
|
||||||
private val DEFAULT_LONG_DURATION = {
|
private val DEFAULT_LONG_DURATION = {
|
||||||
val isCI = Properties.envOrNone("CI").contains("1")
|
if (BitcoinSUtil.isMac && BitcoinSUtil.isCI) 10.seconds
|
||||||
if (Properties.isMac && isCI) 10.seconds
|
|
||||||
else 3.seconds
|
else 3.seconds
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,7 +245,17 @@ trait BitcoinSWalletTest extends BitcoinSFixture with WalletLogger {
|
||||||
|
|
||||||
object BitcoinSWalletTest extends WalletLogger {
|
object BitcoinSWalletTest extends WalletLogger {
|
||||||
|
|
||||||
lazy val initialFunds = 25.bitcoins
|
val defaultAcctAmts = Vector(1.bitcoin, 2.bitcoin, 3.bitcoin)
|
||||||
|
|
||||||
|
val expectedDefaultAmt: CurrencyUnit =
|
||||||
|
defaultAcctAmts.fold(CurrencyUnits.zero)(_ + _)
|
||||||
|
|
||||||
|
val account1Amt = Vector(Bitcoins(0.2), Bitcoins(0.3), Bitcoins(0.5))
|
||||||
|
|
||||||
|
val expectedAccount1Amt: CurrencyUnit =
|
||||||
|
account1Amt.fold(CurrencyUnits.zero)(_ + _)
|
||||||
|
|
||||||
|
lazy val initialFunds: CurrencyUnit = expectedDefaultAmt + expectedAccount1Amt
|
||||||
|
|
||||||
object MockNodeApi extends NodeApi {
|
object MockNodeApi extends NodeApi {
|
||||||
|
|
||||||
|
@ -497,11 +507,6 @@ object BitcoinSWalletTest extends WalletLogger {
|
||||||
implicit ec: ExecutionContext): Future[T] = {
|
implicit ec: ExecutionContext): Future[T] = {
|
||||||
val (wallet, bitcoind) = (pair.wallet, pair.bitcoind)
|
val (wallet, bitcoind) = (pair.wallet, pair.bitcoind)
|
||||||
|
|
||||||
val defaultAcctAmts = Vector(1.bitcoin, 2.bitcoin, 3.bitcoin)
|
|
||||||
val expectedDefaultAmt = defaultAcctAmts.fold(CurrencyUnits.zero)(_ + _)
|
|
||||||
val account1Amt = Vector(Bitcoins(0.2), Bitcoins(0.3), Bitcoins(0.5))
|
|
||||||
val expectedAccount1Amt = account1Amt.fold(CurrencyUnits.zero)(_ + _)
|
|
||||||
|
|
||||||
val defaultAccount = wallet.walletConfig.defaultAccount
|
val defaultAccount = wallet.walletConfig.defaultAccount
|
||||||
val fundedDefaultAccountWalletF =
|
val fundedDefaultAccountWalletF =
|
||||||
FundWalletUtil.fundAccountForWalletWithBitcoind(
|
FundWalletUtil.fundAccountForWalletWithBitcoind(
|
||||||
|
|
|
@ -3,7 +3,7 @@ package org.bitcoins.testkit.wallet
|
||||||
import akka.actor.ActorSystem
|
import akka.actor.ActorSystem
|
||||||
import com.typesafe.config.Config
|
import com.typesafe.config.Config
|
||||||
import org.bitcoins.core.api.{ChainQueryApi, NodeApi}
|
import org.bitcoins.core.api.{ChainQueryApi, NodeApi}
|
||||||
import org.bitcoins.core.currency.{Bitcoins, CurrencyUnit, CurrencyUnits, _}
|
import org.bitcoins.core.currency.CurrencyUnit
|
||||||
import org.bitcoins.core.hd.HDAccount
|
import org.bitcoins.core.hd.HDAccount
|
||||||
import org.bitcoins.core.protocol.BitcoinAddress
|
import org.bitcoins.core.protocol.BitcoinAddress
|
||||||
import org.bitcoins.core.protocol.transaction.TransactionOutput
|
import org.bitcoins.core.protocol.transaction.TransactionOutput
|
||||||
|
@ -76,14 +76,9 @@ trait FundWalletUtil {
|
||||||
def fundWallet(wallet: Wallet)(
|
def fundWallet(wallet: Wallet)(
|
||||||
implicit ec: ExecutionContext): Future[FundedWallet] = {
|
implicit ec: ExecutionContext): Future[FundedWallet] = {
|
||||||
|
|
||||||
val defaultAcctAmts = Vector(1.bitcoin, 2.bitcoin, 3.bitcoin)
|
|
||||||
val expectedDefaultAmt = defaultAcctAmts.fold(CurrencyUnits.zero)(_ + _)
|
|
||||||
val account1Amt = Vector(Bitcoins(0.2), Bitcoins(0.3), Bitcoins(0.5))
|
|
||||||
val expectedAccount1Amt = account1Amt.fold(CurrencyUnits.zero)(_ + _)
|
|
||||||
|
|
||||||
val defaultAccount = wallet.walletConfig.defaultAccount
|
val defaultAccount = wallet.walletConfig.defaultAccount
|
||||||
val fundedDefaultAccountWalletF = FundWalletUtil.fundAccountForWallet(
|
val fundedDefaultAccountWalletF = FundWalletUtil.fundAccountForWallet(
|
||||||
amts = defaultAcctAmts,
|
amts = BitcoinSWalletTest.defaultAcctAmts,
|
||||||
account = defaultAccount,
|
account = defaultAccount,
|
||||||
wallet = wallet
|
wallet = wallet
|
||||||
)
|
)
|
||||||
|
@ -92,7 +87,7 @@ trait FundWalletUtil {
|
||||||
val fundedAccount1WalletF = for {
|
val fundedAccount1WalletF = for {
|
||||||
fundedDefaultAcct <- fundedDefaultAccountWalletF
|
fundedDefaultAcct <- fundedDefaultAccountWalletF
|
||||||
fundedAcct1 <- FundWalletUtil.fundAccountForWallet(
|
fundedAcct1 <- FundWalletUtil.fundAccountForWallet(
|
||||||
amts = account1Amt,
|
amts = BitcoinSWalletTest.account1Amt,
|
||||||
account = hdAccount1,
|
account = hdAccount1,
|
||||||
fundedDefaultAcct
|
fundedDefaultAcct
|
||||||
)
|
)
|
||||||
|
@ -103,14 +98,15 @@ trait FundWalletUtil {
|
||||||
fundedWallet <- fundedAccount1WalletF
|
fundedWallet <- fundedAccount1WalletF
|
||||||
balance <- fundedWallet.getBalance(defaultAccount)
|
balance <- fundedWallet.getBalance(defaultAccount)
|
||||||
_ = require(
|
_ = require(
|
||||||
balance == expectedDefaultAmt,
|
balance == BitcoinSWalletTest.expectedDefaultAmt,
|
||||||
s"Funding wallet fixture failed to fund the wallet, got balance=${balance} expected=${expectedDefaultAmt}")
|
s"Funding wallet fixture failed to fund the wallet, got balance=${balance} expected=${BitcoinSWalletTest.expectedDefaultAmt}"
|
||||||
|
)
|
||||||
|
|
||||||
account1Balance <- fundedWallet.getBalance(hdAccount1)
|
account1Balance <- fundedWallet.getBalance(hdAccount1)
|
||||||
_ = require(
|
_ = require(
|
||||||
account1Balance == expectedAccount1Amt,
|
account1Balance == BitcoinSWalletTest.expectedAccount1Amt,
|
||||||
s"Funding wallet fixture failed to fund account 1, " +
|
s"Funding wallet fixture failed to fund account 1, " +
|
||||||
s"got balance=${hdAccount1} expected=${expectedAccount1Amt}"
|
s"got balance=${hdAccount1} expected=${BitcoinSWalletTest.expectedAccount1Amt}"
|
||||||
)
|
)
|
||||||
|
|
||||||
} yield FundedWallet(fundedWallet)
|
} yield FundedWallet(fundedWallet)
|
||||||
|
|
Loading…
Add table
Reference in a new issue