gecko/snow/engine/avalanche/test_vm.go

86 lines
1.9 KiB
Go

// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package avalanche
import (
"errors"
"github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/snow/choices"
"github.com/ava-labs/gecko/snow/consensus/snowstorm"
"github.com/ava-labs/gecko/snow/engine/common"
)
var (
errParseTx = errors.New("unexpectedly called ParseTx")
errIssueTx = errors.New("unexpectedly called IssueTx")
errGetTx = errors.New("unexpectedly called GetTx")
)
// VMTest ...
type VMTest struct {
common.VMTest
CantPendingTxs, CantParseTx, CantIssueTx, CantGetTx bool
PendingTxsF func() []snowstorm.Tx
ParseTxF func([]byte) (snowstorm.Tx, error)
IssueTxF func([]byte, func(choices.Status), func(choices.Status)) (ids.ID, error)
GetTxF func(ids.ID) (snowstorm.Tx, error)
}
// Default ...
func (vm *VMTest) Default(cant bool) {
vm.VMTest.Default(cant)
vm.CantPendingTxs = cant
vm.CantParseTx = cant
vm.CantIssueTx = cant
vm.CantGetTx = cant
}
// PendingTxs ...
func (vm *VMTest) PendingTxs() []snowstorm.Tx {
if vm.PendingTxsF != nil {
return vm.PendingTxsF()
}
if vm.CantPendingTxs && vm.T != nil {
vm.T.Fatalf("Unexpectedly called PendingTxs")
}
return nil
}
// ParseTx ...
func (vm *VMTest) ParseTx(b []byte) (snowstorm.Tx, error) {
if vm.ParseTxF != nil {
return vm.ParseTxF(b)
}
if vm.CantParseTx && vm.T != nil {
vm.T.Fatal(errParseTx)
}
return nil, errParseTx
}
// IssueTx ...
func (vm *VMTest) IssueTx(b []byte, issued, finalized func(choices.Status)) (ids.ID, error) {
if vm.IssueTxF != nil {
return vm.IssueTxF(b, issued, finalized)
}
if vm.CantIssueTx && vm.T != nil {
vm.T.Fatal(errIssueTx)
}
return ids.ID{}, errIssueTx
}
// GetTx ...
func (vm *VMTest) GetTx(txID ids.ID) (snowstorm.Tx, error) {
if vm.GetTxF != nil {
return vm.GetTxF(txID)
}
if vm.CantGetTx && vm.T != nil {
vm.T.Fatal(errGetTx)
}
return nil, errGetTx
}