lnd/htlcswitch/circuit_test.go
Jim Posen 4a29fbdab2 htlcswitch: Rename htlcPacket fields for clarity.
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.
2017-12-14 17:53:58 -08:00

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))
}
}