Skip to content

Commit 1c2191b

Browse files
committed
draft base e2e spec
1 parent e100bf2 commit 1c2191b

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

hydra-cluster/src/Hydra/Cluster/Scenarios.hs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,89 @@ canRecoverDeposit tracer workDir backend hydraScriptsTxId =
15151515
where
15161516
hydraTracer = contramap FromHydraNode tracer
15171517

1518+
-- | Open a single participant head, deposit, Close and then recover it.
1519+
canRecoverDepositWhenClosed :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> backend -> [TxId] -> IO ()
1520+
canRecoverDepositWhenClosed tracer workDir backend hydraScriptsTxId =
1521+
(`finally` returnFundsToFaucet tracer backend Alice) $ do
1522+
refuelIfNeeded tracer backend Alice 30_000_000
1523+
-- NOTE: Directly expire deposits
1524+
contestationPeriod <- CP.fromNominalDiffTime 2
1525+
blockTime <- Backend.getBlockTime backend
1526+
let depositPeriod = 1
1527+
networkId <- Backend.queryNetworkId backend
1528+
aliceChainConfig <-
1529+
chainConfigFor Alice workDir backend hydraScriptsTxId [] contestationPeriod
1530+
<&> setNetworkId networkId . modifyConfig (\c -> c{depositPeriod})
1531+
withHydraNode hydraTracer aliceChainConfig workDir 1 aliceSk [] [1] $ \n1 -> do
1532+
send n1 $ input "Init" []
1533+
headId <- waitMatch 10 n1 $ headIsInitializingWith (Set.fromList [alice])
1534+
1535+
-- Commit nothing
1536+
requestCommitTx n1 mempty >>= Backend.submitTransaction backend
1537+
1538+
waitFor hydraTracer (20 * blockTime) [n1] $
1539+
output "HeadIsOpen" ["utxo" .= object mempty, "headId" .= headId]
1540+
1541+
-- Get some L1 funds
1542+
(walletVk, walletSk) <- generate genKeyPair
1543+
let commitAmount = 5_000_000
1544+
commitUTxO <- seedFromFaucet backend walletVk commitAmount (contramap FromFaucet tracer)
1545+
1546+
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1547+
`shouldReturn` lovelaceToValue commitAmount
1548+
1549+
depositTransaction <-
1550+
parseUrlThrow ("POST " <> hydraNodeBaseUrl n1 <> "/commit")
1551+
<&> setRequestBodyJSON commitUTxO
1552+
>>= httpJSON
1553+
<&> getResponseBody
1554+
1555+
let tx = signTx walletSk depositTransaction
1556+
Backend.submitTransaction backend tx
1557+
1558+
deadline <- waitMatch 10 n1 $ \v -> do
1559+
guard $ v ^? key "tag" == Just "CommitRecorded"
1560+
v ^? key "deadline" >>= parseMaybe parseJSON
1561+
1562+
(selectLovelace . balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1563+
`shouldReturn` 0
1564+
1565+
send n1 $ input "Close" []
1566+
1567+
deadline' <- waitMatch (10 * blockTime) n1 $ \v -> do
1568+
guard $ v ^? key "tag" == Just "HeadIsClosed"
1569+
v ^? key "contestationDeadline" . _JSON
1570+
1571+
let path = BSC.unpack $ urlEncode False $ encodeUtf8 $ T.pack $ show (getTxId $ getTxBody tx)
1572+
-- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1573+
diff <- realToFrac . diffUTCTime deadline <$> getCurrentTime
1574+
threadDelay $ diff + 1
1575+
1576+
(`shouldReturn` "OK") $
1577+
parseUrlThrow ("DELETE " <> hydraNodeBaseUrl n1 <> "/commits/" <> path)
1578+
>>= httpJSON
1579+
<&> getResponseBody @String
1580+
1581+
waitMatch 20 n1 $ \v -> do
1582+
guard $ v ^? key "tag" == Just "CommitRecovered"
1583+
guard $ v ^? key "recoveredUTxO" == Just (toJSON commitUTxO)
1584+
1585+
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1586+
`shouldReturn` lovelaceToValue commitAmount
1587+
1588+
remainingTime <- diffUTCTime deadline' <$> getCurrentTime
1589+
waitFor hydraTracer (remainingTime + 3 * blockTime) [n1] $
1590+
output "ReadyToFanout" ["headId" .= headId]
1591+
send n1 $ input "Fanout" []
1592+
waitMatch (20 * blockTime) n1 $ \v ->
1593+
guard $ v ^? key "tag" == Just "HeadIsFinalized"
1594+
1595+
-- Assert final wallet balance
1596+
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1597+
`shouldReturn` balance commitUTxO
1598+
where
1599+
hydraTracer = contramap FromHydraNode tracer
1600+
15181601
-- | Make sure to be able to see pending deposits.
15191602
canSeePendingDeposits :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> NominalDiffTime -> backend -> [TxId] -> IO ()
15201603
canSeePendingDeposits tracer workDir blockTime backend hydraScriptsTxId =

hydra-cluster/test/Test/EndToEndSpec.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import Hydra.Cluster.Scenarios (
5454
canDecommit,
5555
canDepositPartially,
5656
canRecoverDeposit,
57+
canRecoverDepositWhenClosed,
5758
canResumeOnMemberAlreadyBootstrapped,
5859
canSeePendingDeposits,
5960
canSideLoadSnapshot,
@@ -311,6 +312,11 @@ spec = around (showLogsOnFailure "EndToEndSpec") $ do
311312
withBackend (contramap FromCardanoNode tracer) tmpDir $ \_ backend -> do
312313
publishHydraScriptsAs backend Faucet
313314
>>= canRecoverDeposit tracer tmpDir backend
315+
it "can recover deposit when closed" $ \tracer -> do
316+
withClusterTempDir $ \tmpDir -> do
317+
withBackend (contramap FromCardanoNode tracer) tmpDir $ \_ backend -> do
318+
publishHydraScriptsAs backend Faucet
319+
>>= canRecoverDepositWhenClosed tracer tmpDir backend
314320
it "can see pending deposits" $ \tracer -> do
315321
withClusterTempDir $ \tmpDir -> do
316322
withBackend (contramap FromCardanoNode tracer) tmpDir $ \blockTime backend -> do

0 commit comments

Comments
 (0)