-
Notifications
You must be signed in to change notification settings - Fork 205
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tests for transaction validation #10167
Conversation
/azp run |
Azure Pipelines successfully started running 1 pipeline(s). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like it very much. Thanks a lot.
val versionBeforeMinByKey: (TransactionVersion => Boolean) = { v => | ||
import scala.Ordering.Implicits.infixOrderingOps | ||
v < TransactionVersion.minByKey | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just curious to know
- why it is a
val
? - why it is not private like the other (I do not really care of
private
for tests) ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
val? -- no good reason. I changed to def.
not private? -- oversight. fixed now.
(good spot, thanks)
the reason I liked to use private
here (when I remembered!) is that is ensures that everything definition has a use.
private def tweakKeyMaintainers = Tweak[KWM] { x => | ||
List(samKWM1, samKWM2, samKWM3).filter(y => x != y) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why this one is not a val
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not a val? -- no good reason. changed to a val
.
If you want to know the actual reason... during development I often use ???
for code I haven''t yet written, but I often want to check the overall structure compiles. However, scalac
complains about unreachable code for combinations of val
/???
, so I must use def
as a temporary workaround.
|
||
private val tweakOptKeyMaintainersSome = Tweak[OKWM] { | ||
case None => List() // don't tweak from None | ||
case Some(x) => None :: List(samKWM1, samKWM2, samKWM3).filter(y => x != y).map(Some(_)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just an alternative, not really better.
case Some(x) => None :: List(samKWM1, samKWM2, samKWM3).filter(y => x != y).map(Some(_)) | |
case Some(x) => None :: List(samKWM1, samKWM2, samKWM3).collect{ case y if x != y => Some(y) }``` |
private object Tweak { | ||
def single[X](f1: X => Option[X]): Tweak[X] = { | ||
def f(x: X) = f1(x) match { | ||
case None => Nil | ||
case Some(y) => List(y) | ||
} | ||
new Tweak(f) | ||
} | ||
def apply[X](f: X => List[X]): Tweak[X] = { | ||
new Tweak(f) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am perfectly fine with the current state of the Tweak object, but have you consider using PartialFunction
? I find it fits particularly well your use case.
See the following suggestion together with the two suggestions I made line 259 and line 276 (and two others)
private object Tweak { | |
def single[X](f1: X => Option[X]): Tweak[X] = { | |
def f(x: X) = f1(x) match { | |
case None => Nil | |
case Some(y) => List(y) | |
} | |
new Tweak(f) | |
} | |
def apply[X](f: X => List[X]): Tweak[X] = { | |
new Tweak(f) | |
} | |
} | |
private object Tweak { | |
def single[X](f1: PartialFunction[X, X]): Tweak[X] = | |
Tweak(f1.andThen(List(_))) | |
def apply[X](f: PartialFunction[X, List[X]]): Tweak[X] = | |
new Tweak(f.applyOrElse(List.empty)) | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
partial function to list seems a bit odd. Afaict we have no difference between returning an empty list and the function not being defined.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
new Tweak(f.orElse(_ => List.empty[X]))
may work better than new Tweak(f.applyOrElse(List.empty))
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the suggestion about PartialFunction
. I am aware of it, but to be honest it's not something that is in my everyday scala toolbox. Also, I would be a bit unhappy to loose exhaustiveness checking for pattern matches. However, perhaps it would be idiomatic for the use case here. I wont make the change in this PR. Let's discuss offline & you can try to persuade me. :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see any use for the Tweak
class. A type synonym will serve equally well.
When you write a function with partial function syntax, and the expected type is a non-partial function, you will still get exhaustiveness checking. Broadly speaking, this violates the Liskov Substitution Principle (because an expression that satisfies type t
does not satisfy type u >: t
if warnings are errors), but not in a way that violates soundness.
So that means you can write
private type Tweak[T] = T => List[T]
private object Tweak {
def apply[T](f: Tweak[T]): Tweak[T] = f
}
Tweak[Option[Location]] {
case None => //blah blah
// I get an exhaustiveness warning if I don't handle Some
}
private val tweakCreateCoid = Tweak.single[Node] { | ||
case nc: Node.NodeCreate[_] => Some(nc.copy(coid = changeContractId(nc.coid))) | ||
case _ => None | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With the PartialFunction change made above:
private val tweakCreateCoid = Tweak.single[Node] { | |
case nc: Node.NodeCreate[_] => Some(nc.copy(coid = changeContractId(nc.coid))) | |
case _ => None | |
} | |
private val tweakCreateCoid = Tweak.single[Node] { | |
case nc: Node.NodeCreate[_] => nc.copy(coid = changeContractId(nc.coid)) | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is perfectly reasonable to have another method in object Tweak
that takes a PartialFunction
instead and adds the Seq.empty
case with orElse
, producing a total function. You are getting no exhaustiveness-checking value out of many of these tweak definitions, and defining them as @remyhaemmerle-da suggests would clean them up.
|
||
"Significant tweaks" - { | ||
var count = 0 | ||
significantTweaks.foreach { case (name, tweak) => |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Again not a request for change.
You could consider using scala check TableDrivenPropertyChecks
(See for example SBuiltinTest
)
This as the following advantages:
- it runs all the test cases (and not stop at the first failing one)
- it reports slightly nicer errors
@S11001001 are there other advantages ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll have a look at this...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
forEvery
is already doing a lot of the stuff for you so you don't have to do it yourself. For example, a nested forEvery
here would simply report the txA
and txB
in a nice way as part of the failure message, so you would not have to jam it into the fail
string.
And that makes it so that you can simply use shouldBe
or inside
without using fail
at all, and still getting all the stuff you might need to know to understand failures reported.
res match { | ||
case Right(()) => () | ||
case Left(_) => | ||
println(s"**expected $name to be INSIGNIFICANT (but it wasn't)\n-txA=$txA\n-txB=$txB") | ||
assert(false) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not simply res shouldBe Right(())
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
because it is quite helpful to be able to see the txA
and txB
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
forEvery
solves this problem nicely, as mentioned in #10167 (comment).
But there's another aspect here that really illustrates why it's useful to track down the existing combinators rather than use scala-library to simulate them. There are two kinds of failures of these kinds of tests: break-everything, and break-something. As written, these tests stop on the first failure. So you don't really know which of those situations you're in.
With forEvery
, you can immediately tell from one test run whether you've broken everything, just a few things, or a single edge case. It's a bit like the difference between having separate test declarations for each test, and just putting every assertion in the whole file into a single test case.
Redefining this functionality is annoying. And it is quite useful; #8879 was more or less an exercise of adding cases, tweaking or rewriting part of the algorithm, and quickly getting feedback on every shortcoming of whatever change I had just made--whether there was just one detail I had forgotten, or everything collapsed and I had hit a dead end.
println(s"**expected $name to be INSIGNIFICANT (but it wasn't)\n-txA=$txA\n-txB=$txB") | ||
assert(false) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would better not use println.
If you want to display a message on failure, better use fail
.
See ScalaTest assertions
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok, I used fail
private val tweakExerciseExerciseResultSome = Tweak[Node] { //sig | ||
case ne: Node.NodeExercises[_, _] => | ||
ne.exerciseResult match { | ||
case None => Nil | ||
case Some(v) => | ||
List( | ||
ne.copy(exerciseResult = Some(changeValue(v))), | ||
ne.copy(exerciseResult = None), | ||
) | ||
} | ||
case _ => Nil | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With the PartialFunction
change for Tweak.apply
private val tweakExerciseExerciseResultSome = Tweak[Node] { //sig | |
case ne: Node.NodeExercises[_, _] => | |
ne.exerciseResult match { | |
case None => Nil | |
case Some(v) => | |
List( | |
ne.copy(exerciseResult = Some(changeValue(v))), | |
ne.copy(exerciseResult = None), | |
) | |
} | |
case _ => Nil | |
} | |
private val tweakExerciseExerciseResultSome = Tweak[Node] { //sig | |
case ne: Node.NodeExercises[_, _] if ne.exerciseResult.isDefined => | |
List( | |
ne.copy(exerciseResult = ne.exerciseResult.map(changeValue)), | |
ne.copy(exerciseResult = None), | |
) | |
} | |
} |
private def tweakExerciseByKey(whenVersion: TransactionVersion => Boolean) = Tweak.single[Node] { | ||
case ne: Node.NodeExercises[_, _] => | ||
if (whenVersion(ne.version)) Some(ne.copy(byKey = changeBoolean(ne.byKey))) | ||
else None | ||
case _ => None | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
with the PartialFunction
change in Tweak.single
.
private def tweakExerciseByKey(whenVersion: TransactionVersion => Boolean) = Tweak.single[Node] { | |
case ne: Node.NodeExercises[_, _] => | |
if (whenVersion(ne.version)) Some(ne.copy(byKey = changeBoolean(ne.byKey))) | |
else None | |
case _ => None | |
} | |
private def tweakExerciseByKey(whenVersion: TransactionVersion => Boolean) = Tweak.single[Node] { | |
case ne: Node.NodeExercises[_, _] if whenVersion(ne.version) => | |
ne.copy(byKey = changeBoolean(ne.byKey)) | |
} |
changelog_begin changelog_end try fix scala 2_12 build fetch node: samples and tweaks list sig/insig field tweaks side-by-side so coverage is easier to eyeball exerciseResult tweak sig & insig add sig/insig tweak for byKey of Fetch node add sig/insig tweak for key of Fetch node must use ImmArray.empty instead of ImmArray() for scala 2.12 another blind attempt to fix scala 2.12 use for/yield instead of flatMap for list-comprehensions test sig/insig tweaks to LookupByKey nodes wont attempt to tweak rollbacks (and shorten trailing dash in comment banners) comment about how Tweak testing is organized dont dep/import scalacheck (not used!) no wild imports
716b5d6
to
79edb49
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, I think there is a set of tests that is missing here that we should add but doesn’t have to be in this PR and some of this might also become redundant by adding the normalization:
Anything around items having different numbers of children: e.g., different number of children in an exercise rollback but also different number of record fields. More generally, I think there are probably a few more tests around values (e.g., tweak of record constructor) that could be useful.
private object Tweak { | ||
def single[X](f1: X => Option[X]): Tweak[X] = { | ||
def f(x: X) = f1(x) match { | ||
case None => Nil | ||
case Some(y) => List(y) | ||
} | ||
new Tweak(f) | ||
} | ||
def apply[X](f: X => List[X]): Tweak[X] = { | ||
new Tweak(f) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
partial function to list seems a bit odd. Afaict we have no difference between returning an empty list and the function not being defined.
A Tweak[X] is a total function from (1) A non-empty return list provides a list of value-replacements which we want to apply here. There is no concept of a tweak being applicable, but with a empty list of value-replacements. Or at least the meaning of this is indistinguishable from (2). |
I think Mortiz is referring to my suggestion to use Here is a concrete example of what I have in mind. To answer @cocreature concern I do not find to have a "partial function to list" so odd, the idea is just to understand that where the function passed to the builder is undefined, we just use the default value |
private object Tweak { | ||
def single[X](f1: X => Option[X]): Tweak[X] = { | ||
def f(x: X) = f1(x) match { | ||
case None => Nil | ||
case Some(y) => List(y) | ||
} | ||
new Tweak(f) | ||
} | ||
def apply[X](f: X => List[X]): Tweak[X] = { | ||
new Tweak(f) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see any use for the Tweak
class. A type synonym will serve equally well.
When you write a function with partial function syntax, and the expected type is a non-partial function, you will still get exhaustiveness checking. Broadly speaking, this violates the Liskov Substitution Principle (because an expression that satisfies type t
does not satisfy type u >: t
if warnings are errors), but not in a way that violates soundness.
So that means you can write
private type Tweak[T] = T => List[T]
private object Tweak {
def apply[T](f: Tweak[T]): Tweak[T] = f
}
Tweak[Option[Location]] {
case None => //blah blah
// I get an exhaustiveness warning if I don't handle Some
}
private val samVersion1: TransactionVersion = TransactionVersion.minVersion | ||
private val samVersion2: TransactionVersion = TransactionVersion.maxVersion | ||
|
||
private val someCreates: List[Node] = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This kind of code should broadly use Seq
instead of List
. It would probably be profitably idiomatic to replace every List
with Seq
here.
The only legitimate reasons to use List
directly are
- you need to traverse or
- need a functor/monad instance, or
- you rely specifically on the structure of a list, i.e. cheap push/pop
private val tweakCreateCoid = Tweak.single[Node] { | ||
case nc: Node.NodeCreate[_] => Some(nc.copy(coid = changeContractId(nc.coid))) | ||
case _ => None | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is perfectly reasonable to have another method in object Tweak
that takes a PartialFunction
instead and adds the Seq.empty
case with orElse
, producing a total function. You are getting no exhaustiveness-checking value out of many of these tweak definitions, and defining them as @remyhaemmerle-da suggests would clean them up.
} | ||
} | ||
} | ||
println(s"**SIGNIFICANT tweaks checked: #$count") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All println
s should be removed.
|
||
"Significant tweaks" - { | ||
var count = 0 | ||
significantTweaks.foreach { case (name, tweak) => |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
forEvery
is already doing a lot of the stuff for you so you don't have to do it yourself. For example, a nested forEvery
here would simply report the txA
and txB
in a nice way as part of the failure message, so you would not have to jam it into the fail
string.
And that makes it so that you can simply use shouldBe
or inside
without using fail
at all, and still getting all the stuff you might need to know to understand failures reported.
This PR has been created by a script, which is not very smart and does not have all the context. Please do double-check that the version prefix is correct before merging. @Robin-da is in charge of this release. Commit log: ``` 0d881f5 Improvements to the documentation with regards to offsets (#10180) 1d5ba4f feed elasticsearch cluster (#10193) e2bdca6 Use PartialFunction for more concise code. (#10191) fe98c48 release 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10186) 4fe626a Drop logging on CompletionSource (#10190) 582aa5f Fix a typo in an exceptions example. (#10188) 8750c0c reduce noise in Scala bindings (#10187) 98b5ffe Add divulgence warning and test in script service. (#10179) 8578e56 Tests for transaction validation (#10167) 05a72a3 update compat versions for 1.15.0-snapshot.20210705.7286.0.62aabcc4 (#10184) 7b93923 [In-memory fan-out] Performance optimizations [DPP-470] (#10127) 6c49619 Document how to run the Java codegen from the Daml assistant (#10181) 61aa774 Release SDK 1.15 RC (#10182) ``` Changelog: ``` [Docs] Improvements to the documentation with regards to offsets [Docs] Document how to use the Java codegen using the Daml assistant ``` CHANGELOG_BEGIN CHANGELOG_END
Thanks @stephencompall-DA for your suggestions. Please see: #10214 |
This PR has been created by a script, which is not very smart and does not have all the context. Please do double-check that the version prefix is correct before merging. @akshayshirahatti-da is in charge of this release. Commit log: ``` 1f35db1 ledger-on-sql: Use random log entry ID allocation so we don't depend on `SeedService`. [KVL-1002] (#10255) b8e2198 Separate traces from warnings in engine. (#10253) 0a7f2b1 [JSON-API] Small refactoring to start using akka http routes internally (#10252) 6e8ec1d LF: Drop old depreated code (#10251) de7a08f [In-memory fan-out] Handle `null` submitters in getTransactionLogUpdates (#10248) 584169a Participant state v1-to-v2 adaptors [KVL-1002] (#10246) e4d7cd7 LF: Deprecate com.daml.lf.data.TryOps.Bracket (#10249) b59f365 [JSON-API] Correctly extract the request source URL/IP (#10244) edaf541 Adapt `ledger-api-bench-tool` to work with LR [DPP-424] (#10171) 6fe6ae0 LF: Make DarReader ZipEntries immulatble (#10243) 05e5218 Consolidating EventStorageBackend (#10224) 3fd3abf Instrument buffer after contract state events stream (#10209) 643a2de v2 participant state API draft [KVL-998] (#10210) 5abcd04 Adds Unit tests for parallel-ingestion [DPP-455] (#10238) 3cdedcf kvutils: Extract validators from TransactionCommitter [KVL-1015] (#10235) 00d622f Make @UNTIL-LF exclusive, add @UNTIL-LF-FEATURE. (#10240) 2bcbd4e es: switch to persistent nodes (#10236) 7f4bc2a update compat versions for 1.14.2 (#10233) 4eba4b0 Ledger: decouple BD value serialization library from archive library. (#10218) 729afa8 Write a few lines on how to run tests against an Oracle database (#10230) 2b67ebb tf: refactor appr var (#10232) 202b7f7 add akshay to appr team (#10229) 2c5410c Release SDK 1.14.2 (#10226) 89d87ad update compat versions for 1.14.2-snapshot.20210708.7135.0.aa297840 (#10223) 4839344 TODO Cleanup: QueryNonPruned [DPP-459] (#10225) 0bea5e3 Allow retriable lookupMaximumLedgerTime on contention (#10211) ca2a9e9 Release 1.14.2 snapshot (#10222) 999577a tweak ES cluster (#10219) 6680d36 Warn on DA.Exception import (#10201) f19f5b0 LF: Simplify DarReader (#10217) 8f1a8f2 Release DAML SDK 1.14.1 (#10204) ebb76dc LF: reorganize errors in com.daml.lf.archive (#10213) 6964645 Improvements for validation tests (#10214) 5f124c3 Avoid collision in execution log postfix (#10205) 9e27ae0 Reshuffle cocreature in daml-lf codeowners (#10215) 41b8448 LF: Simplify archive reader. (#10208) 38734f0 es-feed: ignore invalid files (#10207) 6586dde Move exercise context computation to the client side (#10199) c92c678 Mark Daml profiler as stable (#10203) cb1f4ec ci/windows: disable spool (#10200) 2326d42 Publish execution logs on unix platforms (#10194) 4269345 Drop cleanup of node_modules (#10195) c8faed8 Deduplicate Java codegen running instructions (#10185) e4c8c39 update compat versions for 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10196) 0d881f5 Improvements to the documentation with regards to offsets (#10180) 1d5ba4f feed elasticsearch cluster (#10193) e2bdca6 Use PartialFunction for more concise code. (#10191) fe98c48 release 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10186) 4fe626a Drop logging on CompletionSource (#10190) 582aa5f Fix a typo in an exceptions example. (#10188) 8750c0c reduce noise in Scala bindings (#10187) 98b5ffe Add divulgence warning and test in script service. (#10179) 8578e56 Tests for transaction validation (#10167) 05a72a3 update compat versions for 1.15.0-snapshot.20210705.7286.0.62aabcc4 (#10184) 7b93923 [In-memory fan-out] Performance optimizations [DPP-470] (#10127) 6c49619 Document how to run the Java codegen from the Daml assistant (#10181) 61aa774 Release SDK 1.15 RC (#10182) ``` Changelog: ``` - [JSON-API] If the service is put behind a proxy filling either of these headers X-Forwarded-For & X-Real-Ip then these will now be respected for logging the request source ip/url - [Daml Compiler] Importing DA.Exception on LF < 1.14 now produces a warning that exceptions require Daml-LF >= 1.14. - [Daml Profiler] The Daml profiler is now a stable feature. [Docs] Improvements to the documentation with regards to offsets [Docs] Document how to use the Java codegen using the Daml assistant ``` CHANGELOG_BEGIN CHANGELOG_END
* release 1.15.0-snapshot.20210713.7343.0.1f35db17 This PR has been created by a script, which is not very smart and does not have all the context. Please do double-check that the version prefix is correct before merging. @akshayshirahatti-da is in charge of this release. Commit log: ``` 1f35db1 ledger-on-sql: Use random log entry ID allocation so we don't depend on `SeedService`. [KVL-1002] (#10255) b8e2198 Separate traces from warnings in engine. (#10253) 0a7f2b1 [JSON-API] Small refactoring to start using akka http routes internally (#10252) 6e8ec1d LF: Drop old depreated code (#10251) de7a08f [In-memory fan-out] Handle `null` submitters in getTransactionLogUpdates (#10248) 584169a Participant state v1-to-v2 adaptors [KVL-1002] (#10246) e4d7cd7 LF: Deprecate com.daml.lf.data.TryOps.Bracket (#10249) b59f365 [JSON-API] Correctly extract the request source URL/IP (#10244) edaf541 Adapt `ledger-api-bench-tool` to work with LR [DPP-424] (#10171) 6fe6ae0 LF: Make DarReader ZipEntries immulatble (#10243) 05e5218 Consolidating EventStorageBackend (#10224) 3fd3abf Instrument buffer after contract state events stream (#10209) 643a2de v2 participant state API draft [KVL-998] (#10210) 5abcd04 Adds Unit tests for parallel-ingestion [DPP-455] (#10238) 3cdedcf kvutils: Extract validators from TransactionCommitter [KVL-1015] (#10235) 00d622f Make @UNTIL-LF exclusive, add @UNTIL-LF-FEATURE. (#10240) 2bcbd4e es: switch to persistent nodes (#10236) 7f4bc2a update compat versions for 1.14.2 (#10233) 4eba4b0 Ledger: decouple BD value serialization library from archive library. (#10218) 729afa8 Write a few lines on how to run tests against an Oracle database (#10230) 2b67ebb tf: refactor appr var (#10232) 202b7f7 add akshay to appr team (#10229) 2c5410c Release SDK 1.14.2 (#10226) 89d87ad update compat versions for 1.14.2-snapshot.20210708.7135.0.aa297840 (#10223) 4839344 TODO Cleanup: QueryNonPruned [DPP-459] (#10225) 0bea5e3 Allow retriable lookupMaximumLedgerTime on contention (#10211) ca2a9e9 Release 1.14.2 snapshot (#10222) 999577a tweak ES cluster (#10219) 6680d36 Warn on DA.Exception import (#10201) f19f5b0 LF: Simplify DarReader (#10217) 8f1a8f2 Release DAML SDK 1.14.1 (#10204) ebb76dc LF: reorganize errors in com.daml.lf.archive (#10213) 6964645 Improvements for validation tests (#10214) 5f124c3 Avoid collision in execution log postfix (#10205) 9e27ae0 Reshuffle cocreature in daml-lf codeowners (#10215) 41b8448 LF: Simplify archive reader. (#10208) 38734f0 es-feed: ignore invalid files (#10207) 6586dde Move exercise context computation to the client side (#10199) c92c678 Mark Daml profiler as stable (#10203) cb1f4ec ci/windows: disable spool (#10200) 2326d42 Publish execution logs on unix platforms (#10194) 4269345 Drop cleanup of node_modules (#10195) c8faed8 Deduplicate Java codegen running instructions (#10185) e4c8c39 update compat versions for 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10196) 0d881f5 Improvements to the documentation with regards to offsets (#10180) 1d5ba4f feed elasticsearch cluster (#10193) e2bdca6 Use PartialFunction for more concise code. (#10191) fe98c48 release 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10186) 4fe626a Drop logging on CompletionSource (#10190) 582aa5f Fix a typo in an exceptions example. (#10188) 8750c0c reduce noise in Scala bindings (#10187) 98b5ffe Add divulgence warning and test in script service. (#10179) 8578e56 Tests for transaction validation (#10167) 05a72a3 update compat versions for 1.15.0-snapshot.20210705.7286.0.62aabcc4 (#10184) 7b93923 [In-memory fan-out] Performance optimizations [DPP-470] (#10127) 6c49619 Document how to run the Java codegen from the Daml assistant (#10181) 61aa774 Release SDK 1.15 RC (#10182) ``` Changelog: ``` - [JSON-API] If the service is put behind a proxy filling either of these headers X-Forwarded-For & X-Real-Ip then these will now be respected for logging the request source ip/url - [Daml Compiler] Importing DA.Exception on LF < 1.14 now produces a warning that exceptions require Daml-LF >= 1.14. - [Daml Profiler] The Daml profiler is now a stable feature. [Docs] Improvements to the documentation with regards to offsets [Docs] Document how to use the Java codegen using the Daml assistant ``` CHANGELOG_BEGIN CHANGELOG_END * 1.16 not 1.15 changelog_begin changelog_end Co-authored-by: Azure Pipelines DAML Build <[email protected]> Co-authored-by: Moritz Kiefer <[email protected]>
Testing for transaction validation (
isReplayedBy
)Tweak
based testingGenActionNode
This PR advances #6665