github.com/decred/dcrlnd@v0.7.6/lntest/itest/dcrlnd_automation_test.go (about) 1 package itest 2 3 import ( 4 "time" 5 6 "github.com/decred/dcrd/dcrutil/v4" 7 "github.com/decred/dcrlnd/lnrpc" 8 "github.com/decred/dcrlnd/lntest" 9 "github.com/stretchr/testify/require" 10 "matheusd.com/testctx" 11 ) 12 13 func testMissingChanReestablishAutoClosesChan(net *lntest.NetworkHarness, t *harnessTest) { 14 const ( 15 chanAmt = dcrutil.Amount(10000000) 16 pushAmt = dcrutil.Amount(5000000) 17 ) 18 password := []byte("El Psy Kongroo") 19 var err error 20 21 // Create a new retore scenario. 22 carolArgs := []string{"--automation.closechanreestablishwait=5"} 23 carol := net.NewNode(t.t, "carol", carolArgs) 24 defer shutdownAndAssert(net, t, carol) 25 26 daveArgs := []string{"--nolisten", "--minbackoff=1h"} 27 dave, mnemonic, _, err := net.NewNodeWithSeed( 28 "dave", daveArgs, password, false, 29 ) 30 require.Nil(t.t, err) 31 defer shutdownAndAssert(net, t, dave) 32 33 net.SendCoins(t.t, dcrutil.AtomsPerCoin, carol) 34 net.SendCoins(t.t, dcrutil.AtomsPerCoin, dave) 35 net.EnsureConnected(t.t, dave, carol) 36 37 chanPoint := openChannelAndAssert( 38 t, net, carol, dave, 39 lntest.OpenChannelParams{ 40 Amt: chanAmt, 41 PushAmt: pushAmt, 42 }, 43 ) 44 45 // Wait for both sides to see the opened channel. 46 err = dave.WaitForNetworkChannelOpen(chanPoint) 47 require.Nil(t.t, err) 48 err = carol.WaitForNetworkChannelOpen(chanPoint) 49 require.Nil(t.t, err) 50 51 // Perform a payment to assert channel is working. 52 invoice := &lnrpc.Invoice{ 53 Memo: "testing", 54 Value: 100000, 55 } 56 invoiceResp, err := carol.AddInvoice(testctx.New(t), invoice) 57 require.Nil(t.t, err) 58 err = completePaymentRequests( 59 dave, dave.RouterClient, 60 []string{invoiceResp.PaymentRequest}, true, 61 ) 62 require.Nil(t.t, err) 63 64 // Recreate Dave without the channel. 65 err = net.ShutdownNode(dave) 66 require.Nil(t.t, err) 67 time.Sleep(time.Second) 68 69 daveRestored, err := net.RestoreNodeWithSeed( 70 "dave", nil, password, mnemonic, "", 1000, 71 nil, copyPorts(dave), 72 ) 73 require.Nil(t.t, err) 74 assertNumPendingChannels(t, daveRestored, 0, 0, 0, 0) 75 assertNodeNumChannels(t, daveRestored, 0) 76 // ht.AssertNumEdges(daveRestored, 0, true) 77 78 // Assert Carol does not autoclose and Dave does not have the channel. 79 net.EnsureConnected(t.t, daveRestored, carol) 80 time.Sleep(time.Second) 81 assertNumPendingChannels(t, daveRestored, 0, 0, 0, 0) 82 assertNodeNumChannels(t, daveRestored, 0) 83 assertNumPendingChannels(t, carol, 0, 0, 0, 0) 84 assertNodeNumChannels(t, carol, 1) 85 86 // Assert Carol is tracking the time Dave has been online without 87 // reestablishing the channel. 88 require.Nil(t.t, net.DisconnectNodes(carol, daveRestored)) 89 time.Sleep(time.Second) 90 chanInfo, err := carol.ListChannels(testctx.New(t), &lnrpc.ListChannelsRequest{}) 91 require.Nil(t.t, err) 92 require.Len(t.t, chanInfo.Channels, 1) 93 require.Greater(t.t, chanInfo.Channels[0].ChanReestablishWaitTimeMs, int64(2000)) 94 95 // Wait long enough for Carol's automation to want to force-close the 96 // channel. 97 net.EnsureConnected(t.t, daveRestored, carol) 98 time.Sleep(time.Second * 3) 99 err = net.ShutdownNode(daveRestored) 100 require.Nil(t.t, err) 101 102 // Assert Carol force-closes the channel. 103 assertNumPendingChannels(t, carol, 1, 0, 0, 0) 104 assertNodeNumChannels(t, carol, 0) 105 mineBlocks(t, net, 1, 1) 106 cleanupForceClose(t, net, carol, chanPoint) 107 }