graph/db: migrate tests from Fatal to require helpers

Replace remaining fatal-style assertions in graph/db tests with direct
testify/require helpers. This simplifies control flow and reduces
indentation by using NoError, True/False, Equal, Len, Empty, and Nil
assertions directly.
This commit is contained in:
Elle Mouton committed 2026-02-25 11:14:55 +02:00
1 parent 0b00c66231
commit f8899dd324
4 files changed
+135 -455

No files matched your search

+5 -20
View File
@@ -3,7 +3,6 @@ package graphdb
import (
"bytes"
"net"
"strings"
"testing"
"github.com/lightningnetwork/lnd/lnwire"
@@ -148,29 +147,15 @@ func TestAddrSerialization(t *testing.T) {
var b bytes.Buffer
for _, test := range addrTests {
err := SerializeAddr(&b, test.expAddr)
switch {
case err == nil && test.serErr != "":
t.Fatalf("expected serialization err for addr %v",
test.expAddr)
case err != nil && test.serErr == "":
t.Fatalf("unexpected serialization err for addr %v: %v",
test.expAddr, err)
case err != nil && !strings.Contains(err.Error(), test.serErr):
t.Fatalf("unexpected serialization err for addr %v, "+
"want: %v, got %v", test.expAddr, test.serErr,
err)
case err != nil:
if test.serErr != "" {
require.Error(t, err)
require.ErrorContains(t, err, test.serErr)
continue
}
require.NoError(t, err)
addr, err := DeserializeAddr(&b)
if err != nil {
t.Fatalf("unable to deserialize address: %v", err)
}
require.NoError(t, err)
require.Equal(t, test.expAddr, addr)
}
}
+5 -14
View File
@@ -1,13 +1,13 @@
package graphdb
import (
"reflect"
"testing"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/lightningnetwork/lnd/graph/db/models"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/routing/route"
"github.com/stretchr/testify/require"
)
// TestChannelCache checks the behavior of the channelCache with respect to
@@ -23,9 +23,7 @@ func TestChannelCache(t *testing.T) {
// As a sanity check, assert that querying the empty cache does not
// return an entry.
_, ok := c.get(v, 0)
if ok {
t.Fatalf("channel cache should be empty")
}
require.False(t, ok)
// Now, fill up the cache entirely.
for i := uint64(0); i < cacheSize; i++ {
@@ -55,9 +53,7 @@ func TestChannelCache(t *testing.T) {
// Assert that exactly one element has been evicted.
numEvicted := len(evicted)
if numEvicted != 1 {
t.Fatalf("expected one evicted entry, got: %d", numEvicted)
}
require.Equal(t, 1, numEvicted)
// Remove the highest item which initially caused the eviction and
// reinsert the element that was evicted prior.
@@ -92,15 +88,10 @@ func assertHasChanEntries(t *testing.T, c *channelCache,
for i := start; i < end; i++ {
entry, ok := c.get(v, i)
if !ok {
t.Fatalf("channel cache should contain chan %d", i)
}
require.True(t, ok)
expEntry := channelForInt(i)
if !reflect.DeepEqual(entry, expEntry) {
t.Fatalf("entry mismatch, want: %v, got: %v",
expEntry, entry)
}
require.Equal(t, expEntry, entry)
}
}
+120 -407
View File
@@ -12,7 +12,6 @@ import (
prand "math/rand"
"net"
"reflect"
"runtime"
"sync"
"testing"
"time"
@@ -846,9 +845,7 @@ func TestDisconnectBlockAtHeight(t *testing.T) {
graph := MakeTestGraph(t)
sourceNode := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.SetSourceNode(ctx, sourceNode); err != nil {
t.Fatalf("unable to set source node: %v", err)
}
require.NoError(t, graph.SetSourceNode(ctx, sourceNode))
// We'd like to test the insertion/deletion of edges, so we create two
// vertexes to connect.
@@ -896,17 +893,9 @@ func TestDisconnectBlockAtHeight(t *testing.T) {
)
// Now add all these new edges to the database.
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
if err := graph.AddChannelEdge(ctx, edgeInfo2); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
if err := graph.AddChannelEdge(ctx, edgeInfo3); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo2))
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo3))
assertEdgeWithNoPoliciesInCache(t, graph, edgeInfo)
assertEdgeWithNoPoliciesInCache(t, graph, edgeInfo2)
assertEdgeWithNoPoliciesInCache(t, graph, edgeInfo3)
@@ -914,58 +903,37 @@ func TestDisconnectBlockAtHeight(t *testing.T) {
// Call DisconnectBlockAtHeight, which should prune every channel
// that has a funding height of 'height' or greater.
removed, err := graph.DisconnectBlockAtHeight(uint32(height))
if err != nil {
t.Fatalf("unable to prune %v", err)
}
require.NoError(t, err)
assertNoEdge(t, graph, edgeInfo.ChannelID)
assertNoEdge(t, graph, edgeInfo2.ChannelID)
assertEdgeWithNoPoliciesInCache(t, graph, edgeInfo3)
// The two edges should have been removed.
if len(removed) != 2 {
t.Fatalf("expected two edges to be removed from graph, "+
"only %d were", len(removed))
}
if removed[0].ChannelID != edgeInfo.ChannelID {
t.Fatalf("expected edge to be removed from graph")
}
if removed[1].ChannelID != edgeInfo2.ChannelID {
t.Fatalf("expected edge to be removed from graph")
}
require.Len(t, removed, 2)
require.Equal(t, edgeInfo.ChannelID, removed[0].ChannelID)
require.Equal(t, edgeInfo2.ChannelID, removed[1].ChannelID)
// The two first edges should be removed from the db.
has, isZombie, err := graph.HasChannelEdge(
lnwire.GossipVersion1, edgeInfo.ChannelID,
)
require.NoError(t, err, "unable to query for edge")
if has {
t.Fatalf("edge1 was not pruned from the graph")
}
if isZombie {
t.Fatal("reorged edge1 should not be marked as zombie")
}
require.False(t, has)
require.False(t, isZombie)
has, isZombie, err = graph.HasChannelEdge(
lnwire.GossipVersion1, edgeInfo2.ChannelID,
)
require.NoError(t, err, "unable to query for edge")
if has {
t.Fatalf("edge2 was not pruned from the graph")
}
if isZombie {
t.Fatal("reorged edge2 should not be marked as zombie")
}
require.False(t, has)
require.False(t, isZombie)
// Edge 3 should not be removed.
has, isZombie, err = graph.HasChannelEdge(
lnwire.GossipVersion1, edgeInfo3.ChannelID,
)
require.NoError(t, err, "unable to query for edge")
if !has {
t.Fatalf("edge3 was pruned from the graph")
}
if isZombie {
t.Fatal("edge3 was marked as zombie")
}
require.True(t, has)
require.False(t, isZombie)
// PruneTip should be set to the blockHash we specified for the block
// at height 155.
@@ -977,38 +945,17 @@ func TestDisconnectBlockAtHeight(t *testing.T) {
func assertEdgeInfoEqual(t *testing.T, e1 *models.ChannelEdgeInfo,
e2 *models.ChannelEdgeInfo) {
if e1.ChannelID != e2.ChannelID {
t.Fatalf("chan id's don't match: %v vs %v", e1.ChannelID,
e2.ChannelID)
}
if e1.ChainHash != e2.ChainHash {
t.Fatalf("chain hashes don't match: %v vs %v", e1.ChainHash,
e2.ChainHash)
}
if !bytes.Equal(e1.NodeKey1Bytes[:], e2.NodeKey1Bytes[:]) {
t.Fatalf("nodekey1 doesn't match")
}
if !bytes.Equal(e1.NodeKey2Bytes[:], e2.NodeKey2Bytes[:]) {
t.Fatalf("nodekey2 doesn't match")
}
require.Equal(t, e2.ChannelID, e1.ChannelID)
require.Equal(t, e2.ChainHash, e1.ChainHash)
require.Equal(t, e2.NodeKey1Bytes[:], e1.NodeKey1Bytes[:])
require.Equal(t, e2.NodeKey2Bytes[:], e1.NodeKey2Bytes[:])
btcKey1E1 := e1.BitcoinKey1Bytes.UnwrapOr(route.Vertex{})
btcKey1E2 := e2.BitcoinKey1Bytes.UnwrapOr(route.Vertex{})
if !bytes.Equal(btcKey1E1[:], btcKey1E2[:]) {
t.Fatalf("bitcoinkey1 doesn't match")
}
require.Equal(t, btcKey1E2[:], btcKey1E1[:])
btcKey2E1 := e1.BitcoinKey2Bytes.UnwrapOr(route.Vertex{})
btcKey2E2 := e2.BitcoinKey2Bytes.UnwrapOr(route.Vertex{})
if !bytes.Equal(btcKey2E1[:], btcKey2E2[:]) {
t.Fatalf("bitcoinkey2 doesn't match")
}
if !e1.Features.Equals(e2.Features.RawFeatureVector) {
t.Fatalf("features don't match: %v vs %v", e1.Features,
e2.Features)
}
require.Equal(t, btcKey2E2[:], btcKey2E1[:])
require.True(t, e1.Features.Equals(e2.Features.RawFeatureVector))
require.True(t, bytes.Equal(
e1.AuthProof.NodeSig1(),
@@ -1027,20 +974,9 @@ func assertEdgeInfoEqual(t *testing.T, e1 *models.ChannelEdgeInfo,
e2.AuthProof.BitcoinSig2(),
))
if e1.ChannelPoint != e2.ChannelPoint {
t.Fatalf("channel point match: %v vs %v", e1.ChannelPoint,
e2.ChannelPoint)
}
if e1.Capacity != e2.Capacity {
t.Fatalf("capacity doesn't match: %v vs %v", e1.Capacity,
e2.Capacity)
}
if !bytes.Equal(e1.ExtraOpaqueData, e2.ExtraOpaqueData) {
t.Fatalf("extra data doesn't match: %v vs %v",
e2.ExtraOpaqueData, e2.ExtraOpaqueData)
}
require.Equal(t, e2.ChannelPoint, e1.ChannelPoint)
require.Equal(t, e2.Capacity, e1.Capacity)
require.Equal(t, e2.ExtraOpaqueData, e1.ExtraOpaqueData)
}
func createChannelEdge(node1, node2 *models.Node,
@@ -1210,14 +1146,10 @@ func testEdgeInfoUpdates(t *testing.T, v lnwire.GossipVersion) {
// We'd like to test the update of edges inserted into the database, so
// we create two vertexes to connect.
node1 := createTestVertex(t, v)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
assertNodeInCache(t, graph.ChannelGraph, node1, testFeatures)
node2 := createTestVertex(t, v)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
assertNodeInCache(t, graph.ChannelGraph, node2, testFeatures)
// Create an edge and add it to the db.
@@ -1230,9 +1162,7 @@ func testEdgeInfoUpdates(t *testing.T, v lnwire.GossipVersion) {
require.Len(t, graph.graphCache.nodeChannels, 0)
// Add the edge info.
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
assertEdgeWithNoPoliciesInCache(t, graph.ChannelGraph, edgeInfo)
chanID := edgeInfo.ChannelID
@@ -1240,15 +1170,11 @@ func testEdgeInfoUpdates(t *testing.T, v lnwire.GossipVersion) {
// Next, insert both edge policies into the database, they should both
// be inserted without any issues.
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
assertEdgeWithPolicyInCache(
t, graph.ChannelGraph, edgeInfo, edge1, true,
)
if err := graph.UpdateEdgePolicy(ctx, edge2); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge2))
assertEdgeWithPolicyInCache(
t, graph.ChannelGraph, edgeInfo, edge2, false,
)
@@ -1257,32 +1183,21 @@ func testEdgeInfoUpdates(t *testing.T, v lnwire.GossipVersion) {
// found.
found, isZombie, err := graph.HasChannelEdge(chanID)
require.NoError(t, err, "unable to query for edge")
if !found {
t.Fatalf("graph should have of inserted edge")
}
if isZombie {
t.Fatal("live edge should not be marked as zombie")
}
require.True(t, found)
require.False(t, isZombie)
// We should also be able to retrieve the channelID only knowing the
// channel point of the channel.
dbChanID, err := graph.ChannelID(&outpoint)
require.NoError(t, err, "unable to retrieve channel ID")
if dbChanID != chanID {
t.Fatalf("chan ID's mismatch, expected %v got %v", dbChanID,
chanID)
}
require.Equal(t, chanID, dbChanID)
// With the edges inserted, perform some queries to ensure that they've
// been inserted properly.
dbEdgeInfo, dbEdge1, dbEdge2, err := graph.FetchChannelEdgesByID(chanID)
require.NoError(t, err, "unable to fetch channel by ID")
if err := compareEdgePolicies(dbEdge1, edge1); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
if err := compareEdgePolicies(dbEdge2, edge2); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
require.NoError(t, compareEdgePolicies(dbEdge1, edge1))
require.NoError(t, compareEdgePolicies(dbEdge2, edge2))
assertEdgeInfoEqual(t, dbEdgeInfo, edgeInfo)
// Next, attempt to query the channel edges according to the outpoint
@@ -1291,12 +1206,8 @@ func testEdgeInfoUpdates(t *testing.T, v lnwire.GossipVersion) {
&outpoint,
)
require.NoError(t, err, "unable to fetch channel by ID")
if err := compareEdgePolicies(dbEdge1, edge1); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
if err := compareEdgePolicies(dbEdge2, edge2); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
require.NoError(t, compareEdgePolicies(dbEdge1, edge1))
require.NoError(t, compareEdgePolicies(dbEdge2, edge2))
assertEdgeInfoEqual(t, dbEdgeInfo, edgeInfo)
}
@@ -2205,20 +2116,9 @@ func assertPruneTip(t *testing.T, graph *ChannelGraph,
blockHash *chainhash.Hash, blockHeight uint32) {
pruneHash, pruneHeight, err := graph.PruneTip()
if err != nil {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: unable to fetch prune tip: %v", line, err)
}
if !bytes.Equal(blockHash[:], pruneHash[:]) {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line: %v, prune tips don't match, expected %x got %x",
line, blockHash, pruneHash)
}
if pruneHeight != blockHeight {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: prune heights don't match, expected %v "+
"got %v", line, blockHeight, pruneHeight)
}
require.NoError(t, err)
require.Equal(t, blockHash[:], pruneHash[:])
require.Equal(t, blockHeight, pruneHeight)
}
func assertNumChans(t *testing.T, graph *ChannelGraph, n int) {
@@ -2247,23 +2147,12 @@ func assertNumNodes(t *testing.T, graph *ChannelGraph, n int) {
return nil
}, func() {})
if err != nil {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: unable to scan nodes: %v", line, err)
}
if numNodes != n {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: expected %v nodes, got %v", line, n,
numNodes)
}
require.NoError(t, err)
require.Equal(t, n, numNodes)
}
func assertChanViewEqual(t *testing.T, a []EdgePoint, b []EdgePoint) {
if len(a) != len(b) {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: chan views don't match", line)
}
require.Len(t, b, len(a))
chanViewSet := make(map[wire.OutPoint]struct{})
for _, op := range a {
@@ -2271,21 +2160,15 @@ func assertChanViewEqual(t *testing.T, a []EdgePoint, b []EdgePoint) {
}
for _, op := range b {
if _, ok := chanViewSet[op.OutPoint]; !ok {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: chanPoint(%v) not found in first "+
"view", line, op)
}
_, ok := chanViewSet[op.OutPoint]
require.True(t, ok)
}
}
func assertChanViewEqualChanPoints(t *testing.T, a []EdgePoint,
b []*wire.OutPoint) {
if len(a) != len(b) {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: chan views don't match", line)
}
require.Len(t, b, len(a))
chanViewSet := make(map[wire.OutPoint]struct{})
for _, op := range a {
@@ -2293,11 +2176,8 @@ func assertChanViewEqualChanPoints(t *testing.T, a []EdgePoint,
}
for _, op := range b {
if _, ok := chanViewSet[*op]; !ok {
_, _, line, _ := runtime.Caller(1)
t.Fatalf("line %v: chanPoint(%v) not found in first "+
"view", line, op)
}
_, ok := chanViewSet[*op]
require.True(t, ok)
}
}
@@ -2308,9 +2188,7 @@ func TestGraphPruning(t *testing.T) {
graph := MakeTestGraph(t)
sourceNode := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.SetSourceNode(ctx, sourceNode); err != nil {
t.Fatalf("unable to set source node: %v", err)
}
require.NoError(t, graph.SetSourceNode(ctx, sourceNode))
// As initial set up for the test, we'll create a graph with 5 vertexes
// and enough edges to create a fully connected graph. The graph will
@@ -2319,10 +2197,7 @@ func TestGraphPruning(t *testing.T) {
graphNodes := make([]*models.Node, numNodes)
for i := 0; i < numNodes; i++ {
node := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node))
graphNodes[i] = node
}
@@ -2362,12 +2237,8 @@ func TestGraphPruning(t *testing.T) {
models.WithChannelPoint(op),
models.WithCapacity(1000),
)
if err != nil {
t.Fatalf("unable to create edge: %v", err)
}
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, err)
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
pkScript, err := edgeInfo.FundingPKScript()
require.NoError(t, err)
@@ -2383,9 +2254,7 @@ func TestGraphPruning(t *testing.T) {
edge.ChannelFlags = 0
edge.ToNode = graphNodes[i].PubKeyBytes
edge.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge))
// Create another random edge that points from node_i+1 ->
// node_i this time.
@@ -2393,9 +2262,7 @@ func TestGraphPruning(t *testing.T) {
edge.ChannelFlags = 1
edge.ToNode = graphNodes[i].PubKeyBytes
edge.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge))
}
// With all the channel points added, we'll consult the graph to ensure
@@ -2415,10 +2282,7 @@ func TestGraphPruning(t *testing.T) {
block := channelPoints[:2]
prunedChans, err := graph.PruneGraph(block, &blockHash, blockHeight)
require.NoError(t, err, "unable to prune graph")
if len(prunedChans) != 2 {
t.Fatalf("incorrect number of channels pruned: "+
"expected %v, got %v", 2, prunedChans)
}
require.Len(t, prunedChans, 2)
// Now ensure that the prune tip has been updated.
assertPruneTip(t, graph, &blockHash, blockHeight)
@@ -2447,9 +2311,7 @@ func TestGraphPruning(t *testing.T) {
require.NoError(t, err, "unable to prune graph")
// No channels should have been detected as pruned.
if len(prunedChans) != 0 {
t.Fatalf("channels were pruned but shouldn't have been")
}
require.Empty(t, prunedChans)
// Once again, the prune tip should have been updated. We should still
// see both channels and their participants, along with the source node.
@@ -2468,10 +2330,7 @@ func TestGraphPruning(t *testing.T) {
// The remainder of the channels should have been pruned from the
// graph.
if len(prunedChans) != 2 {
t.Fatalf("incorrect number of channels pruned: "+
"expected %v, got %v", 2, len(prunedChans))
}
require.Len(t, prunedChans, 2)
// The prune tip should be updated, no channels should be found, and
// only the source node should remain within the current graph.
@@ -2484,10 +2343,7 @@ func TestGraphPruning(t *testing.T) {
// channel view.
channelView, err = graph.ChannelView()
require.NoError(t, err, "unable to get graph channel view")
if len(channelView) != 0 {
t.Fatalf("channel view should be empty, instead have: %v",
channelView)
}
require.Empty(t, channelView)
}
// TestHighestChanID tests that we're able to properly retrieve the highest
@@ -2502,9 +2358,7 @@ func testHighestChanID(t *testing.T, v lnwire.GossipVersion) {
// get a channel ID of zero if we ask for the highest channel ID.
bestID, err := graph.HighestChanID(ctx)
require.NoError(t, err, "unable to get highest ID")
if bestID != 0 {
require.Equal(t, uint64(0), bestID)
}
require.Zero(t, bestID)
// Next, we'll insert two channels into the database, with each channel
// connecting the same two nodes.
@@ -2523,10 +2377,7 @@ func testHighestChanID(t *testing.T, v lnwire.GossipVersion) {
// known channel ID in the database.
bestID, err = graph.HighestChanID(ctx)
require.NoError(t, err, "unable to get highest ID")
if bestID != chanID2.ToUint64() {
require.Equal(t, chanID2.ToUint64(), bestID)
}
require.Equal(t, chanID2.ToUint64(), bestID)
// If we add another edge, then the current best chan ID should be
// updated as well.
@@ -2555,21 +2406,13 @@ func TestChanUpdatesInHorizon(t *testing.T) {
chanUpdates, err := fn.CollectErr(chanIter)
require.NoError(t, err, "unable to updates for updates")
if len(chanUpdates) != 0 {
t.Fatalf("expected 0 chan updates, instead got %v",
len(chanUpdates))
}
require.Empty(t, chanUpdates)
// We'll start by creating two nodes which will seed our test graph.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
node2 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
// We'll now create 10 channels between the two nodes, with update
// times 10 seconds after each other.
@@ -2582,10 +2425,7 @@ func TestChanUpdatesInHorizon(t *testing.T) {
lnwire.GossipVersion1, uint32(i*10), 0, 0, 0,
node1, node2,
)
if err := graph.AddChannelEdge(ctx, channel); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, channel))
edge1UpdateTime := endTime
edge2UpdateTime := edge1UpdateTime.Add(time.Second)
@@ -2598,9 +2438,7 @@ func TestChanUpdatesInHorizon(t *testing.T) {
edge1.ChannelFlags = 0
edge1.ToNode = node2.PubKeyBytes
edge1.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
edge2 := newEdgePolicy(
lnwire.GossipVersion1, chanID.ToUint64(),
@@ -2609,9 +2447,7 @@ func TestChanUpdatesInHorizon(t *testing.T) {
edge2.ChannelFlags = 1
edge2.ToNode = node1.PubKeyBytes
edge2.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge2); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge2))
edges = append(edges, ChannelEdge{
Info: channel,
@@ -2676,15 +2512,8 @@ func TestChanUpdatesInHorizon(t *testing.T) {
)
resp, err := fn.CollectErr(respIter)
if err != nil {
t.Fatalf("unable to query for updates: %v", err)
}
if len(resp) != len(queryCase.resp) {
t.Fatalf("expected %v chans, got %v chans",
len(queryCase.resp), len(resp))
}
require.NoError(t, err)
require.Len(t, resp, len(queryCase.resp))
for i := 0; i < len(resp); i++ {
chanExp := queryCase.resp[i]
@@ -3208,13 +3037,9 @@ func TestFilterKnownChanIDs(t *testing.T) {
// We'll start by creating two nodes which will seed our test graph.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
node2 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
// Next, we'll add 5 channel ID's to the graph, each of them having a
// block height 10 blocks after the previous.
@@ -3225,10 +3050,7 @@ func TestFilterKnownChanIDs(t *testing.T) {
lnwire.GossipVersion1, uint32(i*10), 0, 0, 0,
node1, node2,
)
if err := graph.AddChannelEdge(ctx, channel); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, channel))
chanIDs = append(chanIDs, NewChannelUpdateInfo(
chanID, time.Time{}, time.Time{},
@@ -3242,13 +3064,9 @@ func TestFilterKnownChanIDs(t *testing.T) {
lnwire.GossipVersion1, uint32(i*10+1), 0, 0, 0,
node1, node2,
)
if err := graph.AddChannelEdge(ctx, channel); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, channel))
err := graph.DeleteChannelEdges(false, true, channel.ChannelID)
if err != nil {
t.Fatalf("unable to mark edge zombie: %v", err)
}
require.NoError(t, err)
zombieIDs = append(
zombieIDs, ChannelUpdateInfo{ShortChannelID: chanID},
@@ -3952,20 +3770,13 @@ func testFetchChanInfos(t *testing.T, v lnwire.GossipVersion) {
// edges back.
resp, err := graph.FetchChanInfos(edgeQuery)
require.NoError(t, err, "unable to fetch chan edges")
if len(resp) != len(edges) {
t.Fatalf("expected %v edges, instead got %v", len(edges),
len(resp))
}
require.Len(t, resp, len(edges))
for i := 0; i < len(resp); i++ {
err := compareEdgePolicies(resp[i].Policy1, edges[i].Policy1)
if err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
require.NoError(t, err)
err = compareEdgePolicies(resp[i].Policy2, edges[i].Policy2)
if err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
require.NoError(t, err)
assertEdgeInfoEqual(t, resp[i].Info, edges[i].Info)
}
}
@@ -4060,46 +3871,34 @@ func TestChannelEdgePruningUpdateIndexDeletion(t *testing.T) {
}
sourceNode := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.SetSourceNode(ctx, sourceNode); err != nil {
t.Fatalf("unable to set source node: %v", err)
}
require.NoError(t, graph.SetSourceNode(ctx, sourceNode))
// We'll first populate our graph with two nodes. All channels created
// below will be made between these two nodes.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
node2 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
// With the two nodes created, we'll now create a random channel, as
// well as two edges in the database with distinct update times.
edgeInfo, chanID := createEdge(
lnwire.GossipVersion1, 100, 0, 0, 0, node1, node2,
)
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to add edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
edge1 := randEdgePolicy(chanID.ToUint64())
edge1.ChannelFlags = 0
edge1.ToNode = node1.PubKeyBytes
edge1.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
edge1 = copyEdgePolicy(edge1) // Avoid read/write race conditions.
edge2 := randEdgePolicy(chanID.ToUint64())
edge2.ChannelFlags = 1
edge2.ToNode = node2.PubKeyBytes
edge2.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge2); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge2))
edge2 = copyEdgePolicy(edge2) // Avoid read/write race conditions.
// checkIndexTimestamps is a helper function that checks the edge update
@@ -4148,9 +3947,7 @@ func TestChannelEdgePruningUpdateIndexDeletion(t *testing.T) {
return nil
})
}, func() {})
if err != nil {
t.Fatal(err)
}
require.NoError(t, err)
}
// With both edges policies added, we'll make sure to check they exist
@@ -4164,14 +3961,10 @@ func TestChannelEdgePruningUpdateIndexDeletion(t *testing.T) {
// removed from the update index.
edge1.ChannelFlags = 2
edge1.LastUpdate = time.Now()
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
edge2.ChannelFlags = 3
edge2.LastUpdate = edge1.LastUpdate.Add(time.Hour)
if err := graph.UpdateEdgePolicy(ctx, edge2); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge2))
// With the policies updated, we should now be able to find their
// updated entries within the update index.
@@ -4206,34 +3999,24 @@ func TestPruneGraphNodes(t *testing.T) {
// We'll start off by inserting our source node, to ensure that it's
// the only node left after we prune the graph.
sourceNode := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.SetSourceNode(ctx, sourceNode); err != nil {
t.Fatalf("unable to set source node: %v", err)
}
require.NoError(t, graph.SetSourceNode(ctx, sourceNode))
// With the source node inserted, we'll now add three nodes to the
// channel graph, at the end of the scenario, only two of these nodes
// should still be in the graph.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
node2 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
node3 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node3); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node3))
// We'll now add a new edge to the graph, but only actually advertise
// the edge of *one* of the nodes.
edgeInfo, chanID := createEdge(
lnwire.GossipVersion1, 100, 0, 0, 0, node1, node2,
)
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to add edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
// We'll now insert an advertised edge, but it'll only be the edge that
// points from the first to the second node.
@@ -4241,14 +4024,10 @@ func TestPruneGraphNodes(t *testing.T) {
edge1.ChannelFlags = 0
edge1.ToNode = node1.PubKeyBytes
edge1.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
// We'll now initiate a around of graph pruning.
if err := graph.PruneGraphNodes(); err != nil {
t.Fatalf("unable to prune graph nodes: %v", err)
}
require.NoError(t, graph.PruneGraphNodes())
// At this point, there should be 3 nodes left in the graph still: the
// source node (which can't be pruned), and node 1+2. Nodes 1 and two
@@ -4315,9 +4094,7 @@ func TestNodePruningUpdateIndexDeletion(t *testing.T) {
// We'll first populate our graph with a single node that will be
// removed shortly.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
// We'll confirm that we can retrieve the node using
// NodeUpdatesInHorizon, using a time that's slightly beyond the last
@@ -4330,10 +4107,7 @@ func TestNodePruningUpdateIndexDeletion(t *testing.T) {
// match the node we just inserted.
nodesInHorizon, err := fn.CollectErr(nodesInHorizonIter)
require.NoError(t, err, "unable to fetch nodes in horizon")
if len(nodesInHorizon) != 1 {
t.Fatalf("should have 1 nodes instead have: %v",
len(nodesInHorizon))
}
require.Len(t, nodesInHorizon, 1)
compareNodes(t, node1, nodesInHorizon[0])
// We'll now delete the node from the graph, this should result in it
@@ -4346,11 +4120,7 @@ func TestNodePruningUpdateIndexDeletion(t *testing.T) {
nodesInHorizonIter = graph.NodeUpdatesInHorizon(startTime, endTime)
nodesInHorizon, err = fn.CollectErr(nodesInHorizonIter)
require.NoError(t, err, "unable to fetch nodes in horizon")
if len(nodesInHorizon) != 0 {
t.Fatalf("should have zero nodes instead have: %v",
len(nodesInHorizon))
}
require.Empty(t, nodesInHorizon)
}
var (
@@ -4581,15 +4351,11 @@ func testDisabledChannelIDs(t *testing.T, v lnwire.GossipVersion) {
// Create first node and add it to the graph.
node1 := createTestVertex(t, v)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
// Create second node and add it to the graph.
node2 := createTestVertex(t, v)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
// Adding a new channel edge to the graph.
edgeInfo, edge1, edge2 := createChannelEdge(node1, node2, v)
@@ -4599,21 +4365,13 @@ func testDisabledChannelIDs(t *testing.T, v lnwire.GossipVersion) {
case lnwire.GossipVersion2:
node2.LastBlockHeight = nextBlockHeight()
}
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
// Ensure no disabled channels exist in the bucket on start.
disabledChanIds, err := graph.DisabledChannelIDs()
require.NoError(t, err, "unable to get disabled channel ids")
if len(disabledChanIds) > 0 {
t.Fatalf("expected empty disabled channels, got %v disabled "+
"channels", len(disabledChanIds))
}
require.Empty(t, disabledChanIds)
// Add one disabled policy and ensure the channel is still not in the
// disabled list.
@@ -4623,15 +4381,10 @@ func testDisabledChannelIDs(t *testing.T, v lnwire.GossipVersion) {
case lnwire.GossipVersion2:
edge1.DisableFlags |= lnwire.ChanUpdateDisableIncoming
}
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
disabledChanIds, err = graph.DisabledChannelIDs()
require.NoError(t, err, "unable to get disabled channel ids")
if len(disabledChanIds) > 0 {
t.Fatalf("expected empty disabled channels, got %v disabled "+
"channels", len(disabledChanIds))
}
require.Empty(t, disabledChanIds)
// Add second disabled policy and ensure the channel is now in the
// disabled list.
@@ -4641,31 +4394,19 @@ func testDisabledChannelIDs(t *testing.T, v lnwire.GossipVersion) {
case lnwire.GossipVersion2:
edge2.DisableFlags |= lnwire.ChanUpdateDisableIncoming
}
if err := graph.UpdateEdgePolicy(ctx, edge2); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge2))
disabledChanIds, err = graph.DisabledChannelIDs()
require.NoError(t, err, "unable to get disabled channel ids")
if len(disabledChanIds) != 1 ||
disabledChanIds[0] != edgeInfo.ChannelID {
t.Fatalf("expected disabled channel with id %v, "+
"got %v", edgeInfo.ChannelID, disabledChanIds)
}
require.Equal(t, []uint64{edgeInfo.ChannelID}, disabledChanIds)
// Delete the channel edge and ensure it is removed from the disabled
// list.
if err = graph.DeleteChannelEdges(
require.NoError(t, graph.DeleteChannelEdges(
false, true, edgeInfo.ChannelID,
); err != nil {
t.Fatalf("unable to delete channel edge: %v", err)
}
))
disabledChanIds, err = graph.DisabledChannelIDs()
require.NoError(t, err, "unable to get disabled channel ids")
if len(disabledChanIds) > 0 {
t.Fatalf("expected empty disabled channels, got %v disabled "+
"channels", len(disabledChanIds))
}
require.Empty(t, disabledChanIds)
}
// TestEdgePolicyMissingMaxHTLC tests that if we find a ChannelEdgePolicy in
@@ -4688,20 +4429,14 @@ func TestEdgePolicyMissingMaxHTLC(t *testing.T) {
// We'd like to test the update of edges inserted into the database, so
// we create two vertexes to connect.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node1))
node2 := createTestVertex(t, lnwire.GossipVersion1)
edgeInfo, edge1, edge2 := createChannelEdge(
node1, node2, lnwire.GossipVersion1,
)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
if err := graph.AddChannelEdge(ctx, edgeInfo); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddNode(ctx, node2))
require.NoError(t, graph.AddChannelEdge(ctx, edgeInfo))
chanID := edgeInfo.ChannelID
from := edge2.ToNode[:]
@@ -4746,28 +4481,18 @@ func TestEdgePolicyMissingMaxHTLC(t *testing.T) {
require.NoError(t, err, "unable to fetch channel by ID")
// The first edge should have a nil-policy returned
if dbEdge1 != nil {
t.Fatalf("expected db edge to be nil")
}
if err := compareEdgePolicies(dbEdge2, edge2); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
require.Nil(t, dbEdge1)
require.NoError(t, compareEdgePolicies(dbEdge2, edge2))
assertEdgeInfoEqual(t, dbEdgeInfo, edgeInfo)
// Now add the original, unmodified edge policy, and make sure the edge
// policies then become fully populated.
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
dbEdgeInfo, dbEdge1, dbEdge2, err = graph.FetchChannelEdgesByID(chanID)
require.NoError(t, err, "unable to fetch channel by ID")
if err := compareEdgePolicies(dbEdge1, edge1); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
if err := compareEdgePolicies(dbEdge2, edge2); err != nil {
t.Fatalf("edge doesn't match: %v", err)
}
require.NoError(t, compareEdgePolicies(dbEdge1, edge1))
require.NoError(t, compareEdgePolicies(dbEdge2, edge2))
assertEdgeInfoEqual(t, dbEdgeInfo, edgeInfo)
}
@@ -4810,11 +4535,7 @@ func assertNumZombies(t *testing.T, graph *ChannelGraph, expZombies uint64) {
numZombies, err := graph.NumZombies()
require.NoError(t, err, "unable to query number of zombies")
if numZombies != expZombies {
t.Fatalf("expected %d zombies, found %d",
expZombies, numZombies)
}
require.Equal(t, expZombies, numZombies)
}
// TestGraphZombieIndex ensures that we can mark edges correctly as zombie/live.
@@ -4954,9 +4675,8 @@ func TestLightningNodeSigVerification(t *testing.T) {
// Create some dummy data to sign.
var data [32]byte
if _, err := prand.Read(data[:]); err != nil {
t.Fatalf("unable to read prand: %v", err)
}
_, err := prand.Read(data[:])
require.NoError(t, err)
// Create private key and sign the data with it.
priv, err := btcec.NewPrivateKey()
@@ -4965,9 +4685,7 @@ func TestLightningNodeSigVerification(t *testing.T) {
sign := ecdsa.Sign(priv, data[:])
// Sanity check that the signature checks out.
if !sign.Verify(data[:], priv.PubKey()) {
t.Fatalf("signature doesn't check out")
}
require.True(t, sign.Verify(data[:], priv.PubKey()))
// Create a Node from the same private key.
node := createNode(t, lnwire.GossipVersion1, priv)
@@ -4976,10 +4694,7 @@ func TestLightningNodeSigVerification(t *testing.T) {
// pubkey returned from the lightning node.
nodePub, err := node.PubKey()
require.NoError(t, err, "unable to get pubkey")
if !sign.Verify(data[:], nodePub) {
t.Fatalf("unable to verify sig")
}
require.True(t, sign.Verify(data[:], nodePub))
}
// TestComputeFee tests fee calculation based on the outgoing amt.
@@ -4995,9 +4710,7 @@ func TestComputeFee(t *testing.T) {
)
fee := policy.ComputeFee(outgoingAmt)
if fee != expectedFee {
t.Fatalf("expected fee %v, got %v", expectedFee, fee)
}
require.Equal(t, expectedFee, fee)
}
// TestBatchedAddChannelEdge asserts that BatchedAddChannelEdge properly
+5 -14
View File
@@ -1,10 +1,10 @@
package graphdb
import (
"reflect"
"testing"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/stretchr/testify/require"
)
// TestRejectCache checks the behavior of the rejectCache with respect to insertion,
@@ -18,9 +18,7 @@ func TestRejectCache(t *testing.T) {
// As a sanity check, assert that querying the empty cache does not
// return an entry.
_, ok := c.get(lnwire.GossipVersion1, 0)
if ok {
t.Fatalf("reject cache should be empty")
}
require.False(t, ok)
// Now, fill up the cache entirely.
for i := uint64(0); i < cacheSize; i++ {
@@ -53,9 +51,7 @@ func TestRejectCache(t *testing.T) {
// Assert that exactly one element has been evicted.
numEvicted := len(evicted)
if numEvicted != 1 {
t.Fatalf("expected one evicted entry, got: %d", numEvicted)
}
require.Equal(t, 1, numEvicted)
// Remove the highest item which initially caused the eviction and
// reinsert the element that was evicted prior.
@@ -88,15 +84,10 @@ func assertHasEntries(t *testing.T, c *rejectCache, start, end uint64) {
for i := start; i < end; i++ {
entry, ok := c.get(lnwire.GossipVersion1, i)
if !ok {
t.Fatalf("reject cache should contain chan %d", i)
}
require.True(t, ok)
expEntry := entryForInt(i)
if !reflect.DeepEqual(entry, expEntry) {
t.Fatalf("entry mismatch, want: %v, got: %v",
expEntry, entry)
}
require.Equal(t, expEntry, entry)
}
}