mirror of
https://github.com/btcsuite/btcd.git
synced 2024-11-19 18:00:11 +01:00
349450379f
This completely removes the threshold state database caching code since it can very quickly be calculated at startup now that the entire block index is loaded first.
135 lines
3.6 KiB
Go
135 lines
3.6 KiB
Go
// Copyright (c) 2016 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package blockchain
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
|
)
|
|
|
|
// TestThresholdStateStringer tests the stringized output for the
|
|
// ThresholdState type.
|
|
func TestThresholdStateStringer(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
in ThresholdState
|
|
want string
|
|
}{
|
|
{ThresholdDefined, "ThresholdDefined"},
|
|
{ThresholdStarted, "ThresholdStarted"},
|
|
{ThresholdLockedIn, "ThresholdLockedIn"},
|
|
{ThresholdActive, "ThresholdActive"},
|
|
{ThresholdFailed, "ThresholdFailed"},
|
|
{0xff, "Unknown ThresholdState (255)"},
|
|
}
|
|
|
|
// Detect additional threshold states that don't have the stringer added.
|
|
if len(tests)-1 != int(numThresholdsStates) {
|
|
t.Errorf("It appears a threshold statewas added without " +
|
|
"adding an associated stringer test")
|
|
}
|
|
|
|
t.Logf("Running %d tests", len(tests))
|
|
for i, test := range tests {
|
|
result := test.in.String()
|
|
if result != test.want {
|
|
t.Errorf("String #%d\n got: %s want: %s", i, result,
|
|
test.want)
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestThresholdStateCache ensure the threshold state cache works as intended
|
|
// including adding entries, updating existing entries, and flushing.
|
|
func TestThresholdStateCache(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
numEntries int
|
|
state ThresholdState
|
|
}{
|
|
{name: "2 entries defined", numEntries: 2, state: ThresholdDefined},
|
|
{name: "7 entries started", numEntries: 7, state: ThresholdStarted},
|
|
{name: "10 entries active", numEntries: 10, state: ThresholdActive},
|
|
{name: "5 entries locked in", numEntries: 5, state: ThresholdLockedIn},
|
|
{name: "3 entries failed", numEntries: 3, state: ThresholdFailed},
|
|
}
|
|
|
|
nextTest:
|
|
for _, test := range tests {
|
|
cache := &newThresholdCaches(1)[0]
|
|
for i := 0; i < test.numEntries; i++ {
|
|
var hash chainhash.Hash
|
|
hash[0] = uint8(i + 1)
|
|
|
|
// Ensure the hash isn't available in the cache already.
|
|
_, ok := cache.Lookup(&hash)
|
|
if ok {
|
|
t.Errorf("Lookup (%s): has entry for hash %v",
|
|
test.name, hash)
|
|
continue nextTest
|
|
}
|
|
|
|
// Ensure hash that was added to the cache reports it's
|
|
// available and the state is the expected value.
|
|
cache.Update(&hash, test.state)
|
|
state, ok := cache.Lookup(&hash)
|
|
if !ok {
|
|
t.Errorf("Lookup (%s): missing entry for hash "+
|
|
"%v", test.name, hash)
|
|
continue nextTest
|
|
}
|
|
if state != test.state {
|
|
t.Errorf("Lookup (%s): state mismatch - got "+
|
|
"%v, want %v", test.name, state,
|
|
test.state)
|
|
continue nextTest
|
|
}
|
|
|
|
// Ensure adding an existing hash with the same state
|
|
// doesn't break the existing entry.
|
|
cache.Update(&hash, test.state)
|
|
state, ok = cache.Lookup(&hash)
|
|
if !ok {
|
|
t.Errorf("Lookup (%s): missing entry after "+
|
|
"second add for hash %v", test.name,
|
|
hash)
|
|
continue nextTest
|
|
}
|
|
if state != test.state {
|
|
t.Errorf("Lookup (%s): state mismatch after "+
|
|
"second add - got %v, want %v",
|
|
test.name, state, test.state)
|
|
continue nextTest
|
|
}
|
|
|
|
// Ensure adding an existing hash with a different state
|
|
// updates the existing entry.
|
|
newState := ThresholdFailed
|
|
if newState == test.state {
|
|
newState = ThresholdStarted
|
|
}
|
|
cache.Update(&hash, newState)
|
|
state, ok = cache.Lookup(&hash)
|
|
if !ok {
|
|
t.Errorf("Lookup (%s): missing entry after "+
|
|
"state change for hash %v", test.name,
|
|
hash)
|
|
continue nextTest
|
|
}
|
|
if state != newState {
|
|
t.Errorf("Lookup (%s): state mismatch after "+
|
|
"state change - got %v, want %v",
|
|
test.name, state, newState)
|
|
continue nextTest
|
|
}
|
|
}
|
|
}
|
|
}
|