Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import org.lfdecentralizedtrust.splice.sv.automation.delegatebased.TerminatedSub
import org.lfdecentralizedtrust.splice.util.{DisclosedContracts, TriggerTestUtil, WalletTestUtil}
import org.lfdecentralizedtrust.splice.validator.automation.ReconcileSequencerConnectionsTrigger
import org.lfdecentralizedtrust.splice.wallet.admin.api.client.commands.HttpWalletAppClient
import org.lfdecentralizedtrust.splice.util.TriggerTestUtil.{
pauseAllDsoDelegateTriggers,
resumeAllDsoDelegateTriggers,
}
import org.scalatest.Assertion

class Ans4SvsIntegrationTest extends IntegrationTest with WalletTestUtil with TriggerTestUtil {
Expand All @@ -18,9 +22,6 @@ class Ans4SvsIntegrationTest extends IntegrationTest with WalletTestUtil with Tr
// TODO(#11927): incorporate this test into AnsIntegrationTest
"ans" should {
"terminated subscriptions are archived" in { implicit env =>
val leaderTerminatedSubscriptionTrigger =
sv1Backend.dsoDelegateBasedAutomation.trigger[TerminatedSubscriptionTrigger]

setTriggersWithin[Assertion](
// Figure out how to make the `onboardUser` part of `onboardWalletUser` not time out
// in the even of an untimely domain disconnect
Expand Down Expand Up @@ -72,7 +73,7 @@ class Ans4SvsIntegrationTest extends IntegrationTest with WalletTestUtil with Tr
)

clue("Pausing TerminatedSubscriptionTrigger") {
leaderTerminatedSubscriptionTrigger.pause().futureValue
pauseAllDsoDelegateTriggers[TerminatedSubscriptionTrigger]
}

actAndCheck(
Expand All @@ -92,7 +93,7 @@ class Ans4SvsIntegrationTest extends IntegrationTest with WalletTestUtil with Tr
) should not be empty
}
clue("Resuming TerminatedSubscriptionTrigger") {
leaderTerminatedSubscriptionTrigger.resume()
resumeAllDsoDelegateTriggers[TerminatedSubscriptionTrigger]
}

eventually() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ import com.digitalasset.canton.console.CommandFailure
import com.digitalasset.canton.logging.SuppressionRule
import com.digitalasset.canton.topology.PartyId
import org.scalatest.Assertion
import org.scalatest.concurrent.PatienceConfiguration
import org.slf4j.event.Level

import java.time.{Instant, OffsetDateTime, ZoneOffset}
import java.time.temporal.ChronoUnit
import scala.concurrent.duration.FiniteDuration
import scala.jdk.CollectionConverters.*

class AnsIntegrationTest extends IntegrationTest with WalletTestUtil with TriggerTestUtil {
Expand Down Expand Up @@ -60,8 +62,8 @@ class AnsIntegrationTest extends IntegrationTest with WalletTestUtil with Trigge
)(config)
)

def dsoDelegateExpiredAnsEntryTrigger(implicit env: SpliceTestConsoleEnvironment) =
sv1Backend.dsoDelegateBasedAutomation.trigger[ExpiredAnsEntryTrigger]
def dsoDelegateExpiredAnsEntryTriggers(implicit env: SpliceTestConsoleEnvironment) =
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[ExpiredAnsEntryTrigger])

// created by the expiry test
override protected lazy val sanityChecksIgnoredRootCreates: Seq[Identifier] = Seq(
Expand All @@ -87,7 +89,7 @@ class AnsIntegrationTest extends IntegrationTest with WalletTestUtil with Trigge
bobRefs,
).parTraverse { ref =>
Future { requestAndPayForEntry(ref, testEntryName) }
}.futureValue,
}.futureValue(timeout = PatienceConfiguration.Timeout(FiniteDuration(40, "seconds"))),
lines => {
forAll(lines) { line =>
line.message should (include(s"entry already exists and owned by") or include(
Expand Down Expand Up @@ -360,7 +362,7 @@ class AnsIntegrationTest extends IntegrationTest with WalletTestUtil with Trigge

setTriggersWithin[Assertion](
triggersToPauseAtStart = Seq(aliceSubscriptionReadyForPaymentTrigger),
triggersToResumeAtStart = Seq(dsoDelegateExpiredAnsEntryTrigger),
triggersToResumeAtStart = dsoDelegateExpiredAnsEntryTriggers,
) {

val ansRules = sv1ScanBackend.getAnsRules()
Expand Down Expand Up @@ -411,7 +413,7 @@ class AnsIntegrationTest extends IntegrationTest with WalletTestUtil with Trigge
setTriggersWithin(
Seq.empty,
triggersToResumeAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[ExpiredAnsSubscriptionTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[ExpiredAnsSubscriptionTrigger]),
) {
withClue("contracts removed with subscription trigger reenabled") {
// Wait for subscription to be expired.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class SvExpiredRewardsCollectionTimeBasedIntegrationTest
aliceWalletClient.tap(100.0)
bobWalletClient.tap(100.0)

actAndCheck(
actAndCheck()(
"Generate some reward coupons by executing a few direct transfers", {
p2pTransfer(aliceWalletClient, bobWalletClient, bobParty, 10.0)
p2pTransfer(aliceWalletClient, bobWalletClient, bobParty, 10.0)
Expand All @@ -57,7 +57,6 @@ class SvExpiredRewardsCollectionTimeBasedIntegrationTest
) should have length 8 // 4 app rewards + 4 validator
},
)

actAndCheck(
timeUntilSuccess = 30.seconds
)(
Expand All @@ -76,7 +75,9 @@ class SvExpiredRewardsCollectionTimeBasedIntegrationTest
.getClosedRounds()
.filter(r => r.payload.round.number == round.payload.round.number) should be(empty)
val (lastRound, _) = sv1ScanBackend.getRoundOfLatestData()
sv1WalletClient.listSvRewardCoupons().filter(_.payload.round.number <= lastRound) should be(
sv1WalletClient
.listSvRewardCoupons()
.filter(_.payload.round.number <= lastRound) should be(
empty
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import org.lfdecentralizedtrust.splice.codegen.java.splice.validatorlicense.Vali
import org.lfdecentralizedtrust.splice.integration.EnvironmentDefinition
import org.lfdecentralizedtrust.splice.sv.automation.delegatebased.MergeValidatorLicenseContractsTrigger
import org.lfdecentralizedtrust.splice.util.TriggerTestUtil
import org.lfdecentralizedtrust.splice.util.TriggerTestUtil.{
pauseAllDsoDelegateTriggers,
resumeAllDsoDelegateTriggers,
}
import org.slf4j.event.Level

import scala.jdk.CollectionConverters.*
Expand Down Expand Up @@ -42,7 +46,7 @@ class SvMergeDuplicatedValidatorLicenseIntegrationTest
}
setTriggersWithin(
triggersToPauseAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[MergeValidatorLicenseContractsTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[MergeValidatorLicenseContractsTrigger]),
triggersToResumeAtStart = Seq.empty,
) {
actAndCheck(
Expand All @@ -61,20 +65,15 @@ class SvMergeDuplicatedValidatorLicenseIntegrationTest
// The trigger can process both validator licenses in parallel so we might get multiple log messages.
loggerFactory.assertLogsSeq(SuppressionRule.LevelAndAbove(Level.WARN))(
{
sv1Backend.dsoDelegateBasedAutomation
.trigger[MergeValidatorLicenseContractsTrigger]
.resume()
resumeAllDsoDelegateTriggers[MergeValidatorLicenseContractsTrigger]
clue("Trigger merges the duplicated validator licenses contracts") {
eventually() {
val newValidatorLicenses = getValidatorLicenses()
newValidatorLicenses should have size 1
}
}
// Pause to make sure we don't get more log messages.
sv1Backend.dsoDelegateBasedAutomation
.trigger[MergeValidatorLicenseContractsTrigger]
.pause()
.futureValue
pauseAllDsoDelegateTriggers[MergeValidatorLicenseContractsTrigger]
},
forAll(_)(
_.warningMessage should include(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.lfdecentralizedtrust.splice.integration.EnvironmentDefinition
import org.lfdecentralizedtrust.splice.codegen.java.splice.dso.svstate.SvRewardState
import org.lfdecentralizedtrust.splice.sv.automation.delegatebased.MergeSvRewardStateContractsTrigger
import org.lfdecentralizedtrust.splice.util.TriggerTestUtil
import org.lfdecentralizedtrust.splice.util.TriggerTestUtil.resumeAllDsoDelegateTriggers

import scala.jdk.CollectionConverters.*

Expand Down Expand Up @@ -38,7 +39,7 @@ class SvMergeSvRewardStateIntegrationTest extends SvIntegrationTestBase with Tri
}
setTriggersWithin(
triggersToPauseAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[MergeSvRewardStateContractsTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[MergeSvRewardStateContractsTrigger]),
triggersToResumeAtStart = Seq.empty,
) {
actAndCheck(
Expand All @@ -56,7 +57,7 @@ class SvMergeSvRewardStateIntegrationTest extends SvIntegrationTestBase with Tri
)
loggerFactory.assertLogs(
{
sv1Backend.dsoDelegateBasedAutomation.trigger[MergeSvRewardStateContractsTrigger].resume()
resumeAllDsoDelegateTriggers[MergeSvRewardStateContractsTrigger]
clue("Trigger merges SvRewardState contracts") {
eventually() {
val newRewardStates = getRewardStates()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@

package org.lfdecentralizedtrust.splice.integration.tests

import cats.instances.future.*
import cats.instances.seq.*
import cats.syntax.foldable.*
import com.digitalasset.canton.config.RequireTypes.PositiveInt
import com.digitalasset.canton.topology.{MediatorId, SequencerId}
import com.digitalasset.canton.topology.admin.grpc.TopologyStoreId
Expand Down Expand Up @@ -35,6 +32,13 @@ import org.lfdecentralizedtrust.splice.sv.automation.singlesv.offboarding.{
}
import org.lfdecentralizedtrust.splice.util.{ProcessTestUtil, StandaloneCanton}
import org.scalatest.time.{Minute, Span}
import cats.syntax.foldable.*
import cats.instances.future.*
import cats.instances.seq.*
import org.lfdecentralizedtrust.splice.util.TriggerTestUtil.{
pauseAllDsoDelegateTriggers,
resumeAllDsoDelegateTriggers,
}

import java.time.Instant
import java.time.temporal.ChronoUnit
Expand Down Expand Up @@ -96,10 +100,8 @@ class SvOffboardingIntegrationTest
)
}

sv1Backend.dsoDelegateBasedAutomation
.trigger[ExecuteConfirmedActionTrigger]
.pause()
.futureValue
pauseAllDsoDelegateTriggers[ExecuteConfirmedActionTrigger]

val externalPartyAmuletRules = sv1ScanBackend.getExternalPartyAmuletRules()
// Create TransferCommand to trigger creation of confirmations for creating the transfer command counter.
// We don't want to test external parties in this test so we just create it directly from SV1.
Expand Down Expand Up @@ -240,7 +242,7 @@ class SvOffboardingIntegrationTest
) shouldBe None
actAndCheck(timeUntilSuccess = 60.seconds)(
"Resume ExecuteConfirmedActionTrigger",
sv1Backend.dsoDelegateBasedAutomation.trigger[ExecuteConfirmedActionTrigger].resume(),
resumeAllDsoDelegateTriggers[ExecuteConfirmedActionTrigger],
)(
"TransferCommandCounter gets created",
(_: Unit) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ class SvStateManagementIntegrationTest extends SvIntegrationTestBase with Trigge
setTriggersWithin(
// Pause so SV3 can be stopped before it gets offboarded
triggersToPauseAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[CloseVoteRequestTrigger])
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[CloseVoteRequestTrigger])
) {
// We need SV3's vote here for immediate offboarding
Seq(sv2Backend, sv3Backend, sv4Backend).foreach { sv =>
Expand Down Expand Up @@ -612,7 +612,9 @@ class SvStateManagementIntegrationTest extends SvIntegrationTestBase with Trigge
}
}
clue("Pausing vote request expiration automation") {
sv1Backend.dsoDelegateBasedAutomation.trigger[CloseVoteRequestTrigger].pause().futureValue
Seq(sv1Backend, sv2Backend).foreach(
_.dsoDelegateBasedAutomation.trigger[CloseVoteRequestTrigger].pause().futureValue
)
}
actAndCheck(
"SV2 creates a vote request for removing SV1", {
Expand Down Expand Up @@ -640,7 +642,9 @@ class SvStateManagementIntegrationTest extends SvIntegrationTestBase with Trigge
},
)
clue("Resuming vote request expiration automation") {
sv1Backend.dsoDelegateBasedAutomation.trigger[CloseVoteRequestTrigger].resume()
Seq(sv1Backend, sv2Backend).foreach(
_.dsoDelegateBasedAutomation.trigger[CloseVoteRequestTrigger].resume()
)
}
clue("Eventually the vote request expires and gets archived") {
eventually() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ class WalletExpirationsIntegrationTest
setTriggersWithin(
Seq.empty,
triggersToResumeAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[ExpiredAmuletTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[ExpiredAmuletTrigger]),
) {
clue("Check wallet after advancing to next 2 rounds") {
eventually()(aliceWalletClient.list().amulets shouldBe empty)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ class WalletTimeBasedIntegrationTest
},
cancelAllSubscriptions(aliceWalletClient),
) {
val ansSubscriptionRenewalPaymentTrigger =
sv1Backend.dsoDelegateBasedAutomation.trigger[AnsSubscriptionRenewalPaymentTrigger]
val ansSubscriptionRenewalPaymentTriggers =
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[AnsSubscriptionRenewalPaymentTrigger])
setTriggersWithin(
triggersToPauseAtStart = Seq(ansSubscriptionRenewalPaymentTrigger),
triggersToPauseAtStart = ansSubscriptionRenewalPaymentTriggers,
triggersToResumeAtStart = Seq.empty,
) {
actAndCheck(
Expand Down Expand Up @@ -204,7 +204,7 @@ class WalletTimeBasedIntegrationTest
setTriggersWithin(
Seq.empty,
triggersToResumeAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[ExpiredLockedAmuletTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[ExpiredLockedAmuletTrigger]),
) {
clue("Check wallet after advancing to next 2 rounds") {
eventually()(aliceWalletClient.list().lockedAmulets shouldBe empty)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ class WalletTxLogTimeBasedIntegrationTest
setTriggersWithin(
Seq.empty,
triggersToResumeAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[ExpiredAmuletTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[ExpiredAmuletTrigger]),
) {
actAndCheck(
"Advance 4 ticks to expire the amulet",
Expand Down Expand Up @@ -309,7 +309,7 @@ class WalletTxLogTimeBasedIntegrationTest
setTriggersWithin(
Seq.empty,
triggersToResumeAtStart =
Seq(sv1Backend.dsoDelegateBasedAutomation.trigger[ExpiredLockedAmuletTrigger]),
activeSvs.map(_.dsoDelegateBasedAutomation.trigger[ExpiredLockedAmuletTrigger]),
) {
actAndCheck(
"Advance 4 ticks to expire the locked amulet",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ trait CommonAppInstanceReferences {

def dsoParty(implicit env: SpliceTestConsoleEnvironment): PartyId = sv1ScanBackend.getDsoPartyId()

def activeSvs(implicit env: SpliceTestConsoleEnvironment): Seq[SvAppBackendReference] =
env.svs.local

def sv1Backend(implicit env: SpliceTestConsoleEnvironment): SvAppBackendReference = svb("sv1")

def sv1LocalBackend(implicit env: SpliceTestConsoleEnvironment): SvAppBackendReference = svb(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package org.lfdecentralizedtrust.splice.util

import com.digitalasset.canton.{BaseTest, ScalaFuturesWithPatience}
import org.lfdecentralizedtrust.splice.automation.Trigger
import org.lfdecentralizedtrust.splice.integration.EnvironmentDefinition.sv1Backend
import org.lfdecentralizedtrust.splice.integration.tests.SpliceTests.SpliceTestConsoleEnvironment
import org.lfdecentralizedtrust.splice.sv.automation.delegatebased.AdvanceOpenMiningRoundTrigger
import com.digitalasset.canton.{BaseTest, ScalaFuturesWithPatience}

import scala.concurrent.duration.FiniteDuration
import scala.reflect.ClassTag

trait TriggerTestUtil { self: BaseTest =>

Expand Down Expand Up @@ -51,4 +52,22 @@ object TriggerTestUtil extends ScalaFuturesWithPatience {
triggersToResumeAtStart.foreach(_.pause().futureValue)
}
}

def pauseAllDsoDelegateTriggers[T <: Trigger](implicit
tag: ClassTag[T],
env: SpliceTestConsoleEnvironment,
): Unit = {
env.svs.local.foreach(
_.dsoDelegateBasedAutomation.trigger[T].pause().futureValue
)
}

def resumeAllDsoDelegateTriggers[T <: Trigger](implicit
tag: ClassTag[T],
env: SpliceTestConsoleEnvironment,
): Unit = {
env.svs.local.foreach(
_.dsoDelegateBasedAutomation.trigger[T].resume()
)
}
}
3 changes: 3 additions & 0 deletions apps/common/src/main/openapi/common-internal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,9 @@ components:
type: object
required:
- new_governance_flow
- delegateless_automation
properties:
new_governance_flow:
type: boolean
delegateless_automation:
type: boolean
Loading
Loading