github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/tests/state_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 // 10 // 11 // 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 25 package tests 26 27 import ( 28 "bytes" 29 "fmt" 30 "reflect" 31 "testing" 32 33 "github.com/ethereum/go-ethereum/core/vm" 34 ) 35 36 func TestState(t *testing.T) { 37 t.Parallel() 38 39 st := new(testMatcher) 40 // 41 st.skipShortMode(`^stQuadraticComplexityTest/`) 42 // 43 st.skipLoad(`^stTransactionTest/OverflowGasRequire\.json`) // 44 st.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\.json`) // 45 // 46 st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") 47 st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") 48 49 st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { 50 for _, subtest := range test.Subtests() { 51 subtest := subtest 52 key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) 53 name := name + "/" + key 54 t.Run(key, func(t *testing.T) { 55 if subtest.Fork == "Constantinople" { 56 t.Skip("constantinople not supported yet") 57 } 58 withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { 59 _, err := test.Run(subtest, vmconfig) 60 return st.checkFailure(t, name, err) 61 }) 62 }) 63 } 64 }) 65 } 66 67 // 68 const traceErrorLimit = 400000 69 70 func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { 71 err := test(vm.Config{}) 72 if err == nil { 73 return 74 } 75 t.Error(err) 76 if gasLimit > traceErrorLimit { 77 t.Log("gas limit too high for EVM trace") 78 return 79 } 80 tracer := vm.NewStructLogger(nil) 81 err2 := test(vm.Config{Debug: true, Tracer: tracer}) 82 if !reflect.DeepEqual(err, err2) { 83 t.Errorf("different error for second run: %v", err2) 84 } 85 buf := new(bytes.Buffer) 86 vm.WriteTrace(buf, tracer.StructLogs()) 87 if buf.Len() == 0 { 88 t.Log("no EVM operation logs generated") 89 } else { 90 t.Log("EVM operation log:\n" + buf.String()) 91 } 92 t.Logf("EVM output: 0x%x", tracer.Output()) 93 t.Logf("EVM error: %v", tracer.Error()) 94 }