diff --git a/core-test/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorTest.scala b/core-test/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorTest.scala index 9c674ed387..6201ee897c 100644 --- a/core-test/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/crypto/TransactionSignatureCreatorTest.scala @@ -15,7 +15,7 @@ import org.bitcoins.crypto.{ ECPrivateKey, EmptyDigitalSignature } -import org.bitcoins.testkit.util.TransactionTestUtil +import org.bitcoins.testkit.util.{BitcoinSAsyncTest, TransactionTestUtil} import org.scalatest.concurrent.ScalaFutures import org.scalatest.{FlatSpec, MustMatchers} import scodec.bits.ByteVector @@ -25,11 +25,7 @@ import scala.concurrent.Future /** * Created by chris on 7/21/16. */ -class TransactionSignatureCreatorTest - extends FlatSpec - with MustMatchers - with ScalaFutures { - private def logger = BitcoinSLogger.logger +class TransactionSignatureCreatorTest extends BitcoinSAsyncTest { "TransactionSignatureCreator" must "create a signature for a scriptSignature in a transaction" in { //this is a signed tx, but since TransactionSignatureSerializer removes scriptSigs, it will work for testing this @@ -264,7 +260,6 @@ class TransactionSignatureCreatorTest } it must "be able to use a sign function that returns a Future[ECDigitalSignature] and have the sig validate" in { - import scala.concurrent.ExecutionContext.Implicits.global val privateKey = ECPrivateKey() val publicKey = privateKey.publicKey val redeemScript = MultiSignatureScriptPubKey(1, Seq(publicKey)) @@ -312,9 +307,9 @@ class TransactionSignatureCreatorTest PreExecutionScriptProgram(signedTxSigComponent) } - val result = program.map(ScriptInterpreter.run(_)) - whenReady(result) { r => - r must be(ScriptOk) + val resultF = program.map(ScriptInterpreter.run(_)) + resultF.map { r => + assert(r == ScriptOk) } } diff --git a/core-test/src/test/scala/org/bitcoins/core/crypto/bip32/BIP32PathTest.scala b/core-test/src/test/scala/org/bitcoins/core/crypto/bip32/BIP32PathTest.scala index a7048b539f..5f2be71e95 100644 --- a/core-test/src/test/scala/org/bitcoins/core/crypto/bip32/BIP32PathTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/crypto/bip32/BIP32PathTest.scala @@ -16,7 +16,7 @@ import scala.util.{Success, Try} class BIP32PathTest extends BitcoinSUnitTest { implicit override val generatorDrivenConfig: PropertyCheckConfiguration = - generatorDrivenConfigNewCode + generatorDriveConfigOldCode behavior of "BIP32Child" diff --git a/core-test/src/test/scala/org/bitcoins/core/p2p/BlockMessageTest.scala b/core-test/src/test/scala/org/bitcoins/core/p2p/BlockMessageTest.scala index c4a6700bdc..ada97a7e08 100644 --- a/core-test/src/test/scala/org/bitcoins/core/p2p/BlockMessageTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/p2p/BlockMessageTest.scala @@ -1,11 +1,11 @@ package org.bitcoins.core.p2p -import org.bitcoins.testkit.util.BitcoinSUnitTest import org.bitcoins.testkit.core.gen.p2p.DataMessageGenerator +import org.bitcoins.testkit.util.BitcoinSAsyncTest -class BlockMessageTest extends BitcoinSUnitTest { +class BlockMessageTest extends BitcoinSAsyncTest { it must "have serialization symmetry" in { - forAll(DataMessageGenerator.blockMessage) { block => + forAllParallel(DataMessageGenerator.blockMessage) { block => assert(block == BlockMessage.fromBytes(block.bytes)) } } diff --git a/core-test/src/test/scala/org/bitcoins/core/p2p/HeadersMessageTest.scala b/core-test/src/test/scala/org/bitcoins/core/p2p/HeadersMessageTest.scala index f71dcbca2c..606d2e94e8 100644 --- a/core-test/src/test/scala/org/bitcoins/core/p2p/HeadersMessageTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/p2p/HeadersMessageTest.scala @@ -1,12 +1,12 @@ package org.bitcoins.core.p2p import org.bitcoins.testkit.core.gen.p2p.DataMessageGenerator -import org.bitcoins.testkit.util.BitcoinSUnitTest +import org.bitcoins.testkit.util.BitcoinSAsyncTest -class HeadersMessageTest extends BitcoinSUnitTest { +class HeadersMessageTest extends BitcoinSAsyncTest { it must "have serialization symmetry" in { - forAll(DataMessageGenerator.headersMessage) { headersMsg => + forAllParallel(DataMessageGenerator.headersMessage) { headersMsg => assert(HeadersMessage(headersMsg.hex) == headersMsg) } } diff --git a/core-test/src/test/scala/org/bitcoins/core/p2p/NetworkPayloadTest.scala b/core-test/src/test/scala/org/bitcoins/core/p2p/NetworkPayloadTest.scala index bd32155767..8c64b8596c 100644 --- a/core-test/src/test/scala/org/bitcoins/core/p2p/NetworkPayloadTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/p2p/NetworkPayloadTest.scala @@ -2,10 +2,12 @@ package org.bitcoins.core.p2p import org.bitcoins.core.config.{MainNet, TestNet3} import org.bitcoins.testkit.node.NodeTestUtil -import org.bitcoins.testkit.util.BitcoinSUnitTest +import org.bitcoins.testkit.util.{BitcoinSAsyncTest, BitcoinSUnitTest} import org.bitcoins.testkit.core.gen.p2p.P2PGenerator -class NetworkPayloadTest extends BitcoinSUnitTest { +import scala.concurrent.Future + +class NetworkPayloadTest extends BitcoinSAsyncTest { "NetworkMessage" must "create a payload object from it's network header and the payload bytes" in { val rawNetworkMessage = NodeTestUtil.rawNetworkMessage @@ -25,7 +27,7 @@ class NetworkPayloadTest extends BitcoinSUnitTest { // this tests has a bunch of messages to choose between, so we set a high config value implicit override val generatorDrivenConfig = customGenDrivenConfig(100) it must "parse messages based on its command name" in { - forAll(P2PGenerator.message) { p2p => + forAllParallel(P2PGenerator.message) { p2p => val bytes = p2p.bytes val parser = NetworkPayload.readers(p2p.commandName) assert(parser(bytes) == p2p) diff --git a/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/BlockTest.scala b/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/BlockTest.scala index 900218cd47..a8da136da3 100644 --- a/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/BlockTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/BlockTest.scala @@ -1,14 +1,14 @@ package org.bitcoins.core.protocol.blockchain -import org.bitcoins.testkit.util.BitcoinSUnitTest -import org.slf4j.LoggerFactory +import org.bitcoins.testkit.core.gen.BlockchainElementsGenerator +import org.bitcoins.testkit.util.BitcoinSAsyncTest import scala.io.Source /** * Created by chris on 7/15/16. */ -class BlockTest extends BitcoinSUnitTest { +class BlockTest extends BitcoinSAsyncTest { def timeBlockParsing[R](block: => R): Long = { val t0 = System.currentTimeMillis() @@ -43,4 +43,12 @@ class BlockTest extends BitcoinSUnitTest { val time = timeBlockParsing(Block.fromHex(lines)) assert(time <= 15000) } + + it must "have serialization symmetry" in { + forAllParallel(BlockchainElementsGenerator.block) { block => + val result = Block(block.hex) == block + if (!result) logger.warn("block.hex: " + block.hex) + assert(result) + } + } } diff --git a/testkit/src/main/scala/org/bitcoins/testkit/core/gen/ScriptGenerators.scala b/testkit/src/main/scala/org/bitcoins/testkit/core/gen/ScriptGenerators.scala index 3fa0954cc6..af55fe9a71 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/core/gen/ScriptGenerators.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/core/gen/ScriptGenerators.scala @@ -42,7 +42,7 @@ import scala.concurrent.duration.DurationInt //TODO: Need to provide generators for [[NonStandardScriptSignature]] and [[NonStandardScriptPubKey]] sealed abstract class ScriptGenerators extends BitcoinSLogger { - val timeout = 5.seconds + val timeout = 15.seconds val defaultMaxDepth: Int = 2 /** Since redeem scripts are pushed onto the stack, this function 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 0673e7bc2d..35a99d94f3 100644 --- a/testkit/src/main/scala/org/bitcoins/testkit/util/BitcoinSAsyncTest.scala +++ b/testkit/src/main/scala/org/bitcoins/testkit/util/BitcoinSAsyncTest.scala @@ -195,6 +195,16 @@ trait BaseAsyncTest sequenceTestRuns(testRunFs) } + + /** Runs all property based tests in parallel. This is a convinient optimization + * for synchronous property based tests */ + def forAllParallel[A](gen: Gen[A])(func: A => Assertion): Future[Assertion] = { + forAllAsync(gen) { a: A => + Future { + func(a) + } + } + } } /** A trait that uses [[AsyncFlatSpec]] to execute tests