discovery: add unit tests for chan anns in the reject cache
This commit is contained in:
parent
c959ecc4c9
commit
bb6aca1130
@ -105,6 +105,7 @@ type mockGraphSource struct {
|
|||||||
infos map[uint64]channeldb.ChannelEdgeInfo
|
infos map[uint64]channeldb.ChannelEdgeInfo
|
||||||
edges map[uint64][]channeldb.ChannelEdgePolicy
|
edges map[uint64][]channeldb.ChannelEdgePolicy
|
||||||
zombies map[uint64][][33]byte
|
zombies map[uint64][][33]byte
|
||||||
|
chansToReject map[uint64]struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMockRouter(height uint32) *mockGraphSource {
|
func newMockRouter(height uint32) *mockGraphSource {
|
||||||
@ -113,6 +114,7 @@ func newMockRouter(height uint32) *mockGraphSource {
|
|||||||
infos: make(map[uint64]channeldb.ChannelEdgeInfo),
|
infos: make(map[uint64]channeldb.ChannelEdgeInfo),
|
||||||
edges: make(map[uint64][]channeldb.ChannelEdgePolicy),
|
edges: make(map[uint64][]channeldb.ChannelEdgePolicy),
|
||||||
zombies: make(map[uint64][][33]byte),
|
zombies: make(map[uint64][][33]byte),
|
||||||
|
chansToReject: make(map[uint64]struct{}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,10 +140,21 @@ func (r *mockGraphSource) AddEdge(info *channeldb.ChannelEdgeInfo,
|
|||||||
return errors.New("info already exist")
|
return errors.New("info already exist")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, ok := r.chansToReject[info.ChannelID]; ok {
|
||||||
|
return errors.New("validation failed")
|
||||||
|
}
|
||||||
|
|
||||||
r.infos[info.ChannelID] = *info
|
r.infos[info.ChannelID] = *info
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *mockGraphSource) queueValidationFail(chanID uint64) {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
|
r.chansToReject[chanID] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *mockGraphSource) UpdateEdge(edge *channeldb.ChannelEdgePolicy,
|
func (r *mockGraphSource) UpdateEdge(edge *channeldb.ChannelEdgePolicy,
|
||||||
_ ...batch.SchedulerOption) error {
|
_ ...batch.SchedulerOption) error {
|
||||||
|
|
||||||
@ -4177,3 +4190,56 @@ func TestIgnoreOwnAnnouncement(t *testing.T) {
|
|||||||
t.Fatalf("expected gossiper to ignore announcement, got: %v", err)
|
t.Fatalf("expected gossiper to ignore announcement, got: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestRejectCacheChannelAnn checks that if we reject a channel announcement,
|
||||||
|
// then if we attempt to validate it again, we'll reject it with the proper
|
||||||
|
// error.
|
||||||
|
func TestRejectCacheChannelAnn(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
ctx, cleanup, err := createTestCtx(proofMatureDelta)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("can't create context: %v", err)
|
||||||
|
}
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
// First, we create a channel announcement to send over to our test
|
||||||
|
// peer.
|
||||||
|
batch, err := createRemoteAnnouncements(0)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("can't generate announcements: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteKey, err := btcec.ParsePubKey(batch.nodeAnn2.NodeID[:], btcec.S256())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to parse pubkey: %v", err)
|
||||||
|
}
|
||||||
|
remotePeer := &mockPeer{remoteKey, nil, nil}
|
||||||
|
|
||||||
|
// Before sending over the announcement, we'll modify it such that we
|
||||||
|
// know it will always fail.
|
||||||
|
chanID := batch.chanAnn.ShortChannelID.ToUint64()
|
||||||
|
ctx.router.queueValidationFail(chanID)
|
||||||
|
|
||||||
|
// If we process the batch the first time we should get an error.
|
||||||
|
select {
|
||||||
|
case err = <-ctx.gossiper.ProcessRemoteAnnouncement(
|
||||||
|
batch.chanAnn, remotePeer,
|
||||||
|
):
|
||||||
|
require.NotNil(t, err)
|
||||||
|
case <-time.After(2 * time.Second):
|
||||||
|
t.Fatal("did not process remote announcement")
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we process it a *second* time, then we should get an error saying
|
||||||
|
// we rejected it already.
|
||||||
|
select {
|
||||||
|
case err = <-ctx.gossiper.ProcessRemoteAnnouncement(
|
||||||
|
batch.chanAnn, remotePeer,
|
||||||
|
):
|
||||||
|
errStr := err.Error()
|
||||||
|
require.Contains(t, errStr, "recently rejected")
|
||||||
|
case <-time.After(2 * time.Second):
|
||||||
|
t.Fatal("did not process remote announcement")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user