From 7c9b6f510ec1b66855d4b3c0838eaddb79880f34 Mon Sep 17 00:00:00 2001 From: Sergey Tolmachev Date: Fri, 7 Oct 2016 21:11:43 +0300 Subject: [PATCH] Fixed appending invalid block --- .../scorex/transaction/BlockStorage.scala | 1 + .../test/scala/scorex/ScorexTestSuite.scala | 4 +- .../BlockStorageSpecification.scala | 39 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 scorex-basics/src/test/scala/scorex/transaction/BlockStorageSpecification.scala diff --git a/scorex-basics/src/main/scala/scorex/transaction/BlockStorage.scala b/scorex-basics/src/main/scala/scorex/transaction/BlockStorage.scala index fdd4893c..13ee9a8b 100644 --- a/scorex-basics/src/main/scala/scorex/transaction/BlockStorage.scala +++ b/scorex-basics/src/main/scala/scorex/transaction/BlockStorage.scala @@ -30,6 +30,7 @@ trait BlockStorage extends ScorexLogging { case Failure(e) => log.error("Failed to apply block to state", e) db.rollback() + throw e case Success(m) => db.commit() } diff --git a/scorex-basics/src/test/scala/scorex/ScorexTestSuite.scala b/scorex-basics/src/test/scala/scorex/ScorexTestSuite.scala index 2487b065..a671d7dd 100644 --- a/scorex-basics/src/test/scala/scorex/ScorexTestSuite.scala +++ b/scorex-basics/src/test/scala/scorex/ScorexTestSuite.scala @@ -5,6 +5,7 @@ import scorex.account.AccountSpecification import scorex.crypto.SigningFunctionsSpecification import scorex.crypto.ads.merkle.{AuthDataBlockSpecification, MerkleSpecification, MerkleTreeStorageSpecification} import scorex.network.HandshakeSpecification +import scorex.transaction.BlockStorageSpecification class ScorexTestSuite extends Suites( new AccountSpecification, @@ -12,5 +13,6 @@ class ScorexTestSuite extends Suites( new SigningFunctionsSpecification, new MerkleSpecification, new MerkleTreeStorageSpecification, - new HandshakeSpecification + new HandshakeSpecification, + new BlockStorageSpecification ) diff --git a/scorex-basics/src/test/scala/scorex/transaction/BlockStorageSpecification.scala b/scorex-basics/src/test/scala/scorex/transaction/BlockStorageSpecification.scala new file mode 100644 index 00000000..1bb5f7ca --- /dev/null +++ b/scorex-basics/src/test/scala/scorex/transaction/BlockStorageSpecification.scala @@ -0,0 +1,39 @@ +package scorex.transaction + +import scala.util.{Failure, Success, Try} +import org.h2.mvstore.MVStore +import org.scalamock.scalatest.PathMockFactory +import org.scalatest.prop.{GeneratorDrivenPropertyChecks, PropertyChecks} +import org.scalatest.{Matchers, PropSpec} +import scorex.account.Account +import scorex.block.Block +import scorex.network.BlockSeq + +class BlockStorageSpecification extends PropSpec with PropertyChecks with GeneratorDrivenPropertyChecks with Matchers with PathMockFactory { + private def mockHistory: History = { + val history = mock[History] + (history.appendBlock(_: Block)) expects * onCall { b: Block => Success(Seq(b)) } anyNumberOfTimes() + history + } + + private class MockLagonakiState(v: Try[State]) extends LagonakiState { + override private[transaction] def processBlock(block: Block): Try[State] = v + override def validate(txs: Seq[Transaction], height: Option[Int]): Seq[Transaction] = ??? + override def included(signature: Array[Byte], heightOpt: Option[Int]): Option[Int] = ??? + override private[transaction] def rollbackTo(height: Int): State = ??? + override def balance(account: Account, height: Option[Int]): Long = ??? + override def balanceWithConfirmations(account: Account, confirmations: Int, heightOpt: Option[Int]): Long = ??? + override def accountTransactions(account: Account): Array[_ <: Transaction] = ??? + } + + property("BlockStorage appendBlock should returns failed try when state.processBlock fails") { + val f = Failure(new IllegalStateException) + + new BlockStorage { + override val history: History = mockHistory + override protected[this] val db: MVStore = new MVStore.Builder().open() + override val state: LagonakiState = new MockLagonakiState(f) + override val blockSeq: BlockSeq = null + }.appendBlock(/*i'm a block*/null) shouldBe f + } +}