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:
Ben Carman 2020-04-27 18:20:47 -05:00 committed by GitHub
parent 2a785388bf
commit b8331d4cf1
6 changed files with 65 additions and 51 deletions

View file

@ -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

View file

@ -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

View file

@ -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))
} }

View file

@ -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
} }
} }

View file

@ -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(

View file

@ -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)