From 7a068ac036b4d5fd6279340c80a7c2eb7cd57cda Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Thu, 25 Feb 2021 13:26:38 -0600 Subject: [PATCH] 2021 02 25 async utils (#2725) * Refactor AsyncUtil to just use an execution context rather than an actor system * Create async util project, use it in various projects that depend on it --- ...Linux_2.12_KeyManager_Wallet_DLC_Tests.yml | 2 +- ...Linux_2.13_KeyManager_Wallet_DLC_Tests.yml | 2 +- .../Mac_2.13_Wallet_Node_DLC_Tests.yml | 2 +- .../org/bitcoins/asyncutil}/AsyncUtil.scala | 23 ++++++++--------- .../org/bitcoins/rpc/TestRpcUtilTest.scala | 10 ++++---- .../rpc/common/BlockchainRpcTest.scala | 2 +- .../rpc/v16/BitcoindV16RpcClientTest.scala | 2 +- .../rpc/v17/BitcoindV17RpcClientTest.scala | 2 +- .../bitcoins/rpc/client/common/Client.scala | 2 +- .../scala/org/bitcoins/rpc/util/RpcUtil.scala | 8 +++--- build.sbt | 15 ++++++++++- .../eclair/rpc/EclairRpcClientTest.scala | 2 +- eclair-rpc/eclair-rpc.sbt | 2 -- .../eclair/rpc/client/EclairRpcClient.scala | 2 +- .../node/NeutrinoNodeWithWalletTest.scala | 2 +- .../bitcoins/node/SpvNodeWithWalletTest.scala | 2 +- .../main/scala/org/bitcoins/node/Node.scala | 2 +- .../scala/org/bitcoins/node/SpvNode.scala | 2 +- .../testkit/async/TestAsyncUtil.scala | 10 +++----- .../eclair/rpc/EclairRpcTestUtil.scala | 25 +++++++++++-------- .../testkit/rpc/BitcoindRpcTestUtil.scala | 4 ++- .../testkit/util/BitcoinSAsyncTest.scala | 2 +- .../testkit/wallet/BitcoinSWalletTest.scala | 4 +-- .../bitcoins/wallet/AddressHandlingTest.scala | 2 +- .../wallet/BitcoindBlockPollingTest.scala | 2 +- 25 files changed, 73 insertions(+), 60 deletions(-) rename {bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util => async-utils/src/main/scala/org/bitcoins/asyncutil}/AsyncUtil.scala (91%) diff --git a/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml b/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml index 730e36e874..db629708d3 100644 --- a/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml +++ b/.github/workflows/Linux_2.12_KeyManager_Wallet_DLC_Tests.yml @@ -23,4 +23,4 @@ jobs: ~/.bitcoin-s/binaries key: ${{ runner.os }}-cache - name: run tests - run: sbt ++2.12.12 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls + run: sbt ++2.12.12 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test asyncUtils/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls diff --git a/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml b/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml index 751513c853..b018316d8f 100644 --- a/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml +++ b/.github/workflows/Linux_2.13_KeyManager_Wallet_DLC_Tests.yml @@ -23,4 +23,4 @@ jobs: ~/.bitcoin-s/binaries key: ${{ runner.os }}-cache - name: run tests - run: sbt ++2.13.5 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls + run: sbt ++2.13.5 downloadBitcoind coverage keyManagerTest/test keyManager/coverageReport keyManager/coverageAggregate keyManager/coveralls feeProviderTest/test walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls dlcOracleTest/test asyncUtils/test dlcOracle/coverageReport dlcOracle/coverageAggregate dlcOracle/coveralls diff --git a/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml b/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml index feb556acd4..dd9daec8d8 100644 --- a/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml +++ b/.github/workflows/Mac_2.13_Wallet_Node_DLC_Tests.yml @@ -23,4 +23,4 @@ jobs: ~/.bitcoin-s/binaries key: ${{ runner.os }}-cache - name: run tests - run: sbt ++2.13.5 downloadBitcoind coverage walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls nodeTest/test node/coverageReport node/coverageAggregate node/coveralls dlcOracleTest/test dlcOracle/coverageReport dlcOracle/coveralls \ No newline at end of file + run: sbt ++2.13.5 downloadBitcoind coverage walletTest/test wallet/coverageReport wallet/coverageAggregate wallet/coveralls nodeTest/test node/coverageReport node/coverageAggregate node/coveralls dlcOracleTest/test asyncUtils/test dlcOracle/coverageReport dlcOracle/coveralls \ No newline at end of file diff --git a/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/AsyncUtil.scala b/async-utils/src/main/scala/org/bitcoins/asyncutil/AsyncUtil.scala similarity index 91% rename from bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/AsyncUtil.scala rename to async-utils/src/main/scala/org/bitcoins/asyncutil/AsyncUtil.scala index a48e372373..03d09531f5 100644 --- a/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/AsyncUtil.scala +++ b/async-utils/src/main/scala/org/bitcoins/asyncutil/AsyncUtil.scala @@ -1,8 +1,8 @@ -package org.bitcoins.rpc.util +package org.bitcoins.asyncutil -import akka.actor.ActorSystem import org.bitcoins.core.util.BitcoinSLogger +import java.util.concurrent.{Executors, TimeUnit} import scala.concurrent._ import scala.concurrent.duration.{DurationInt, FiniteDuration} @@ -24,7 +24,7 @@ abstract class AsyncUtil extends BitcoinSLogger { condition: => Boolean, interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL, maxTries: Int = DEFAULT_MAX_TRIES)(implicit - system: ActorSystem): Future[Unit] = { + ec: ExecutionContext): Future[Unit] = { val f = () => Future.successful(condition) retryUntilSatisfiedF(f, interval, maxTries) } @@ -40,7 +40,7 @@ abstract class AsyncUtil extends BitcoinSLogger { conditionF: () => Future[Boolean], interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL, maxTries: Int = DEFAULT_MAX_TRIES)(implicit - system: ActorSystem): Future[Unit] = { + ec: ExecutionContext): Future[Unit] = { val stackTrace: Array[StackTraceElement] = Thread.currentThread().getStackTrace @@ -81,10 +81,7 @@ abstract class AsyncUtil extends BitcoinSLogger { counter: Int = 0, maxTries: Int, stackTrace: Array[StackTraceElement])(implicit - system: ActorSystem): Future[Unit] = { - - import system.dispatcher - + ec: ExecutionContext): Future[Unit] = { conditionF().flatMap { condition => if (condition) { Future.unit @@ -96,7 +93,8 @@ abstract class AsyncUtil extends BitcoinSLogger { val p = Promise[Boolean]() val runnable = retryRunnable(condition, p) - system.scheduler.scheduleOnce(delay = interval, runnable = runnable) + AsyncUtil.scheduler + .schedule(runnable, interval.toMillis, TimeUnit.MILLISECONDS) p.future.flatMap { case true => Future.unit @@ -122,7 +120,7 @@ abstract class AsyncUtil extends BitcoinSLogger { condition: () => Boolean, interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL, maxTries: Int = DEFAULT_MAX_TRIES)(implicit - system: ActorSystem): Future[Unit] = { + ec: ExecutionContext): Future[Unit] = { //type hackery here to go from () => Boolean to () => Future[Boolean] //to make sure we re-evaluate every time retryUntilSatisfied is called @@ -137,7 +135,7 @@ abstract class AsyncUtil extends BitcoinSLogger { conditionF: () => Future[Boolean], interval: FiniteDuration = AsyncUtil.DEFAULT_INTERVAL, maxTries: Int = DEFAULT_MAX_TRIES)(implicit - system: ActorSystem): Future[Unit] = { + ec: ExecutionContext): Future[Unit] = { retryUntilSatisfiedF(conditionF = conditionF, interval = interval, @@ -148,6 +146,8 @@ abstract class AsyncUtil extends BitcoinSLogger { object AsyncUtil extends AsyncUtil { + private[bitcoins] val scheduler = Executors.newScheduledThreadPool(2) + /** The default interval between async attempts */ private[bitcoins] val DEFAULT_INTERVAL: FiniteDuration = 100.milliseconds @@ -155,5 +155,4 @@ object AsyncUtil extends AsyncUtil { /** The default number of async attempts before timing out */ private[bitcoins] val DEFAULT_MAX_TRIES: Int = 50 - } diff --git a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/TestRpcUtilTest.scala b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/TestRpcUtilTest.scala index 2daf2921d0..e717305a90 100644 --- a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/TestRpcUtilTest.scala +++ b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/TestRpcUtilTest.scala @@ -1,11 +1,11 @@ package org.bitcoins.rpc -import java.io.File +import org.bitcoins.asyncutil.AsyncUtil +import java.io.File import org.bitcoins.core.currency.Bitcoins import org.bitcoins.rpc.client.common.BitcoindRpcClient -import org.bitcoins.rpc.util.AsyncUtil.RpcRetryException -import org.bitcoins.rpc.util.{AsyncUtil, RpcUtil} +import org.bitcoins.rpc.util.RpcUtil import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil import org.bitcoins.testkit.util.{BitcoindRpcTest, FileUtil} @@ -48,7 +48,7 @@ class TestRpcUtilTest extends BitcoindRpcTest { } it should "fail if condition is false" in { - recoverToSucceededIf[RpcRetryException] { + recoverToSucceededIf[AsyncUtil.RpcRetryException] { AsyncUtil.retryUntilSatisfiedF(conditionF = () => Future.successful(false), interval = 0.millis) @@ -70,7 +70,7 @@ class TestRpcUtilTest extends BitcoindRpcTest { } it should "timeout if condition is false" in { - recoverToSucceededIf[RpcRetryException] { + recoverToSucceededIf[AsyncUtil.RpcRetryException] { AsyncUtil .awaitCondition(condition = () => false, interval = 0.millis) .map(_ => succeed) diff --git a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/common/BlockchainRpcTest.scala b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/common/BlockchainRpcTest.scala index c0e63c733a..90206241f8 100644 --- a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/common/BlockchainRpcTest.scala +++ b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/common/BlockchainRpcTest.scala @@ -1,5 +1,6 @@ package org.bitcoins.rpc.common +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.bitcoind.GetBlockChainInfoResultPreV19 import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.{ AddNodeArgument, @@ -9,7 +10,6 @@ import org.bitcoins.core.config.RegTest import org.bitcoins.core.currency.Bitcoins import org.bitcoins.core.number.UInt32 import org.bitcoins.rpc.client.common.{BitcoindRpcClient, BitcoindVersion} -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil import org.bitcoins.testkit.util.BitcoindRpcTest diff --git a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v16/BitcoindV16RpcClientTest.scala b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v16/BitcoindV16RpcClientTest.scala index 947de08c8a..a565b31b1d 100644 --- a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v16/BitcoindV16RpcClientTest.scala +++ b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v16/BitcoindV16RpcClientTest.scala @@ -1,5 +1,6 @@ package org.bitcoins.rpc.v16 +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.SignRawTransactionOutputParameter import org.bitcoins.core.crypto.ECPrivateKeyUtil import org.bitcoins.core.currency.Bitcoins @@ -14,7 +15,6 @@ import org.bitcoins.core.protocol.transaction.{ import org.bitcoins.crypto.{DoubleSha256DigestBE, ECPrivateKey} import org.bitcoins.rpc.client.common.BitcoindVersion import org.bitcoins.rpc.client.v16.BitcoindV16RpcClient -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil import org.bitcoins.testkit.util.BitcoindRpcTest diff --git a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v17/BitcoindV17RpcClientTest.scala b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v17/BitcoindV17RpcClientTest.scala index 66fa646566..c3ceabf8c0 100644 --- a/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v17/BitcoindV17RpcClientTest.scala +++ b/bitcoind-rpc-test/src/test/scala/org/bitcoins/rpc/v17/BitcoindV17RpcClientTest.scala @@ -1,5 +1,6 @@ package org.bitcoins.rpc.v17 +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.{ AddressType, LabelPurpose, @@ -14,7 +15,6 @@ import org.bitcoins.core.protocol.script.ScriptPubKey import org.bitcoins.core.protocol.transaction.TransactionInput import org.bitcoins.crypto.DoubleSha256DigestBE import org.bitcoins.rpc.client.v17.BitcoindV17RpcClient -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil import org.bitcoins.testkit.util.BitcoindRpcTest diff --git a/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/client/common/Client.scala b/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/client/common/Client.scala index 73bac2a1fc..396327a3e3 100644 --- a/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/client/common/Client.scala +++ b/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/client/common/Client.scala @@ -9,6 +9,7 @@ import akka.http.scaladsl.model._ import akka.stream.StreamTcpException import akka.util.ByteString import com.fasterxml.jackson.core.JsonParseException +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts import org.bitcoins.commons.serializers.JsonSerializers._ import org.bitcoins.core.config.{ @@ -27,7 +28,6 @@ import org.bitcoins.rpc.config.BitcoindAuthCredentials.{ PasswordBased } import org.bitcoins.rpc.config.{BitcoindAuthCredentials, BitcoindInstance} -import org.bitcoins.rpc.util.AsyncUtil import play.api.libs.json._ import scala.concurrent._ diff --git a/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/RpcUtil.scala b/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/RpcUtil.scala index b2df8b8fb3..93b6f856a5 100644 --- a/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/RpcUtil.scala +++ b/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/util/RpcUtil.scala @@ -1,12 +1,12 @@ package org.bitcoins.rpc.util -import java.net.ServerSocket +import org.bitcoins.asyncutil.AsyncUtil -import akka.actor.ActorSystem +import java.net.ServerSocket import org.bitcoins.rpc.client.common.BitcoindRpcClient import scala.annotation.tailrec -import scala.concurrent.Future +import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.duration.FiniteDuration import scala.concurrent.duration.DurationInt import scala.util.{Failure, Random, Success, Try} @@ -16,7 +16,7 @@ abstract class RpcUtil extends AsyncUtil { def awaitServerShutdown( server: BitcoindRpcClient, duration: FiniteDuration = 300.milliseconds, - maxTries: Int = 50)(implicit system: ActorSystem): Future[Unit] = { + maxTries: Int = 50)(implicit ec: ExecutionContext): Future[Unit] = { retryUntilSatisfiedF(() => server.isStoppedF, duration, maxTries) } diff --git a/build.sbt b/build.sbt index 3964858ed9..3235e35a6a 100644 --- a/build.sbt +++ b/build.sbt @@ -37,15 +37,20 @@ lazy val bitcoindRpc = project .in(file("bitcoind-rpc")) .settings(CommonSettings.prodSettings: _*) .dependsOn( + asyncUtils, appCommons ) -lazy val eclairRpc = project in file("eclair-rpc") + +lazy val eclairRpc = project + .in(file("eclair-rpc")) + .dependsOn(asyncUtils, bitcoindRpc) // quoting the val name this way makes it appear as // 'bitcoin-s' in sbt/bloop instead of 'bitcoins' lazy val `bitcoin-s` = project .in(file(".")) .aggregate( + asyncUtils, secp256k1jni, chain, chainTest, @@ -267,6 +272,12 @@ lazy val coreTest = project testkit ) +lazy val asyncUtils = project + .in(file("async-utils")) + .settings(CommonSettings.prodSettings) + .settings(name := "bitcoin-s-async-utils") + .dependsOn(core) + lazy val appCommons = project .in(file("app-commons")) .settings(CommonSettings.prodSettings: _*) @@ -463,6 +474,7 @@ lazy val node = libraryDependencies ++= Deps.node ) .dependsOn( + asyncUtils, core, chain, dbCommons, @@ -500,6 +512,7 @@ lazy val testkit = project name := "bitcoin-s-testkit" ) .dependsOn( + asyncUtils, core % testAndCompile, appServer, chain, diff --git a/eclair-rpc-test/src/test/scala/org/bitcoins/eclair/rpc/EclairRpcClientTest.scala b/eclair-rpc-test/src/test/scala/org/bitcoins/eclair/rpc/EclairRpcClientTest.scala index a6c06f8395..0fb1f06ebc 100644 --- a/eclair-rpc-test/src/test/scala/org/bitcoins/eclair/rpc/EclairRpcClientTest.scala +++ b/eclair-rpc-test/src/test/scala/org/bitcoins/eclair/rpc/EclairRpcClientTest.scala @@ -1,5 +1,6 @@ package org.bitcoins.eclair.rpc +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.eclair._ import org.bitcoins.core.config.RegTest import org.bitcoins.core.currency.{CurrencyUnits, Satoshis} @@ -22,7 +23,6 @@ import org.bitcoins.eclair.rpc.api._ import org.bitcoins.eclair.rpc.client.EclairRpcClient import org.bitcoins.eclair.rpc.config.{EclairAuthCredentials, EclairInstance} import org.bitcoins.rpc.client.common.BitcoindRpcClient -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.testkit.async.TestAsyncUtil import org.bitcoins.testkit.eclair.rpc.{EclairNodes4, EclairRpcTestUtil} import org.bitcoins.testkit.util.{BitcoinSAsyncTest, EclairRpcTestClient} diff --git a/eclair-rpc/eclair-rpc.sbt b/eclair-rpc/eclair-rpc.sbt index cfb9ae3fd6..d794cb20b0 100644 --- a/eclair-rpc/eclair-rpc.sbt +++ b/eclair-rpc/eclair-rpc.sbt @@ -6,8 +6,6 @@ name := "bitcoin-s-eclair-rpc" libraryDependencies ++= Deps.eclairRpc -dependsOn(Projects.bitcoindRpc) - CommonSettings.prodSettings TaskKeys.downloadEclair := { diff --git a/eclair-rpc/src/main/scala/org/bitcoins/eclair/rpc/client/EclairRpcClient.scala b/eclair-rpc/src/main/scala/org/bitcoins/eclair/rpc/client/EclairRpcClient.scala index 9c35828257..e8a341c1a8 100644 --- a/eclair-rpc/src/main/scala/org/bitcoins/eclair/rpc/client/EclairRpcClient.scala +++ b/eclair-rpc/src/main/scala/org/bitcoins/eclair/rpc/client/EclairRpcClient.scala @@ -9,6 +9,7 @@ import akka.http.scaladsl.model.headers.{Authorization, BasicHttpCredentials} import akka.http.scaladsl.model.ws.{Message, TextMessage, WebSocketRequest} import akka.stream.scaladsl.{Flow, Sink, Source} import akka.util.ByteString +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.eclair._ import org.bitcoins.commons.serializers.JsonReaders._ import org.bitcoins.core.currency.{CurrencyUnit, Satoshis} @@ -30,7 +31,6 @@ import org.bitcoins.eclair.rpc.api._ import org.bitcoins.eclair.rpc.config.EclairInstance import org.bitcoins.eclair.rpc.network.NodeUri import org.bitcoins.rpc.client.common.BitcoindVersion -import org.bitcoins.rpc.util.AsyncUtil import org.slf4j.LoggerFactory import play.api.libs.json._ diff --git a/node-test/src/test/scala/org/bitcoins/node/NeutrinoNodeWithWalletTest.scala b/node-test/src/test/scala/org/bitcoins/node/NeutrinoNodeWithWalletTest.scala index 04b739c3f9..0d2d0595fb 100644 --- a/node-test/src/test/scala/org/bitcoins/node/NeutrinoNodeWithWalletTest.scala +++ b/node-test/src/test/scala/org/bitcoins/node/NeutrinoNodeWithWalletTest.scala @@ -1,12 +1,12 @@ package org.bitcoins.node +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.core.currency._ import org.bitcoins.core.protocol.script.MultiSignatureScriptPubKey import org.bitcoins.core.protocol.transaction.TransactionOutput import org.bitcoins.core.wallet.fee.SatoshisPerByte import org.bitcoins.crypto.ECPublicKey import org.bitcoins.rpc.client.common.BitcoindVersion -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.server.BitcoinSAppConfig import org.bitcoins.testkit.BitcoinSTestAppConfig import org.bitcoins.testkit.node.{ diff --git a/node-test/src/test/scala/org/bitcoins/node/SpvNodeWithWalletTest.scala b/node-test/src/test/scala/org/bitcoins/node/SpvNodeWithWalletTest.scala index 4947bc1ffd..ad56d927d6 100644 --- a/node-test/src/test/scala/org/bitcoins/node/SpvNodeWithWalletTest.scala +++ b/node-test/src/test/scala/org/bitcoins/node/SpvNodeWithWalletTest.scala @@ -1,8 +1,8 @@ package org.bitcoins.node +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.core.currency._ import org.bitcoins.crypto.DoubleSha256DigestBE -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.server.BitcoinSAppConfig import org.bitcoins.testkit.BitcoinSTestAppConfig import org.bitcoins.testkit.node.{ diff --git a/node/src/main/scala/org/bitcoins/node/Node.scala b/node/src/main/scala/org/bitcoins/node/Node.scala index f3027790cd..f6d8887e62 100644 --- a/node/src/main/scala/org/bitcoins/node/Node.scala +++ b/node/src/main/scala/org/bitcoins/node/Node.scala @@ -2,6 +2,7 @@ package org.bitcoins.node import akka.Done import akka.actor.ActorSystem +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.chain.blockchain.ChainHandlerCached import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.chain.models.{ @@ -25,7 +26,6 @@ import org.bitcoins.node.networking.peer.{ PeerMessageReceiver, PeerMessageSender } -import org.bitcoins.rpc.util.AsyncUtil import scala.concurrent.duration.DurationInt import scala.concurrent.{ExecutionContext, Future, Promise} diff --git a/node/src/main/scala/org/bitcoins/node/SpvNode.scala b/node/src/main/scala/org/bitcoins/node/SpvNode.scala index 75bf2d51a8..713e61778f 100644 --- a/node/src/main/scala/org/bitcoins/node/SpvNode.scala +++ b/node/src/main/scala/org/bitcoins/node/SpvNode.scala @@ -2,6 +2,7 @@ package org.bitcoins.node import akka.Done import akka.actor.ActorSystem +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.core.api.chain.ChainQueryApi.FilterResponse import org.bitcoins.core.bloom.BloomFilter @@ -10,7 +11,6 @@ import org.bitcoins.core.protocol.{BitcoinAddress, BlockStamp} import org.bitcoins.core.util.Mutable import org.bitcoins.node.config.NodeAppConfig import org.bitcoins.node.models.Peer -import org.bitcoins.rpc.util.AsyncUtil import scala.concurrent.{Future, Promise} diff --git a/testkit/src/main/scala/org/bitcoins/testkit/async/TestAsyncUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/async/TestAsyncUtil.scala index 1320974069..de147a526f 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/async/TestAsyncUtil.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/async/TestAsyncUtil.scala @@ -1,14 +1,12 @@ package org.bitcoins.testkit.async -import akka.actor.ActorSystem +import org.bitcoins.asyncutil.AsyncUtil import org.scalatest.exceptions.{StackDepthException, TestFailedException} import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.duration.FiniteDuration -abstract class TestAsyncUtil - extends org.bitcoins.rpc.util.AsyncUtil - with Serializable { +abstract class TestAsyncUtil extends AsyncUtil with Serializable { override protected def retryUntilSatisfiedWithCounter( conditionF: () => Future[Boolean], @@ -16,7 +14,7 @@ abstract class TestAsyncUtil counter: Int, maxTries: Int, stackTrace: Array[StackTraceElement])(implicit - system: ActorSystem): Future[Unit] = { + ec: ExecutionContext): Future[Unit] = { val retryF = super .retryUntilSatisfiedWithCounter(conditionF, duration, @@ -24,7 +22,7 @@ abstract class TestAsyncUtil maxTries, stackTrace) - TestAsyncUtil.transformRetryToTestFailure(retryF)(system.dispatcher) + TestAsyncUtil.transformRetryToTestFailure(retryF) } } diff --git a/testkit/src/main/scala/org/bitcoins/testkit/eclair/rpc/EclairRpcTestUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/eclair/rpc/EclairRpcTestUtil.scala index d44cbbbf92..afc164d0b1 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/eclair/rpc/EclairRpcTestUtil.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/eclair/rpc/EclairRpcTestUtil.scala @@ -244,6 +244,7 @@ trait EclairRpcTestUtil extends BitcoinSLogger { client: EclairApi, chanId: ChannelId, state: ChannelState)(implicit system: ActorSystem): Future[Unit] = { + import system.dispatcher logger.debug(s"Awaiting ${chanId} to enter ${state} state") def isState(): Future[Boolean] = { val chanF = client.channel(chanId) @@ -294,6 +295,7 @@ trait EclairRpcTestUtil extends BitcoinSLogger { failFast: Boolean)(implicit system: ActorSystem, tag: ClassTag[T]): Future[Unit] = { + import system.dispatcher logger.debug( s"Awaiting payment ${paymentId} to enter ${tag.runtimeClass.getName} state") @@ -336,6 +338,7 @@ trait EclairRpcTestUtil extends BitcoinSLogger { maxTries: Int = 60)(implicit system: ActorSystem, tag: ClassTag[T]): Future[Unit] = { + import system.dispatcher logger.debug( s"Awaiting payment ${paymentHash} to enter ${tag.runtimeClass.getName} state") @@ -719,22 +722,22 @@ trait EclairRpcTestUtil extends BitcoinSLogger { * Fails the future if they are not sychronized within the given timeout. */ def awaitEclairInSync(eclair: EclairRpcClient, bitcoind: BitcoindRpcClient)( - implicit - system: ActorSystem, - ec: ExecutionContext): Future[Unit] = { - - def clientInSync(client: EclairRpcClient, bitcoind: BitcoindRpcClient)( - implicit ec: ExecutionContext): Future[Boolean] = - for { - blockCount <- bitcoind.getBlockCount - info <- client.getInfo - } yield info.blockHeight == blockCount - + implicit system: ActorSystem): Future[Unit] = { + import system.dispatcher TestAsyncUtil.retryUntilSatisfiedF(conditionF = () => clientInSync(eclair, bitcoind), interval = 1.seconds) } + private def clientInSync( + client: EclairRpcClient, + bitcoind: BitcoindRpcClient)(implicit + ec: ExecutionContext): Future[Boolean] = + for { + blockCount <- bitcoind.getBlockCount + info <- client.getInfo + } yield info.blockHeight == blockCount + /** Shuts down an eclair daemon and the bitcoind daemon it is associated with */ def shutdown(eclairRpcClient: EclairRpcClient)(implicit diff --git a/testkit/src/main/scala/org/bitcoins/testkit/rpc/BitcoindRpcTestUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/rpc/BitcoindRpcTestUtil.scala index fa2d4c1218..4ccf9103c8 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/rpc/BitcoindRpcTestUtil.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/rpc/BitcoindRpcTestUtil.scala @@ -4,6 +4,7 @@ import java.io.File import java.net.URI import java.nio.file.{Files, Path} import akka.actor.ActorSystem +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.AddNodeArgument import org.bitcoins.commons.jsonmodels.bitcoind.{ GetBlockWithTransactionsResult, @@ -43,7 +44,7 @@ import org.bitcoins.rpc.config.{ BitcoindInstance, ZmqConfig } -import org.bitcoins.rpc.util.{AsyncUtil, RpcUtil} +import org.bitcoins.rpc.util.RpcUtil import org.bitcoins.testkit.util.{BitcoindRpcTestClient, FileUtil} import org.bitcoins.util.ListUtil @@ -589,6 +590,7 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger { client: BitcoindRpcClient, interval: FiniteDuration = 100.milliseconds, maxTries: Int = 50)(implicit system: ActorSystem): Future[Unit] = { + import system.dispatcher AsyncUtil.retryUntilSatisfiedF(conditionF = { () => client.isStoppedF }, interval = interval, maxTries = maxTries) diff --git a/testkit/src/main/scala/org/bitcoins/testkit/util/BitcoinSAsyncTest.scala b/testkit/src/main/scala/org/bitcoins/testkit/util/BitcoinSAsyncTest.scala index 219a41b343..9e8308016c 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/util/BitcoinSAsyncTest.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/util/BitcoinSAsyncTest.scala @@ -3,10 +3,10 @@ package org.bitcoins.testkit.util import akka.actor.ActorSystem import akka.testkit.TestKit import akka.util.Timeout +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.core.config.{NetworkParameters, RegTest} import org.bitcoins.core.protocol.blockchain.ChainParams import org.bitcoins.core.util.BitcoinSLogger -import org.bitcoins.rpc.util.AsyncUtil import org.scalacheck.{Gen, Shrink} import org.scalactic.anyvals.PosInt import org.scalatest._ diff --git a/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala b/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala index f55c1e310b..3d78c016c3 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/wallet/BitcoinSWalletTest.scala @@ -2,6 +2,7 @@ package org.bitcoins.testkit.wallet import akka.actor.ActorSystem import com.typesafe.config.{Config, ConfigFactory} +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.core.api.chain.ChainQueryApi import org.bitcoins.core.api.chain.ChainQueryApi.FilterResponse import org.bitcoins.core.api.feeprovider.FeeRateApi @@ -23,7 +24,6 @@ import org.bitcoins.node.{ } import org.bitcoins.rpc.client.common.{BitcoindRpcClient, BitcoindVersion} import org.bitcoins.rpc.client.v19.BitcoindV19RpcClient -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.server.BitcoinSAppConfig import org.bitcoins.server.BitcoinSAppConfig._ import org.bitcoins.testkit.Implicits.GeneratorOps @@ -736,7 +736,7 @@ object BitcoinSWalletTest extends WalletLogger { system: ActorSystem): Future[Unit] = { AsyncUtil.retryUntilSatisfiedF(conditionF = () => isSameWalletBalances(fundedWallet), - interval = 1.seconds) + interval = 1.seconds)(system.dispatcher) } private def isSameWalletBalances(fundedWallet: WalletWithBitcoind)(implicit diff --git a/wallet-test/src/test/scala/org/bitcoins/wallet/AddressHandlingTest.scala b/wallet-test/src/test/scala/org/bitcoins/wallet/AddressHandlingTest.scala index eae9ff2be1..296ba710f3 100644 --- a/wallet-test/src/test/scala/org/bitcoins/wallet/AddressHandlingTest.scala +++ b/wallet-test/src/test/scala/org/bitcoins/wallet/AddressHandlingTest.scala @@ -1,5 +1,6 @@ package org.bitcoins.wallet +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.core.currency.{Bitcoins, Satoshis} import org.bitcoins.core.protocol.script.EmptyScriptPubKey import org.bitcoins.core.protocol.transaction.TransactionOutput @@ -9,7 +10,6 @@ import org.bitcoins.core.wallet.utxo.{ AddressLabelTagType, StorageLocationTagType } -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.testkit.wallet.FundWalletUtil.FundedWallet import org.bitcoins.testkit.wallet.{BitcoinSWalletTest, WalletTestUtil} import org.scalatest.FutureOutcome diff --git a/wallet-test/src/test/scala/org/bitcoins/wallet/BitcoindBlockPollingTest.scala b/wallet-test/src/test/scala/org/bitcoins/wallet/BitcoindBlockPollingTest.scala index a78a810c12..078faaf66b 100644 --- a/wallet-test/src/test/scala/org/bitcoins/wallet/BitcoindBlockPollingTest.scala +++ b/wallet-test/src/test/scala/org/bitcoins/wallet/BitcoindBlockPollingTest.scala @@ -1,8 +1,8 @@ package org.bitcoins.wallet +import org.bitcoins.asyncutil.AsyncUtil import org.bitcoins.core.currency._ import org.bitcoins.db.AppConfig -import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.server.{BitcoinSAppConfig, BitcoindRpcBackendUtil} import org.bitcoins.testkit.fixtures.BitcoinSFixture import org.bitcoins.testkit.util.BitcoinSAsyncTest