From 242a844012796d7b3139bf5d70a7e503927cdbc5 Mon Sep 17 00:00:00 2001 From: bluetegu Date: Mon, 10 Dec 2018 07:42:57 -0500 Subject: [PATCH] routing: fix TestSendPaymentErrorRepeatedFeeInsufficient The simulated error returned was rejected due to signature failure, and didn't simulate correctly the insufficient fees error as intended. Fix error by including correct signature. --- routing/router_test.go | 59 +++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/routing/router_test.go b/routing/router_test.go index aeba0530..10f6a561 100644 --- a/routing/router_test.go +++ b/routing/router_test.go @@ -206,6 +206,30 @@ func createTestCtxFromFile(startingHeight uint32, testGraph string) (*testCtx, f return createTestCtxFromGraphInstance(startingHeight, graphInstance, false) } +// Add valid signature to channel update simulated as error received from the +// network. +func signErrChanUpdate(key *btcec.PrivateKey, + errChanUpdate *lnwire.ChannelUpdate) error { + + chanUpdateMsg, err := errChanUpdate.DataToSign() + if err != nil { + return err + } + + digest := chainhash.DoubleHashB(chanUpdateMsg) + sig, err := key.Sign(digest) + if err != nil { + return err + } + + errChanUpdate.Signature, err = lnwire.NewSigFromSignature(sig) + if err != nil { + return err + } + + return nil +} + // TestFindRoutesWithFeeLimit asserts that routes found by the FindRoutes method // within the channel router contain a total fee less than or equal to the fee // limit. @@ -504,15 +528,22 @@ func TestChannelUpdateValidation(t *testing.T) { func TestSendPaymentErrorRepeatedFeeInsufficient(t *testing.T) { t.Parallel() + var ( + roasbeefSongokuChanID = uint64(12345) + songokuSophonChanID = uint64(3495345) + ) + const startingBlockHeight = 101 - ctx, cleanUp, err := createTestCtxFromFile(startingBlockHeight, basicGraphFilePath) + ctx, cleanUp, err := createTestCtxFromFile( + startingBlockHeight, basicGraphFilePath, + ) if err != nil { t.Fatalf("unable to create router: %v", err) } defer cleanUp() // Craft a LightningPayment struct that'll send a payment from roasbeef - // to luo ji for 100 satoshis. + // to sophon for 1000 satoshis. var payHash lntypes.Hash amt := lnwire.NewMSatFromSatoshis(1000) payment := LightningPayment{ @@ -525,17 +556,20 @@ func TestSendPaymentErrorRepeatedFeeInsufficient(t *testing.T) { var preImage [32]byte copy(preImage[:], bytes.Repeat([]byte{9}, 32)) - // We'll also fetch the first outgoing channel edge from roasbeef to - // son goku. We'll obtain this as we'll need to to generate the + // We'll also fetch the first outgoing channel edge from son goku + // to sophon. We'll obtain this as we'll need to to generate the // FeeInsufficient error that we'll send back. - chanID := uint64(12345) - _, _, edgeUpdateToFail, err := ctx.graph.FetchChannelEdgesByID(chanID) + _, _, edgeUpdateToFail, err := ctx.graph.FetchChannelEdgesByID( + songokuSophonChanID, + ) if err != nil { t.Fatalf("unable to fetch chan id: %v", err) } errChanUpdate := lnwire.ChannelUpdate{ - ShortChannelID: lnwire.NewShortChanIDFromInt(chanID), + ShortChannelID: lnwire.NewShortChanIDFromInt( + songokuSophonChanID, + ), Timestamp: uint32(edgeUpdateToFail.LastUpdate.Unix()), MessageFlags: edgeUpdateToFail.MessageFlags, ChannelFlags: edgeUpdateToFail.ChannelFlags, @@ -546,13 +580,20 @@ func TestSendPaymentErrorRepeatedFeeInsufficient(t *testing.T) { FeeRate: uint32(edgeUpdateToFail.FeeProportionalMillionths), } + err = signErrChanUpdate(ctx.privKeys["songoku"], &errChanUpdate) + if err != nil { + t.Fatalf("Failed to sign channel update error: %v ", err) + } + // We'll now modify the SendToSwitch method to return an error for the // outgoing channel to Son goku. This will be a fee related error, so // it should only cause the edge to be pruned after the second attempt. ctx.router.cfg.Payer.(*mockPaymentAttemptDispatcher).setPaymentResult( func(firstHop lnwire.ShortChannelID) ([32]byte, error) { - roasbeefSongoku := lnwire.NewShortChanIDFromInt(chanID) + roasbeefSongoku := lnwire.NewShortChanIDFromInt( + roasbeefSongokuChanID, + ) if firstHop == roasbeefSongoku { return [32]byte{}, htlcswitch.NewForwardingError( // Within our error, we'll add a @@ -590,7 +631,7 @@ func TestSendPaymentErrorRepeatedFeeInsufficient(t *testing.T) { // The route should have pham nuwen as the first hop. if route.Hops[0].PubKeyBytes != ctx.aliases["phamnuwen"] { - t.Fatalf("route should go through satoshi as first hop, "+ + t.Fatalf("route should go through pham nuwen as first hop, "+ "instead passes through: %v", getAliasFromPubKey(route.Hops[0].PubKeyBytes, ctx.aliases))