htlcswitch/test: test additional forwarding scenarios
This commit is contained in:
parent
4ea8927845
commit
e1b7cfe2e5
@ -1287,10 +1287,69 @@ func TestSwitchForwardCircuitPersistence(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type multiHopFwdTest struct {
|
||||||
|
name string
|
||||||
|
eligible1, eligible2 bool
|
||||||
|
failure1, failure2 lnwire.FailureMessage
|
||||||
|
expectedReply lnwire.FailCode
|
||||||
|
}
|
||||||
|
|
||||||
// TestSkipIneligibleLinksMultiHopForward tests that if a multi-hop HTLC comes
|
// TestSkipIneligibleLinksMultiHopForward tests that if a multi-hop HTLC comes
|
||||||
// along, then we won't attempt to froward it down al ink that isn't yet able
|
// along, then we won't attempt to froward it down al ink that isn't yet able
|
||||||
// to forward any HTLC's.
|
// to forward any HTLC's.
|
||||||
func TestSkipIneligibleLinksMultiHopForward(t *testing.T) {
|
func TestSkipIneligibleLinksMultiHopForward(t *testing.T) {
|
||||||
|
tests := []multiHopFwdTest{
|
||||||
|
// None of the channels is eligible or has enough bandwidth.
|
||||||
|
{
|
||||||
|
name: "not eligible",
|
||||||
|
expectedReply: lnwire.CodeTemporaryChannelFailure,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Channel one has a policy failure and the other channel isn't
|
||||||
|
// available.
|
||||||
|
{
|
||||||
|
name: "policy fail",
|
||||||
|
eligible1: true,
|
||||||
|
failure1: lnwire.NewFinalIncorrectCltvExpiry(0),
|
||||||
|
expectedReply: lnwire.CodeFinalIncorrectCltvExpiry,
|
||||||
|
},
|
||||||
|
|
||||||
|
// The requested channel is not eligible or has insufficient
|
||||||
|
// bandwidth, but the packet is forwarded through the other
|
||||||
|
// channel.
|
||||||
|
{
|
||||||
|
name: "non-strict success",
|
||||||
|
eligible2: true,
|
||||||
|
expectedReply: lnwire.CodeNone,
|
||||||
|
},
|
||||||
|
|
||||||
|
// The requested channel is not eligible or has insufficient
|
||||||
|
// bandwidth and the other channel's policy isn't satisfied.
|
||||||
|
//
|
||||||
|
// NOTE: We expect a temporary channel failure here, but don't
|
||||||
|
// receive it!
|
||||||
|
{
|
||||||
|
name: "non-strict policy fail",
|
||||||
|
eligible2: true,
|
||||||
|
failure2: lnwire.NewFinalIncorrectCltvExpiry(0),
|
||||||
|
expectedReply: lnwire.CodeUnknownNextPeer,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
test := test
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
testSkipIneligibleLinksMultiHopForward(t, &test)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// testSkipIneligibleLinksMultiHopForward tests that if a multi-hop HTLC comes
|
||||||
|
// along, then we won't attempt to froward it down al ink that isn't yet able
|
||||||
|
// to forward any HTLC's.
|
||||||
|
func testSkipIneligibleLinksMultiHopForward(t *testing.T,
|
||||||
|
testCase *multiHopFwdTest) {
|
||||||
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
var packet *htlcPacket
|
var packet *htlcPacket
|
||||||
@ -1313,22 +1372,32 @@ func TestSkipIneligibleLinksMultiHopForward(t *testing.T) {
|
|||||||
}
|
}
|
||||||
defer s.Stop()
|
defer s.Stop()
|
||||||
|
|
||||||
chanID1, chanID2, aliceChanID, bobChanID := genIDs()
|
chanID1, aliceChanID := genID()
|
||||||
|
|
||||||
aliceChannelLink := newMockChannelLink(
|
aliceChannelLink := newMockChannelLink(
|
||||||
s, chanID1, aliceChanID, alicePeer, true,
|
s, chanID1, aliceChanID, alicePeer, true,
|
||||||
)
|
)
|
||||||
|
|
||||||
// We'll create a link for Bob, but mark the link as unable to forward
|
// We'll create a link for Bob, but mark the link as unable to forward
|
||||||
// any new outgoing HTLC's.
|
// any new outgoing HTLC's.
|
||||||
bobChannelLink := newMockChannelLink(
|
chanID2, bobChanID2 := genID()
|
||||||
s, chanID2, bobChanID, bobPeer, false,
|
bobChannelLink1 := newMockChannelLink(
|
||||||
|
s, chanID2, bobChanID2, bobPeer, testCase.eligible1,
|
||||||
)
|
)
|
||||||
|
bobChannelLink1.checkHtlcForwardResult = testCase.failure1
|
||||||
|
|
||||||
|
chanID3, bobChanID3 := genID()
|
||||||
|
bobChannelLink2 := newMockChannelLink(
|
||||||
|
s, chanID3, bobChanID3, bobPeer, testCase.eligible2,
|
||||||
|
)
|
||||||
|
bobChannelLink2.checkHtlcForwardResult = testCase.failure2
|
||||||
|
|
||||||
if err := s.AddLink(aliceChannelLink); err != nil {
|
if err := s.AddLink(aliceChannelLink); err != nil {
|
||||||
t.Fatalf("unable to add alice link: %v", err)
|
t.Fatalf("unable to add alice link: %v", err)
|
||||||
}
|
}
|
||||||
if err := s.AddLink(bobChannelLink); err != nil {
|
if err := s.AddLink(bobChannelLink1); err != nil {
|
||||||
|
t.Fatalf("unable to add bob link: %v", err)
|
||||||
|
}
|
||||||
|
if err := s.AddLink(bobChannelLink2); err != nil {
|
||||||
t.Fatalf("unable to add bob link: %v", err)
|
t.Fatalf("unable to add bob link: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1340,7 +1409,7 @@ func TestSkipIneligibleLinksMultiHopForward(t *testing.T) {
|
|||||||
packet = &htlcPacket{
|
packet = &htlcPacket{
|
||||||
incomingChanID: aliceChannelLink.ShortChanID(),
|
incomingChanID: aliceChannelLink.ShortChanID(),
|
||||||
incomingHTLCID: 0,
|
incomingHTLCID: 0,
|
||||||
outgoingChanID: bobChannelLink.ShortChanID(),
|
outgoingChanID: bobChannelLink1.ShortChanID(),
|
||||||
htlc: &lnwire.UpdateAddHTLC{
|
htlc: &lnwire.UpdateAddHTLC{
|
||||||
PaymentHash: rhash,
|
PaymentHash: rhash,
|
||||||
Amount: 1,
|
Amount: 1,
|
||||||
@ -1350,13 +1419,23 @@ func TestSkipIneligibleLinksMultiHopForward(t *testing.T) {
|
|||||||
|
|
||||||
// The request to forward should fail as
|
// The request to forward should fail as
|
||||||
err = s.forward(packet)
|
err = s.forward(packet)
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("forwarding should have failed due to inactive link")
|
|
||||||
}
|
|
||||||
|
|
||||||
failure := obfuscator.(*mockObfuscator).failure
|
failure := obfuscator.(*mockObfuscator).failure
|
||||||
if _, ok := failure.(*lnwire.FailTemporaryChannelFailure); !ok {
|
if testCase.expectedReply == lnwire.CodeNone {
|
||||||
t.Fatalf("unexpected failure %T", failure)
|
if err != nil {
|
||||||
|
t.Fatalf("forwarding should have succeeded")
|
||||||
|
}
|
||||||
|
if failure != nil {
|
||||||
|
t.Fatalf("unexpected failure %T", failure)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("forwarding should have failed due to " +
|
||||||
|
"inactive link")
|
||||||
|
}
|
||||||
|
if failure.Code() != testCase.expectedReply {
|
||||||
|
t.Fatalf("unexpected failure %T", failure)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.circuits.NumOpen() != 0 {
|
if s.circuits.NumOpen() != 0 {
|
||||||
|
Loading…
Reference in New Issue
Block a user