lnd/watchtower/wtdb/migration2/client_db_test.go

125 lines
2.9 KiB
Go
Raw Normal View History

package migration2
import (
"encoding/binary"
"testing"
"github.com/lightningnetwork/lnd/channeldb/migtest"
"github.com/lightningnetwork/lnd/kvdb"
"github.com/stretchr/testify/require"
)
var (
// pre is the expected data in the cChanSummaryBkt bucket before the
// migration.
pre = map[string]interface{}{
channelIDString(1): string([]byte{1, 2, 3}),
channelIDString(2): string([]byte{3, 4, 5}),
}
// pre should fail the migration due to no channel summary being found
// for a given channel ID.
preFailCorruptDB = map[string]interface{}{
channelIDString(1): string([]byte{1, 2, 3}),
channelIDString(2): "",
}
// post is the expected data after migration.
post = map[string]interface{}{
channelIDString(1): map[string]interface{}{
string(cChannelSummary): string([]byte{1, 2, 3}),
},
channelIDString(2): map[string]interface{}{
string(cChannelSummary): string([]byte{3, 4, 5}),
},
}
)
// TestMigrateClientChannelDetails tests that the MigrateClientChannelDetails
// function correctly moves channel-summaries from the channel-summaries bucket
// to the new channel-details bucket.
func TestMigrateClientChannelDetails(t *testing.T) {
t.Parallel()
tests := []struct {
name string
shouldFail bool
pre map[string]interface{}
post map[string]interface{}
}{
{
name: "migration ok",
shouldFail: false,
pre: pre,
post: post,
},
{
name: "fail due to corrupt db",
shouldFail: true,
pre: preFailCorruptDB,
post: nil,
},
{
name: "no channel summaries",
shouldFail: false,
pre: nil,
post: nil,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
t.Parallel()
// Before the migration we have a channel summary
// bucket.
before := func(tx kvdb.RwTx) error {
return migtest.RestoreDB(
tx, cChanSummaryBkt, test.pre,
)
}
// After the migration, we should have a new channel
// details bucket and no longer have a channel summary
// bucket.
after := func(tx kvdb.RwTx) error {
// If we expect our migration to fail, we
// expect our channel summary bucket to remain
// intact.
if test.shouldFail {
return migtest.VerifyDB(
tx, cChanSummaryBkt, test.pre,
)
}
// Otherwise, we expect the channel summary
// bucket to be deleted.
err := migtest.VerifyDB(
tx, cChanSummaryBkt, test.pre,
)
require.ErrorContains(t, err, "not found")
// We also expect the new channel details bucket
// to be present.
return migtest.VerifyDB(
tx, cChanDetailsBkt, test.post,
)
}
migtest.ApplyMigration(
t, before, after, MigrateClientChannelDetails,
test.shouldFail,
)
})
}
}
func channelIDString(id uint64) string {
var chanID ChannelID
binary.BigEndian.PutUint64(chanID[:], id)
return chanID.String()
}