2016-02-03 16:46:27 -06:00
// Copyright 2016 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package vm
import (
"math/big"
"testing"
"github.com/ethereum/go-ethereum/common"
2016-12-05 19:16:03 -06:00
"github.com/ethereum/go-ethereum/params"
2016-02-03 16:46:27 -06:00
)
type dummyContractRef struct {
calledForEach bool
}
2016-12-05 19:16:03 -06:00
func ( dummyContractRef ) ReturnGas ( * big . Int ) { }
func ( dummyContractRef ) Address ( ) common . Address { return common . Address { } }
func ( dummyContractRef ) Value ( ) * big . Int { return new ( big . Int ) }
func ( dummyContractRef ) SetCode ( common . Hash , [ ] byte ) { }
2016-02-03 16:46:27 -06:00
func ( d * dummyContractRef ) ForEachStorage ( callback func ( key , value common . Hash ) bool ) {
d . calledForEach = true
}
func ( d * dummyContractRef ) SubBalance ( amount * big . Int ) { }
func ( d * dummyContractRef ) AddBalance ( amount * big . Int ) { }
func ( d * dummyContractRef ) SetBalance ( * big . Int ) { }
func ( d * dummyContractRef ) SetNonce ( uint64 ) { }
func ( d * dummyContractRef ) Balance ( ) * big . Int { return new ( big . Int ) }
2016-12-05 19:16:03 -06:00
type dummyStateDB struct {
NoopStateDB
2016-02-03 16:46:27 -06:00
ref * dummyContractRef
}
2016-12-05 19:16:03 -06:00
func ( d dummyStateDB ) GetAccount ( common . Address ) Account {
2016-02-03 16:46:27 -06:00
return d . ref
}
func TestStoreCapture ( t * testing . T ) {
var (
2017-01-05 04:52:10 -06:00
env = NewEVM ( Context { } , nil , params . TestChainConfig , Config { EnableJit : false , ForceJit : false } )
2016-08-19 09:19:51 -05:00
logger = NewStructLogger ( nil )
2016-02-03 16:46:27 -06:00
mem = NewMemory ( )
stack = newstack ( )
2016-12-05 19:16:03 -06:00
contract = NewContract ( & dummyContractRef { } , & dummyContractRef { } , new ( big . Int ) , new ( big . Int ) )
2016-02-03 16:46:27 -06:00
)
stack . push ( big . NewInt ( 1 ) )
stack . push ( big . NewInt ( 0 ) )
var index common . Hash
2016-08-19 09:19:51 -05:00
logger . CaptureState ( env , 0 , SSTORE , new ( big . Int ) , new ( big . Int ) , mem , stack , contract , 0 , nil )
2016-02-03 16:46:27 -06:00
if len ( logger . changedValues [ contract . Address ( ) ] ) == 0 {
t . Fatalf ( "expected exactly 1 changed value on address %x, got %d" , contract . Address ( ) , len ( logger . changedValues [ contract . Address ( ) ] ) )
}
exp := common . BigToHash ( big . NewInt ( 1 ) )
if logger . changedValues [ contract . Address ( ) ] [ index ] != exp {
t . Errorf ( "expected %x, got %x" , exp , logger . changedValues [ contract . Address ( ) ] [ index ] )
}
}
func TestStorageCapture ( t * testing . T ) {
t . Skip ( "implementing this function is difficult. it requires all sort of interfaces to be implemented which isn't trivial. The value (the actual test) isn't worth it" )
var (
ref = & dummyContractRef { }
2016-12-05 19:16:03 -06:00
contract = NewContract ( ref , ref , new ( big . Int ) , new ( big . Int ) )
2017-01-05 04:52:10 -06:00
env = NewEVM ( Context { } , dummyStateDB { ref : ref } , params . TestChainConfig , Config { EnableJit : false , ForceJit : false } )
2016-08-19 09:19:51 -05:00
logger = NewStructLogger ( nil )
2016-02-03 16:46:27 -06:00
mem = NewMemory ( )
stack = newstack ( )
)
2016-08-19 09:19:51 -05:00
logger . CaptureState ( env , 0 , STOP , new ( big . Int ) , new ( big . Int ) , mem , stack , contract , 0 , nil )
2016-02-03 16:46:27 -06:00
if ref . calledForEach {
t . Error ( "didn't expect for each to be called" )
}
2016-08-19 09:19:51 -05:00
logger = NewStructLogger ( & LogConfig { FullStorage : true } )
logger . CaptureState ( env , 0 , STOP , new ( big . Int ) , new ( big . Int ) , mem , stack , contract , 0 , nil )
2016-02-03 16:46:27 -06:00
if ! ref . calledForEach {
t . Error ( "expected for each to be called" )
}
}