diff --git a/docs/source/tools/ledger-api-test-tool/index.rst b/docs/source/tools/ledger-api-test-tool/index.rst index 04b2cb9cf4..b2dcda3e7f 100644 --- a/docs/source/tools/ledger-api-test-tool/index.rst +++ b/docs/source/tools/ledger-api-test-tool/index.rst @@ -69,6 +69,7 @@ Use the following command line flags to select which tests to run: - ``--include``: only run the tests that match the argument - ``--exclude``: do not run the tests that match the argument - ``--perf-tests``: list performance tests to run; cannot be combined with normal tests +- ``--skip-dar-upload``: skip upload of DAR files into ledger. DAR files should be uploaded manually before the tests. Include and exclude are matched as prefixes, e.g. ``--exclude=SemanticTests`` will exclude all tests whose name starts with ``SemanticTests``. Test names diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala index ba45a253cf..d425b36290 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala @@ -202,6 +202,11 @@ object Cli { .action((interval, c) => c.copy(ledgerClockGranularityMs = interval)) .text("Specify the largest interval in ms that you will see between clock ticks on the ledger under test. The default is 10000ms") + opt[Unit]("skip-dar-upload") + .optional() + .action((_, c) => c.copy(uploadDars = false)) + .text("Skip DARs upload into ledger before running tests") + help("help").text("Prints this usage text") } diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Config.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Config.scala index d50e0c38c2..1ec4003a86 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Config.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Config.scala @@ -27,6 +27,7 @@ final case class Config( shuffleParticipants: Boolean, partyAllocation: PartyAllocationConfiguration, ledgerClockGranularityMs: Int, + uploadDars: Boolean, ) object Config { @@ -48,5 +49,6 @@ object Config { shuffleParticipants = false, partyAllocation = PartyAllocationConfiguration.ClosedWorldWaitingForAllParticipants, ledgerClockGranularityMs = 10000, + uploadDars = true, ) } diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala index daea49810b..de82855ece 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala @@ -187,5 +187,6 @@ object LedgerApiTestTool { identifierSuffix, config.timeoutScaleFactor, concurrencyOverride.getOrElse(config.concurrentTestRuns), + uploadDars = config.uploadDars, ) } diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala index 32b7a1b695..7ed50f517b 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala @@ -11,7 +11,10 @@ import akka.stream.Materializer import akka.stream.scaladsl.{Sink, Source} import com.daml.ledger.api.testtool.infrastructure.LedgerTestCasesRunner._ import com.daml.ledger.api.testtool.infrastructure.Result.Retired -import com.daml.ledger.api.testtool.infrastructure.participant.ParticipantSessionManager +import com.daml.ledger.api.testtool.infrastructure.participant.{ + ParticipantSessionManager, + ParticipantTestContext +} import org.slf4j.LoggerFactory import scala.concurrent.duration.{Duration, DurationInt} @@ -39,6 +42,7 @@ final class LedgerTestCasesRunner( identifierSuffix: String, suiteTimeoutScale: Double, concurrentTestRuns: Int, + uploadDars: Boolean, ) { private[this] val verifyRequirements: Try[Unit] = Try { @@ -112,28 +116,34 @@ final class LedgerTestCasesRunner( ): Future[Either[Result.Failure, Result.Success]] = result(start(test, session)) + private def uploadDarsIfRequired(participantSessionManager: ParticipantSessionManager)( + implicit ec: ExecutionContext): Future[Unit] = + if (uploadDars) { + def uploadDar(context: ParticipantTestContext, name: String): Future[Unit] = { + logger.info(s"""Uploading DAR "$name"...""") + context.uploadDarFile(Dars.read(name)).andThen { + case _ => logger.info(s"""Uploaded DAR "$name".""") + } + } + + Future + .sequence(participantSessionManager.allSessions.map { session => + for { + context <- session.createInitContext("upload-dars", identifierSuffix) + _ <- Future.sequence(Dars.resources.map(uploadDar(context, _))) + } yield () + }) + .map(_ => ()) + } else { + Future.successful(logger.info("DAR files upload skipped.")) + } + private def run(completionCallback: Try[Vector[LedgerTestSummary]] => Unit): Unit = { val system: ActorSystem = ActorSystem(classOf[LedgerTestCasesRunner].getSimpleName) implicit val materializer: Materializer = Materializer(system) implicit val executionContext: ExecutionContext = materializer.executionContext - def uploadDars(participantSessionManager: ParticipantSessionManager): Future[Unit] = - Future - .sequence(participantSessionManager.allSessions.map { session => - for { - context <- session.createInitContext("upload-dars", identifierSuffix) - _ <- Future.sequence(Dars.resources.map { name => - logger.info("Uploading DAR \"{}\"...", name) - context.uploadDarFile(Dars.read(name)).andThen { - case _ => - logger.info("Uploaded DAR \"{}\".", name) - } - }) - } yield () - }) - .map(_ => ()) - def runTestCases( ledgerSession: LedgerSession, testCases: Vector[LedgerTestCase], @@ -156,7 +166,7 @@ final class LedgerTestCasesRunner( val ledgerSession = LedgerSession(participantSessionManager, config.shuffleParticipants) val testResults = for { - _ <- uploadDars(participantSessionManager) + _ <- uploadDarsIfRequired(participantSessionManager) concurrentTestResults <- runTestCases( ledgerSession, concurrentTestCases,