4a29fbdab2
The src/dest terminology for routing packets is kind of confusing because the source HTLC may not be the source of the packet for settles/fails traversing the circuit in the opposite direction. This changes the nomenclature to incoming/outgoing and always references the HTLCs themselves.
156 lines
4.2 KiB
Go
156 lines
4.2 KiB
Go
package htlcswitch_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
|
"github.com/lightningnetwork/lnd/lnwire"
|
|
)
|
|
|
|
func TestCircuitMap(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
var hash1, hash2, hash3 [32]byte
|
|
hash1[0] = 1
|
|
hash2[0] = 2
|
|
hash3[0] = 3
|
|
|
|
var (
|
|
chan1 = lnwire.NewShortChanIDFromInt(1)
|
|
chan2 = lnwire.NewShortChanIDFromInt(2)
|
|
)
|
|
|
|
circuitMap := htlcswitch.NewCircuitMap()
|
|
|
|
circuit := circuitMap.LookupByHTLC(chan1, 0)
|
|
if circuit != nil {
|
|
t.Fatalf("LookupByHTLC returned a circuit before any were added: %v",
|
|
circuit)
|
|
}
|
|
|
|
// Add multiple circuits with same destination channel but different HTLC
|
|
// IDs and payment hashes.
|
|
circuitMap.Add(&htlcswitch.PaymentCircuit{
|
|
PaymentHash: hash1,
|
|
IncomingChanID: chan2,
|
|
IncomingHTLCID: 1,
|
|
OutgoingChanID: chan1,
|
|
OutgoingHTLCID: 0,
|
|
})
|
|
|
|
circuitMap.Add(&htlcswitch.PaymentCircuit{
|
|
PaymentHash: hash2,
|
|
IncomingChanID: chan2,
|
|
IncomingHTLCID: 2,
|
|
OutgoingChanID: chan1,
|
|
OutgoingHTLCID: 1,
|
|
})
|
|
|
|
// Add another circuit with an already-used HTLC ID but different
|
|
// destination channel.
|
|
circuitMap.Add(&htlcswitch.PaymentCircuit{
|
|
PaymentHash: hash3,
|
|
IncomingChanID: chan1,
|
|
IncomingHTLCID: 2,
|
|
OutgoingChanID: chan2,
|
|
OutgoingHTLCID: 0,
|
|
})
|
|
|
|
circuit = circuitMap.LookupByHTLC(chan1, 0)
|
|
if circuit == nil {
|
|
t.Fatal("LookupByHTLC failed to find circuit")
|
|
}
|
|
if circuit.PaymentHash != hash1 || circuit.IncomingHTLCID != 1 {
|
|
t.Fatalf("LookupByHTLC found unexpected circuit: %v", circuit)
|
|
}
|
|
|
|
circuit = circuitMap.LookupByHTLC(chan1, 1)
|
|
if circuit == nil {
|
|
t.Fatal("LookupByHTLC failed to find circuit")
|
|
}
|
|
if circuit.PaymentHash != hash2 || circuit.IncomingHTLCID != 2 {
|
|
t.Fatalf("LookupByHTLC found unexpected circuit: %v", circuit)
|
|
}
|
|
|
|
circuit = circuitMap.LookupByHTLC(chan2, 0)
|
|
if circuit == nil {
|
|
t.Fatal("LookupByHTLC failed to find circuit")
|
|
}
|
|
if circuit.PaymentHash != hash3 || circuit.IncomingHTLCID != 2 {
|
|
t.Fatalf("LookupByHTLC found unexpected circuit: %v", circuit)
|
|
}
|
|
|
|
// Even though a circuit was added with chan1, HTLC ID 2 as the source, the
|
|
// lookup should go by destination channel, HTLC ID.
|
|
circuit = circuitMap.LookupByHTLC(chan1, 2)
|
|
if circuit != nil {
|
|
t.Fatalf("LookupByHTLC returned a circuit without being added: %v",
|
|
circuit)
|
|
}
|
|
|
|
// Add a circuit with a destination channel and payment hash that are
|
|
// already added but a different HTLC ID.
|
|
circuitMap.Add(&htlcswitch.PaymentCircuit{
|
|
PaymentHash: hash1,
|
|
IncomingChanID: chan2,
|
|
IncomingHTLCID: 3,
|
|
OutgoingChanID: chan1,
|
|
OutgoingHTLCID: 3,
|
|
})
|
|
|
|
circuit = circuitMap.LookupByHTLC(chan1, 3)
|
|
if circuit == nil {
|
|
t.Fatal("LookupByHTLC failed to find circuit")
|
|
}
|
|
if circuit.PaymentHash != hash1 || circuit.IncomingHTLCID != 3 {
|
|
t.Fatalf("LookupByHTLC found unexpected circuit: %v", circuit)
|
|
}
|
|
|
|
// Check lookups by payment hash.
|
|
circuits := circuitMap.LookupByPaymentHash(hash1)
|
|
if len(circuits) != 2 {
|
|
t.Fatalf("LookupByPaymentHash returned wrong number of circuits for "+
|
|
"hash1: expected %d, got %d", 2, len(circuits))
|
|
}
|
|
|
|
circuits = circuitMap.LookupByPaymentHash(hash2)
|
|
if len(circuits) != 1 {
|
|
t.Fatalf("LookupByPaymentHash returned wrong number of circuits for "+
|
|
"hash2: expected %d, got %d", 1, len(circuits))
|
|
}
|
|
|
|
// Test removing circuits and the subsequent lookups.
|
|
err := circuitMap.Remove(chan1, 0)
|
|
if err != nil {
|
|
t.Fatalf("Remove returned unexpected error: %v", err)
|
|
}
|
|
|
|
circuits = circuitMap.LookupByPaymentHash(hash1)
|
|
if len(circuits) != 1 {
|
|
t.Fatalf("LookupByPaymentHash returned wrong number of circuits for "+
|
|
"hash1: expecected %d, got %d", 1, len(circuits))
|
|
}
|
|
if circuits[0].OutgoingHTLCID != 3 {
|
|
t.Fatalf("LookupByPaymentHash returned wrong circuit for hash1: %v",
|
|
circuits[0])
|
|
}
|
|
|
|
// Removing already-removed circuit should return an error.
|
|
err = circuitMap.Remove(chan1, 0)
|
|
if err == nil {
|
|
t.Fatal("Remove did not return expected not found error")
|
|
}
|
|
|
|
// Remove last remaining circuit with payment hash hash1.
|
|
err = circuitMap.Remove(chan1, 3)
|
|
if err != nil {
|
|
t.Fatalf("Remove returned unexpected error: %v", err)
|
|
}
|
|
|
|
circuits = circuitMap.LookupByPaymentHash(hash1)
|
|
if len(circuits) != 0 {
|
|
t.Fatalf("LookupByPaymentHash returned wrong number of circuits for "+
|
|
"hash1: expecected %d, got %d", 0, len(circuits))
|
|
}
|
|
}
|