| 
									
										
										
										
											2014-10-18 13:33:02 +02:00
										 |  |  | package vm | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/eth-go/ethstate" | 
					
						
							|  |  |  | 	"github.com/ethereum/eth-go/ethutil" | 
					
						
							|  |  |  | 	"github.com/ethereum/eth-go/tests/helper" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Account struct { | 
					
						
							|  |  |  | 	Balance string | 
					
						
							|  |  |  | 	Code    string | 
					
						
							|  |  |  | 	Nonce   string | 
					
						
							|  |  |  | 	Storage map[string]string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func StateObjectFromAccount(addr string, account Account) *ethstate.StateObject { | 
					
						
							|  |  |  | 	obj := ethstate.NewStateObject(ethutil.Hex2Bytes(addr)) | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	obj.SetBalance(ethutil.Big(account.Balance)) | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if ethutil.IsHex(account.Code) { | 
					
						
							|  |  |  | 		account.Code = account.Code[2:] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	obj.Code = ethutil.Hex2Bytes(account.Code) | 
					
						
							|  |  |  | 	obj.Nonce = ethutil.Big(account.Nonce).Uint64() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type VmTest struct { | 
					
						
							|  |  |  | 	Callcreates interface{} | 
					
						
							|  |  |  | 	Env         map[string]string | 
					
						
							|  |  |  | 	Exec        map[string]string | 
					
						
							|  |  |  | 	Gas         string | 
					
						
							|  |  |  | 	Out         string | 
					
						
							|  |  |  | 	Post        map[string]Account | 
					
						
							|  |  |  | 	Pre         map[string]Account | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | func RunVmTest(p string, t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 	tests := make(map[string]VmTest) | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	helper.CreateFileTests(t, p, &tests) | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for name, test := range tests { | 
					
						
							|  |  |  | 		state := ethstate.New(helper.NewTrie()) | 
					
						
							|  |  |  | 		for addr, account := range test.Pre { | 
					
						
							|  |  |  | 			obj := StateObjectFromAccount(addr, account) | 
					
						
							|  |  |  | 			state.SetStateObject(obj) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 		ret, gas, err := helper.RunVm(state, test.Env, test.Exec) | 
					
						
							| 
									
										
										
										
											2014-10-16 13:40:46 +02:00
										 |  |  | 		// When an error is returned it doesn't always mean the tests fails. | 
					
						
							|  |  |  | 		// Have to come up with some conditional failing mechanism. | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | 			helper.Log.Infoln(err) | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		rexp := helper.FromHex(test.Out) | 
					
						
							|  |  |  | 		if bytes.Compare(rexp, ret) != 0 { | 
					
						
							|  |  |  | 			t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		gexp := ethutil.Big(test.Gas) | 
					
						
							|  |  |  | 		if gexp.Cmp(gas) != 0 { | 
					
						
							|  |  |  | 			t.Errorf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for addr, account := range test.Post { | 
					
						
							|  |  |  | 			obj := state.GetStateObject(helper.FromHex(addr)) | 
					
						
							|  |  |  | 			for addr, value := range account.Storage { | 
					
						
							| 
									
										
										
										
											2014-10-16 13:40:46 +02:00
										 |  |  | 				v := obj.GetState(helper.FromHex(addr)).Bytes() | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 				vexp := helper.FromHex(value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if bytes.Compare(v, vexp) != 0 { | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | 					t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address()[0:4], addr, vexp, v, ethutil.BigD(vexp), ethutil.BigD(v)) | 
					
						
							| 
									
										
										
										
											2014-10-15 00:41:00 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // I've created a new function for each tests so it's easier to identify where the problem lies if any of them fail. | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | func TestVMArithmetic(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:20:25 +02:00
										 |  |  | 	//helper.Logger.SetLogLevel(5) | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmArithmeticTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | func TestVMSystemOperation(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmSystemOperationsTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestBitwiseLogicOperation(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmBitwiseLogicOperationTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestBlockInfo(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmBlockInfoTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestEnvironmentalInfo(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmEnvironmentalInfoTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-16 13:40:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | func TestFlowOperation(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmIOandFlowOperationsTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-16 13:40:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | func TestPushDupSwap(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmPushDupSwapTest.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestVMSha3(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmSha3Test.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 13:40:46 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-16 18:27:05 +02:00
										 |  |  | func TestVm(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2014-10-18 23:31:10 +02:00
										 |  |  | 	const fn = "../files/vmtests/vmtests.json" | 
					
						
							| 
									
										
										
										
											2014-10-18 23:28:16 +02:00
										 |  |  | 	RunVmTest(fn, t) | 
					
						
							| 
									
										
										
										
											2014-10-16 13:40:46 +02:00
										 |  |  | } |