Skip to content

Commit cc97c5f

Browse files
authored
Merge pull request #1276 from input-output-hk/add-close-to-model
Add Close to our Model
2 parents 57e1304 + 792cca4 commit cc97c5f

File tree

1 file changed

+45
-17
lines changed

1 file changed

+45
-17
lines changed

hydra-node/test/Hydra/Model.hs

+45-17
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ instance StateModel WorldState where
169169
Init :: Party -> Action WorldState ()
170170
Commit :: Party -> UTxOType Payment -> Action WorldState ActualCommitted
171171
Abort :: Party -> Action WorldState ()
172+
Close :: Party -> Action WorldState ()
172173
NewTx :: Party -> Payment -> Action WorldState Payment
173174
Wait :: DiffTime -> Action WorldState ()
174175
ObserveConfirmedTx :: Var Payment -> Action WorldState ()
@@ -192,9 +193,12 @@ instance StateModel WorldState where
192193
[ (5, genCommit pendingCommits)
193194
, (1, genAbort)
194195
]
195-
Open{} -> do
196-
genNewTx
197-
_ -> fmap Some genSeed
196+
Open{} ->
197+
frequency
198+
[ (5, genNewTx)
199+
, (1, genClose)
200+
]
201+
Final{} -> fmap Some genSeed
198202
where
199203
genCommit :: Uncommitted -> Gen (Any (Action WorldState))
200204
genCommit pending = do
@@ -208,6 +212,11 @@ instance StateModel WorldState where
208212

209213
genNewTx = genPayment st >>= \(party, transaction) -> pure . Some $ NewTx party transaction
210214

215+
genClose = do
216+
(key, _) <- elements hydraParties
217+
let party = deriveParty key
218+
pure . Some $ Close party
219+
211220
precondition WorldState{hydraState = Start} Seed{} =
212221
True
213222
precondition WorldState{hydraState = Idle{}} Init{} =
@@ -216,6 +225,8 @@ instance StateModel WorldState where
216225
isPendingCommitFrom party hydraState
217226
precondition WorldState{hydraState = Initial{}} Abort{} =
218227
True
228+
precondition WorldState{hydraState = Open{}} (Close _) =
229+
True
219230
precondition WorldState{hydraState = Open{offChainState}} (NewTx _ tx) =
220231
(from tx, value tx) `List.elem` confirmedUTxO offChainState
221232
precondition _ Wait{} =
@@ -290,6 +301,13 @@ instance StateModel WorldState where
290301
committedUTxO = mconcat $ Map.elems commits
291302
_ -> Final mempty
292303
--
304+
Close{} ->
305+
WorldState{hydraParties, hydraState = updateWithClose hydraState}
306+
where
307+
updateWithClose = \case
308+
Open{offChainState} -> Final $ confirmedUTxO offChainState
309+
_ -> error "unexpected state"
310+
--
293311
(NewTx _ tx) ->
294312
WorldState{hydraParties, hydraState = updateWithNewTx hydraState}
295313
where
@@ -335,7 +353,7 @@ genToCommit (hk, ck) = do
335353

336354
genContestationPeriod :: Gen ContestationPeriod
337355
genContestationPeriod = do
338-
n <- choose (1, 200)
356+
n <- choose (1, 10)
339357
pure $ UnsafeContestationPeriod $ wordToNatural n
340358

341359
genInit :: [(SigningKey HydraKey, b)] -> Gen (Action WorldState ())
@@ -477,6 +495,8 @@ instance
477495
performInit party
478496
Abort party -> do
479497
performAbort party
498+
Close party ->
499+
performClose party
480500
Wait delay ->
481501
lift $ threadDelay delay
482502
ObserveConfirmedTx var -> do
@@ -495,10 +515,6 @@ instance
495515
Nothing -> error "The head is not open for node"
496516
StopTheWorld ->
497517
stopTheWorld
498-
where
499-
headIsOpen = \case
500-
HeadIsOpen{} -> True
501-
_otherwise -> False
502518

503519
-- ** Performing actions
504520

@@ -607,7 +623,6 @@ performNewTx party tx = do
607623
let recipient = mkVkAddress testNetworkId . getVerificationKey . signingKey $ to tx
608624
nodes <- gets nodes
609625
let thisNode = nodes ! party
610-
611626
waitForOpen thisNode
612627

613628
(i, o) <-
@@ -623,7 +638,7 @@ performNewTx party tx = do
623638

624639
party `sendsInput` Input.NewTx realTx
625640
lift $ do
626-
waitUntilMatch [thisNode] $ \case
641+
waitUntilMatch (toList nodes) $ \case
627642
SnapshotConfirmed{snapshot = snapshot} ->
628643
txId realTx `elem` Snapshot.confirmed snapshot
629644
err@TxInvalid{} -> error ("expected tx to be valid: " <> show err)
@@ -635,14 +650,9 @@ performNewTx party tx = do
635650
waitForOpen :: MonadDelay m => TestHydraClient tx m -> RunMonad m ()
636651
waitForOpen node = do
637652
outs <- lift $ serverOutputs node
638-
unless
639-
(any headIsOpen outs)
653+
unless (any headIsOpen outs) $
640654
waitAndRetry
641655
where
642-
headIsOpen = \case
643-
HeadIsOpen{} -> True
644-
_ -> False
645-
646656
waitAndRetry = lift (threadDelay 0.1) >> waitForOpen node
647657

648658
sendsInput :: (MonadSTM m, MonadThrow m) => Party -> ClientInput Tx -> RunMonad m ()
@@ -655,7 +665,6 @@ sendsInput party command = do
655665
performInit :: (MonadThrow m, MonadAsync m, MonadTimer m) => Party -> RunMonad m ()
656666
performInit party = do
657667
party `sendsInput` Input.Init
658-
659668
nodes <- gets nodes
660669
lift $
661670
waitUntilMatch (toList nodes) $ \case
@@ -674,6 +683,19 @@ performAbort party = do
674683
err@CommandFailed{} -> error $ show err
675684
_ -> False
676685

686+
performClose :: (MonadThrow m, MonadAsync m, MonadTimer m, MonadDelay m) => Party -> RunMonad m ()
687+
performClose party = do
688+
nodes <- gets nodes
689+
let thisNode = nodes ! party
690+
waitForOpen thisNode
691+
party `sendsInput` Input.Close
692+
693+
lift $
694+
waitUntilMatch (toList nodes) $ \case
695+
HeadIsClosed{} -> True
696+
err@CommandFailed{} -> error $ show err
697+
_ -> False
698+
677699
stopTheWorld :: MonadAsync m => RunMonad m ()
678700
stopTheWorld =
679701
gets threads >>= mapM_ (lift . cancel)
@@ -692,6 +714,7 @@ showFromAction k = \case
692714
Init{} -> k
693715
Commit{} -> k
694716
Abort{} -> k
717+
Close{} -> k
695718
NewTx{} -> k
696719
Wait{} -> k
697720
ObserveConfirmedTx{} -> k
@@ -738,3 +761,8 @@ isOwned (CardanoSigningKey sk) (_, TxOut{txOutAddress = ShelleyAddressInEra (She
738761
(PaymentCredentialByKey ha) -> verificationKeyHash (getVerificationKey sk) == ha
739762
_ -> False
740763
isOwned _ _ = False
764+
765+
headIsOpen :: ServerOutput tx -> Bool
766+
headIsOpen = \case
767+
HeadIsOpen{} -> True
768+
_otherwise -> False

0 commit comments

Comments
 (0)