Skip to content

Commit 6c07a8b

Browse files
committed
refactor e2e scenario
1 parent bde00b1 commit 6c07a8b

File tree

1 file changed

+56
-106
lines changed

1 file changed

+56
-106
lines changed

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

Lines changed: 56 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,7 +1515,10 @@ 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.
1518+
-- | Open a single-participant head, perform 3 deposits, and then:
1519+
-- 1. Close the head and recover deposit #1
1520+
-- 2. Fanout the head and recover deposit #2
1521+
-- 3. Open a new head and recover deposit #3
15191522
canRecoverDepositInAnyState :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> backend -> [TxId] -> IO ()
15201523
canRecoverDepositInAnyState tracer workDir backend hydraScriptsTxId =
15211524
(`finally` returnFundsToFaucet tracer backend Alice) $ do
@@ -1529,6 +1532,7 @@ canRecoverDepositInAnyState tracer workDir backend hydraScriptsTxId =
15291532
chainConfigFor Alice workDir backend hydraScriptsTxId [] contestationPeriod
15301533
<&> setNetworkId networkId . modifyConfig (\c -> c{depositPeriod})
15311534
withHydraNode hydraTracer aliceChainConfig workDir 1 aliceSk [] [1] $ \n1 -> do
1535+
-- Init the head
15321536
send n1 $ input "Init" []
15331537
headId <- waitMatch 10 n1 $ headIsInitializingWith (Set.fromList [alice])
15341538

@@ -1545,116 +1549,44 @@ canRecoverDepositInAnyState tracer workDir backend hydraScriptsTxId =
15451549
commitUTxO2 <- seedFromFaucet backend walletVk commitAmount (contramap FromFaucet tracer)
15461550
commitUTxO3 <- seedFromFaucet backend walletVk commitAmount (contramap FromFaucet tracer)
15471551

1548-
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1549-
`shouldReturn` lovelaceToValue (commitAmount * 3)
1552+
queryWalletBalance walletVk `shouldReturn` lovelaceToValue (commitAmount * 3)
15501553

15511554
-- Increment commit #1
1552-
depositTransaction1 <-
1553-
parseUrlThrow ("POST " <> hydraNodeBaseUrl n1 <> "/commit")
1554-
<&> setRequestBodyJSON commitUTxO1
1555-
>>= httpJSON
1556-
<&> getResponseBody
1557-
1558-
let tx1 = signTx walletSk depositTransaction1
1559-
Backend.submitTransaction backend tx1
1560-
1561-
deadline1 <- waitMatch 10 n1 $ \v -> do
1562-
guard $ v ^? key "tag" == Just "CommitRecorded"
1563-
v ^? key "deadline" >>= parseMaybe parseJSON
1564-
1565-
(selectLovelace . balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1566-
`shouldReturn` (commitAmount * 2)
1555+
depositReceipt1 <- increment n1 walletSk commitUTxO1
1556+
queryWalletBalance walletVk `shouldReturn` lovelaceToValue (commitAmount * 2)
15671557

15681558
-- Increment commit #2
1569-
depositTransaction2 <-
1570-
parseUrlThrow ("POST " <> hydraNodeBaseUrl n1 <> "/commit")
1571-
<&> setRequestBodyJSON commitUTxO2
1572-
>>= httpJSON
1573-
<&> getResponseBody
1574-
1575-
let tx2 = signTx walletSk depositTransaction2
1576-
Backend.submitTransaction backend tx2
1577-
1578-
deadline2 <- waitMatch 10 n1 $ \v -> do
1579-
guard $ v ^? key "tag" == Just "CommitRecorded"
1580-
v ^? key "deadline" >>= parseMaybe parseJSON
1581-
1582-
(selectLovelace . balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1583-
`shouldReturn` commitAmount
1559+
depositReceipt2 <- increment n1 walletSk commitUTxO2
1560+
queryWalletBalance walletVk `shouldReturn` lovelaceToValue commitAmount
15841561

15851562
-- Increment commit #3
1586-
depositTransaction3 <-
1587-
parseUrlThrow ("POST " <> hydraNodeBaseUrl n1 <> "/commit")
1588-
<&> setRequestBodyJSON commitUTxO3
1589-
>>= httpJSON
1590-
<&> getResponseBody
1591-
1592-
let tx3 = signTx walletSk depositTransaction3
1593-
Backend.submitTransaction backend tx3
1594-
1595-
deadline3 <- waitMatch 10 n1 $ \v -> do
1596-
guard $ v ^? key "tag" == Just "CommitRecorded"
1597-
v ^? key "deadline" >>= parseMaybe parseJSON
1598-
1599-
(selectLovelace . balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1600-
`shouldReturn` 0
1563+
depositReceipt3 <- increment n1 walletSk commitUTxO3
1564+
selectLovelace <$> queryWalletBalance walletVk `shouldReturn` 0
16011565

1602-
-- Close the head
1566+
-- 1. Close the head
16031567
send n1 $ input "Close" []
16041568

1605-
deadline1' <- waitMatch (10 * blockTime) n1 $ \v -> do
1569+
contestationDeadline <- waitMatch (10 * blockTime) n1 $ \v -> do
16061570
guard $ v ^? key "tag" == Just "HeadIsClosed"
16071571
v ^? key "contestationDeadline" . _JSON
16081572

16091573
-- Recover deposit #1
1610-
let path1 = BSC.unpack $ urlEncode False $ encodeUtf8 $ T.pack $ show (getTxId $ getTxBody tx1)
1611-
-- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1612-
diff1 <- realToFrac . diffUTCTime deadline1 <$> getCurrentTime
1613-
threadDelay $ diff1 + 1
1574+
recover n1 depositReceipt1 commitUTxO1
1575+
queryWalletBalance walletVk `shouldReturn` balance commitUTxO1
16141576

1615-
(`shouldReturn` "OK") $
1616-
parseUrlThrow ("DELETE " <> hydraNodeBaseUrl n1 <> "/commits/" <> path1)
1617-
>>= httpJSON
1618-
<&> getResponseBody @String
1619-
1620-
waitMatch 20 n1 $ \v -> do
1621-
guard $ v ^? key "tag" == Just "CommitRecovered"
1622-
guard $ v ^? key "recoveredUTxO" == Just (toJSON commitUTxO1)
1623-
1624-
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1625-
`shouldReturn` lovelaceToValue commitAmount
1626-
1627-
-- Fanout the head
1628-
remainingTime <- diffUTCTime deadline1' <$> getCurrentTime
1577+
-- 2. Fanout the head
1578+
remainingTime <- diffUTCTime contestationDeadline <$> getCurrentTime
16291579
waitFor hydraTracer (remainingTime + 3 * blockTime) [n1] $
16301580
output "ReadyToFanout" ["headId" .= headId]
16311581
send n1 $ input "Fanout" []
16321582
waitMatch (20 * blockTime) n1 $ \v ->
16331583
guard $ v ^? key "tag" == Just "HeadIsFinalized"
16341584

16351585
-- Recover deposit #2
1636-
let path2 = BSC.unpack $ urlEncode False $ encodeUtf8 $ T.pack $ show (getTxId $ getTxBody tx2)
1637-
-- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1638-
diff2 <- realToFrac . diffUTCTime deadline2 <$> getCurrentTime
1639-
threadDelay $ diff2 + 1
1640-
1641-
(`shouldReturn` "OK") $
1642-
parseUrlThrow ("DELETE " <> hydraNodeBaseUrl n1 <> "/commits/" <> path2)
1643-
>>= httpJSON
1644-
<&> getResponseBody @String
1645-
1646-
waitMatch 20 n1 $ \v -> do
1647-
guard $ v ^? key "tag" == Just "CommitRecovered"
1648-
guard $ v ^? key "recoveredUTxO" == Just (toJSON commitUTxO2)
1649-
1650-
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1651-
`shouldReturn` lovelaceToValue (commitAmount * 2)
1586+
recover n1 depositReceipt2 commitUTxO2
1587+
queryWalletBalance walletVk `shouldReturn` balance (commitUTxO1 <> commitUTxO2)
16521588

1653-
-- Assert final wallet balance
1654-
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1655-
`shouldReturn` balance (commitUTxO1 <> commitUTxO2)
1656-
1657-
-- Open a new head
1589+
-- 3. Open a new head
16581590
send n1 $ input "Init" []
16591591
headId2 <- waitMatch 10 n1 $ headIsInitializingWith (Set.fromList [alice])
16601592

@@ -1665,28 +1597,46 @@ canRecoverDepositInAnyState tracer workDir backend hydraScriptsTxId =
16651597
output "HeadIsOpen" ["utxo" .= object mempty, "headId" .= headId2]
16661598

16671599
-- Recover deposit #3
1668-
let path3 = BSC.unpack $ urlEncode False $ encodeUtf8 $ T.pack $ show (getTxId $ getTxBody tx3)
1669-
-- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1670-
diff3 <- realToFrac . diffUTCTime deadline3 <$> getCurrentTime
1671-
threadDelay $ diff3 + 1
1600+
recover n1 depositReceipt3 commitUTxO3
1601+
queryWalletBalance walletVk `shouldReturn` balance (commitUTxO1 <> commitUTxO2 <> commitUTxO3)
1602+
where
1603+
hydraTracer = contramap FromHydraNode tracer
1604+
1605+
queryWalletBalance walletVk =
1606+
balance <$> Backend.queryUTxOFor backend QueryTip walletVk
16721607

1673-
(`shouldReturn` "OK") $
1674-
parseUrlThrow ("DELETE " <> hydraNodeBaseUrl n1 <> "/commits/" <> path3)
1608+
increment :: HydraClient -> SigningKey PaymentKey -> UTxO -> IO (TxId, UTCTime)
1609+
increment n walletSk commitUTxO = do
1610+
depositTransaction <-
1611+
parseUrlThrow ("POST " <> hydraNodeBaseUrl n <> "/commit")
1612+
<&> setRequestBodyJSON commitUTxO
16751613
>>= httpJSON
1676-
<&> getResponseBody @String
1614+
<&> getResponseBody
16771615

1678-
waitMatch 20 n1 $ \v -> do
1679-
guard $ v ^? key "tag" == Just "CommitRecovered"
1680-
guard $ v ^? key "recoveredUTxO" == Just (toJSON commitUTxO3)
1616+
let tx = signTx walletSk depositTransaction
1617+
Backend.submitTransaction backend tx
16811618

1682-
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1683-
`shouldReturn` lovelaceToValue (commitAmount * 3)
1619+
deadline <- waitMatch 10 n $ \v -> do
1620+
guard $ v ^? key "tag" == Just "CommitRecorded"
1621+
v ^? key "deadline" >>= parseMaybe parseJSON
16841622

1685-
-- Assert final wallet balance
1686-
(balance <$> Backend.queryUTxOFor backend QueryTip walletVk)
1687-
`shouldReturn` balance (commitUTxO1 <> commitUTxO2 <> commitUTxO3)
1688-
where
1689-
hydraTracer = contramap FromHydraNode tracer
1623+
pure (getTxId $ getTxBody tx, deadline)
1624+
1625+
recover :: HydraClient -> (TxId, UTCTime) -> UTxO -> IO ()
1626+
recover n (depositId, deadline) commitUTxO = do
1627+
-- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1628+
diff <- realToFrac . diffUTCTime deadline <$> getCurrentTime
1629+
threadDelay $ diff + 1
1630+
1631+
let path = BSC.unpack $ urlEncode False $ encodeUtf8 $ T.pack $ show depositId
1632+
(`shouldReturn` "OK") $
1633+
parseUrlThrow ("DELETE " <> hydraNodeBaseUrl n <> "/commits/" <> path)
1634+
>>= httpJSON
1635+
<&> getResponseBody @String
1636+
1637+
waitMatch 20 n $ \v -> do
1638+
guard $ v ^? key "tag" == Just "CommitRecovered"
1639+
guard $ v ^? key "recoveredUTxO" == Just (toJSON commitUTxO)
16901640

16911641
-- | Make sure to be able to see pending deposits.
16921642
canSeePendingDeposits :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> NominalDiffTime -> backend -> [TxId] -> IO ()

0 commit comments

Comments
 (0)