diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index b6aa1933..687483ab 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -15200,6 +15200,10 @@ var testsCases = []*testCase{ name: "intercept forwarded htlc packets", test: testForwardInterceptor, }, + { + name: "wumbo channels", + test: testWumboChannels, + }, } // TestLightningNetworkDaemon performs a series of integration tests amongst a diff --git a/lntest/itest/lnd_wumbo_channels_test.go b/lntest/itest/lnd_wumbo_channels_test.go new file mode 100644 index 00000000..31f379b8 --- /dev/null +++ b/lntest/itest/lnd_wumbo_channels_test.go @@ -0,0 +1,92 @@ +// +build rpctest + +package itest + +import ( + "context" + "strings" + + "github.com/btcsuite/btcutil" + "github.com/lightningnetwork/lnd" + "github.com/lightningnetwork/lnd/lntest" +) + +// testWumboChannels tests that only a node that signals wumbo channel +// acceptances will allow a wumbo channel to be created. Additionally, if a +// node is running with mini channels only enabled, then they should reject any +// inbound wumbo channel requests. +func testWumboChannels(net *lntest.NetworkHarness, t *harnessTest) { + // With all the channel types exercised, we'll now make sure the wumbo + // signalling support works properly. + // + // We'll make two new nodes, with one of them signalling support for + // wumbo channels while the other doesn't. + wumboNode, err := net.NewNode( + "wumbo", []string{"--protocol.wumbo-channels"}, + ) + if err != nil { + t.Fatalf("unable to create new node: %v", err) + } + defer shutdownAndAssert(net, t, wumboNode) + miniNode, err := net.NewNode("mini", nil) + if err != nil { + t.Fatalf("unable to create new node: %v", err) + } + defer shutdownAndAssert(net, t, miniNode) + + // We'll send coins to the wumbo node, as it'll be the one imitating + // the channel funding. + ctxb := context.Background() + err = net.SendCoins(ctxb, btcutil.SatoshiPerBitcoin, wumboNode) + if err != nil { + t.Fatalf("unable to send coins to carol: %v", err) + } + + // Next we'll connect both nodes, then attempt to make a wumbo channel + // funding request to the mini node we created above. The wumbo request + // should fail as the node isn't advertising wumbo channels. + err = net.EnsureConnected(ctxb, wumboNode, miniNode) + if err != nil { + t.Fatalf("unable to connect peers: %v", err) + } + + chanAmt := lnd.MaxBtcFundingAmount + 1 + _, err = net.OpenChannel( + ctxb, wumboNode, miniNode, lntest.OpenChannelParams{ + Amt: chanAmt, + }, + ) + if err == nil { + t.Fatalf("expected wumbo channel funding to fail") + } + + // The test should indicate a failure due to the channel being too + // large. + if !strings.Contains(err.Error(), "channel too large") { + t.Fatalf("channel should be rejected due to size, instead "+ + "error was: %v", err) + } + + // We'll now make another wumbo node to accept our wumbo channel + // funding. + wumboNode2, err := net.NewNode( + "wumbo2", []string{"--protocol.wumbo-channels"}, + ) + if err != nil { + t.Fatalf("unable to create new node: %v", err) + } + defer shutdownAndAssert(net, t, wumboNode2) + + // Creating a wumbo channel between these two nodes should succeed. + err = net.EnsureConnected(ctxb, wumboNode, wumboNode2) + if err != nil { + t.Fatalf("unable to connect peers: %v", err) + } + chanPoint := openChannelAndAssert( + ctxb, t, net, wumboNode, wumboNode2, + lntest.OpenChannelParams{ + Amt: chanAmt, + }, + ) + closeChannelAndAssert(ctxb, t, net, wumboNode, chanPoint, false) +} diff --git a/lntest/itest/log_error_whitelist.txt b/lntest/itest/log_error_whitelist.txt index 0185f6b4..59f1bdc3 100644 --- a/lntest/itest/log_error_whitelist.txt +++ b/lntest/itest/log_error_whitelist.txt @@ -191,4 +191,7 @@