discovery: use T.TempDir to create temporary test directory

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
This commit is contained in:
Eng Zer Jun committed 2022-08-24 08:58:16 +08:00
1 parent d1541d6628
commit dbf3cf62fe
2 files changed
+47 -95

No files matched your search

+39 -77
View File
@@ -4,10 +4,8 @@ import (
"bytes" "bytes"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io/ioutil"
prand "math/rand" prand "math/rand"
"net" "net"
"os"
"reflect" "reflect"
"strings" "strings"
"sync" "sync"
@@ -72,29 +70,19 @@ var (
rebroadcastInterval = time.Hour * 1000000 rebroadcastInterval = time.Hour * 1000000
) )
// makeTestDB creates a new instance of the ChannelDB for testing purposes. A // makeTestDB creates a new instance of the ChannelDB for testing purposes.
// callback which cleans up the created temporary directories is also returned func makeTestDB(t *testing.T) (*channeldb.DB, error) {
// and intended to be executed after the test completes. // Create channeldb for the first time.
func makeTestDB() (*channeldb.DB, func(), error) { cdb, err := channeldb.Open(t.TempDir())
// First, create a temporary directory to be used for the duration of
// this test.
tempDirName, err := ioutil.TempDir("", "channeldb")
if err != nil { if err != nil {
return nil, nil, err return nil, err
} }
// Next, create channeldb for the first time. t.Cleanup(func() {
cdb, err := channeldb.Open(tempDirName)
if err != nil {
return nil, nil, err
}
cleanUp := func() {
cdb.Close() cdb.Close()
os.RemoveAll(tempDirName) })
}
return cdb, cleanUp, nil return cdb, nil
} }
type mockGraphSource struct { type mockGraphSource struct {
@@ -716,7 +704,7 @@ type testCtx struct {
broadcastedMessage chan msgWithSenders broadcastedMessage chan msgWithSenders
} }
func createTestCtx(startHeight uint32) (*testCtx, func(), error) { func createTestCtx(t *testing.T, startHeight uint32) (*testCtx, error) {
// Next we'll initialize an instance of the channel router with mock // Next we'll initialize an instance of the channel router with mock
// versions of the chain and channel notifier. As we don't need to test // versions of the chain and channel notifier. As we don't need to test
// any p2p functionality, the peer send and switch send, // any p2p functionality, the peer send and switch send,
@@ -724,15 +712,14 @@ func createTestCtx(startHeight uint32) (*testCtx, func(), error) {
notifier := newMockNotifier() notifier := newMockNotifier()
router := newMockRouter(startHeight) router := newMockRouter(startHeight)
db, cleanUpDb, err := makeTestDB() db, err := makeTestDB(t)
if err != nil { if err != nil {
return nil, nil, err return nil, err
} }
waitingProofStore, err := channeldb.NewWaitingProofStore(db) waitingProofStore, err := channeldb.NewWaitingProofStore(db)
if err != nil { if err != nil {
cleanUpDb() return nil, err
return nil, nil, err
} }
broadcastedMessage := make(chan msgWithSenders, 10) broadcastedMessage := make(chan msgWithSenders, 10)
@@ -808,25 +795,23 @@ func createTestCtx(startHeight uint32) (*testCtx, func(), error) {
}, selfKeyDesc) }, selfKeyDesc)
if err := gossiper.Start(); err != nil { if err := gossiper.Start(); err != nil {
cleanUpDb() return nil, fmt.Errorf("unable to start router: %v", err)
return nil, nil, fmt.Errorf("unable to start router: %v", err)
} }
// Mark the graph as synced in order to allow the announcements to be // Mark the graph as synced in order to allow the announcements to be
// broadcast. // broadcast.
gossiper.syncMgr.markGraphSynced() gossiper.syncMgr.markGraphSynced()
cleanUp := func() { t.Cleanup(func() {
gossiper.Stop() gossiper.Stop()
cleanUpDb() })
}
return &testCtx{ return &testCtx{
router: router, router: router,
notifier: notifier, notifier: notifier,
gossiper: gossiper, gossiper: gossiper,
broadcastedMessage: broadcastedMessage, broadcastedMessage: broadcastedMessage,
}, cleanUp, nil }, nil
} }
// TestProcessAnnouncement checks that mature announcements are propagated to // TestProcessAnnouncement checks that mature announcements are propagated to
@@ -835,9 +820,8 @@ func TestProcessAnnouncement(t *testing.T) {
t.Parallel() t.Parallel()
timestamp := testTimestamp timestamp := testTimestamp
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
assertSenderExistence := func(sender *btcec.PublicKey, msg msgWithSenders) { assertSenderExistence := func(sender *btcec.PublicKey, msg msgWithSenders) {
if _, ok := msg.senders[route.NewVertex(sender)]; !ok { if _, ok := msg.senders[route.NewVertex(sender)]; !ok {
@@ -929,9 +913,8 @@ func TestPrematureAnnouncement(t *testing.T) {
timestamp := testTimestamp timestamp := testTimestamp
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
_, err = createNodeAnnouncement(remoteKeyPriv1, timestamp) _, err = createNodeAnnouncement(remoteKeyPriv1, timestamp)
require.NoError(t, err, "can't create node announcement") require.NoError(t, err, "can't create node announcement")
@@ -961,9 +944,8 @@ func TestPrematureAnnouncement(t *testing.T) {
func TestSignatureAnnouncementLocalFirst(t *testing.T) { func TestSignatureAnnouncementLocalFirst(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(uint32(proofMatureDelta)) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
// Set up a channel that we can use to inspect the messages sent // Set up a channel that we can use to inspect the messages sent
// directly from the gossiper. // directly from the gossiper.
@@ -1134,9 +1116,8 @@ func TestSignatureAnnouncementLocalFirst(t *testing.T) {
func TestOrphanSignatureAnnouncement(t *testing.T) { func TestOrphanSignatureAnnouncement(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(uint32(proofMatureDelta)) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
// Set up a channel that we can use to inspect the messages sent // Set up a channel that we can use to inspect the messages sent
// directly from the gossiper. // directly from the gossiper.
@@ -1318,9 +1299,8 @@ func TestOrphanSignatureAnnouncement(t *testing.T) {
func TestSignatureAnnouncementRetryAtStartup(t *testing.T) { func TestSignatureAnnouncementRetryAtStartup(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(uint32(proofMatureDelta)) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
batch, err := createLocalAnnouncements(0) batch, err := createLocalAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -1550,9 +1530,8 @@ out:
func TestSignatureAnnouncementFullProofWhenRemoteProof(t *testing.T) { func TestSignatureAnnouncementFullProofWhenRemoteProof(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(uint32(proofMatureDelta)) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
batch, err := createLocalAnnouncements(0) batch, err := createLocalAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -1983,9 +1962,8 @@ func TestForwardPrivateNodeAnnouncement(t *testing.T) {
timestamp = 123456 timestamp = 123456
) )
ctx, cleanup, err := createTestCtx(startingHeight) ctx, err := createTestCtx(t, startingHeight)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
// We'll start off by processing a channel announcement without a proof // We'll start off by processing a channel announcement without a proof
// (i.e., an unadvertised channel), followed by a node announcement for // (i.e., an unadvertised channel), followed by a node announcement for
@@ -2083,9 +2061,8 @@ func TestRejectZombieEdge(t *testing.T) {
// We'll start by creating our test context with a batch of // We'll start by creating our test context with a batch of
// announcements. // announcements.
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "unable to create test context") require.NoError(t, err, "unable to create test context")
defer cleanup()
batch, err := createRemoteAnnouncements(0) batch, err := createRemoteAnnouncements(0)
require.NoError(t, err, "unable to create announcements") require.NoError(t, err, "unable to create announcements")
@@ -2185,9 +2162,8 @@ func TestProcessZombieEdgeNowLive(t *testing.T) {
// We'll start by creating our test context with a batch of // We'll start by creating our test context with a batch of
// announcements. // announcements.
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "unable to create test context") require.NoError(t, err, "unable to create test context")
defer cleanup()
batch, err := createRemoteAnnouncements(0) batch, err := createRemoteAnnouncements(0)
require.NoError(t, err, "unable to create announcements") require.NoError(t, err, "unable to create announcements")
@@ -2343,9 +2319,8 @@ func TestProcessZombieEdgeNowLive(t *testing.T) {
func TestReceiveRemoteChannelUpdateFirst(t *testing.T) { func TestReceiveRemoteChannelUpdateFirst(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(uint32(proofMatureDelta)) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
batch, err := createLocalAnnouncements(0) batch, err := createLocalAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -2541,9 +2516,8 @@ func TestReceiveRemoteChannelUpdateFirst(t *testing.T) {
func TestExtraDataChannelAnnouncementValidation(t *testing.T) { func TestExtraDataChannelAnnouncementValidation(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
remotePeer := &mockPeer{remoteKeyPriv1.PubKey(), nil, nil} remotePeer := &mockPeer{remoteKeyPriv1.PubKey(), nil, nil}
@@ -2573,9 +2547,8 @@ func TestExtraDataChannelUpdateValidation(t *testing.T) {
t.Parallel() t.Parallel()
timestamp := testTimestamp timestamp := testTimestamp
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
remotePeer := &mockPeer{remoteKeyPriv1.PubKey(), nil, nil} remotePeer := &mockPeer{remoteKeyPriv1.PubKey(), nil, nil}
@@ -2625,9 +2598,8 @@ func TestExtraDataChannelUpdateValidation(t *testing.T) {
func TestExtraDataNodeAnnouncementValidation(t *testing.T) { func TestExtraDataNodeAnnouncementValidation(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
remotePeer := &mockPeer{remoteKeyPriv1.PubKey(), nil, nil} remotePeer := &mockPeer{remoteKeyPriv1.PubKey(), nil, nil}
timestamp := testTimestamp timestamp := testTimestamp
@@ -2694,9 +2666,8 @@ func assertProcessAnnouncement(t *testing.T, result chan error) {
func TestRetransmit(t *testing.T) { func TestRetransmit(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(proofMatureDelta) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
batch, err := createLocalAnnouncements(0) batch, err := createLocalAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -2801,9 +2772,8 @@ func TestRetransmit(t *testing.T) {
func TestNodeAnnouncementNoChannels(t *testing.T) { func TestNodeAnnouncementNoChannels(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
batch, err := createRemoteAnnouncements(0) batch, err := createRemoteAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -2887,9 +2857,8 @@ func TestNodeAnnouncementNoChannels(t *testing.T) {
func TestOptionalFieldsChannelUpdateValidation(t *testing.T) { func TestOptionalFieldsChannelUpdateValidation(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
chanUpdateHeight := uint32(0) chanUpdateHeight := uint32(0)
timestamp := uint32(123456) timestamp := uint32(123456)
@@ -2966,9 +2935,8 @@ func TestSendChannelUpdateReliably(t *testing.T) {
// We'll start by creating our test context and a batch of // We'll start by creating our test context and a batch of
// announcements. // announcements.
ctx, cleanup, err := createTestCtx(uint32(proofMatureDelta)) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "unable to create test context") require.NoError(t, err, "unable to create test context")
defer cleanup()
batch, err := createLocalAnnouncements(0) batch, err := createLocalAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -3319,9 +3287,8 @@ func TestPropagateChanPolicyUpdate(t *testing.T) {
// First, we'll make out test context and add 3 random channels to the // First, we'll make out test context and add 3 random channels to the
// graph. // graph.
startingHeight := uint32(10) startingHeight := uint32(10)
ctx, cleanup, err := createTestCtx(startingHeight) ctx, err := createTestCtx(t, startingHeight)
require.NoError(t, err, "unable to create test context") require.NoError(t, err, "unable to create test context")
defer cleanup()
const numChannels = 3 const numChannels = 3
channelsToAnnounce := make([]*annBatch, 0, numChannels) channelsToAnnounce := make([]*annBatch, 0, numChannels)
@@ -3497,9 +3464,8 @@ func TestProcessChannelAnnouncementOptionalMsgFields(t *testing.T) {
// We'll start by creating our test context and a set of test channel // We'll start by creating our test context and a set of test channel
// announcements. // announcements.
ctx, cleanup, err := createTestCtx(0) ctx, err := createTestCtx(t, 0)
require.NoError(t, err, "unable to create test context") require.NoError(t, err, "unable to create test context")
defer cleanup()
chanAnn1 := createAnnouncementWithoutProof( chanAnn1 := createAnnouncementWithoutProof(
100, selfKeyDesc.PubKey, remoteKeyPub1, 100, selfKeyDesc.PubKey, remoteKeyPub1,
@@ -3661,9 +3627,8 @@ func (m *SyncManager) markGraphSyncing() {
func TestBroadcastAnnsAfterGraphSynced(t *testing.T) { func TestBroadcastAnnsAfterGraphSynced(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(10) ctx, err := createTestCtx(t, 10)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
// We'll mark the graph as not synced. This should prevent us from // We'll mark the graph as not synced. This should prevent us from
// broadcasting any messages we've received as part of our initial // broadcasting any messages we've received as part of our initial
@@ -3735,9 +3700,8 @@ func TestRateLimitChannelUpdates(t *testing.T) {
// Create our test harness. // Create our test harness.
const blockHeight = 100 const blockHeight = 100
ctx, cleanup, err := createTestCtx(blockHeight) ctx, err := createTestCtx(t, blockHeight)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
ctx.gossiper.cfg.RebroadcastInterval = time.Hour ctx.gossiper.cfg.RebroadcastInterval = time.Hour
ctx.gossiper.cfg.MaxChannelUpdateBurst = 5 ctx.gossiper.cfg.MaxChannelUpdateBurst = 5
ctx.gossiper.cfg.ChannelUpdateInterval = 5 * time.Second ctx.gossiper.cfg.ChannelUpdateInterval = 5 * time.Second
@@ -3882,9 +3846,8 @@ func TestRateLimitChannelUpdates(t *testing.T) {
func TestIgnoreOwnAnnouncement(t *testing.T) { func TestIgnoreOwnAnnouncement(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(proofMatureDelta) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
batch, err := createLocalAnnouncements(0) batch, err := createLocalAnnouncements(0)
require.NoError(t, err, "can't generate announcements") require.NoError(t, err, "can't generate announcements")
@@ -4027,9 +3990,8 @@ func TestIgnoreOwnAnnouncement(t *testing.T) {
func TestRejectCacheChannelAnn(t *testing.T) { func TestRejectCacheChannelAnn(t *testing.T) {
t.Parallel() t.Parallel()
ctx, cleanup, err := createTestCtx(proofMatureDelta) ctx, err := createTestCtx(t, proofMatureDelta)
require.NoError(t, err, "can't create context") require.NoError(t, err, "can't create context")
defer cleanup()
// First, we create a channel announcement to send over to our test // First, we create a channel announcement to send over to our test
// peer. // peer.
+8 -18
View File
@@ -2,9 +2,7 @@ package discovery
import ( import (
"bytes" "bytes"
"io/ioutil"
"math/rand" "math/rand"
"os"
"reflect" "reflect"
"testing" "testing"
@@ -16,29 +14,24 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func createTestMessageStore(t *testing.T) (*MessageStore, func()) { func createTestMessageStore(t *testing.T) *MessageStore {
t.Helper() t.Helper()
tempDir, err := ioutil.TempDir("", "channeldb") db, err := channeldb.Open(t.TempDir())
require.NoError(t, err, "unable to create temp dir")
db, err := channeldb.Open(tempDir)
if err != nil { if err != nil {
os.RemoveAll(tempDir)
t.Fatalf("unable to open db: %v", err) t.Fatalf("unable to open db: %v", err)
} }
cleanUp := func() { t.Cleanup(func() {
db.Close() db.Close()
os.RemoveAll(tempDir) })
}
store, err := NewMessageStore(db) store, err := NewMessageStore(db)
if err != nil { if err != nil {
cleanUp()
t.Fatalf("unable to initialize message store: %v", err) t.Fatalf("unable to initialize message store: %v", err)
} }
return store, cleanUp return store
} }
func randPubKey(t *testing.T) *btcec.PublicKey { func randPubKey(t *testing.T) *btcec.PublicKey {
@@ -79,8 +72,7 @@ func TestMessageStoreMessages(t *testing.T) {
t.Parallel() t.Parallel()
// We'll start by creating our test message store. // We'll start by creating our test message store.
msgStore, cleanUp := createTestMessageStore(t) msgStore := createTestMessageStore(t)
defer cleanUp()
// We'll then create some test messages for two test peers, and none for // We'll then create some test messages for two test peers, and none for
// an additional test peer. // an additional test peer.
@@ -212,8 +204,7 @@ func TestMessageStoreUnsupportedMessage(t *testing.T) {
t.Parallel() t.Parallel()
// We'll start by creating our test message store. // We'll start by creating our test message store.
msgStore, cleanUp := createTestMessageStore(t) msgStore := createTestMessageStore(t)
defer cleanUp()
// Create a message that is known to not be supported by the store. // Create a message that is known to not be supported by the store.
peer := randCompressedPubKey(t) peer := randCompressedPubKey(t)
@@ -261,8 +252,7 @@ func TestMessageStoreUnsupportedMessage(t *testing.T) {
func TestMessageStoreDeleteMessage(t *testing.T) { func TestMessageStoreDeleteMessage(t *testing.T) {
t.Parallel() t.Parallel()
msgStore, cleanUp := createTestMessageStore(t) msgStore := createTestMessageStore(t)
defer cleanUp()
// assertMsg is a helper closure we'll use to ensure a message // assertMsg is a helper closure we'll use to ensure a message
// does/doesn't exist within the store. // does/doesn't exist within the store.