Skip to content
Snippets Groups Projects
pipe.go 7.43 KiB
Newer Older
Androlo's avatar
Androlo committed
package mock

import (
Silas Davis's avatar
Silas Davis committed

	account "github.com/eris-ltd/eris-db/account"
	core_types "github.com/eris-ltd/eris-db/core/types"
	definitions "github.com/eris-ltd/eris-db/definitions"
	event "github.com/eris-ltd/eris-db/event"
Silas Davis's avatar
Silas Davis committed
	blockchain_types "github.com/eris-ltd/eris-db/blockchain/types"
	consensus_types "github.com/eris-ltd/eris-db/consensus/types"
	manager_types "github.com/eris-ltd/eris-db/manager/types"
Silas Davis's avatar
Silas Davis committed
	td "github.com/eris-ltd/eris-db/test/testdata/testdata"
Silas Davis's avatar
Silas Davis committed
	"github.com/tendermint/go-crypto"
	"github.com/tendermint/go-p2p"
Ethan Buchman's avatar
Ethan Buchman committed
	mintTypes "github.com/tendermint/tendermint/types"
Silas Davis's avatar
Silas Davis committed
	tmsp_types "github.com/tendermint/tmsp/types"
Androlo's avatar
Androlo committed
)

// Base struct.
type MockPipe struct {
	testData        *td.TestData
	accounts        definitions.Accounts
	blockchain      blockchain_types.Blockchain
	consensusEngine consensus_types.ConsensusEngine
	events          event.EventEmitter
	namereg         definitions.NameReg
	transactor      definitions.Transactor
Androlo's avatar
Androlo committed
}

// Create a new mock tendermint pipe.
func NewMockPipe(td *td.TestData) definitions.Pipe {
androlo's avatar
androlo committed
	accounts := &accounts{td}
	blockchain := &blockchain{td}
	consensusEngine := &consensusEngine{td}
Ethan Buchman's avatar
Ethan Buchman committed
	eventer := &eventer{td}
androlo's avatar
androlo committed
	namereg := &namereg{td}
androlo's avatar
androlo committed
	transactor := &transactor{td}
Androlo's avatar
Androlo committed
	return &MockPipe{
androlo's avatar
androlo committed
		td,
Androlo's avatar
Androlo committed
		accounts,
		blockchain,
		consensusEngine,
Ethan Buchman's avatar
Ethan Buchman committed
		eventer,
androlo's avatar
androlo committed
		namereg,
Androlo's avatar
Androlo committed
		transactor,
Androlo's avatar
Androlo committed
	}
}

// Create a mock pipe with default mock data.
func NewDefaultMockPipe() definitions.Pipe {
	return NewMockPipe(td.LoadTestData())
Androlo's avatar
Androlo committed
}

func (pipe *MockPipe) Accounts() definitions.Accounts {
	return pipe.accounts
Androlo's avatar
Androlo committed
}

func (pipe *MockPipe) Blockchain() blockchain_types.Blockchain {
	return pipe.blockchain
Androlo's avatar
Androlo committed
}

func (pipe *MockPipe) Events() event.EventEmitter {
	return pipe.events
Androlo's avatar
Androlo committed
}

func (pipe *MockPipe) NameReg() definitions.NameReg {
	return pipe.namereg
Androlo's avatar
Androlo committed
}

func (pipe *MockPipe) Transactor() definitions.Transactor {
	return pipe.transactor
Androlo's avatar
Androlo committed
}

func (pipe *MockPipe) GetApplication() manager_types.Application {
	// TODO: [ben] mock application
	return nil
}

func (pipe *MockPipe) SetConsensusEngine(_ consensus_types.ConsensusEngine) error {
	// TODO: [ben] mock consensus engine
	return nil
}
func (pipe *MockPipe) GetConsensusEngine() consensus_types.ConsensusEngine {
	return pipe.consensusEngine
Silas Davis's avatar
Silas Davis committed
}

func (pipe *MockPipe) SetBlockchain(_ blockchain_types.Blockchain) error {
Silas Davis's avatar
Silas Davis committed
	// TODO: [ben] mock consensus engine
	return nil
}

func (pipe *MockPipe) GetBlockchain() blockchain_types.Blockchain {
func (pipe *MockPipe) GetTendermintPipe() (definitions.TendermintPipe, error) {
	return nil, fmt.Errorf("Tendermint pipe is not supported by mocked pipe.")
}

func (pipe *MockPipe) GenesisHash() []byte {
	return pipe.testData.GetGenesisHash.Output.Hash
Silas Davis's avatar
Silas Davis committed
}

Androlo's avatar
Androlo committed
// Components

// Accounts
type accounts struct {
androlo's avatar
androlo committed
	testData *td.TestData
Androlo's avatar
Androlo committed
}

func (acc *accounts) GenPrivAccount() (*account.PrivAccount, error) {
	return acc.testData.GenPrivAccount.Output, nil
Androlo's avatar
Androlo committed
}

func (acc *accounts) GenPrivAccountFromKey(key []byte) (*account.PrivAccount, error) {
	return acc.testData.GenPrivAccount.Output, nil
Androlo's avatar
Androlo committed
}

func (acc *accounts) Accounts([]*event.FilterData) (*core_types.AccountList, error) {
	return acc.testData.GetAccounts.Output, nil
Androlo's avatar
Androlo committed
}

func (acc *accounts) Account(address []byte) (*account.Account, error) {
	return acc.testData.GetAccount.Output, nil
Androlo's avatar
Androlo committed
}

func (acc *accounts) Storage(address []byte) (*core_types.Storage, error) {
	return acc.testData.GetStorage.Output, nil
Androlo's avatar
Androlo committed
}

func (acc *accounts) StorageAt(address, key []byte) (*core_types.StorageItem, error) {
	return acc.testData.GetStorageAt.Output, nil
Androlo's avatar
Androlo committed
}

// Blockchain
type blockchain struct {
androlo's avatar
androlo committed
	testData *td.TestData
Androlo's avatar
Androlo committed
}

Silas Davis's avatar
Silas Davis committed
func (this *blockchain) ChainId() string {
	return this.testData.GetChainId.Output.ChainId
}

func (this *blockchain) Height() int {
	return this.testData.GetLatestBlockHeight.Output.Height
Androlo's avatar
Androlo committed
}

Silas Davis's avatar
Silas Davis committed
func (this *blockchain) Block(height int) *mintTypes.Block {
	return this.testData.GetBlock.Output
Androlo's avatar
Androlo committed
}

Silas Davis's avatar
Silas Davis committed
func (this *blockchain) BlockMeta(height int) *mintTypes.BlockMeta {
	return &mintTypes.BlockMeta{}
Androlo's avatar
Androlo committed
}

Silas Davis's avatar
Silas Davis committed
// Consensus
type consensusEngine struct {
Silas Davis's avatar
Silas Davis committed
	testData *td.TestData
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) BroadcastTransaction(transaction []byte,
Silas Davis's avatar
Silas Davis committed
	callback func(*tmsp_types.Response)) error {
	return nil
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) IsListening() bool {
	return cons.testData.IsListening.Output.Listening
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) Listeners() []p2p.Listener {
	p2pListeners := make([]p2p.Listener, 0)

	for _, name := range cons.testData.GetListeners.Output.Listeners {
		p2pListeners = append(p2pListeners, p2p.NewDefaultListener("tcp", name, true))
	}

	return p2pListeners
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) NodeInfo() *p2p.NodeInfo {
	return &p2p.NodeInfo{
		Version: cons.testData.GetNetworkInfo.Output.ClientVersion,
		Moniker: cons.testData.GetNetworkInfo.Output.Moniker,
	}
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) Peers() []*consensus_types.Peer {
	return cons.testData.GetPeers.Output
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) PublicValidatorKey() crypto.PubKey {
Silas Davis's avatar
Silas Davis committed
	return crypto.PubKeyEd25519{
		1, 2, 3, 4, 5, 6, 7, 8,
		1, 2, 3, 4, 5, 6, 7, 8,
		1, 2, 3, 4, 5, 6, 7, 8,
		1, 2, 3, 4, 5, 6, 7, 8,
func (cons *consensusEngine) Events() event.EventEmitter {
Silas Davis's avatar
Silas Davis committed
	return nil
Androlo's avatar
Androlo committed
}

func (cons *consensusEngine) ListUnconfirmedTxs(maxTxs int) ([]txs.Tx, error) {
	return cons.testData.GetUnconfirmedTxs.Output.Txs, nil
}

func (cons *consensusEngine) ListValidators() []consensus_types.Validator {
	return nil
}

func (cons *consensusEngine) ConsensusState() *consensus_types.ConsensusState {
	return &consensus_types.ConsensusState{}
}

func (cons *consensusEngine) PeerConsensusStates() map[string]string {
	return map[string]string{}
}

Androlo's avatar
Androlo committed
// Events
Ethan Buchman's avatar
Ethan Buchman committed
type eventer struct {
androlo's avatar
androlo committed
	testData *td.TestData
Androlo's avatar
Androlo committed
}

func (evntr *eventer) Subscribe(subId, event string, callback func(txs.EventData)) error {
Androlo's avatar
Androlo committed
}

func (evntr *eventer) Unsubscribe(subId string) error {
Androlo's avatar
Androlo committed
}

androlo's avatar
androlo committed
// NameReg
type namereg struct {
	testData *td.TestData
}

func (nmreg *namereg) Entry(key string) (*core_types.NameRegEntry, error) {
	return nmreg.testData.GetNameRegEntry.Output, nil
func (nmreg *namereg) Entries(filters []*event.FilterData) (*core_types.ResultListNames, error) {
	return nmreg.testData.GetNameRegEntries.Output, nil
Androlo's avatar
Androlo committed
// Txs
Androlo's avatar
Androlo committed
type transactor struct {
androlo's avatar
androlo committed
	testData *td.TestData
Androlo's avatar
Androlo committed
}

func (trans *transactor) Call(fromAddress, toAddress, data []byte) (*core_types.Call, error) {
	return trans.testData.Call.Output, nil
Androlo's avatar
Androlo committed
}

func (trans *transactor) CallCode(from, code, data []byte) (*core_types.Call, error) {
	return trans.testData.CallCode.Output, nil
Androlo's avatar
Androlo committed
}

func (trans *transactor) BroadcastTx(tx txs.Tx) (*txs.Receipt, error) {
	return nil, nil
Androlo's avatar
Androlo committed
}

func (trans *transactor) Transact(privKey, address, data []byte, gasLimit, fee int64) (*txs.Receipt, error) {
	if address == nil || len(address) == 0 {
		return trans.testData.TransactCreate.Output, nil
	return trans.testData.Transact.Output, nil
Androlo's avatar
Androlo committed
}

func (trans *transactor) TransactAndHold(privKey, address, data []byte, gasLimit, fee int64) (*txs.EventDataCall, error) {
androlo's avatar
androlo committed
	return nil, nil
}

func (trans *transactor) Send(privKey, toAddress []byte, amount int64) (*txs.Receipt, error) {
Androlo's avatar
.  
Androlo committed
	return nil, nil
}

func (trans *transactor) SendAndHold(privKey, toAddress []byte, amount int64) (*txs.Receipt, error) {
Androlo's avatar
.  
Androlo committed
	return nil, nil
}

func (trans *transactor) TransactNameReg(privKey []byte, name, data string, amount, fee int64) (*txs.Receipt, error) {
	return trans.testData.TransactNameReg.Output, nil
func (trans *transactor) SignTx(tx txs.Tx, privAccounts []*account.PrivAccount) (txs.Tx, error) {
	return nil, nil
Androlo's avatar
Androlo committed
}