Expose Daml-LF parser to trigger simulations (#17021)

This commit is contained in:
Carl Pulley 2023-06-22 12:57:38 +01:00 committed by GitHub
parent 7d458f17ac
commit 35f4566222
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 2 deletions

View File

@ -21,6 +21,7 @@ da_scala_library(
visibility = [
"//daml-lf:__subpackages__",
"//ledger:__subpackages__",
"//triggers:__subpackages__",
],
deps = [
"//daml-lf/data",

View File

@ -237,6 +237,8 @@ da_scala_library(
"//canton/it-lib",
"//daml-lf/data",
"//daml-lf/interpreter",
"//daml-lf/language",
"//daml-lf/parser",
"//daml-lf/transaction",
"//daml-script/converter",
"//language-support/scala/bindings",

View File

@ -5,17 +5,22 @@ package com.daml.lf.engine.trigger
package simulation
import akka.actor.typed.{ActorRef, ActorSystem, Behavior, ChildFailed, SupervisorStrategy}
import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.scaladsl.{ActorContext, Behaviors}
import com.daml.ledger.api.refinements.ApiTypes
import com.daml.ledger.client.LedgerClient
import com.daml.lf.engine.trigger.simulation.process.TriggerProcessFactory
import com.daml.lf.engine.trigger.simulation.process.ledger.LedgerProcess
import com.daml.lf.engine.trigger.test.AbstractTriggerTest
import com.daml.lf.engine.trigger.test.AbstractTriggerTest.allocateParty
import com.daml.lf.speedy.{SValue, Speedy}
import com.daml.lf.testing.parser
import com.daml.lf.testing.parser.{defaultLanguageVersion, parseExpr}
import com.daml.logging.LoggingContext
import org.scalatest.wordspec.AsyncWordSpec
import java.nio.file.{Files, Path}
import scala.concurrent.duration._
import scala.concurrent.Promise
import scala.concurrent.{Await, Promise}
abstract class TriggerMultiProcessSimulation extends AsyncWordSpec with AbstractTriggerTest {
@ -108,6 +113,47 @@ abstract class TriggerMultiProcessSimulation extends AsyncWordSpec with Abstract
actAs,
)
}
protected def withLedger(
spawnTriggers: (
LedgerClient,
ActorRef[LedgerProcess.Message],
ApiTypes.Party,
ActorContext[Unit],
) => Behavior[Unit]
)(implicit applicationId: ApiTypes.ApplicationId): Behavior[Unit] = {
Behaviors.setup { controllerContext =>
val setup = for {
client <- defaultLedgerClient()
party <- allocateParty(client)
} yield (client, party)
val (client, actAs) = Await.result(setup, simulationConfig.simulationSetupTimeout)
val ledger = controllerContext.spawn(LedgerProcess.create(client), "ledger")
controllerContext.watch(ledger)
spawnTriggers(client, ledger, actAs, controllerContext)
}
}
protected def safeSValueFromLf(lfValue: String): Either[String, SValue] = {
val parserParameters: parser.ParserParameters[this.type] =
parser.ParserParameters(
defaultPackageId = packageId,
languageVersion = defaultLanguageVersion,
)
parseExpr(lfValue)(parserParameters).flatMap(expr =>
Speedy.Machine
.runPureExpr(expr, compiledPackages)(LoggingContext.ForTesting)
.left
.map(_.toString)
)
}
protected def unsafeSValueFromLf(lfValue: String): SValue = {
safeSValueFromLf(lfValue).left.map(cause => throw new RuntimeException(cause)).toOption.get
}
}
object TriggerMultiProcessSimulation {