Merge pull request #7395 from yyforyongyu/fix-unit-test-db

channeldb+invoices: fix unit test flakes
This commit is contained in:
Oliver Gugger 2023-02-10 14:27:17 +01:00 committed by GitHub
commit 939614b70d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 16 deletions

View File

@ -6,6 +6,7 @@ import (
"net" "net"
"reflect" "reflect"
"runtime" "runtime"
"sync/atomic"
"testing" "testing"
"github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2"
@ -64,6 +65,11 @@ var (
// dummyRemoteOutIndex specifics a default value for their output index // dummyRemoteOutIndex specifics a default value for their output index
// in this test. // in this test.
dummyRemoteOutIndex = uint32(1) dummyRemoteOutIndex = uint32(1)
// uniqueOutputIndex is used to create a unique funding outpoint.
//
// NOTE: must be incremented when used.
uniqueOutputIndex = atomic.Uint32{}
) )
// testChannelParams is a struct which details the specifics of how a channel // testChannelParams is a struct which details the specifics of how a channel
@ -299,10 +305,15 @@ func createTestChannelState(t *testing.T, cdb *ChannelStateDB) *OpenChannel {
chanID := lnwire.NewShortChanIDFromInt(uint64(rand.Int63())) chanID := lnwire.NewShortChanIDFromInt(uint64(rand.Int63()))
// Increment the uniqueOutputIndex so we always get a unique value for
// the funding outpoint.
uniqueOutputIndex.Add(1)
op := wire.OutPoint{Hash: key, Index: uniqueOutputIndex.Load()}
return &OpenChannel{ return &OpenChannel{
ChanType: SingleFunderBit | FrozenBit, ChanType: SingleFunderBit | FrozenBit,
ChainHash: key, ChainHash: key,
FundingOutpoint: wire.OutPoint{Hash: key, Index: rand.Uint32()}, FundingOutpoint: op,
ShortChannelID: chanID, ShortChannelID: chanID,
IsInitiator: true, IsInitiator: true,
IsPending: true, IsPending: true,

View File

@ -243,11 +243,13 @@ func TestFetchChannel(t *testing.T) {
spew.Sdump(channelState), spew.Sdump(dbChannel)) spew.Sdump(channelState), spew.Sdump(dbChannel))
} }
// If we attempt to query for a non-exist ante channel, then we should // If we attempt to query for a non-existent channel, then we should
// get an error. // get an error.
channelState2 := createTestChannelState(t, cdb) channelState2 := createTestChannelState(t, cdb)
require.NoError(t, err, "unable to create channel state") require.NoError(t, err, "unable to create channel state")
channelState2.FundingOutpoint.Index ^= 1
uniqueOutputIndex.Add(1)
channelState2.FundingOutpoint.Index = uniqueOutputIndex.Load()
_, err = cdb.FetchChannel(nil, channelState2.FundingOutpoint) _, err = cdb.FetchChannel(nil, channelState2.FundingOutpoint)
if err == nil { if err == nil {

View File

@ -1006,27 +1006,34 @@ func TestInvoiceExpiryWithRegistry(t *testing.T) {
// Fwd time 1 day. // Fwd time 1 day.
testClock.SetTime(testTime.Add(24 * time.Hour)) testClock.SetTime(testTime.Add(24 * time.Hour))
// Give some time to the watcher to cancel everything.
time.Sleep(500 * time.Millisecond)
if err := registry.Stop(); err != nil {
t.Fatalf("failed to stop invoice registry: %v", err)
}
// Create the expected cancellation set before the final check. // Create the expected cancellation set before the final check.
expectedCancellations = append( expectedCancellations = append(
expectedCancellations, invoicesThatWillCancel..., expectedCancellations, invoicesThatWillCancel...,
) )
// Retrospectively check that all invoices that were expected to be // canceled returns a bool to indicate whether all the invoices are
// canceled are indeed canceled. // canceled.
for i := range expectedCancellations { canceled := func() bool {
invoice, err := registry.LookupInvoice(expectedCancellations[i]) for i := range expectedCancellations {
if err != nil { invoice, err := registry.LookupInvoice(
t.Fatalf("cannot find invoice: %v", err) expectedCancellations[i],
)
require.NoError(t, err)
if invoice.State != invpkg.ContractCanceled {
return false
}
} }
require.Equal(t, invpkg.ContractCanceled, invoice.State) return true
} }
// Retrospectively check that all invoices that were expected to be
// canceled are indeed canceled.
require.Eventually(t, canceled, testTimeout, 10*time.Millisecond)
// Finally stop the registry.
require.NoError(t, registry.Stop(), "failed to stop invoice registry")
} }
// TestOldInvoiceRemovalOnStart tests that we'll attempt to remove old canceled // TestOldInvoiceRemovalOnStart tests that we'll attempt to remove old canceled