From fe4d26858cdd2739acf17a3ec3cc7e5df37dc1cd Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Fri, 15 Feb 2019 07:13:33 -0600 Subject: [PATCH] Add bitcoin-s unit test class, all unit tests going forward should extend this (#335) --- build.sbt | 19 ++++--- ...Test.scala => LnInvoiceUnitUnitTest.scala} | 26 +++------ .../bitcoins/core/util/BitcoinSUnitTest.scala | 57 +++++++++++++++++++ 3 files changed, 74 insertions(+), 28 deletions(-) rename core-test/src/test/scala/org/bitcoins/core/protocol/ln/{LnInvoiceUnitTest.scala => LnInvoiceUnitUnitTest.scala} (97%) create mode 100644 core-test/src/test/scala/org/bitcoins/core/util/BitcoinSUnitTest.scala diff --git a/build.sbt b/build.sbt index 1d40a43f61..ed9e9c42d0 100644 --- a/build.sbt +++ b/build.sbt @@ -40,7 +40,11 @@ lazy val commonSettings = List( scalacOptions in Test := testCompilerOpts, - testOptions in Test += Tests.Argument("-oF"), + //show full stack trace of failed tests + testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-oF"), + + //show duration of tests + testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-oD"), assemblyOption in assembly := (assemblyOption in assembly).value .copy(includeScala = false), @@ -127,36 +131,33 @@ lazy val secp256k1jni = project lazy val core = project .in(file("core")) - .enablePlugins() .settings(commonSettings: _*) .dependsOn( secp256k1jni - ) + ).enablePlugins() lazy val coreTest = project .in(file("core-test")) - .enablePlugins() .settings(commonSettings: _*) .settings(skip in publish := true) .dependsOn( core, - ) + ).enablePlugins() lazy val zmq = project .in(file("zmq")) - .enablePlugins() .settings(commonSettings: _*) .dependsOn( core - ) + ).enablePlugins() lazy val rpc = project .in(file("rpc")) - .enablePlugins() + .settings(commonSettings: _*) .dependsOn( core - ) + ).enablePlugins() lazy val bench = project .in(file("bench")) diff --git a/core-test/src/test/scala/org/bitcoins/core/protocol/ln/LnInvoiceUnitTest.scala b/core-test/src/test/scala/org/bitcoins/core/protocol/ln/LnInvoiceUnitUnitTest.scala similarity index 97% rename from core-test/src/test/scala/org/bitcoins/core/protocol/ln/LnInvoiceUnitTest.scala rename to core-test/src/test/scala/org/bitcoins/core/protocol/ln/LnInvoiceUnitUnitTest.scala index 9468be4cb0..853084aa03 100644 --- a/core-test/src/test/scala/org/bitcoins/core/protocol/ln/LnInvoiceUnitTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/protocol/ln/LnInvoiceUnitUnitTest.scala @@ -3,31 +3,18 @@ package org.bitcoins.core.protocol.ln import org.bitcoins.core.crypto._ import org.bitcoins.core.gen.ln.LnInvoiceGen import org.bitcoins.core.number.{UInt32, UInt64, UInt8} -import org.bitcoins.core.protocol.ln.LnParams.{ - LnBitcoinMainNet, - 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.LnParams.{LnBitcoinMainNet, 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.{Bech32Address, P2PKHAddress, P2SHAddress} -import org.bitcoins.core.util.CryptoUtil -import org.scalatest.prop.PropertyChecks -import org.scalatest.{FlatSpec, MustMatchers} -import org.slf4j.LoggerFactory +import org.bitcoins.core.util.{BitcoinSUnitTest, CryptoUtil} import scodec.bits.ByteVector -class LnInvoiceUnitTest extends FlatSpec with MustMatchers with PropertyChecks { +class LnInvoiceUnitTest extends BitcoinSUnitTest { behavior of "LnInvoice" - private val logger = LoggerFactory.getLogger(getClass) + override implicit val generatorDrivenConfig: PropertyCheckConfiguration = generatorDrivenConfigNewCode val hrpEmpty = LnHumanReadablePart(LnBitcoinMainNet) @@ -449,4 +436,5 @@ class LnInvoiceUnitTest extends FlatSpec with MustMatchers with PropertyChecks { invoice.nodeId.hex must be(expected) } + } diff --git a/core-test/src/test/scala/org/bitcoins/core/util/BitcoinSUnitTest.scala b/core-test/src/test/scala/org/bitcoins/core/util/BitcoinSUnitTest.scala new file mode 100644 index 0000000000..9b28fb9144 --- /dev/null +++ b/core-test/src/test/scala/org/bitcoins/core/util/BitcoinSUnitTest.scala @@ -0,0 +1,57 @@ +package org.bitcoins.core.util + +import org.scalatest.prop.PropertyChecks +import org.scalatest.{FlatSpec, MustMatchers} +import org.slf4j.LoggerFactory + +/** A wrapper for boiler plate testing procesures in bitcoin-s */ +abstract class BitcoinSUnitTest extends FlatSpec with MustMatchers with PropertyChecks { + + lazy val logger = LoggerFactory.getLogger(getClass) + + /** The configuration for property based tests in our testing suite + * See: http://www.scalatest.org/user_guide/writing_scalacheck_style_properties + */ + override implicit val generatorDrivenConfig: PropertyCheckConfiguration = { + generatorDriveConfigOldCode + } + + private def buildConfig(executions: Int): PropertyCheckConfiguration = { + PropertyCheckConfig( + minSuccessful = executions, + minSize = executions, + maxSize = executions + ) + } + + /** Property based tests that have been around a long time + * have a less of a chance failing, so execute them less + * @return + */ + def generatorDriveConfigOldCode: PropertyCheckConfiguration = { + buildConfig(BitcoinSUnitTest.OLD_CODE_EXECUTIONS) + } + + /** Property based tests that are new have a higher chance of failing + * so execute them more + * @return + */ + def generatorDrivenConfigNewCode: PropertyCheckConfiguration = { + buildConfig(BitcoinSUnitTest.NEW_CODE_EXECUTIONS) + } + +} + +object BitcoinSUnitTest { + + /** The number of times new code + * should be executed in a property based test + */ + val NEW_CODE_EXECUTIONS = 100 + + /** The number of times old code should be executed + * in a property based test + */ + val OLD_CODE_EXECUTIONS = 20 + +}