The new command opens an existing vspd database and replaces the currently used xpub with a new one.
118 lines
3.2 KiB
Go
118 lines
3.2 KiB
Go
// Copyright (c) 2020-2024 The Decred developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package database
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func testFeeXPub(t *testing.T) {
|
|
// A newly created DB should store the fee xpub it was initialized with.
|
|
retrievedXPub, err := db.FeeXPub()
|
|
if err != nil {
|
|
t.Fatalf("error getting fee xpub: %v", err)
|
|
}
|
|
|
|
if retrievedXPub.Key != feeXPub {
|
|
t.Fatalf("expected fee xpub %v, got %v", feeXPub, retrievedXPub.Key)
|
|
}
|
|
|
|
// The ID, last used index and retirement timestamp should all be 0
|
|
if retrievedXPub.ID != 0 {
|
|
t.Fatalf("expected xpub ID 0, got %d", retrievedXPub.ID)
|
|
}
|
|
if retrievedXPub.LastUsedIdx != 0 {
|
|
t.Fatalf("expected xpub last used 0, got %d", retrievedXPub.LastUsedIdx)
|
|
}
|
|
if retrievedXPub.Retired != 0 {
|
|
t.Fatalf("expected xpub retirement 0, got %d", retrievedXPub.Retired)
|
|
}
|
|
|
|
// Update address index.
|
|
idx := uint32(99)
|
|
err = db.SetLastAddressIndex(idx)
|
|
if err != nil {
|
|
t.Fatalf("error setting address index: %v", err)
|
|
}
|
|
|
|
// Check for updated value.
|
|
retrievedXPub, err = db.FeeXPub()
|
|
if err != nil {
|
|
t.Fatalf("error getting fee xpub: %v", err)
|
|
}
|
|
if retrievedXPub.LastUsedIdx != idx {
|
|
t.Fatalf("expected xpub last used %d, got %d", idx, retrievedXPub.LastUsedIdx)
|
|
}
|
|
|
|
// Key, ID and retirement timestamp should be unchanged.
|
|
if retrievedXPub.Key != feeXPub {
|
|
t.Fatalf("expected fee xpub %v, got %v", feeXPub, retrievedXPub.Key)
|
|
}
|
|
if retrievedXPub.ID != 0 {
|
|
t.Fatalf("expected xpub ID 0, got %d", retrievedXPub.ID)
|
|
}
|
|
if retrievedXPub.Retired != 0 {
|
|
t.Fatalf("expected xpub retirement 0, got %d", retrievedXPub.Retired)
|
|
}
|
|
}
|
|
|
|
func testRetireFeeXPub(t *testing.T) {
|
|
// Increment the last used index to simulate some usage.
|
|
idx := uint32(99)
|
|
err := db.SetLastAddressIndex(idx)
|
|
if err != nil {
|
|
t.Fatalf("error setting address index: %v", err)
|
|
}
|
|
|
|
// Ensure a previously used xpub is rejected.
|
|
err = db.RetireXPub(feeXPub)
|
|
if err == nil {
|
|
t.Fatalf("previous xpub was not rejected")
|
|
}
|
|
|
|
const expectedErr = "provided xpub has already been used"
|
|
if err == nil || err.Error() != expectedErr {
|
|
t.Fatalf("incorrect error, expected %q, got %q",
|
|
expectedErr, err.Error())
|
|
}
|
|
|
|
// An unused xpub should be accepted.
|
|
const feeXPub2 = "feexpub2"
|
|
err = db.RetireXPub(feeXPub2)
|
|
if err != nil {
|
|
t.Fatalf("retiring xpub failed: %v", err)
|
|
}
|
|
|
|
// Retrieve the new xpub. Index should be incremented, last addr should be
|
|
// reset to 0, key should not be retired.
|
|
retrievedXPub, err := db.FeeXPub()
|
|
if err != nil {
|
|
t.Fatalf("error getting fee xpub: %v", err)
|
|
}
|
|
|
|
if retrievedXPub.Key != feeXPub2 {
|
|
t.Fatalf("expected fee xpub %q, got %q", feeXPub2, retrievedXPub.Key)
|
|
}
|
|
if retrievedXPub.ID != 1 {
|
|
t.Fatalf("expected xpub ID 1, got %d", retrievedXPub.ID)
|
|
}
|
|
if retrievedXPub.LastUsedIdx != 0 {
|
|
t.Fatalf("expected xpub last used 0, got %d", retrievedXPub.LastUsedIdx)
|
|
}
|
|
if retrievedXPub.Retired != 0 {
|
|
t.Fatalf("expected xpub retirement 0, got %d", retrievedXPub.Retired)
|
|
}
|
|
|
|
// Old xpub should have retired field set.
|
|
xpubs, err := db.AllXPubs()
|
|
if err != nil {
|
|
t.Fatalf("error getting all fee xpubs: %v", err)
|
|
}
|
|
|
|
if xpubs[0].Retired == 0 {
|
|
t.Fatalf("old xpub retired field not set")
|
|
}
|
|
}
|