testkit refactor (rename and repackage) (#355)

* Refactored testkit to have a package called testkit and renamed AsyncUtil and TestUtil, ran scalafmt

* Updated internal file names list
This commit is contained in:
Nadav Kohen 2019-02-21 10:04:31 -06:00 committed by Chris Stewart
parent 0e9e021ad7
commit a0c1ab91b4
84 changed files with 321 additions and 282 deletions

View file

@ -7,6 +7,7 @@ import akka.testkit.TestKit
import org.bitcoins.core.currency.Bitcoins import org.bitcoins.core.currency.Bitcoins
import org.bitcoins.rpc.client.BitcoindRpcClient import org.bitcoins.rpc.client.BitcoindRpcClient
import org.bitcoins.rpc.config.BitcoindInstance import org.bitcoins.rpc.config.BitcoindInstance
import org.bitcoins.testkit.rpc.{BitcoindRpcTestUtil, TestRpcUtil}
import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll} import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll}
import scala.concurrent.Future import scala.concurrent.Future
@ -43,7 +44,7 @@ class BitcoindInstanceTest extends AsyncFlatSpec with BeforeAndAfterAll {
val instance = BitcoindInstance.fromDatadir(datadir.toFile) val instance = BitcoindInstance.fromDatadir(datadir.toFile)
val client = new BitcoindRpcClient(instance) val client = new BitcoindRpcClient(instance)
BitcoindRpcTestUtil.startServers(Vector(client)) BitcoindRpcTestUtil.startServers(Vector(client))
RpcUtil.awaitServer(client) TestRpcUtil.awaitServer(client)
for { for {
_ <- client.generate(101) _ <- client.generate(101)
@ -52,7 +53,7 @@ class BitcoindInstanceTest extends AsyncFlatSpec with BeforeAndAfterAll {
assert(balance > Bitcoins(0)) assert(balance > Bitcoins(0))
client.stop() client.stop()
} }
_ <- Future.successful(RpcUtil.awaitServerShutdown(client)) _ <- Future.successful(TestRpcUtil.awaitServerShutdown(client))
} yield succeed } yield succeed
} }

View file

@ -5,6 +5,7 @@ import java.io.File
import akka.actor.ActorSystem import akka.actor.ActorSystem
import akka.stream.ActorMaterializer import akka.stream.ActorMaterializer
import org.bitcoins.rpc.client.BitcoindRpcClient import org.bitcoins.rpc.client.BitcoindRpcClient
import org.bitcoins.testkit.rpc.{BitcoindRpcTestUtil, TestRpcUtil}
import org.scalatest.exceptions.TestFailedException import org.scalatest.exceptions.TestFailedException
import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll} import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll}
@ -12,7 +13,7 @@ import scala.concurrent.duration.DurationInt
import scala.concurrent.{Await, Future} import scala.concurrent.{Await, Future}
import scala.util.Success import scala.util.Success
class RpcUtilTest extends AsyncFlatSpec with BeforeAndAfterAll { class TestRpcUtilTest extends AsyncFlatSpec with BeforeAndAfterAll {
implicit val system = ActorSystem("RpcUtilTest_ActorSystem") implicit val system = ActorSystem("RpcUtilTest_ActorSystem")
implicit val ec = system.dispatcher implicit val ec = system.dispatcher
@ -33,10 +34,10 @@ class RpcUtilTest extends AsyncFlatSpec with BeforeAndAfterAll {
boolLaterDoneAnd(true, trueLater) boolLaterDoneAnd(true, trueLater)
} }
behavior of "RpcUtil" behavior of "TestRpcUtil"
it should "complete immediately if condition is true" in { it should "complete immediately if condition is true" in {
RpcUtil TestRpcUtil
.retryUntilSatisfiedF(conditionF = () => Future.successful(true), .retryUntilSatisfiedF(conditionF = () => Future.successful(true),
duration = 0.millis) duration = 0.millis)
.map { _ => .map { _ =>
@ -46,14 +47,15 @@ class RpcUtilTest extends AsyncFlatSpec with BeforeAndAfterAll {
it should "fail if condition is false" in { it should "fail if condition is false" in {
recoverToSucceededIf[TestFailedException] { recoverToSucceededIf[TestFailedException] {
RpcUtil.retryUntilSatisfiedF(conditionF = () => Future.successful(false), TestRpcUtil.retryUntilSatisfiedF(conditionF =
duration = 0.millis) () => Future.successful(false),
duration = 0.millis)
} }
} }
it should "succeed after a delay" in { it should "succeed after a delay" in {
val boolLater = trueLater(delay = 250) val boolLater = trueLater(delay = 250)
RpcUtil.retryUntilSatisfiedF(boolLaterDoneAndTrue(boolLater)).map { _ => TestRpcUtil.retryUntilSatisfiedF(boolLaterDoneAndTrue(boolLater)).map { _ =>
succeed succeed
} }
} }
@ -61,26 +63,26 @@ class RpcUtilTest extends AsyncFlatSpec with BeforeAndAfterAll {
it should "fail if there is a delay and duration is zero" in { it should "fail if there is a delay and duration is zero" in {
val boolLater = trueLater(delay = 250) val boolLater = trueLater(delay = 250)
recoverToSucceededIf[TestFailedException] { recoverToSucceededIf[TestFailedException] {
RpcUtil.retryUntilSatisfiedF(boolLaterDoneAndTrue(boolLater), TestRpcUtil.retryUntilSatisfiedF(boolLaterDoneAndTrue(boolLater),
duration = 0.millis) duration = 0.millis)
} }
} }
it should "succeed immediately if condition is true" in { it should "succeed immediately if condition is true" in {
RpcUtil.awaitCondition(condition = () => true, 0.millis) TestRpcUtil.awaitCondition(condition = () => true, 0.millis)
succeed succeed
} }
it should "timeout if condition is false" in { it should "timeout if condition is false" in {
assertThrows[TestFailedException] { assertThrows[TestFailedException] {
RpcUtil.awaitCondition(condition = () => false, duration = 0.millis) TestRpcUtil.awaitCondition(condition = () => false, duration = 0.millis)
} }
} }
it should "block for a delay and then succeed" in { it should "block for a delay and then succeed" in {
val boolLater = trueLater(delay = 250) val boolLater = trueLater(delay = 250)
val before: Long = System.currentTimeMillis val before: Long = System.currentTimeMillis
RpcUtil.awaitConditionF(boolLaterDoneAndTrue(boolLater)) TestRpcUtil.awaitConditionF(boolLaterDoneAndTrue(boolLater))
val after: Long = System.currentTimeMillis val after: Long = System.currentTimeMillis
assert(after - before >= 250) assert(after - before >= 250)
} }
@ -88,8 +90,8 @@ class RpcUtilTest extends AsyncFlatSpec with BeforeAndAfterAll {
it should "timeout if there is a delay and duration is zero" in { it should "timeout if there is a delay and duration is zero" in {
val boolLater = trueLater(delay = 250) val boolLater = trueLater(delay = 250)
assertThrows[TestFailedException] { assertThrows[TestFailedException] {
RpcUtil.awaitConditionF(boolLaterDoneAndTrue(boolLater), TestRpcUtil.awaitConditionF(boolLaterDoneAndTrue(boolLater),
duration = 0.millis) duration = 0.millis)
} }
} }

View file

@ -50,17 +50,22 @@ abstract class AsyncUtil extends BitcoinSLogger {
message: String, message: String,
caller: Array[StackTraceElement]) caller: Array[StackTraceElement])
extends Exception(message) { extends Exception(message) {
/* /*
Someone who calls a method in this class will be interested Someone who calls a method in this class will be interested
* in where the call was made (and the stack trace from there * in where the call was made (and the stack trace from there
* backwards) and what happens between their call and the failure, * backwards) and what happens between their call and the failure,
* i.e. the internal calls of this class, are not of interest. * i.e. the internal calls of this class, are not of interest.
* *
* This trims the top of the stack trace to exclude these internal calls. * This trims the top of the stack trace to exclude these internal calls.
*/ */
private val relevantStackTrace = caller.tail val internalFiles: Vector[String] = Vector("AsyncUtil.scala",
.dropWhile(elem => elem.getFileName == "AsyncUtil.scala" "RpcUtil.scala",
|| elem.getFileName == "RpcUtil.scala") "TestAsyncUtil.scala",
"TestRpcUtil.scala")
private val relevantStackTrace =
caller.tail.dropWhile(elem => internalFiles.contains(elem.getFileName))
this.setStackTrace(relevantStackTrace) this.setStackTrace(relevantStackTrace)
} }

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.crypto package org.bitcoins.core.crypto
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.bitcoins.core.util.BitcoinSUnitTest import org.bitcoins.core.util.BitcoinSUnitTest
import scodec.bits.ByteVector import scodec.bits.ByteVector

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.crypto package org.bitcoins.core.crypto
import org.bitcoinj.core.Sha256Hash import org.bitcoinj.core.Sha256Hash
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.scalatest.prop.PropertyChecks import org.scalatest.prop.PropertyChecks
import org.scalatest.{FlatSpec, MustMatchers} import org.scalatest.{FlatSpec, MustMatchers}
import scodec.bits.ByteVector import scodec.bits.ByteVector

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.crypto package org.bitcoins.core.crypto
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.bitcoins.core.number.UInt32 import org.bitcoins.core.number.UInt32
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Gen, Prop, Properties} import org.scalacheck.{Gen, Prop, Properties}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.crypto package org.bitcoins.core.crypto
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.bitcoins.core.util.BitcoinSUnitTest import org.bitcoins.core.util.BitcoinSUnitTest
import scodec.bits.ByteVector import scodec.bits.ByteVector

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.crypto package org.bitcoins.core.crypto
import org.bitcoins.core.gen.TransactionGenerators import org.bitcoins.testkit.core.gen.TransactionGenerators
import org.bitcoins.core.script.PreExecutionScriptProgram import org.bitcoins.core.script.PreExecutionScriptProgram
import org.bitcoins.core.script.interpreter.ScriptInterpreter import org.bitcoins.core.script.interpreter.ScriptInterpreter
import org.bitcoins.core.script.result._ import org.bitcoins.core.script.result._

View file

@ -1,5 +1,5 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.util.BitcoinSUnitTest import org.bitcoins.core.util.BitcoinSUnitTest
import org.scalatest.prop.PropertyChecks import org.scalatest.prop.PropertyChecks

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
import scala.util.Try import scala.util.Try

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
import scala.util.Try import scala.util.Try

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Gen, Prop, Properties} import org.scalacheck.{Gen, Prop, Properties}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.scalatest.prop.PropertyChecks import org.scalatest.prop.PropertyChecks
import org.scalatest.{FlatSpec, MustMatchers} import org.scalatest.{FlatSpec, MustMatchers}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
import scala.util.Try import scala.util.Try

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.number package org.bitcoins.core.number
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Gen, Prop, Properties} import org.scalacheck.{Gen, Prop, Properties}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol package org.bitcoins.core.protocol
import org.bitcoins.core.gen.{ import org.bitcoins.testkit.core.gen.{
AddressGenerator, AddressGenerator,
ChainParamsGenerator, ChainParamsGenerator,
ScriptGenerators ScriptGenerators

View file

@ -2,7 +2,7 @@ package org.bitcoins.core.protocol
import org.bitcoins.core.config.{MainNet, TestNet3} import org.bitcoins.core.config.{MainNet, TestNet3}
import org.bitcoins.core.crypto.ECPublicKey import org.bitcoins.core.crypto.ECPublicKey
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.number.{UInt5, UInt8} import org.bitcoins.core.number.{UInt5, UInt8}
import org.bitcoins.core.protocol.script._ import org.bitcoins.core.protocol.script._
import org.bitcoins.core.util.{Bech32, BitcoinSUnitTest} import org.bitcoins.core.util.{Bech32, BitcoinSUnitTest}
@ -135,7 +135,6 @@ class Bech32Test extends BitcoinSUnitTest {
Seq(31, 31, 31, 31, 31, 31, 31, 31, 31, 28).map(i => UInt5(i.toByte))) Seq(31, 31, 31, 31, 31, 31, 31, 31, 31, 28).map(i => UInt5(i.toByte)))
} }
it must "encode from 8 bit to 5 bit and back" in { it must "encode from 8 bit to 5 bit and back" in {
forAll(NumberGenerator.uInt8s) { u8s => forAll(NumberGenerator.uInt8s) { u8s =>
val u5s = Bech32.from8bitTo5bit(u8s.toVector) val u5s = Bech32.from8bitTo5bit(u8s.toVector)

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.protocol package org.bitcoins.core.protocol
import org.bitcoins.core.config.TestNet3 import org.bitcoins.core.config.TestNet3
import org.bitcoins.core.gen.{ import org.bitcoins.testkit.core.gen.{
AddressGenerator, AddressGenerator,
CryptoGenerators, CryptoGenerators,
ScriptGenerators ScriptGenerators

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol package org.bitcoins.core.protocol
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.blockchain package org.bitcoins.core.protocol.blockchain
import org.bitcoins.core.gen.BlockchainElementsGenerator import org.bitcoins.testkit.core.gen.BlockchainElementsGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.protocol.blockchain package org.bitcoins.core.protocol.blockchain
import org.bitcoins.core.crypto.DoubleSha256Digest import org.bitcoins.core.crypto.DoubleSha256Digest
import org.bitcoins.core.gen.MerkleGenerator import org.bitcoins.testkit.core.gen.MerkleGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.protocol.blockchain package org.bitcoins.core.protocol.blockchain
import org.bitcoins.core.crypto.DoubleSha256Digest import org.bitcoins.core.crypto.DoubleSha256Digest
import org.bitcoins.core.gen.MerkleGenerator import org.bitcoins.testkit.core.gen.MerkleGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,25 +1,23 @@
package org.bitcoins.core.protocol.ln package org.bitcoins.core.protocol.ln
import org.bitcoins.core.crypto.ECPrivateKey import org.bitcoins.core.crypto.ECPrivateKey
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.bitcoins.core.gen.ln.LnInvoiceGen import org.bitcoins.testkit.core.gen.ln.LnInvoiceGen
import org.bitcoins.core.util.BitcoinSUnitTest import org.bitcoins.core.util.BitcoinSUnitTest
class LnInvoiceSignatureTest extends BitcoinSUnitTest { class LnInvoiceSignatureTest extends BitcoinSUnitTest {
override implicit val generatorDrivenConfig: PropertyCheckConfiguration = generatorDrivenConfigNewCode override implicit val generatorDrivenConfig: PropertyCheckConfiguration =
generatorDrivenConfigNewCode
behavior of "LnInvoiceSignature" behavior of "LnInvoiceSignature"
it must "have serialization symmetry for raw r,s,recovId" in { it must "have serialization symmetry for raw r,s,recovId" in {
forAll(CryptoGenerators.digitalSignature, LnInvoiceGen.signatureVersion) { forAll(CryptoGenerators.digitalSignature, LnInvoiceGen.signatureVersion) {
case (ecSig, recovId) => case (ecSig, recovId) =>
val lnSig = LnInvoiceSignature.fromRS(r = ecSig.r.bigInteger,
val lnSig = LnInvoiceSignature.fromRS( s = ecSig.s.bigInteger,
r = ecSig.r.bigInteger, recovId = recovId)
s = ecSig.s.bigInteger,
recovId = recovId)
val serialized = lnSig.hex val serialized = lnSig.hex
@ -33,29 +31,31 @@ class LnInvoiceSignatureTest extends BitcoinSUnitTest {
} }
it must "have serialization symmetry" in { it must "have serialization symmetry" in {
forAll(LnInvoiceGen.lnInvoiceSignature) { case sig => forAll(LnInvoiceGen.lnInvoiceSignature) {
assert(LnInvoiceSignature.fromHex(sig.hex) == sig) case sig =>
assert(LnInvoiceSignature.fromHex(sig.hex) == sig)
} }
} }
it must "be able to generate signatures, and then verify those signatures" in { it must "be able to generate signatures, and then verify those signatures" in {
val gen = LnInvoiceGen val gen = LnInvoiceGen
forAll(gen.lnHrp, gen.taggedFields(None), gen.invoiceTimestamp) { case (hrp,tags,timestamp) => forAll(gen.lnHrp, gen.taggedFields(None), gen.invoiceTimestamp) {
val key = ECPrivateKey.freshPrivateKey case (hrp, tags, timestamp) =>
val signature = LnInvoice.buildLnInvoiceSignature( val key = ECPrivateKey.freshPrivateKey
val signature = LnInvoice.buildLnInvoiceSignature(
hrp = hrp, hrp = hrp,
timestamp = timestamp, timestamp = timestamp,
lnTags = tags, lnTags = tags,
privateKey = key privateKey = key
) )
val hash = LnInvoice.buildSigHashData( val hash = LnInvoice.buildSigHashData(
hrp = hrp, hrp = hrp,
timestamp = timestamp, timestamp = timestamp,
lnTags = tags lnTags = tags
) )
assert(key.publicKey.verify(hash,signature.signature)) assert(key.publicKey.verify(hash, signature.signature))
} }
} }
} }

View file

@ -1,11 +1,21 @@
package org.bitcoins.core.protocol.ln package org.bitcoins.core.protocol.ln
import org.bitcoins.core.crypto._ import org.bitcoins.core.crypto._
import org.bitcoins.core.gen.ln.LnInvoiceGen import org.bitcoins.testkit.core.gen.ln.LnInvoiceGen
import org.bitcoins.core.number.{UInt32, UInt64, UInt8} import org.bitcoins.core.number.{UInt32, UInt64, UInt8}
import org.bitcoins.core.protocol.ln.LnParams.{LnBitcoinMainNet, LnBitcoinTestNet} import org.bitcoins.core.protocol.ln.LnParams.{
import org.bitcoins.core.protocol.ln.currency.{MicroBitcoins, MilliBitcoins, MilliSatoshis} LnBitcoinMainNet,
import org.bitcoins.core.protocol.ln.fee.{FeeBaseMSat, FeeProportionalMillionths} LnBitcoinTestNet
}
import org.bitcoins.core.protocol.ln.currency.{
MicroBitcoins,
MilliBitcoins,
MilliSatoshis
}
import org.bitcoins.core.protocol.ln.fee.{
FeeBaseMSat,
FeeProportionalMillionths
}
import org.bitcoins.core.protocol.ln.routing.LnRoute import org.bitcoins.core.protocol.ln.routing.LnRoute
import org.bitcoins.core.protocol.{Bech32Address, P2PKHAddress, P2SHAddress} import org.bitcoins.core.protocol.{Bech32Address, P2PKHAddress, P2SHAddress}
import org.bitcoins.core.util.{BitcoinSUnitTest, CryptoUtil} import org.bitcoins.core.util.{BitcoinSUnitTest, CryptoUtil}
@ -14,7 +24,8 @@ import scodec.bits.ByteVector
class LnInvoiceUnitTest extends BitcoinSUnitTest { class LnInvoiceUnitTest extends BitcoinSUnitTest {
behavior of "LnInvoice" behavior of "LnInvoice"
override implicit val generatorDrivenConfig: PropertyCheckConfiguration = generatorDrivenConfigNewCode override implicit val generatorDrivenConfig: PropertyCheckConfiguration =
generatorDrivenConfigNewCode
val hrpEmpty = LnHumanReadablePart(LnBitcoinMainNet) val hrpEmpty = LnHumanReadablePart(LnBitcoinMainNet)
@ -368,7 +379,6 @@ class LnInvoiceUnitTest extends BitcoinSUnitTest {
it must "have serialization symmetry for the invoices" in { it must "have serialization symmetry for the invoices" in {
forAll(LnInvoiceGen.lnInvoice) { invoice => forAll(LnInvoiceGen.lnInvoice) { invoice =>
LnInvoice.fromString(invoice.toString).get == invoice LnInvoice.fromString(invoice.toString).get == invoice
} }

View file

@ -1,19 +1,20 @@
package org.bitcoins.core.protocol.ln package org.bitcoins.core.protocol.ln
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.number.{UInt5, UInt64} import org.bitcoins.core.number.{UInt5, UInt64}
import org.bitcoins.core.protocol.ln.util.LnUtil import org.bitcoins.core.protocol.ln.util.LnUtil
import org.bitcoins.core.util.BitcoinSUnitTest import org.bitcoins.core.util.BitcoinSUnitTest
class LnUtilTest extends BitcoinSUnitTest { class LnUtilTest extends BitcoinSUnitTest {
override implicit val generatorDrivenConfig: PropertyCheckConfiguration = generatorDrivenConfigNewCode override implicit val generatorDrivenConfig: PropertyCheckConfiguration =
generatorDrivenConfigNewCode
behavior of "LnUtil" behavior of "LnUtil"
it must "encode / decode a number correctly to bech32" in { it must "encode / decode a number correctly to bech32" in {
forAll(NumberGenerator.uInt64) { case u64: UInt64 => forAll(NumberGenerator.uInt64) {
case u64: UInt64 =>
val encoded = LnUtil.encodeNumber(u64.toBigInt) val encoded = LnUtil.encodeNumber(u64.toBigInt)
val decoded = LnUtil.decodeNumber(encoded) val decoded = LnUtil.decodeNumber(encoded)
@ -21,16 +22,15 @@ class LnUtilTest extends BitcoinSUnitTest {
} }
} }
it must "encode the data length correctly for empty payload" in { it must "encode the data length correctly for empty payload" in {
val empty = LnUtil.createDataLength(List.empty) val empty = LnUtil.createDataLength(List.empty)
empty must be (List(UInt5.zero, UInt5.zero)) empty must be(List(UInt5.zero, UInt5.zero))
} }
it must "encode the property data length for an arbitrary payload" in { it must "encode the property data length for an arbitrary payload" in {
forAll(NumberGenerator.uInt5s) { case u5s => forAll(NumberGenerator.uInt5s) {
case u5s =>
val dataLen = LnUtil.createDataLength(u5s.toList) val dataLen = LnUtil.createDataLength(u5s.toList)
val decodedDataLen = LnUtil.decodeDataLength(dataLen) val decodedDataLen = LnUtil.decodeDataLength(dataLen)

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.protocol.ln.currency package org.bitcoins.core.protocol.ln.currency
import org.bitcoins.core.gen.{CurrencyUnitGenerator, NumberGenerator} import org.bitcoins.testkit.core.gen.{CurrencyUnitGenerator, NumberGenerator}
import org.bitcoins.core.gen.ln.LnCurrencyUnitGen import org.bitcoins.testkit.core.gen.ln.LnCurrencyUnitGen
import org.bitcoins.core.util.BitcoinSUnitTest import org.bitcoins.core.util.BitcoinSUnitTest
import org.scalatest.prop.PropertyChecks import org.scalatest.prop.PropertyChecks

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.{CryptoGenerators, ScriptGenerators} import org.bitcoins.testkit.core.gen.{CryptoGenerators, ScriptGenerators}
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.scalatest.{FlatSpec, MustMatchers} import org.scalatest.{FlatSpec, MustMatchers}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.bitcoins.core.script.bitwise.OP_EQUALVERIFY import org.bitcoins.core.script.bitwise.OP_EQUALVERIFY
import org.bitcoins.core.script.constant._ import org.bitcoins.core.script.constant._
import org.bitcoins.core.script.crypto.{OP_CHECKSIG, OP_HASH160} import org.bitcoins.core.script.crypto.{OP_CHECKSIG, OP_HASH160}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
class ScriptSpec extends Properties("ScriptSpec") { class ScriptSpec extends Properties("ScriptSpec") {

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.{ScriptGenerators, WitnessGenerators} import org.bitcoins.testkit.core.gen.{ScriptGenerators, WitnessGenerators}
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.script package org.bitcoins.core.protocol.script
import org.bitcoins.core.gen.ScriptGenerators import org.bitcoins.testkit.core.gen.ScriptGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.transaction package org.bitcoins.core.protocol.transaction
import org.bitcoins.core.gen.TransactionGenerators import org.bitcoins.testkit.core.gen.TransactionGenerators
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.transaction package org.bitcoins.core.protocol.transaction
import org.bitcoins.core.gen.TransactionGenerators import org.bitcoins.testkit.core.gen.TransactionGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.protocol.transaction package org.bitcoins.core.protocol.transaction
import org.bitcoins.core.gen.TransactionGenerators import org.bitcoins.testkit.core.gen.TransactionGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.protocol.transaction package org.bitcoins.core.protocol.transaction
import org.bitcoins.core.crypto.{ECPrivateKey, EmptyDigitalSignature} import org.bitcoins.core.crypto.{ECPrivateKey, EmptyDigitalSignature}
import org.bitcoins.core.gen.WitnessGenerators import org.bitcoins.testkit.core.gen.WitnessGenerators
import org.bitcoins.core.protocol.script._ import org.bitcoins.core.protocol.script._
import org.scalacheck.Prop import org.scalacheck.Prop
import org.scalatest.{FlatSpec, MustMatchers} import org.scalatest.{FlatSpec, MustMatchers}

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.script.constant package org.bitcoins.core.script.constant
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.script.crypto package org.bitcoins.core.script.crypto
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.serializers package org.bitcoins.core.serializers
import org.bitcoins.core.currency.Satoshis import org.bitcoins.core.currency.Satoshis
import org.bitcoins.core.gen.CurrencyUnitGenerator import org.bitcoins.testkit.core.gen.CurrencyUnitGenerator
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.serializers package org.bitcoins.core.serializers
import org.bitcoins.core.gen.TransactionGenerators import org.bitcoins.testkit.core.gen.TransactionGenerators
import org.bitcoins.core.protocol.transaction.TransactionOutput import org.bitcoins.core.protocol.transaction.TransactionOutput
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
import scodec.bits.ByteVector import scodec.bits.ByteVector

View file

@ -4,7 +4,11 @@ import org.bitcoins.core.script.arithmetic.OP_1ADD
import org.bitcoins.core.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY} import org.bitcoins.core.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY}
import org.bitcoins.core.script.constant._ import org.bitcoins.core.script.constant._
import org.bitcoins.core.script.control.{OP_ELSE, OP_ENDIF, OP_IF, OP_NOTIF} import org.bitcoins.core.script.control.{OP_ELSE, OP_ENDIF, OP_IF, OP_NOTIF}
import org.bitcoins.core.script.crypto.{OP_CHECKMULTISIG, OP_CHECKSIG, OP_HASH160} import org.bitcoins.core.script.crypto.{
OP_CHECKMULTISIG,
OP_CHECKSIG,
OP_HASH160
}
import org.bitcoins.core.script.locktime.OP_CHECKLOCKTIMEVERIFY import org.bitcoins.core.script.locktime.OP_CHECKLOCKTIMEVERIFY
import org.bitcoins.core.script.reserved.OP_NOP import org.bitcoins.core.script.reserved.OP_NOP
import org.bitcoins.core.script.splice.OP_SIZE import org.bitcoins.core.script.splice.OP_SIZE
@ -267,7 +271,8 @@ class ScriptParserTest extends FlatSpec with MustMatchers {
it must "parse a offered htlc" in { it must "parse a offered htlc" in {
//https://github.com/lightningnetwork/lightning-rfc/blob/master/03-transactions.md#offered-htlc-outputs //https://github.com/lightningnetwork/lightning-rfc/blob/master/03-transactions.md#offered-htlc-outputs
val witScriptHex = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac6868" val witScriptHex =
"76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac6868"
val asm = ScriptParser.fromHex(witScriptHex) val asm = ScriptParser.fromHex(witScriptHex)
/** /**
@ -287,41 +292,45 @@ class ScriptParserTest extends FlatSpec with MustMatchers {
* OP_ENDIF * OP_ENDIF
* OP_ENDIF * OP_ENDIF
*/ */
val expectedAsm = List(
OP_DUP,
OP_HASH160,
BytesToPushOntoStack(20),
ScriptConstant(
ByteVector.fromValidHex("14011f7254d96b819c76986c277d115efce6f7b5")),
OP_EQUAL,
OP_IF,
OP_CHECKSIG,
OP_ELSE,
BytesToPushOntoStack(33),
ScriptConstant(ByteVector.fromValidHex(
"0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b")),
OP_SWAP,
OP_SIZE,
BytesToPushOntoStack(1),
ScriptConstant.fromHex("20"),
OP_EQUAL,
OP_NOTIF,
OP_DROP,
OP_2,
OP_SWAP,
BytesToPushOntoStack(33),
ScriptConstant(ByteVector.fromValidHex(
"030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e7")),
OP_2,
OP_CHECKMULTISIG,
OP_ELSE,
OP_HASH160,
BytesToPushOntoStack(20),
ScriptConstant(
ByteVector.fromValidHex("b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d1")),
OP_EQUALVERIFY,
OP_CHECKSIG,
OP_ENDIF,
OP_ENDIF
)
val expectedAsm = List(OP_DUP, asm must be(expectedAsm)
OP_HASH160,
BytesToPushOntoStack(20),
ScriptConstant(ByteVector.fromValidHex("14011f7254d96b819c76986c277d115efce6f7b5")),
OP_EQUAL,
OP_IF,
OP_CHECKSIG,
OP_ELSE,
BytesToPushOntoStack(33),
ScriptConstant(ByteVector.fromValidHex("0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b")),
OP_SWAP,
OP_SIZE,
BytesToPushOntoStack(1),
ScriptConstant.fromHex("20"),
OP_EQUAL,
OP_NOTIF,
OP_DROP,
OP_2,
OP_SWAP,
BytesToPushOntoStack(33),
ScriptConstant(ByteVector.fromValidHex("030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e7")),
OP_2,
OP_CHECKMULTISIG,
OP_ELSE,
OP_HASH160,
BytesToPushOntoStack(20),
ScriptConstant(ByteVector.fromValidHex("b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d1")),
OP_EQUALVERIFY,
OP_CHECKSIG,
OP_ENDIF,
OP_ENDIF)
asm must be (expectedAsm)
} }
@ -345,53 +354,56 @@ class ScriptParserTest extends FlatSpec with MustMatchers {
* OP_ENDIF * OP_ENDIF
* OP_ENDIF * OP_ENDIF
*/ */
val witScriptHex = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc688527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502f401b175ac6868" val witScriptHex =
"76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc688527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502f401b175ac6868"
val asm = ScriptParser.fromHex(witScriptHex) val asm = ScriptParser.fromHex(witScriptHex)
val expectedAsm = { val expectedAsm = {
List( List(
OP_DUP, OP_DUP,
OP_HASH160, OP_HASH160,
BytesToPushOntoStack(20), BytesToPushOntoStack(20),
ScriptConstant(ByteVector.fromValidHex("14011f7254d96b819c76986c277d115efce6f7b5")), ScriptConstant(
OP_EQUAL, ByteVector.fromValidHex("14011f7254d96b819c76986c277d115efce6f7b5")),
OP_IF, OP_EQUAL,
OP_CHECKSIG, OP_IF,
OP_ELSE, OP_CHECKSIG,
BytesToPushOntoStack(33), OP_ELSE,
ScriptConstant(ByteVector.fromValidHex("0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b")), BytesToPushOntoStack(33),
OP_SWAP, ScriptConstant(ByteVector.fromValidHex(
OP_SIZE, "0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b")),
BytesToPushOntoStack(1), OP_SWAP,
ScriptConstant(ByteVector.fromValidHex("20")), OP_SIZE,
OP_EQUAL, BytesToPushOntoStack(1),
OP_IF, ScriptConstant(ByteVector.fromValidHex("20")),
OP_HASH160, OP_EQUAL,
BytesToPushOntoStack(20), OP_IF,
ScriptConstant(ByteVector.fromValidHex("b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc6")), OP_HASH160,
OP_EQUALVERIFY, BytesToPushOntoStack(20),
OP_2, ScriptConstant(
OP_SWAP, ByteVector.fromValidHex("b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc6")),
BytesToPushOntoStack(33), OP_EQUALVERIFY,
ScriptConstant(ByteVector.fromValidHex("030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e7")), OP_2,
OP_2, OP_SWAP,
OP_CHECKMULTISIG, BytesToPushOntoStack(33),
OP_ELSE, ScriptConstant(ByteVector.fromValidHex(
OP_DROP, "030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e7")),
BytesToPushOntoStack(2), OP_2,
ScriptConstant(ByteVector.fromValidHex("f401")), OP_CHECKMULTISIG,
OP_CHECKLOCKTIMEVERIFY, OP_ELSE,
OP_DROP, OP_DROP,
OP_CHECKSIG, BytesToPushOntoStack(2),
OP_ENDIF, ScriptConstant(ByteVector.fromValidHex("f401")),
OP_ENDIF OP_CHECKLOCKTIMEVERIFY,
OP_DROP,
OP_CHECKSIG,
OP_ENDIF,
OP_ENDIF
) )
} }
asm must be (expectedAsm) asm must be(expectedAsm)
} }
} }

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.util package org.bitcoins.core.util
import org.bitcoins.core.gen.StringGenerators import org.bitcoins.testkit.core.gen.StringGenerators
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}
/** /**

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.util package org.bitcoins.core.util
import org.bitcoins.core.gen.CryptoGenerators import org.bitcoins.testkit.core.gen.CryptoGenerators
import org.scalatest.prop.{Configuration, PropertyChecks} import org.scalatest.prop.{Configuration, PropertyChecks}
import org.scalatest.{FlatSpec, MustMatchers} import org.scalatest.{FlatSpec, MustMatchers}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.util package org.bitcoins.core.util
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.number.UInt8 import org.bitcoins.core.number.UInt8
import org.scalacheck.{Prop, Properties} import org.scalacheck.{Prop, Properties}

View file

@ -62,11 +62,12 @@ sealed abstract class ECDigitalSignature extends BitcoinSLogger {
decodeSignature._2 decodeSignature._2
} }
def sBytes:ByteVector = { def sBytes: ByteVector = {
val bytes = s.bigInteger.toByteArray.takeRight(32) val bytes = s.bigInteger.toByteArray.takeRight(32)
val padded = ByteVector(bytes).padLeft(32) val padded = ByteVector(bytes).padLeft(32)
padded padded
} }
/** /**
* Creates a ByteVector with only * Creates a ByteVector with only
* the 32byte r value and 32 byte s value * the 32byte r value and 32 byte s value
@ -151,8 +152,8 @@ object ECDigitalSignature extends Factory[ECDigitalSignature] {
require( require(
byteVector.length == 64, byteVector.length == 64,
s"Incorrect size for reading a ECDigital signature from a bytevec, got ${byteVector.length}") s"Incorrect size for reading a ECDigital signature from a bytevec, got ${byteVector.length}")
val r = BigInt(1,byteVector.take(32).toArray) val r = BigInt(1, byteVector.take(32).toArray)
val s = BigInt(1,byteVector.takeRight(32).toArray) val s = BigInt(1, byteVector.takeRight(32).toArray)
fromRS(r, s) fromRS(r, s)
} }

View file

@ -47,7 +47,7 @@ sealed abstract class Sha256Digest extends HashDigest {
object Sha256Digest extends Factory[Sha256Digest] { object Sha256Digest extends Factory[Sha256Digest] {
private case class Sha256DigestImpl(bytes: ByteVector) extends Sha256Digest { private case class Sha256DigestImpl(bytes: ByteVector) extends Sha256Digest {
require(bytes.length == 32, require(bytes.length == 32,
// $COVERAGE-OFF$ // $COVERAGE-OFF$
"Sha256Digest must be 32 bytes in size, got: " + bytes.length) "Sha256Digest must be 32 bytes in size, got: " + bytes.length)
override def toString = s"Sha256DigestImpl($hex)" override def toString = s"Sha256DigestImpl($hex)"
// $COVERAGE-ON$ // $COVERAGE-ON$

View file

@ -229,16 +229,16 @@ object LnInvoice extends BitcoinSLogger {
} }
def apply( def apply(
hrp: LnHumanReadablePart, hrp: LnHumanReadablePart,
timestamp: UInt64, timestamp: UInt64,
lnTags: LnTaggedFields, lnTags: LnTaggedFields,
privateKey: ECPrivateKey): LnInvoice = { privateKey: ECPrivateKey): LnInvoice = {
val signature = buildLnInvoiceSignature(hrp,timestamp,lnTags,privateKey) val signature = buildLnInvoiceSignature(hrp, timestamp, lnTags, privateKey)
LnInvoiceImpl(hrp = hrp, LnInvoiceImpl(hrp = hrp,
timestamp = timestamp, timestamp = timestamp,
lnTags = lnTags, lnTags = lnTags,
signature = signature) signature = signature)
} }
def buildSignatureData( def buildSignatureData(
@ -251,7 +251,6 @@ object LnInvoice extends BitcoinSLogger {
val payload = UInt8.toBytes(payloadU8) val payload = UInt8.toBytes(payloadU8)
val allBytes = hrp.bytes ++ payload val allBytes = hrp.bytes ++ payload
//for an explanation of why this is needed see //for an explanation of why this is needed see
//https://github.com/bitcoin-s/bitcoin-s-core/issues/277 //https://github.com/bitcoin-s/bitcoin-s-core/issues/277
//https://github.com/bitcoin-s/bitcoin-s-core/pull/285 //https://github.com/bitcoin-s/bitcoin-s-core/pull/285

View file

@ -18,7 +18,9 @@ sealed abstract class LnInvoiceSignature extends NetworkElement {
require(recoverId.toInt >= 0 && recoverId.toInt <= 3, require(recoverId.toInt >= 0 && recoverId.toInt <= 3,
s"signature recovery byte must be 0,1,2,3, got ${recoverId.toInt}") s"signature recovery byte must be 0,1,2,3, got ${recoverId.toInt}")
require(bytes.length == 65, s"LnInvoiceSignatures MUST be 65 bytes in length, got ${bytes.length}") require(
bytes.length == 65,
s"LnInvoiceSignatures MUST be 65 bytes in length, got ${bytes.length}")
def signature: ECDigitalSignature def signature: ECDigitalSignature
def recoverId: UInt8 def recoverId: UInt8
@ -35,12 +37,12 @@ sealed abstract class LnInvoiceSignature extends NetworkElement {
object LnInvoiceSignature extends Factory[LnInvoiceSignature] { object LnInvoiceSignature extends Factory[LnInvoiceSignature] {
private case class LnInvoiceSignatureImpl( private case class LnInvoiceSignatureImpl(
recoverId: UInt8, recoverId: UInt8,
signature: ECDigitalSignature) signature: ECDigitalSignature)
extends LnInvoiceSignature extends LnInvoiceSignature
def apply( def apply(
recoverId: UInt8, recoverId: UInt8,
signature: ECDigitalSignature): LnInvoiceSignature = { signature: ECDigitalSignature): LnInvoiceSignature = {
LnInvoiceSignatureImpl(recoverId, signature) LnInvoiceSignatureImpl(recoverId, signature)
} }
@ -54,8 +56,11 @@ object LnInvoiceSignature extends Factory[LnInvoiceSignature] {
LnInvoiceSignature.apply(recoverId = recoverId, signature = signature) LnInvoiceSignature.apply(recoverId = recoverId, signature = signature)
} }
def fromRS(r:BigInteger, s: BigInteger, recovId: UInt8): LnInvoiceSignature = { def fromRS(
val sig = ECDigitalSignature.fromRS(r,s) r: BigInteger,
s: BigInteger,
recovId: UInt8): LnInvoiceSignature = {
val sig = ECDigitalSignature.fromRS(r, s)
LnInvoiceSignature(recovId, sig) LnInvoiceSignature(recovId, sig)
} }

View file

@ -35,6 +35,7 @@ case class FeeProportionalMillionths(u32: UInt32) extends NetworkElement {
} }
object FeeProportionalMillionths { object FeeProportionalMillionths {
def fromBigInt(bigInt: BigInt): FeeProportionalMillionths = def fromBigInt(bigInt: BigInt): FeeProportionalMillionths =
FeeProportionalMillionths(UInt32(bigInt)) FeeProportionalMillionths(UInt32(bigInt))
} }

View file

@ -65,7 +65,6 @@ abstract class LnUtil extends BitcoinSLogger {
} }
/** Decodes a number from Bech32 to a long */ /** Decodes a number from Bech32 to a long */
@tailrec @tailrec
final def decodeNumber(list: List[UInt5], accum: BigInt = 0): BigInt = { final def decodeNumber(list: List[UInt5], accum: BigInt = 0): BigInt = {

View file

@ -128,7 +128,7 @@ trait CryptoUtil extends BitcoinSLogger {
val pub1 = ECPublicKey.fromPoint(Q1) val pub1 = ECPublicKey.fromPoint(Q1)
val pub2 = ECPublicKey.fromPoint(Q2) val pub2 = ECPublicKey.fromPoint(Q2)
(pub1,pub2) (pub1, pub2)
} }
} }

View file

@ -18,9 +18,10 @@ import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.eclair.rpc.client.EclairRpcClient import org.bitcoins.eclair.rpc.client.EclairRpcClient
import org.bitcoins.eclair.rpc.config.{EclairAuthCredentials, EclairInstance} import org.bitcoins.eclair.rpc.config.{EclairAuthCredentials, EclairInstance}
import org.bitcoins.eclair.rpc.json._ import org.bitcoins.eclair.rpc.json._
import org.bitcoins.rpc.BitcoindRpcTestUtil
import org.bitcoins.rpc.client.BitcoindRpcClient import org.bitcoins.rpc.client.BitcoindRpcClient
import org.bitcoins.rpc.util.AsyncUtil import org.bitcoins.rpc.util.AsyncUtil
import org.bitcoins.testkit.eclair.rpc.{EclairNodes4, EclairRpcTestUtil}
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.scalatest.{Assertion, AsyncFlatSpec, BeforeAndAfterAll} import org.scalatest.{Assertion, AsyncFlatSpec, BeforeAndAfterAll}
import org.slf4j.Logger import org.slf4j.Logger

View file

@ -2,7 +2,8 @@ package org.bitcoins.eclair.rpc
import akka.actor.ActorSystem import akka.actor.ActorSystem
import akka.testkit.TestKit import akka.testkit.TestKit
import org.bitcoins.eclair.rpc.client.EclairRpcClient import org.bitcoins.eclair.rpc.client.EclairRpcClient
import org.bitcoins.rpc.BitcoindRpcTestUtil import org.bitcoins.testkit.eclair.rpc.EclairRpcTestUtil
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll} import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory

View file

@ -87,7 +87,6 @@ trait EclairApi {
feerateSatPerByte: Option[SatoshisPerByte], feerateSatPerByte: Option[SatoshisPerByte],
channelFlags: Option[Byte]): Future[FundedChannelId] channelFlags: Option[Byte]): Future[FundedChannelId]
/** The network that this [[org.bitcoins.eclair.rpc.api.EclairApi EclairApi]] is /** The network that this [[org.bitcoins.eclair.rpc.api.EclairApi EclairApi]] is
* running on. This is not available directly from the eclair api, but is a very * running on. This is not available directly from the eclair api, but is a very
* useful helper method * useful helper method

View file

@ -425,8 +425,7 @@ class EclairRpcClient(val instance: EclairInstance)(
if (amountMsat.isEmpty) { if (amountMsat.isEmpty) {
List(JsString(invoice.toString)) List(JsString(invoice.toString))
} else { } else {
List(JsString(invoice.toString), List(JsString(invoice.toString), JsNumber(amountMsat.get.toMSat.toLong))
JsNumber(amountMsat.get.toMSat.toLong))
} }
} }
@ -484,7 +483,10 @@ class EclairRpcClient(val instance: EclairInstance)(
case class RpcError(code: Int, message: String) case class RpcError(code: Int, message: String)
implicit val rpcErrorReads: Reads[RpcError] = Json.reads[RpcError] implicit val rpcErrorReads: Reads[RpcError] = Json.reads[RpcError]
private def parseResult[T](result: JsResult[T], json: JsValue, commandName: String): T = { private def parseResult[T](
result: JsResult[T],
json: JsValue,
commandName: String): T = {
result match { result match {
case res: JsSuccess[T] => case res: JsSuccess[T] =>
res.value res.value
@ -494,7 +496,8 @@ class EclairRpcClient(val instance: EclairInstance)(
val datadirMsg = instance.authCredentials.datadir val datadirMsg = instance.authCredentials.datadir
.map(d => s"datadir=${d}") .map(d => s"datadir=${d}")
.getOrElse("") .getOrElse("")
val errMsg = s"Error for command=${commandName} ${datadirMsg}, ${err.value.code}=${err.value.message}" val errMsg =
s"Error for command=${commandName} ${datadirMsg}, ${err.value.code}=${err.value.message}"
logger.error(errMsg) logger.error(errMsg)
throw new RuntimeException(errMsg) throw new RuntimeException(errMsg)
case _: JsError => case _: JsError =>
@ -573,7 +576,8 @@ class EclairRpcClient(val instance: EclairInstance)(
val _ = { val _ = {
require(instance.authCredentials.datadir.isDefined, s"A datadir needs to be provided to start eclair") require(instance.authCredentials.datadir.isDefined,
s"A datadir needs to be provided to start eclair")
if (process.isEmpty) { if (process.isEmpty) {
val p = Process( val p = Process(
@ -590,11 +594,9 @@ class EclairRpcClient(val instance: EclairInstance)(
} }
} }
val started = AsyncUtil.retryUntilSatisfiedF( val started = AsyncUtil.retryUntilSatisfiedF(() => isStarted,
() => isStarted, duration = 1.seconds,
duration = 1.seconds, maxTries = 60)
maxTries = 60)
started started
} }

View file

@ -1,11 +1,11 @@
package org.bitcoins.util package org.bitcoins.testkit.async
import akka.actor.ActorSystem import akka.actor.ActorSystem
import org.scalatest.exceptions.{StackDepthException, TestFailedException} import org.scalatest.exceptions.{StackDepthException, TestFailedException}
import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration.FiniteDuration import scala.concurrent.duration.FiniteDuration
abstract class AsyncUtil extends org.bitcoins.rpc.util.AsyncUtil { abstract class TestAsyncUtil extends org.bitcoins.rpc.util.AsyncUtil {
override protected def retryUntilSatisfiedWithCounter( override protected def retryUntilSatisfiedWithCounter(
conditionF: () => Future[Boolean], conditionF: () => Future[Boolean],
duration: FiniteDuration, duration: FiniteDuration,
@ -20,24 +20,26 @@ abstract class AsyncUtil extends org.bitcoins.rpc.util.AsyncUtil {
maxTries, maxTries,
stackTrace) stackTrace)
AsyncUtil.transformRetryToTestFailure(retryF)(system.dispatcher) TestAsyncUtil.transformRetryToTestFailure(retryF)(system.dispatcher)
} }
} }
object AsyncUtil extends AsyncUtil { object TestAsyncUtil extends TestAsyncUtil {
/** /**
* As opposed to the AsyncUtil in the rpc project, in the testkit, we can assume that * As opposed to the AsyncUtil in the rpc project, in the testkit, we can assume that
* AsyncUtil methods are being called from tests and as such, we want to trim the stack * TestAsyncUtil methods are being called from tests and as such, we want to trim the stack
* trace to exclude stack elements that occur before the beginning of a test. * trace to exclude stack elements that occur before the beginning of a test.
* Additionally, we want to transform RpcRetryExceptions to TestFailedExceptions which * Additionally, we want to transform RpcRetryExceptions to TestFailedExceptions which
* conveniently mention the line that called the AsyncUtil method. * conveniently mention the line that called the TestAsyncUtil method.
*/ */
def transformRetryToTestFailure[T](fut: Future[T])(implicit ec: ExecutionContext): Future[T] = { def transformRetryToTestFailure[T](fut: Future[T])(
implicit ec: ExecutionContext): Future[T] = {
def transformRetry(err: Throwable): Throwable = { def transformRetry(err: Throwable): Throwable = {
if (err.isInstanceOf[RpcRetryException]) { if (err.isInstanceOf[RpcRetryException]) {
val retryErr = err.asInstanceOf[RpcRetryException] val retryErr = err.asInstanceOf[RpcRetryException]
val relevantStackTrace = retryErr.caller.tail val relevantStackTrace = retryErr.caller.tail
.dropWhile(_.getFileName == "AsyncUtil.scala") .dropWhile(elem => retryErr.internalFiles.contains(elem.getFileName))
.takeWhile(!_.getFileName.contains("TestSuite")) .takeWhile(!_.getFileName.contains("TestSuite"))
val stackElement = relevantStackTrace.head val stackElement = relevantStackTrace.head
val file = stackElement.getFileName val file = stackElement.getFileName
@ -54,6 +56,8 @@ object AsyncUtil extends AsyncUtil {
} }
} }
fut.transform({ elem: T => elem }, transformRetry) fut.transform({ elem: T =>
elem
}, transformRetry)
} }
} }

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.protocol._ import org.bitcoins.core.protocol._
import org.scalacheck.Gen import org.scalacheck.Gen

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.consensus.Merkle import org.bitcoins.core.consensus.Merkle
import org.bitcoins.core.crypto.DoubleSha256Digest import org.bitcoins.core.crypto.DoubleSha256Digest

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.bloom._ import org.bitcoins.core.bloom._
import org.scalacheck.Gen import org.scalacheck.Gen

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.config._ import org.bitcoins.core.config._
import org.bitcoins.core.protocol.ln.LnParams import org.bitcoins.core.protocol.ln.LnParams

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.crypto.Sign import org.bitcoins.core.crypto.Sign
import org.bitcoins.core.number.UInt32 import org.bitcoins.core.number.UInt32

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.crypto._ import org.bitcoins.core.crypto._
import org.bitcoins.core.script.crypto.HashType import org.bitcoins.core.script.crypto.HashType

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.currency.{ import org.bitcoins.core.currency.{
Bitcoins, Bitcoins,

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.bloom.BloomFilter import org.bitcoins.core.bloom.BloomFilter
import org.bitcoins.core.crypto.DoubleSha256Digest import org.bitcoins.core.crypto.DoubleSha256Digest

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.number._ import org.bitcoins.core.number._
import org.bitcoins.core.protocol.CompactSizeUInt import org.bitcoins.core.protocol.CompactSizeUInt

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.consensus.Consensus import org.bitcoins.core.consensus.Consensus
import org.bitcoins.core.crypto.{TransactionSignatureCreator, _} import org.bitcoins.core.crypto.{TransactionSignatureCreator, _}

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.scalacheck.Gen import org.scalacheck.Gen

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.crypto._ import org.bitcoins.core.crypto._
import org.bitcoins.core.currency.{CurrencyUnit, CurrencyUnits, Satoshis} import org.bitcoins.core.currency.{CurrencyUnit, CurrencyUnits, Satoshis}

View file

@ -1,4 +1,4 @@
package org.bitcoins.core.gen package org.bitcoins.testkit.core.gen
import org.bitcoins.core.crypto._ import org.bitcoins.core.crypto._
import org.bitcoins.core.currency.CurrencyUnit import org.bitcoins.core.currency.CurrencyUnit

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.gen.ln package org.bitcoins.testkit.core.gen.ln
import org.bitcoins.core.gen.NumberGenerator import org.bitcoins.testkit.core.gen.NumberGenerator
import org.bitcoins.core.protocol.ln._ import org.bitcoins.core.protocol.ln._
import org.bitcoins.core.protocol.ln.currency._ import org.bitcoins.core.protocol.ln.currency._
import org.scalacheck.Gen import org.scalacheck.Gen
@ -39,7 +39,7 @@ trait LnCurrencyUnitGen {
} }
def realisticLnInvoice: Gen[LnCurrencyUnit] = { def realisticLnInvoice: Gen[LnCurrencyUnit] = {
val gen = Gen.choose(0,LnPolicy.maxAmountMSat.toLong) val gen = Gen.choose(0, LnPolicy.maxAmountMSat.toLong)
val msat = gen.map(MilliSatoshis(_)) val msat = gen.map(MilliSatoshis(_))
msat.map(LnCurrencyUnits.fromMSat(_)) msat.map(LnCurrencyUnits.fromMSat(_))
} }

View file

@ -1,7 +1,7 @@
package org.bitcoins.core.gen.ln package org.bitcoins.testkit.core.gen.ln
import org.bitcoins.core.crypto.ECPrivateKey import org.bitcoins.core.crypto.ECPrivateKey
import org.bitcoins.core.gen._ import org.bitcoins.testkit.core.gen._
import org.bitcoins.core.number.{UInt64, UInt8} import org.bitcoins.core.number.{UInt64, UInt8}
import org.bitcoins.core.protocol.ln.LnTag.NodeIdTag import org.bitcoins.core.protocol.ln.LnTag.NodeIdTag
import org.bitcoins.core.protocol.ln._ import org.bitcoins.core.protocol.ln._
@ -113,7 +113,6 @@ sealed abstract class LnInvoiceGen {
) )
} }
def optionalTags(nodeIdOpt: Option[NodeId]): Gen[LnTaggedFields] = { def optionalTags(nodeIdOpt: Option[NodeId]): Gen[LnTaggedFields] = {
for { for {
paymentHash <- paymentHashTag paymentHash <- paymentHashTag
@ -158,17 +157,13 @@ sealed abstract class LnInvoiceGen {
) )
} }
/** Generated a tagged fields with an explicit /** Generated a tagged fields with an explicit
* [[org.bitcoins.core.protocol.ln.LnTag.NodeIdTag LnTag.NodeIdTag]] * [[org.bitcoins.core.protocol.ln.LnTag.NodeIdTag LnTag.NodeIdTag]]
* */ * */
def taggedFields(nodeIdOpt: Option[NodeId]): Gen[LnTaggedFields] = { def taggedFields(nodeIdOpt: Option[NodeId]): Gen[LnTaggedFields] = {
Gen.oneOf(allTags(nodeIdOpt), Gen.oneOf(allTags(nodeIdOpt), mandatoryTags, optionalTags(nodeIdOpt))
mandatoryTags,
optionalTags(nodeIdOpt))
} }
def signatureVersion: Gen[UInt8] = { def signatureVersion: Gen[UInt8] = {
Gen.choose(0, 3).map(UInt8(_)) Gen.choose(0, 3).map(UInt8(_))
} }
@ -199,14 +194,12 @@ sealed abstract class LnInvoiceGen {
) )
LnInvoice(hrp = hrp, LnInvoice(hrp = hrp,
timestamp = timestamp, timestamp = timestamp,
lnTags = tags, lnTags = tags,
signature = signature) signature = signature)
} }
} }
def lnInvoice(tags: LnTaggedFields): Gen[LnInvoice] = { def lnInvoice(tags: LnTaggedFields): Gen[LnInvoice] = {
for { for {
privateKey <- CryptoGenerators.privateKey privateKey <- CryptoGenerators.privateKey
@ -222,9 +215,9 @@ sealed abstract class LnInvoiceGen {
) )
LnInvoice(hrp = hrp, LnInvoice(hrp = hrp,
timestamp = timestamp, timestamp = timestamp,
lnTags = tags, lnTags = tags,
signature = signature) signature = signature)
} }
} }

View file

@ -1,6 +1,6 @@
package org.bitcoins.core.gen.ln package org.bitcoins.testkit.core.gen.ln
import org.bitcoins.core.gen.{CryptoGenerators, NumberGenerator} import org.bitcoins.testkit.core.gen.{CryptoGenerators, NumberGenerator}
import org.bitcoins.core.protocol.ln.ShortChannelId import org.bitcoins.core.protocol.ln.ShortChannelId
import org.bitcoins.core.protocol.ln.currency.MilliSatoshis import org.bitcoins.core.protocol.ln.currency.MilliSatoshis
import org.bitcoins.core.protocol.ln.fee.{ import org.bitcoins.core.protocol.ln.fee.{

View file

@ -1,4 +1,4 @@
package org.bitcoins.eclair.rpc package org.bitcoins.testkit.eclair.rpc
import java.io.{File, PrintWriter} import java.io.{File, PrintWriter}
import java.net.URI import java.net.URI
@ -18,11 +18,10 @@ import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.eclair.rpc.client.EclairRpcClient import org.bitcoins.eclair.rpc.client.EclairRpcClient
import org.bitcoins.eclair.rpc.config.EclairInstance import org.bitcoins.eclair.rpc.config.EclairInstance
import org.bitcoins.eclair.rpc.json.PaymentResult import org.bitcoins.eclair.rpc.json.PaymentResult
import org.bitcoins.rpc.BitcoindRpcTestUtil
import org.bitcoins.rpc.client.BitcoindRpcClient import org.bitcoins.rpc.client.BitcoindRpcClient
import org.bitcoins.rpc.config.{BitcoindInstance, ZmqConfig} import org.bitcoins.rpc.config.{BitcoindInstance, ZmqConfig}
import org.bitcoins.rpc.RpcUtil import org.bitcoins.testkit.async.TestAsyncUtil
import org.bitcoins.util.AsyncUtil import org.bitcoins.testkit.rpc.{BitcoindRpcTestUtil, TestRpcUtil}
import scala.concurrent.duration.DurationInt import scala.concurrent.duration.DurationInt
import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.{ExecutionContext, Future}
@ -223,8 +222,8 @@ trait EclairRpcTestUtil extends BitcoinSLogger {
}(system.dispatcher) }(system.dispatcher)
} }
AsyncUtil.retryUntilSatisfiedF(conditionF = () => isState(), TestAsyncUtil.retryUntilSatisfiedF(conditionF = () => isState(),
duration = 1.seconds) duration = 1.seconds)
} }
private def createNodeLink( private def createNodeLink(
@ -415,9 +414,9 @@ trait EclairRpcTestUtil extends BitcoinSLogger {
} }
logger.debug(s"Awaiting connection between clients") logger.debug(s"Awaiting connection between clients")
val connected = RpcUtil.retryUntilSatisfiedF(conditionF = val connected = TestRpcUtil.retryUntilSatisfiedF(conditionF =
() => isConnected(), () => isConnected(),
duration = 1.second) duration = 1.second)
connected.map(_ => logger.debug(s"Successfully connected two clients")) connected.map(_ => logger.debug(s"Successfully connected two clients"))

View file

@ -1,4 +1,4 @@
package org.bitcoins.rpc package org.bitcoins.testkit.rpc
import java.io.{File, PrintWriter} import java.io.{File, PrintWriter}
import java.net.URI import java.net.URI
@ -10,8 +10,12 @@ import org.bitcoins.core.config.RegTest
import org.bitcoins.core.crypto.DoubleSha256Digest import org.bitcoins.core.crypto.DoubleSha256Digest
import org.bitcoins.core.util.BitcoinSLogger import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.rpc.client.BitcoindRpcClient import org.bitcoins.rpc.client.BitcoindRpcClient
import org.bitcoins.rpc.config.{BitcoindAuthCredentials, BitcoindInstance, ZmqConfig} import org.bitcoins.rpc.config.{
import org.bitcoins.util.AsyncUtil BitcoindAuthCredentials,
BitcoindInstance,
ZmqConfig
}
import org.bitcoins.testkit.async.TestAsyncUtil
import scala.collection.immutable.Map import scala.collection.immutable.Map
import scala.concurrent.duration.{DurationInt, FiniteDuration} import scala.concurrent.duration.{DurationInt, FiniteDuration}
@ -20,6 +24,7 @@ import scala.util.{Failure, Success, Try}
trait BitcoindRpcTestUtil extends BitcoinSLogger { trait BitcoindRpcTestUtil extends BitcoinSLogger {
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
def randomDirName: String = def randomDirName: String =
0.until(5).map(_ => scala.util.Random.alphanumeric.head).mkString 0.until(5).map(_ => scala.util.Random.alphanumeric.head).mkString
@ -67,7 +72,8 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
.map(entry => { .map(entry => {
val key = entry.getKey val key = entry.getKey
val value = entry.getValue.unwrapped val value = entry.getValue.unwrapped
s"$key=$value"}) s"$key=$value"
})
.mkString("\n") .mkString("\n")
val datadir = new java.io.File("/tmp/" + randomDirName) val datadir = new java.io.File("/tmp/" + randomDirName)
@ -143,9 +149,9 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
} }
} }
RpcUtil.awaitConditionF(conditionF = () => isConnected(), TestRpcUtil.awaitConditionF(conditionF = () => isConnected(),
duration = duration, duration = duration,
maxTries = maxTries) maxTries = maxTries)
} }
def awaitSynced( def awaitSynced(
@ -163,9 +169,9 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
} }
} }
RpcUtil.awaitConditionF(conditionF = () => isSynced(), TestRpcUtil.awaitConditionF(conditionF = () => isSynced(),
duration = duration, duration = duration,
maxTries = maxTries) maxTries = maxTries)
} }
def awaitSameBlockHeight( def awaitSameBlockHeight(
@ -183,9 +189,9 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
} }
} }
RpcUtil.awaitConditionF(conditionF = () => isSameBlockHeight(), TestRpcUtil.awaitConditionF(conditionF = () => isSameBlockHeight(),
duration = duration, duration = duration,
maxTries = maxTries) maxTries = maxTries)
} }
def awaitDisconnected( def awaitDisconnected(
@ -204,9 +210,9 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
} }
RpcUtil.awaitConditionF(conditionF = () => isDisconnected(), TestRpcUtil.awaitConditionF(conditionF = () => isDisconnected(),
duration = duration, duration = duration,
maxTries = maxTries) maxTries = maxTries)
} }
/** Returns a pair of RpcClients that are connected with 100 blocks in the chain */ /** Returns a pair of RpcClients that are connected with 100 blocks in the chain */
@ -226,13 +232,13 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
client1.start() client1.start()
client2.start() client2.start()
val try1 = Try(RpcUtil.awaitServer(client1)) val try1 = Try(TestRpcUtil.awaitServer(client1))
if (try1.isFailure) { if (try1.isFailure) {
deleteNodePair(client1, client2) deleteNodePair(client1, client2)
throw try1.failed.get throw try1.failed.get
} }
val try2 = Try(RpcUtil.awaitServer(client2)) val try2 = Try(TestRpcUtil.awaitServer(client2))
if (try2.isFailure) { if (try2.isFailure) {
deleteNodePair(client1, client2) deleteNodePair(client1, client2)
throw try2.failed.get throw try2.failed.get
@ -303,7 +309,7 @@ trait BitcoindRpcTestUtil extends BitcoinSLogger {
} }
val blocksGeneratedF = generatedF.flatMap { _ => val blocksGeneratedF = generatedF.flatMap { _ =>
AsyncUtil.retryUntilSatisfiedF( TestAsyncUtil.retryUntilSatisfiedF(
() => isBlocksGenerated, () => isBlocksGenerated,
duration = 1.seconds duration = 1.seconds
) )