mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-09-26 21:46:37 +02:00
itest: add coverage for failure at the introduction node
This commit is contained in:
@@ -574,6 +574,10 @@ var allTestCases = []*lntest.TestCase{
|
|||||||
Name: "relayer blinded error",
|
Name: "relayer blinded error",
|
||||||
TestFunc: testRelayingBlindedError,
|
TestFunc: testRelayingBlindedError,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "introduction blinded error",
|
||||||
|
TestFunc: testIntroductionNodeError,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "removetx",
|
Name: "removetx",
|
||||||
TestFunc: testRemoveTx,
|
TestFunc: testRemoveTx,
|
||||||
|
@@ -841,7 +841,7 @@ func testReceiverBlindedError(ht *lntest.HarnessTest) {
|
|||||||
defer testCase.cleanup()
|
defer testCase.cleanup()
|
||||||
route := testCase.setup(ctx)
|
route := testCase.setup(ctx)
|
||||||
|
|
||||||
sendAndResumeBlindedPayment(ctx, ht, testCase, route)
|
sendAndResumeBlindedPayment(ctx, ht, testCase, route, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// testRelayingBlindedError tests handling of errors from relaying nodes in a
|
// testRelayingBlindedError tests handling of errors from relaying nodes in a
|
||||||
@@ -861,7 +861,7 @@ func testRelayingBlindedError(ht *lntest.HarnessTest) {
|
|||||||
// a lack of liquidity. This check only happens _after_ the interceptor
|
// a lack of liquidity. This check only happens _after_ the interceptor
|
||||||
// has given the instruction to resume so we can use test
|
// has given the instruction to resume so we can use test
|
||||||
// infrastructure that will go ahead and intercept the payment.
|
// infrastructure that will go ahead and intercept the payment.
|
||||||
sendAndResumeBlindedPayment(ctx, ht, testCase, route)
|
sendAndResumeBlindedPayment(ctx, ht, testCase, route, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendAndResumeBlindedPayment sends a blinded payment through the test
|
// sendAndResumeBlindedPayment sends a blinded payment through the test
|
||||||
@@ -870,14 +870,18 @@ func testRelayingBlindedError(ht *lntest.HarnessTest) {
|
|||||||
// reach Carol and asserts that all errors appear to originate from the
|
// reach Carol and asserts that all errors appear to originate from the
|
||||||
// introduction node.
|
// introduction node.
|
||||||
func sendAndResumeBlindedPayment(ctx context.Context, ht *lntest.HarnessTest,
|
func sendAndResumeBlindedPayment(ctx context.Context, ht *lntest.HarnessTest,
|
||||||
testCase *blindedForwardTest, route *routing.BlindedPayment) {
|
testCase *blindedForwardTest, route *routing.BlindedPayment,
|
||||||
|
interceptAtCarol bool) {
|
||||||
|
|
||||||
blindedRoute := testCase.createRouteToBlinded(10_000_000, route)
|
blindedRoute := testCase.createRouteToBlinded(10_000_000, route)
|
||||||
|
|
||||||
// Before we dispatch the payment, spin up a goroutine that will
|
// Before we dispatch the payment, spin up a goroutine that will
|
||||||
// intercept the HTLC on Carol's forward. This allows us to ensure
|
// intercept the HTLC on Carol's forward. This allows us to ensure
|
||||||
// that the HTLC actually reaches the location we expect it to.
|
// that the HTLC actually reaches the location we expect it to.
|
||||||
resolveHTLC := testCase.interceptFinalHop()
|
var resolveHTLC func(routerrpc.ResolveHoldForwardAction)
|
||||||
|
if interceptAtCarol {
|
||||||
|
resolveHTLC = testCase.interceptFinalHop()
|
||||||
|
}
|
||||||
|
|
||||||
// First, test sending the payment all the way through to Dave. We
|
// First, test sending the payment all the way through to Dave. We
|
||||||
// expect this payment to fail, because he does not know how to
|
// expect this payment to fail, because he does not know how to
|
||||||
@@ -886,7 +890,9 @@ func sendAndResumeBlindedPayment(ctx context.Context, ht *lntest.HarnessTest,
|
|||||||
|
|
||||||
// When Carol intercepts the HTLC, instruct her to resume the payment
|
// When Carol intercepts the HTLC, instruct her to resume the payment
|
||||||
// so that it'll reach Dave and fail.
|
// so that it'll reach Dave and fail.
|
||||||
resolveHTLC(routerrpc.ResolveHoldForwardAction_RESUME)
|
if interceptAtCarol {
|
||||||
|
resolveHTLC(routerrpc.ResolveHoldForwardAction_RESUME)
|
||||||
|
}
|
||||||
|
|
||||||
// Wait for the HTLC to reflect as failed for Alice.
|
// Wait for the HTLC to reflect as failed for Alice.
|
||||||
preimage, err := lntypes.MakePreimage(testCase.preimage[:])
|
preimage, err := lntypes.MakePreimage(testCase.preimage[:])
|
||||||
@@ -901,3 +907,21 @@ func sendAndResumeBlindedPayment(ctx context.Context, ht *lntest.HarnessTest,
|
|||||||
pmt.Htlcs[0].Failure.Code,
|
pmt.Htlcs[0].Failure.Code,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// testIntroductionNodeError tests handling of errors in a blinded route when
|
||||||
|
// the introduction node is the source of the error. This test sends a payment
|
||||||
|
// over Alice -- Bob -- Carol -- Dave, where Bob is the introduction node and
|
||||||
|
// has insufficient outgoing liquidity to forward on to carol.
|
||||||
|
func testIntroductionNodeError(ht *lntest.HarnessTest) {
|
||||||
|
ctx, testCase := newBlindedForwardTest(ht)
|
||||||
|
defer testCase.cleanup()
|
||||||
|
route := testCase.setup(ctx)
|
||||||
|
|
||||||
|
// Before we send our payment, drain all of Carol's incoming liquidity
|
||||||
|
// so that she can't receive the forward from Bob, causing a failure
|
||||||
|
// at the introduction node.
|
||||||
|
testCase.drainCarolLiquidity(true)
|
||||||
|
|
||||||
|
// Send the payment, but do not expect it to reach Carol at all.
|
||||||
|
sendAndResumeBlindedPayment(ctx, ht, testCase, route, false)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user