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  }