kvutils: Use mockito-scala's ArgumentMatchersSugar. (#8218)

CHANGELOG_BEGIN
CHANGELOG_END
This commit is contained in:
Samir Talwar 2020-12-09 16:34:38 +01:00 committed by GitHub
parent 5f1d5ad118
commit 79a91669b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 135 additions and 107 deletions

View File

@ -12,8 +12,7 @@ import com.daml.lf.data.Ref
import com.daml.metrics.Metrics
import com.daml.platform.akkastreams.dispatcher.Dispatcher
import com.google.protobuf.ByteString
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
@ -23,12 +22,13 @@ class InMemoryLedgerReaderWriterSpec
extends AsyncWordSpec
with AkkaBeforeAndAfterAll
with Matchers
with MockitoSugar {
with MockitoSugar
with ArgumentMatchersSugar {
"commit" should {
"not signal new head in case of failure" in {
val mockDispatcher = mock[Dispatcher[Index]]
val mockCommitter = mock[ValidateAndCommit]
when(mockCommitter(anyString(), any[ByteString](), any[ParticipantId]()))
when(mockCommitter(any[String], any[ByteString], any[ParticipantId]))
.thenReturn(
Future.successful(SubmissionResult.InternalError("Validation failed with an exception")))
val instance = new InMemoryLedgerReaderWriter(
@ -43,7 +43,7 @@ class InMemoryLedgerReaderWriterSpec
instance
.commit("correlation ID", ByteString.copyFromUtf8("some bytes"), CommitMetadata.Empty)
.map { actual =>
verify(mockDispatcher, times(0)).signalNewHead(anyInt())
verify(mockDispatcher, times(0)).signalNewHead(any[Int])
actual should be(a[SubmissionResult.InternalError])
}
}

View File

@ -14,12 +14,15 @@ import com.daml.lf.transaction.test.TransactionBuilder
import com.daml.lf.transaction.{SubmittedTransaction, Transaction}
import com.daml.logging.LoggingContext
import com.daml.metrics.Metrics
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
class StoreBackedCommandExecutorSpec extends AsyncWordSpec with MockitoSugar with Matchers {
class StoreBackedCommandExecutorSpec
extends AsyncWordSpec
with Matchers
with MockitoSugar
with ArgumentMatchersSugar {
private val emptyTransactionMetadata = Transaction.Metadata(
submissionSeed = None,

View File

@ -7,15 +7,12 @@ import akka.stream.Materializer
import com.daml.ledger.api.health.HealthStatus
import com.daml.ledger.api.testing.utils.AkkaBeforeAndAfterAll
import com.daml.ledger.participant.state.kvutils.DamlKvutils.DamlSubmissionBatch
import com.daml.ledger.participant.state.kvutils.{Envelope, MockitoHelpers}
import com.daml.ledger.participant.state.kvutils.{Bytes, Envelope, MockitoHelpers}
import com.daml.ledger.participant.state.v1.SubmissionResult
import com.daml.ledger.participant.state.{kvutils, v1}
import com.daml.logging.LoggingContext
import com.google.protobuf.ByteString
import org.mockito.ArgumentMatchers._
import org.mockito.Mockito.{times, verify, when}
import org.mockito.MockitoSugar._
import org.mockito.{ArgumentCaptor, ArgumentMatchers}
import org.mockito.{ArgumentCaptor, ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.concurrent.Eventually
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
@ -27,7 +24,9 @@ class BatchingLedgerWriterSpec
extends AsyncWordSpec
with AkkaBeforeAndAfterAll
with Eventually
with Matchers {
with Matchers
with MockitoSugar
with ArgumentMatchersSugar {
import BatchingLedgerWriterSpec._
@ -40,8 +39,7 @@ class BatchingLedgerWriterSpec
val handle = mock[RunningBatchingQueueHandle]
when(handle.state).thenReturn(RunningBatchingQueueState.Closing)
val queue = mock[BatchingQueue]
when(queue.run(any[BatchingQueue.CommitBatchFunction]())(any[Materializer]))
.thenReturn(handle)
when(queue.run(any[BatchingQueue.CommitBatchFunction])(any[Materializer])).thenReturn(handle)
val writer = mock[LedgerWriter]
val batchingWriter =
LoggingContext.newLoggingContext { implicit ctx =>
@ -63,10 +61,9 @@ class BatchingLedgerWriterSpec
submissionResult <- batchingWriter.commit(aCorrelationId, aSubmission, someCommitMetadata)
} yield {
verify(mockWriter).commit(
anyString(),
ArgumentMatchers.eq(expectedBatch),
ArgumentMatchers.argThat((metadata: CommitMetadata) =>
metadata.estimatedInterpretationCost.isEmpty)
any[String],
eqTo(expectedBatch),
argThat((metadata: CommitMetadata) => metadata.estimatedInterpretationCost.isEmpty),
)
submissionResult should be(SubmissionResult.Acknowledged)
}
@ -84,8 +81,7 @@ class BatchingLedgerWriterSpec
result2 <- batchingWriter.commit("test2", aSubmission, someCommitMetadata)
result3 <- batchingWriter.commit("test3", aSubmission, someCommitMetadata)
} yield {
verify(mockWriter, times(3))
.commit(anyString(), any[kvutils.Bytes], any[CommitMetadata])
verify(mockWriter, times(3)).commit(any[String], any[Bytes], any[CommitMetadata])
all(Seq(result1, result2, result3)) should be(SubmissionResult.Acknowledged)
batchingWriter.currentHealth should be(HealthStatus.healthy)
}
@ -95,7 +91,7 @@ class BatchingLedgerWriterSpec
}
object BatchingLedgerWriterSpec {
object BatchingLedgerWriterSpec extends MockitoSugar with ArgumentMatchersSugar {
private val aCorrelationId = "aCorrelationId"
private val aSubmission = ByteString.copyFromUtf8("a submission")
@ -119,11 +115,7 @@ object BatchingLedgerWriterSpec {
private def createMockWriter(captor: Option[ArgumentCaptor[kvutils.Bytes]]): LedgerWriter = {
val writer = mock[LedgerWriter]
when(
writer.commit(
anyString(),
captor.map(_.capture()).getOrElse(any[kvutils.Bytes]),
any[CommitMetadata]))
when(writer.commit(any[String], captor.map(_.capture()).getOrElse(any), any[CommitMetadata]))
.thenReturn(Future.successful(SubmissionResult.Acknowledged))
when(writer.participantId).thenReturn(v1.ParticipantId.assertFromString("test-participant"))
when(writer.currentHealth()).thenReturn(HealthStatus.healthy)

View File

@ -7,8 +7,7 @@ import com.daml.ledger.api.health.{Healthy, Unhealthy}
import com.daml.ledger.participant.state.kvutils.Bytes
import com.daml.ledger.participant.state.v1.SubmissionResult.Acknowledged
import com.google.protobuf.ByteString
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
@ -17,7 +16,8 @@ import scala.concurrent.Future
class InterpretationCostBasedLedgerWriterChooserSpec
extends AsyncWordSpec
with Matchers
with MockitoSugar {
with MockitoSugar
with ArgumentMatchersSugar {
"commit" should {
"delegate to cheap writer in case of no estimated interpretation cost" in {
val commitMetadata = simpleCommitMetadata(estimatedInterpretationCost = None)
@ -36,7 +36,7 @@ class InterpretationCostBasedLedgerWriterChooserSpec
"delegate to cheap writer in case estimated interpretation cost is below threshold" in {
val commitMetadata = simpleCommitMetadata(estimatedInterpretationCost = Some(1))
val mockWriterCheap = mock[LedgerWriter]
when(mockWriterCheap.commit(anyString(), any[Bytes], any[CommitMetadata]))
when(mockWriterCheap.commit(any[String], any[Bytes], any[CommitMetadata]))
.thenReturn(Future.successful(Acknowledged))
val instance =
new InterpretationCostBasedLedgerWriterChooser(2L, mockWriterCheap, mock[LedgerWriter])
@ -50,7 +50,7 @@ class InterpretationCostBasedLedgerWriterChooserSpec
"delegate to expensive writer in case estimated interpretation cost reaches the threshold" in {
val commitMetadata = simpleCommitMetadata(estimatedInterpretationCost = Some(1))
val mockWriterExpensive = mock[LedgerWriter]
when(mockWriterExpensive.commit(anyString(), any[Bytes], any[CommitMetadata]))
when(mockWriterExpensive.commit(any[String], any[Bytes], any[CommitMetadata]))
.thenReturn(Future.successful(Acknowledged))
val instance =
new InterpretationCostBasedLedgerWriterChooser(1L, mock[LedgerWriter], mockWriterExpensive)
@ -64,7 +64,7 @@ class InterpretationCostBasedLedgerWriterChooserSpec
"delegate to expensive writer in case threshold is 0" in {
val commitMetadata = simpleCommitMetadata(estimatedInterpretationCost = None)
val mockWriterExpensive = mock[LedgerWriter]
when(mockWriterExpensive.commit(anyString(), any[Bytes], any[CommitMetadata]))
when(mockWriterExpensive.commit(any[String], any[Bytes], any[CommitMetadata]))
.thenReturn(Future.successful(Acknowledged))
val instance =
new InterpretationCostBasedLedgerWriterChooser(0L, mock[LedgerWriter], mockWriterExpensive)

View File

@ -22,17 +22,18 @@ import com.daml.lf.data.Ref
import com.daml.lf.data.Time.Timestamp
import com.daml.lf.transaction.test.TransactionBuilder
import com.daml.metrics.Metrics
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers._
import org.mockito.Mockito.{times, verify, when}
import org.mockito.MockitoSugar._
import org.mockito.{ArgumentCaptor, ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.Assertion
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import scala.concurrent.Future
class KeyValueParticipantStateWriterSpec extends AnyWordSpec with Matchers {
class KeyValueParticipantStateWriterSpec
extends AnyWordSpec
with Matchers
with MockitoSugar
with ArgumentMatchersSugar {
"participant state writer" should {
"submit a transaction" in {
val transactionCaptor = captor[Bytes]
@ -49,7 +50,7 @@ class KeyValueParticipantStateWriterSpec extends AnyWordSpec with Matchers {
TransactionBuilder.EmptySubmitted,
anInterpretationCost)
verify(writer, times(1)).commit(anyString(), any[Bytes], any[CommitMetadata])
verify(writer, times(1)).commit(any[String], any[Bytes], any[CommitMetadata])
verifyEnvelope(transactionCaptor.getValue)(_.hasTransactionEntry)
correlationIdCaptor.getValue should be(expectedCorrelationId)
val actualCommitMetadata = metadataCaptor.getValue
@ -66,7 +67,7 @@ class KeyValueParticipantStateWriterSpec extends AnyWordSpec with Matchers {
instance.uploadPackages(aSubmissionId, List.empty, sourceDescription = None)
verify(writer, times(1)).commit(anyString(), any[Bytes], any[CommitMetadata])
verify(writer, times(1)).commit(any[String], any[Bytes], any[CommitMetadata])
verifyEnvelope(packageUploadCaptor.getValue)(_.hasPackageUploadEntry)
val actualCommitMetadata = metadataCaptor.getValue
actualCommitMetadata.inputKeys(aSerializationStrategy) should not be empty
@ -81,7 +82,7 @@ class KeyValueParticipantStateWriterSpec extends AnyWordSpec with Matchers {
instance.submitConfiguration(newRecordTime().addMicros(10000), aSubmissionId, aConfiguration)
verify(writer, times(1)).commit(anyString(), any[Bytes], any[CommitMetadata])
verify(writer, times(1)).commit(any[String], any[Bytes], any[CommitMetadata])
verifyEnvelope(configurationCaptor.getValue)(_.hasConfigurationSubmission)
val actualCommitMetadata = metadataCaptor.getValue
actualCommitMetadata.inputKeys(aSerializationStrategy) should not be empty
@ -96,7 +97,7 @@ class KeyValueParticipantStateWriterSpec extends AnyWordSpec with Matchers {
instance.allocateParty(hint = None, displayName = None, aSubmissionId)
verify(writer, times(1)).commit(anyString(), any[Bytes], any[CommitMetadata])
verify(writer, times(1)).commit(any[String], any[Bytes], any[CommitMetadata])
verifyEnvelope(partyAllocationCaptor.getValue)(_.hasPartyAllocationEntry)
val actualCommitMetadata = metadataCaptor.getValue
actualCommitMetadata.inputKeys(aSerializationStrategy) should not be empty
@ -113,6 +114,8 @@ class KeyValueParticipantStateWriterSpec extends AnyWordSpec with Matchers {
object KeyValueParticipantStateWriterSpec {
import MockitoSugar._
private val aParty = Ref.Party.assertFromString("aParty")
private val aSubmissionId: SubmissionId =

View File

@ -9,20 +9,22 @@ import com.daml.ledger.validator.LedgerStateOperations.{Key, Value}
import com.daml.ledger.validator.LogAppendingCommitStrategySpec._
import com.daml.ledger.validator.TestHelper._
import com.google.protobuf.ByteString
import org.mockito.ArgumentMatchers
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
import scala.concurrent.{ExecutionContext, Future}
final class LogAppendingCommitStrategySpec extends AsyncWordSpec with Matchers with MockitoSugar {
final class LogAppendingCommitStrategySpec
extends AsyncWordSpec
with Matchers
with MockitoSugar
with ArgumentMatchersSugar {
"commit" should {
"return index from appendToLog" in {
val mockLedgerStateOperations = mock[LedgerStateOperations[Long]]
val expectedIndex = 1234L
when(mockLedgerStateOperations.appendToLog(any[Key](), any[Value]())(any[ExecutionContext]()))
when(mockLedgerStateOperations.appendToLog(any[Key], any[Value])(anyExecutionContext))
.thenReturn(Future.successful(expectedIndex))
val instance =
new LogAppendingCommitStrategy[Long](
@ -32,20 +34,19 @@ final class LogAppendingCommitStrategySpec extends AsyncWordSpec with Matchers w
instance
.commit(aParticipantId, "a correlation ID", aLogEntryId(), aLogEntry, Map.empty, Map.empty)
.map { actualIndex =>
verify(mockLedgerStateOperations, times(1)).appendToLog(any[Key](), any[Value]())(
any[ExecutionContext]())
verify(mockLedgerStateOperations, times(1)).appendToLog(any[Key], any[Value])(
anyExecutionContext)
verify(mockLedgerStateOperations, times(0))
.writeState(any[Seq[(Key, Value)]]())(any[ExecutionContext]())
.writeState(any[Iterable[(Key, Value)]])(anyExecutionContext)
actualIndex should be(expectedIndex)
}
}
"write keys serialized according to strategy" in {
val mockLedgerStateOperations = mock[LedgerStateOperations[Long]]
when(
mockLedgerStateOperations.writeState(any[Iterable[(Key, Value)]])(any[ExecutionContext]()))
when(mockLedgerStateOperations.writeState(any[Iterable[(Key, Value)]])(anyExecutionContext))
.thenReturn(Future.unit)
when(mockLedgerStateOperations.appendToLog(any[Key], any[Value])(any[ExecutionContext]()))
when(mockLedgerStateOperations.appendToLog(any[Key], any[Value])(anyExecutionContext))
.thenReturn(Future.successful(0L))
val mockStateKeySerializationStrategy = mock[StateKeySerializationStrategy]
val expectedStateKey = ByteString.copyFromUtf8("some key")
@ -68,7 +69,7 @@ final class LogAppendingCommitStrategySpec extends AsyncWordSpec with Matchers w
.map { _: Long =>
verify(mockStateKeySerializationStrategy, times(1)).serializeStateKey(aStateKey)
verify(mockLedgerStateOperations, times(1))
.writeState(ArgumentMatchers.eq(expectedOutputStateBytes))(any[ExecutionContext]())
.writeState(eqTo(expectedOutputStateBytes))(anyExecutionContext)
succeed
}
}
@ -76,6 +77,11 @@ final class LogAppendingCommitStrategySpec extends AsyncWordSpec with Matchers w
}
object LogAppendingCommitStrategySpec {
import ArgumentMatchersSugar._
private def anyExecutionContext = any[ExecutionContext]
private val aStateKey: DamlStateKey = DamlStateKey
.newBuilder()
.setContractId(1.toString)

View File

@ -9,15 +9,20 @@ import com.daml.ledger.participant.state.kvutils.DamlKvutils.{
DamlStateValue
}
import com.daml.ledger.participant.state.kvutils.Envelope
import com.daml.ledger.validator.LedgerStateOperations.Key
import com.daml.ledger.validator.RawToDamlLedgerStateReaderAdapterSpec._
import com.daml.ledger.validator.TestHelper.{anInvalidEnvelope, makePartySubmission}
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
import scala.concurrent.{ExecutionContext, Future}
class RawToDamlLedgerStateReaderAdapterSpec extends AsyncWordSpec with Matchers with MockitoSugar {
class RawToDamlLedgerStateReaderAdapterSpec
extends AsyncWordSpec
with Matchers
with MockitoSugar
with ArgumentMatchersSugar {
"readState" should {
"read the right key and deserialize it" in {
val expectedKey = DefaultStateKeySerializationStrategy.serializeStateKey(aDamlStateKey())
@ -25,7 +30,7 @@ class RawToDamlLedgerStateReaderAdapterSpec extends AsyncWordSpec with Matchers
.setParty(DamlPartyAllocation.newBuilder.setDisplayName("aParty"))
.build
val mockReader = mock[LedgerStateReader]
when(mockReader.read(any[Seq[LedgerStateOperations.Key]]())(any[ExecutionContext]()))
when(mockReader.read(any[Seq[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(Envelope.enclose(expectedValue)))))
val instance =
new RawToDamlLedgerStateReaderAdapter(mockReader, DefaultStateKeySerializationStrategy)
@ -38,7 +43,7 @@ class RawToDamlLedgerStateReaderAdapterSpec extends AsyncWordSpec with Matchers
"throw in case of an invalid envelope returned from underlying reader" in {
val mockReader = mock[LedgerStateReader]
when(mockReader.read(any[Seq[LedgerStateOperations.Key]]())(any[ExecutionContext]()))
when(mockReader.read(any[Seq[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(anInvalidEnvelope))))
val instance =
new RawToDamlLedgerStateReaderAdapter(mockReader, DefaultStateKeySerializationStrategy)
@ -52,7 +57,7 @@ class RawToDamlLedgerStateReaderAdapterSpec extends AsyncWordSpec with Matchers
"throw in case an enveloped value other than a DamlStateValue is returned from underlying reader" in {
val notADamlStateValue = makePartySubmission("aParty")
val mockReader = mock[LedgerStateReader]
when(mockReader.read(any[Seq[LedgerStateOperations.Key]]())(any[ExecutionContext]()))
when(mockReader.read(any[Seq[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(Envelope.enclose(notADamlStateValue)))))
val instance =
new RawToDamlLedgerStateReaderAdapter(mockReader, DefaultStateKeySerializationStrategy)
@ -63,6 +68,13 @@ class RawToDamlLedgerStateReaderAdapterSpec extends AsyncWordSpec with Matchers
}
}
}
}
object RawToDamlLedgerStateReaderAdapterSpec {
import ArgumentMatchersSugar._
private def anyExecutionContext = any[ExecutionContext]
private def aDamlStateKey(): DamlStateKey =
DamlStateKey.newBuilder

View File

@ -11,6 +11,7 @@ import com.daml.ledger.participant.state.kvutils.DamlKvutils._
import com.daml.ledger.participant.state.kvutils.MockitoHelpers.captor
import com.daml.ledger.participant.state.kvutils.{Bytes, Envelope, KeyValueCommitting}
import com.daml.ledger.participant.state.v1.ParticipantId
import com.daml.ledger.validator.LedgerStateOperations.{Key, Value}
import com.daml.ledger.validator.SubmissionValidator.RawKeyValuePairs
import com.daml.ledger.validator.SubmissionValidatorSpec._
import com.daml.ledger.validator.ValidationFailed.{MissingInputState, ValidationError}
@ -18,9 +19,7 @@ import com.daml.lf.data.Time.Timestamp
import com.daml.lf.engine.Engine
import com.daml.metrics.Metrics
import com.google.protobuf.{ByteString, Empty}
import org.mockito.ArgumentMatchers._
import org.mockito.Mockito.{times, verify, when}
import org.mockito.MockitoSugar._
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.Inside
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
@ -28,11 +27,16 @@ import org.scalatest.wordspec.AsyncWordSpec
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
class SubmissionValidatorSpec
extends AsyncWordSpec
with Matchers
with Inside
with MockitoSugar
with ArgumentMatchersSugar {
"validate" should {
"return success in case of no errors during processing of submission" in {
val mockStateOperations = mock[LedgerStateOperations[Unit]]
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(aStateValue()))))
val instance = SubmissionValidator.create(
new FakeStateAccess(mockStateOperations),
@ -49,7 +53,7 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
"signal missing input in case state cannot be retrieved" in {
val mockStateOperations = mock[LedgerStateOperations[Unit]]
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(None)))
val instance = SubmissionValidator.create(
ledgerStateAccess = new FakeStateAccess(mockStateOperations),
@ -86,7 +90,7 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
"return invalid submission in case exception is thrown during processing of submission" in {
val mockStateOperations = mock[BatchingLedgerStateOperations[Unit]]
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(aStateValue()))))
val failingProcessSubmission: SubmissionValidator.ProcessSubmission =
@ -112,13 +116,13 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
"write marshalled log entry to ledger" in {
val mockStateOperations = mock[LedgerStateOperations[Int]]
val expectedLogResult: Int = 3
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(aStateValue()))))
val logEntryValueCaptor = captor[Bytes]
val logEntryIdCaptor = captor[Bytes]
when(
mockStateOperations.appendToLog(logEntryIdCaptor.capture(), logEntryValueCaptor.capture())(
any[ExecutionContext]()))
anyExecutionContext))
.thenReturn(Future.successful(expectedLogResult))
val expectedLogEntryId = aLogEntryId()
val mockLogEntryIdGenerator = mockFunctionReturning(expectedLogEntryId)
@ -140,7 +144,7 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
actualLogResult should be(expectedLogResult)
verify(mockLogEntryIdGenerator, times(1)).apply()
verify(mockStateOperations, times(0))
.writeState(any[RawKeyValuePairs]())(any[ExecutionContext]())
.writeState(any[Iterable[(Key, Value)]])(anyExecutionContext)
logEntryValueCaptor.getAllValues should have size 1
logEntryIdCaptor.getAllValues should have size 1
logEntryIdCaptor.getValue should be(expectedLogEntryId.toByteString)
@ -152,16 +156,13 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
"write marshalled key-value pairs to ledger" in {
val mockStateOperations = mock[LedgerStateOperations[Int]]
val expectedLogResult: Int = 7
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(aStateValue()))))
val writtenKeyValuesCaptor = captor[RawKeyValuePairs]
when(
mockStateOperations.writeState(writtenKeyValuesCaptor.capture())(any[ExecutionContext]()))
when(mockStateOperations.writeState(writtenKeyValuesCaptor.capture())(anyExecutionContext))
.thenReturn(Future.unit)
val logEntryCaptor = captor[Bytes]
when(
mockStateOperations.appendToLog(any[Bytes](), logEntryCaptor.capture())(
any[ExecutionContext]()))
when(mockStateOperations.appendToLog(any[Key], logEntryCaptor.capture())(anyExecutionContext))
.thenReturn(Future.successful(expectedLogResult))
val logEntryAndStateResult = (aLogEntry(), someStateUpdates)
val instance = new SubmissionValidator(
@ -190,16 +191,13 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
"support batch with single submission" in {
val mockStateOperations = mock[LedgerStateOperations[Int]]
val expectedLogResult: Int = 7
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Key]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(aStateValue()))))
val writtenKeyValuesCaptor = captor[RawKeyValuePairs]
when(
mockStateOperations.writeState(writtenKeyValuesCaptor.capture())(any[ExecutionContext]()))
when(mockStateOperations.writeState(writtenKeyValuesCaptor.capture())(anyExecutionContext))
.thenReturn(Future.unit)
val logEntryCaptor = captor[Bytes]
when(
mockStateOperations.appendToLog(any[Bytes](), logEntryCaptor.capture())(
any[ExecutionContext]()))
when(mockStateOperations.appendToLog(any[Key], logEntryCaptor.capture())(anyExecutionContext))
.thenReturn(Future.successful(expectedLogResult))
val logEntryAndStateResult = (aLogEntry(), someStateUpdates)
val instance = new SubmissionValidator(
@ -266,11 +264,11 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
"return invalid submission if state cannot be written" in {
val mockStateOperations = mock[LedgerStateOperations[Int]]
when(mockStateOperations.writeState(any[RawKeyValuePairs]())(any[ExecutionContext]()))
when(mockStateOperations.writeState(any[Iterable[(Key, Value)]])(anyExecutionContext))
.thenThrow(new IllegalArgumentException("Write error"))
when(mockStateOperations.readState(any[Seq[Bytes]]())(any[ExecutionContext]()))
when(mockStateOperations.readState(any[Iterable[Bytes]])(anyExecutionContext))
.thenReturn(Future.successful(Seq(Some(aStateValue()))))
when(mockStateOperations.appendToLog(any[Bytes](), any[Bytes]())(any[ExecutionContext]()))
when(mockStateOperations.appendToLog(any[Key], any[Value])(anyExecutionContext))
.thenReturn(Future.successful(99))
val logEntryAndStateResult = (aLogEntry(), someStateUpdates)
val instance = new SubmissionValidator(
@ -294,6 +292,11 @@ class SubmissionValidatorSpec extends AsyncWordSpec with Matchers with Inside {
object SubmissionValidatorSpec {
import ArgumentMatchersSugar._
import MockitoSugar._
private def anyExecutionContext = any[ExecutionContext]
private def aLogEntry(): DamlLogEntry =
DamlLogEntry
.newBuilder()
@ -331,7 +334,7 @@ object SubmissionValidatorSpec {
private def mockFunctionReturning[A](returnValue: A): () => A = {
val mockFunction = mock[() => A]
when(mockFunction.apply).thenReturn(returnValue)
when(mockFunction.apply()).thenReturn(returnValue)
mockFunction
}
@ -342,5 +345,4 @@ object SubmissionValidatorSpec {
)(implicit executionContext: ExecutionContext): Future[T] =
body(mockStateOperations)
}
}

View File

@ -15,12 +15,12 @@ import com.daml.ledger.participant.state.kvutils.export.SubmissionAggregator
import com.daml.ledger.participant.state.v1.ParticipantId
import com.daml.ledger.validator.CommitStrategy
import com.daml.ledger.validator.TestHelper._
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import com.daml.ledger.validator.caching.CachingCommitStrategySpec._
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
import scala.concurrent.Future
import scala.concurrent.{ExecutionContext, Future}
class CachingCommitStrategySpec extends AsyncWordSpec with Matchers with MockitoSugar {
"commit" should {
@ -50,22 +50,29 @@ class CachingCommitStrategySpec extends AsyncWordSpec with Matchers with Mockito
}
}
}
}
object CachingCommitStrategySpec {
import ArgumentMatchersSugar._
import MockitoSugar._
private def newCache(): Cache[DamlStateKey, DamlStateValue] =
WeightedCache.from[DamlStateKey, DamlStateValue](WeightedCache.Configuration(1024))
private def createInstance(
cache: Cache[DamlStateKey, DamlStateValue],
shouldCache: Boolean): CachingCommitStrategy[Unit] = {
shouldCache: Boolean,
)(implicit executionContext: ExecutionContext): CachingCommitStrategy[Unit] = {
val mockCommitStrategy = mock[CommitStrategy[Unit]]
when(
mockCommitStrategy.commit(
any[ParticipantId](),
anyString(),
any[DamlLogEntryId](),
any[DamlLogEntry](),
any[Map[DamlStateKey, Option[DamlStateValue]]](),
any[Map[DamlStateKey, DamlStateValue]](),
any[ParticipantId],
any[String],
any[DamlLogEntryId],
any[DamlLogEntry],
any[Map[DamlStateKey, Option[DamlStateValue]]],
any[Map[DamlStateKey, DamlStateValue]],
any[Option[SubmissionAggregator.WriteSetBuilder]],
))
.thenReturn(Future.unit)

View File

@ -7,8 +7,7 @@ import com.daml.caching.WeightedCache
import com.daml.ledger.participant.state.kvutils.DamlKvutils.{DamlStateKey, DamlStateValue}
import com.daml.ledger.participant.state.kvutils.caching.`Message Weight`
import com.daml.ledger.validator.{DamlLedgerStateReader, DefaultStateKeySerializationStrategy}
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.Inside
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
@ -19,7 +18,8 @@ class CachingDamlLedgerStateReaderSpec
extends AsyncWordSpec
with Matchers
with Inside
with MockitoSugar {
with MockitoSugar
with ArgumentMatchersSugar {
"readState" should {
"record read keys" in {
@ -59,7 +59,7 @@ class CachingDamlLedgerStateReaderSpec
"serve request from cache for seen key (if policy allows)" in {
val mockReader = mock[DamlLedgerStateReader]
when(mockReader.readState(any[Seq[DamlStateKey]]())).thenReturn(Future.successful(Seq(None)))
when(mockReader.readState(any[Seq[DamlStateKey]])).thenReturn(Future.successful(Seq(None)))
val instance = newInstance(mockReader, shouldCache = true)
for {

View File

@ -28,8 +28,7 @@ import com.daml.lf.data.Time.Timestamp
import com.daml.logging.LoggingContext
import com.daml.metrics.Metrics
import com.google.protobuf.ByteString
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.Assertion
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
@ -206,6 +205,7 @@ class PreExecutingSubmissionValidatorSpec extends AsyncWordSpec with Matchers wi
object PreExecutingSubmissionValidatorSpec {
import ArgumentMatchersSugar._
import MockitoSugar._
private val recordTime = Timestamp.now()

View File

@ -7,14 +7,17 @@ import java.nio.file.Paths
import com.daml.ledger.participant.state.kvutils.tools.integritycheck.Builders._
import com.daml.ledger.validator.LedgerStateOperations.{Key, Value}
import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpec
import scala.concurrent.Future
final class IntegrityCheckerSpec extends AsyncWordSpec with Matchers with MockitoSugar {
final class IntegrityCheckerSpec
extends AsyncWordSpec
with Matchers
with MockitoSugar
with ArgumentMatchersSugar {
"compareSameSizeWriteSets" should {
"return None in case strategy cannot explain difference" in {
val mockCommitStrategySupport = mock[CommitStrategySupport[Unit]]