From 7c6ef0ddac91564f31ef852fd4ef1e821db17c2e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 10 Jun 2015 14:38:39 -0400 Subject: Separate and identify tests runners --- tests/state_test_util.go | 181 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 tests/state_test_util.go (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go new file mode 100644 index 000000000..1f481147e --- /dev/null +++ b/tests/state_test_util.go @@ -0,0 +1,181 @@ +package tests + +import ( + "bytes" + // "errors" + "fmt" + "math/big" + "strconv" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + // "github.com/ethereum/go-ethereum/logger" +) + +func RunStateTest(p string, t *testing.T) { + + tests := make(map[string]VmTest) + CreateFileTests(t, p, &tests) + + for name, test := range tests { + /* + vm.Debug = true + glog.SetV(4) + glog.SetToStderr(true) + if name != "Call50000_sha256" { + continue + } + */ + db, _ := ethdb.NewMemDatabase() + statedb := state.New(common.Hash{}, db) + for addr, account := range test.Pre { + obj := StateObjectFromAccount(db, addr, account) + statedb.SetStateObject(obj) + for a, v := range account.Storage { + obj.SetState(common.HexToHash(a), common.NewValue(common.FromHex(v))) + } + } + + // XXX Yeah, yeah... + env := make(map[string]string) + env["currentCoinbase"] = test.Env.CurrentCoinbase + env["currentDifficulty"] = test.Env.CurrentDifficulty + env["currentGasLimit"] = test.Env.CurrentGasLimit + env["currentNumber"] = test.Env.CurrentNumber + env["previousHash"] = test.Env.PreviousHash + if n, ok := test.Env.CurrentTimestamp.(float64); ok { + env["currentTimestamp"] = strconv.Itoa(int(n)) + } else { + env["currentTimestamp"] = test.Env.CurrentTimestamp.(string) + } + + var ( + ret []byte + // gas *big.Int + // err error + logs state.Logs + ) + + ret, logs, _, _ = RunState(statedb, env, test.Transaction) + + switch name { + // the memory required for these tests (4294967297 bytes) would take too much time. + // on 19 May 2015 decided to skip these tests their output. + case "mload32bitBound_return", "mload32bitBound_return2": + default: + rexp := common.FromHex(test.Out) + if bytes.Compare(rexp, ret) != 0 { + t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) + } + } + + for addr, account := range test.Post { + obj := statedb.GetStateObject(common.HexToAddress(addr)) + if obj == nil { + continue + } + + // if len(test.Exec) == 0 { + if obj.Balance().Cmp(common.Big(account.Balance)) != 0 { + t.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) + } + + // if obj.Nonce() != common.String2Big(account.Nonce).Uint64() { + // t.Errorf("%s's : (%x) nonce failed. Expected %v, got %v\n", name, obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) + // } + + // } + + for addr, value := range account.Storage { + v := obj.GetState(common.HexToHash(addr)).Bytes() + vexp := common.FromHex(value) + + if bytes.Compare(v, vexp) != 0 { + t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v)) + } + } + } + + statedb.Sync() + //if !bytes.Equal(common.Hex2Bytes(test.PostStateRoot), statedb.Root()) { + if common.HexToHash(test.PostStateRoot) != statedb.Root() { + t.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root()) + } + + if len(test.Logs) > 0 { + if len(test.Logs) != len(logs) { + t.Errorf("log length mismatch. Expected %d, got %d", len(test.Logs), len(logs)) + } else { + for i, log := range test.Logs { + if common.HexToAddress(log.AddressF) != logs[i].Address { + t.Errorf("'%s' log address expected %v got %x", name, log.AddressF, logs[i].Address) + } + + if !bytes.Equal(logs[i].Data, common.FromHex(log.DataF)) { + t.Errorf("'%s' log data expected %v got %x", name, log.DataF, logs[i].Data) + } + + if len(log.TopicsF) != len(logs[i].Topics) { + t.Errorf("'%s' log topics length expected %d got %d", name, len(log.TopicsF), logs[i].Topics) + } else { + for j, topic := range log.TopicsF { + if common.HexToHash(topic) != logs[i].Topics[j] { + t.Errorf("'%s' log topic[%d] expected %v got %x", name, j, topic, logs[i].Topics[j]) + } + } + } + genBloom := common.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 256) + + if !bytes.Equal(genBloom, common.Hex2Bytes(log.BloomF)) { + t.Errorf("'%s' bloom mismatch", name) + } + } + } + } + + fmt.Println("State test passed: ", name) + //fmt.Println(string(statedb.Dump())) + } + // logger.Flush() +} + +func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.Logs, *big.Int, error) { + var ( + keyPair, _ = crypto.NewKeyPairFromSec([]byte(common.Hex2Bytes(tx["secretKey"]))) + data = common.FromHex(tx["data"]) + gas = common.Big(tx["gasLimit"]) + price = common.Big(tx["gasPrice"]) + value = common.Big(tx["value"]) + nonce = common.Big(tx["nonce"]).Uint64() + caddr = common.HexToAddress(env["currentCoinbase"]) + ) + + var to *common.Address + if len(tx["to"]) > 2 { + t := common.HexToAddress(tx["to"]) + to = &t + } + // Set pre compiled contracts + vm.Precompiled = vm.PrecompiledContracts() + + snapshot := statedb.Copy() + coinbase := statedb.GetOrNewStateObject(caddr) + coinbase.SetGasPool(common.Big(env["currentGasLimit"])) + + message := NewMessage(common.BytesToAddress(keyPair.Address()), to, data, value, gas, price, nonce) + vmenv := NewEnvFromMap(statedb, env, tx) + vmenv.origin = common.BytesToAddress(keyPair.Address()) + ret, _, err := core.ApplyMessage(vmenv, message, coinbase) + if core.IsNonceErr(err) || core.IsInvalidTxErr(err) { + statedb.Set(snapshot) + } + statedb.Update() + + return ret, vmenv.state.Logs(), vmenv.Gas, err +} -- cgit v1.2.3 From 24554629b162d20a1f945386a45e3221c58adc2b Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 10 Jun 2015 15:02:16 -0400 Subject: DRY log check --- tests/state_test_util.go | 72 +++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 32 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 1f481147e..91a8367e7 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -75,22 +75,20 @@ func RunStateTest(p string, t *testing.T) { } } + // check post state for addr, account := range test.Post { obj := statedb.GetStateObject(common.HexToAddress(addr)) if obj == nil { continue } - // if len(test.Exec) == 0 { if obj.Balance().Cmp(common.Big(account.Balance)) != 0 { t.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) } - // if obj.Nonce() != common.String2Big(account.Nonce).Uint64() { - // t.Errorf("%s's : (%x) nonce failed. Expected %v, got %v\n", name, obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) - // } - - // } + if obj.Nonce() != common.String2Big(account.Nonce).Uint64() { + t.Errorf("%s's : (%x) nonce failed. Expected %v, got %v\n", name, obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) + } for addr, value := range account.Storage { v := obj.GetState(common.HexToHash(addr)).Bytes() @@ -108,41 +106,51 @@ func RunStateTest(p string, t *testing.T) { t.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root()) } + // check logs if len(test.Logs) > 0 { - if len(test.Logs) != len(logs) { - t.Errorf("log length mismatch. Expected %d, got %d", len(test.Logs), len(logs)) - } else { - for i, log := range test.Logs { - if common.HexToAddress(log.AddressF) != logs[i].Address { - t.Errorf("'%s' log address expected %v got %x", name, log.AddressF, logs[i].Address) - } + lerr := CheckLogs(test.Logs, logs, t) + if lerr != nil { + t.Errorf("'%s' ", name, lerr.Error()) + } + } - if !bytes.Equal(logs[i].Data, common.FromHex(log.DataF)) { - t.Errorf("'%s' log data expected %v got %x", name, log.DataF, logs[i].Data) - } + fmt.Println("State test passed: ", name) + //fmt.Println(string(statedb.Dump())) + } + // logger.Flush() +} - if len(log.TopicsF) != len(logs[i].Topics) { - t.Errorf("'%s' log topics length expected %d got %d", name, len(log.TopicsF), logs[i].Topics) - } else { - for j, topic := range log.TopicsF { - if common.HexToHash(topic) != logs[i].Topics[j] { - t.Errorf("'%s' log topic[%d] expected %v got %x", name, j, topic, logs[i].Topics[j]) - } - } - } - genBloom := common.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 256) +func CheckLogs(tlog []Log, logs state.Logs, t *testing.T) error { + + if len(tlog) != len(logs) { + return fmt.Errorf("log length mismatch. Expected %d, got %d", len(tlog), len(logs)) + } else { + for i, log := range tlog { + if common.HexToAddress(log.AddressF) != logs[i].Address { + return fmt.Errorf("log address expected %v got %x", log.AddressF, logs[i].Address) + } - if !bytes.Equal(genBloom, common.Hex2Bytes(log.BloomF)) { - t.Errorf("'%s' bloom mismatch", name) + if !bytes.Equal(logs[i].Data, common.FromHex(log.DataF)) { + return fmt.Errorf("log data expected %v got %x", log.DataF, logs[i].Data) + } + + if len(log.TopicsF) != len(logs[i].Topics) { + return fmt.Errorf("log topics length expected %d got %d", len(log.TopicsF), logs[i].Topics) + } else { + for j, topic := range log.TopicsF { + if common.HexToHash(topic) != logs[i].Topics[j] { + return fmt.Errorf("log topic[%d] expected %v got %x", j, topic, logs[i].Topics[j]) } } } - } + genBloom := common.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 256) - fmt.Println("State test passed: ", name) - //fmt.Println(string(statedb.Dump())) + if !bytes.Equal(genBloom, common.Hex2Bytes(log.BloomF)) { + return fmt.Errorf("bloom mismatch") + } + } } - // logger.Flush() + return nil } func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.Logs, *big.Int, error) { -- cgit v1.2.3 From c5d6fcbaba545d1078f5411dc67208d5d388222e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 10 Jun 2015 16:10:33 -0400 Subject: Return error up stack instead of passing testing var down --- tests/state_test_util.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 91a8367e7..de4af6d82 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -6,22 +6,22 @@ import ( "fmt" "math/big" "strconv" - "testing" + // "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" + // "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" // "github.com/ethereum/go-ethereum/logger" ) -func RunStateTest(p string, t *testing.T) { +func RunStateTest(p string) error { tests := make(map[string]VmTest) - CreateFileTests(t, p, &tests) + CreateFileTests(p, &tests) for name, test := range tests { /* @@ -38,7 +38,7 @@ func RunStateTest(p string, t *testing.T) { obj := StateObjectFromAccount(db, addr, account) statedb.SetStateObject(obj) for a, v := range account.Storage { - obj.SetState(common.HexToHash(a), common.NewValue(common.FromHex(v))) + obj.SetState(common.HexToHash(a), common.HexToHash(s)) } } @@ -64,6 +64,7 @@ func RunStateTest(p string, t *testing.T) { ret, logs, _, _ = RunState(statedb, env, test.Transaction) + // Compare expected and actual return switch name { // the memory required for these tests (4294967297 bytes) would take too much time. // on 19 May 2015 decided to skip these tests their output. @@ -71,7 +72,7 @@ func RunStateTest(p string, t *testing.T) { default: rexp := common.FromHex(test.Out) if bytes.Compare(rexp, ret) != 0 { - t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) + return fmt.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) } } @@ -83,11 +84,11 @@ func RunStateTest(p string, t *testing.T) { } if obj.Balance().Cmp(common.Big(account.Balance)) != 0 { - t.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) + return fmt.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) } if obj.Nonce() != common.String2Big(account.Nonce).Uint64() { - t.Errorf("%s's : (%x) nonce failed. Expected %v, got %v\n", name, obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) + return fmt.Errorf("%s's : (%x) nonce failed. Expected %v, got %v\n", name, obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) } for addr, value := range account.Storage { @@ -95,7 +96,7 @@ func RunStateTest(p string, t *testing.T) { vexp := common.FromHex(value) if bytes.Compare(v, vexp) != 0 { - t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v)) + return fmt.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v)) } } } @@ -103,14 +104,14 @@ func RunStateTest(p string, t *testing.T) { statedb.Sync() //if !bytes.Equal(common.Hex2Bytes(test.PostStateRoot), statedb.Root()) { if common.HexToHash(test.PostStateRoot) != statedb.Root() { - t.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root()) + return fmt.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root()) } // check logs if len(test.Logs) > 0 { lerr := CheckLogs(test.Logs, logs, t) if lerr != nil { - t.Errorf("'%s' ", name, lerr.Error()) + return fmt.Errorf("'%s' ", name, lerr.Error()) } } -- cgit v1.2.3 From b6d40a931286b4c998f58ad074db0a692aeace6e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 10 Jun 2015 16:29:42 -0400 Subject: Cleanup/reorg --- tests/state_test_util.go | 39 +-------------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index de4af6d82..29d7cebe8 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -2,20 +2,16 @@ package tests import ( "bytes" - // "errors" "fmt" "math/big" "strconv" - // "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" - // "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - // "github.com/ethereum/go-ethereum/logger" ) func RunStateTest(p string) error { @@ -109,7 +105,7 @@ func RunStateTest(p string) error { // check logs if len(test.Logs) > 0 { - lerr := CheckLogs(test.Logs, logs, t) + lerr := checkLogs(test.Logs, logs) if lerr != nil { return fmt.Errorf("'%s' ", name, lerr.Error()) } @@ -118,39 +114,6 @@ func RunStateTest(p string) error { fmt.Println("State test passed: ", name) //fmt.Println(string(statedb.Dump())) } - // logger.Flush() -} - -func CheckLogs(tlog []Log, logs state.Logs, t *testing.T) error { - - if len(tlog) != len(logs) { - return fmt.Errorf("log length mismatch. Expected %d, got %d", len(tlog), len(logs)) - } else { - for i, log := range tlog { - if common.HexToAddress(log.AddressF) != logs[i].Address { - return fmt.Errorf("log address expected %v got %x", log.AddressF, logs[i].Address) - } - - if !bytes.Equal(logs[i].Data, common.FromHex(log.DataF)) { - return fmt.Errorf("log data expected %v got %x", log.DataF, logs[i].Data) - } - - if len(log.TopicsF) != len(logs[i].Topics) { - return fmt.Errorf("log topics length expected %d got %d", len(log.TopicsF), logs[i].Topics) - } else { - for j, topic := range log.TopicsF { - if common.HexToHash(topic) != logs[i].Topics[j] { - return fmt.Errorf("log topic[%d] expected %v got %x", j, topic, logs[i].Topics[j]) - } - } - } - genBloom := common.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 256) - - if !bytes.Equal(genBloom, common.Hex2Bytes(log.BloomF)) { - return fmt.Errorf("bloom mismatch") - } - } - } return nil } -- cgit v1.2.3 From ac0637c41332de1f49fb0955f4fbe0fb908a77d5 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 10 Jun 2015 17:04:06 -0400 Subject: More consistent test interfaces + test skipping --- tests/state_test_util.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 29d7cebe8..b507de47f 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -15,19 +15,19 @@ import ( ) func RunStateTest(p string) error { + skipTest := make(map[string]bool, len(stateSkipTests)) + for _, name := range stateSkipTests { + skipTest[name] = true + } tests := make(map[string]VmTest) CreateFileTests(p, &tests) for name, test := range tests { - /* - vm.Debug = true - glog.SetV(4) - glog.SetToStderr(true) - if name != "Call50000_sha256" { - continue - } - */ + if skipTest[name] { + fmt.Println("Skipping state test", name) + return nil + } db, _ := ethdb.NewMemDatabase() statedb := state.New(common.Hash{}, db) for addr, account := range test.Pre { @@ -60,17 +60,17 @@ func RunStateTest(p string) error { ret, logs, _, _ = RunState(statedb, env, test.Transaction) - // Compare expected and actual return - switch name { - // the memory required for these tests (4294967297 bytes) would take too much time. - // on 19 May 2015 decided to skip these tests their output. - case "mload32bitBound_return", "mload32bitBound_return2": - default: - rexp := common.FromHex(test.Out) - if bytes.Compare(rexp, ret) != 0 { - return fmt.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) - } + // // Compare expected and actual return + // switch name { + // // the memory required for these tests (4294967297 bytes) would take too much time. + // // on 19 May 2015 decided to skip these tests their output. + // case "mload32bitBound_return", "mload32bitBound_return2": + // default: + rexp := common.FromHex(test.Out) + if bytes.Compare(rexp, ret) != 0 { + return fmt.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) } + // } // check post state for addr, account := range test.Post { -- cgit v1.2.3 From 6ff956394a26fe13c774797284220b8231ebf809 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 10 Jun 2015 18:11:30 -0400 Subject: DRY file loading --- tests/state_test_util.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index b507de47f..cd87ee75e 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -21,7 +21,7 @@ func RunStateTest(p string) error { } tests := make(map[string]VmTest) - CreateFileTests(p, &tests) + readTestFile(p, &tests) for name, test := range tests { if skipTest[name] { @@ -61,16 +61,10 @@ func RunStateTest(p string) error { ret, logs, _, _ = RunState(statedb, env, test.Transaction) // // Compare expected and actual return - // switch name { - // // the memory required for these tests (4294967297 bytes) would take too much time. - // // on 19 May 2015 decided to skip these tests their output. - // case "mload32bitBound_return", "mload32bitBound_return2": - // default: rexp := common.FromHex(test.Out) if bytes.Compare(rexp, ret) != 0 { return fmt.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) } - // } // check post state for addr, account := range test.Post { -- cgit v1.2.3 From c941a39b756783d95526a74374dd2aa4283474fa Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 11 Jun 2015 13:06:56 -0400 Subject: Cleanup logging --- tests/state_test_util.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index cd87ee75e..ad14168c7 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/logger/glog" ) func RunStateTest(p string) error { @@ -25,7 +26,7 @@ func RunStateTest(p string) error { for name, test := range tests { if skipTest[name] { - fmt.Println("Skipping state test", name) + glog.Infoln("Skipping state test", name) return nil } db, _ := ethdb.NewMemDatabase() @@ -105,7 +106,7 @@ func RunStateTest(p string) error { } } - fmt.Println("State test passed: ", name) + glog.Infoln("State test passed: ", name) //fmt.Println(string(statedb.Dump())) } return nil -- cgit v1.2.3 From 01ec4dbb1251751b8bbf62ddb3b3a02dc50d29fc Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Sun, 14 Jun 2015 17:55:03 -0400 Subject: Add stdin option --- tests/state_test_util.go | 166 ++++++++++++++++++++++++++++------------------- 1 file changed, 100 insertions(+), 66 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index ad14168c7..ad3aeea6c 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -3,6 +3,7 @@ package tests import ( "bytes" "fmt" + "io" "math/big" "strconv" @@ -15,100 +16,133 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" ) -func RunStateTest(p string) error { - skipTest := make(map[string]bool, len(stateSkipTests)) - for _, name := range stateSkipTests { - skipTest[name] = true +func RunStateTestWithReader(r io.Reader) error { + tests := make(map[string]VmTest) + if err := readJson(r, &tests); err != nil { + return err } + if err := runStateTests(tests); err != nil { + return err + } + + return nil +} + +func RunStateTest(p string) error { tests := make(map[string]VmTest) - readTestFile(p, &tests) + if err := readJsonFile(p, &tests); err != nil { + return err + } + + if err := runStateTests(tests); err != nil { + return err + } + + return nil + +} + +func runStateTests(tests map[string]VmTest) error { + skipTest := make(map[string]bool, len(StateSkipTests)) + for _, name := range StateSkipTests { + skipTest[name] = true + } for name, test := range tests { if skipTest[name] { glog.Infoln("Skipping state test", name) return nil } - db, _ := ethdb.NewMemDatabase() - statedb := state.New(common.Hash{}, db) - for addr, account := range test.Pre { - obj := StateObjectFromAccount(db, addr, account) - statedb.SetStateObject(obj) - for a, v := range account.Storage { - obj.SetState(common.HexToHash(a), common.HexToHash(s)) - } - } - // XXX Yeah, yeah... - env := make(map[string]string) - env["currentCoinbase"] = test.Env.CurrentCoinbase - env["currentDifficulty"] = test.Env.CurrentDifficulty - env["currentGasLimit"] = test.Env.CurrentGasLimit - env["currentNumber"] = test.Env.CurrentNumber - env["previousHash"] = test.Env.PreviousHash - if n, ok := test.Env.CurrentTimestamp.(float64); ok { - env["currentTimestamp"] = strconv.Itoa(int(n)) - } else { - env["currentTimestamp"] = test.Env.CurrentTimestamp.(string) + if err := runStateTest(test); err != nil { + return fmt.Errorf("%s: %s\n", name, err.Error()) } - var ( - ret []byte - // gas *big.Int - // err error - logs state.Logs - ) + glog.Infoln("State test passed: ", name) + //fmt.Println(string(statedb.Dump())) + } + return nil - ret, logs, _, _ = RunState(statedb, env, test.Transaction) +} - // // Compare expected and actual return - rexp := common.FromHex(test.Out) - if bytes.Compare(rexp, ret) != 0 { - return fmt.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) +func runStateTest(test VmTest) error { + db, _ := ethdb.NewMemDatabase() + statedb := state.New(common.Hash{}, db) + for addr, account := range test.Pre { + obj := StateObjectFromAccount(db, addr, account) + statedb.SetStateObject(obj) + for a, v := range account.Storage { + obj.SetState(common.HexToHash(a), common.HexToHash(v)) } + } - // check post state - for addr, account := range test.Post { - obj := statedb.GetStateObject(common.HexToAddress(addr)) - if obj == nil { - continue - } + // XXX Yeah, yeah... + env := make(map[string]string) + env["currentCoinbase"] = test.Env.CurrentCoinbase + env["currentDifficulty"] = test.Env.CurrentDifficulty + env["currentGasLimit"] = test.Env.CurrentGasLimit + env["currentNumber"] = test.Env.CurrentNumber + env["previousHash"] = test.Env.PreviousHash + if n, ok := test.Env.CurrentTimestamp.(float64); ok { + env["currentTimestamp"] = strconv.Itoa(int(n)) + } else { + env["currentTimestamp"] = test.Env.CurrentTimestamp.(string) + } - if obj.Balance().Cmp(common.Big(account.Balance)) != 0 { - return fmt.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) - } + var ( + ret []byte + // gas *big.Int + // err error + logs state.Logs + ) - if obj.Nonce() != common.String2Big(account.Nonce).Uint64() { - return fmt.Errorf("%s's : (%x) nonce failed. Expected %v, got %v\n", name, obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) - } + ret, logs, _, _ = RunState(statedb, env, test.Transaction) + + // // Compare expected and actual return + rexp := common.FromHex(test.Out) + if bytes.Compare(rexp, ret) != 0 { + return fmt.Errorf("return failed. Expected %x, got %x\n", rexp, ret) + } - for addr, value := range account.Storage { - v := obj.GetState(common.HexToHash(addr)).Bytes() - vexp := common.FromHex(value) + // check post state + for addr, account := range test.Post { + obj := statedb.GetStateObject(common.HexToAddress(addr)) + if obj == nil { + continue + } - if bytes.Compare(v, vexp) != 0 { - return fmt.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v)) - } - } + if obj.Balance().Cmp(common.Big(account.Balance)) != 0 { + return fmt.Errorf("(%x) balance failed. Expected %v, got %v => %v\n", obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) } - statedb.Sync() - //if !bytes.Equal(common.Hex2Bytes(test.PostStateRoot), statedb.Root()) { - if common.HexToHash(test.PostStateRoot) != statedb.Root() { - return fmt.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root()) + if obj.Nonce() != common.String2Big(account.Nonce).Uint64() { + return fmt.Errorf("(%x) nonce failed. Expected %v, got %v\n", obj.Address().Bytes()[:4], account.Nonce, obj.Nonce()) } - // check logs - if len(test.Logs) > 0 { - lerr := checkLogs(test.Logs, logs) - if lerr != nil { - return fmt.Errorf("'%s' ", name, lerr.Error()) + for addr, value := range account.Storage { + v := obj.GetState(common.HexToHash(addr)).Bytes() + vexp := common.FromHex(value) + + if bytes.Compare(v, vexp) != 0 { + return fmt.Errorf("(%x: %s) storage failed. Expected %x, got %x (%v %v)\n", obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v)) } } + } - glog.Infoln("State test passed: ", name) - //fmt.Println(string(statedb.Dump())) + statedb.Sync() + //if !bytes.Equal(common.Hex2Bytes(test.PostStateRoot), statedb.Root()) { + if common.HexToHash(test.PostStateRoot) != statedb.Root() { + return fmt.Errorf("Post state root error. Expected %s, got %x", test.PostStateRoot, statedb.Root()) } + + // check logs + if len(test.Logs) > 0 { + if err := checkLogs(test.Logs, logs); err != nil { + return err + } + } + return nil } -- cgit v1.2.3 From 8d3faf69d00420b80d4d737e618b2c7791c10ae9 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 18 Jun 2015 22:38:17 +0200 Subject: Build error fixes --- tests/state_test_util.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index ad3aeea6c..835ba44f4 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -121,17 +121,16 @@ func runStateTest(test VmTest) error { } for addr, value := range account.Storage { - v := obj.GetState(common.HexToHash(addr)).Bytes() - vexp := common.FromHex(value) + v := obj.GetState(common.HexToHash(addr)) + vexp := common.HexToHash(value) - if bytes.Compare(v, vexp) != 0 { - return fmt.Errorf("(%x: %s) storage failed. Expected %x, got %x (%v %v)\n", obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v)) + if v != vexp { + return fmt.Errorf("(%x: %s) storage failed. Expected %x, got %x (%v %v)\n", obj.Address().Bytes()[0:4], addr, vexp, v, vexp.Big(), v.Big()) } } } statedb.Sync() - //if !bytes.Equal(common.Hex2Bytes(test.PostStateRoot), statedb.Root()) { if common.HexToHash(test.PostStateRoot) != statedb.Root() { return fmt.Errorf("Post state root error. Expected %s, got %x", test.PostStateRoot, statedb.Root()) } -- cgit v1.2.3 From a9659e6dcf1f1584e155825d4422eb005ff38c21 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 18 Jun 2015 23:46:42 +0200 Subject: recover test logic --- tests/state_test_util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 835ba44f4..577935dfa 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -172,7 +172,7 @@ func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state. vmenv := NewEnvFromMap(statedb, env, tx) vmenv.origin = common.BytesToAddress(keyPair.Address()) ret, _, err := core.ApplyMessage(vmenv, message, coinbase) - if core.IsNonceErr(err) || core.IsInvalidTxErr(err) { + if core.IsNonceErr(err) || core.IsInvalidTxErr(err) || state.IsGasLimitErr(err) { statedb.Set(snapshot) } statedb.Update() -- cgit v1.2.3 From 0743243dce05c38c1f4949e44467d20a22a1f743 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Fri, 19 Jun 2015 11:38:23 +0200 Subject: Add --skip option to CLI Disassociates hardcoded tests to skip when running via CLI. Tests still skipped when running `go test` --- tests/state_test_util.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'tests/state_test_util.go') diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 577935dfa..e9abad788 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -16,26 +16,26 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" ) -func RunStateTestWithReader(r io.Reader) error { +func RunStateTestWithReader(r io.Reader, skipTests []string) error { tests := make(map[string]VmTest) if err := readJson(r, &tests); err != nil { return err } - if err := runStateTests(tests); err != nil { + if err := runStateTests(tests, skipTests); err != nil { return err } return nil } -func RunStateTest(p string) error { +func RunStateTest(p string, skipTests []string) error { tests := make(map[string]VmTest) if err := readJsonFile(p, &tests); err != nil { return err } - if err := runStateTests(tests); err != nil { + if err := runStateTests(tests, skipTests); err != nil { return err } @@ -43,9 +43,9 @@ func RunStateTest(p string) error { } -func runStateTests(tests map[string]VmTest) error { - skipTest := make(map[string]bool, len(StateSkipTests)) - for _, name := range StateSkipTests { +func runStateTests(tests map[string]VmTest, skipTests []string) error { + skipTest := make(map[string]bool, len(skipTests)) + for _, name := range skipTests { skipTest[name] = true } -- cgit v1.2.3