From 83ef018f66e49b8b8346dd672dc783a449487afb Mon Sep 17 00:00:00 2001 From: Ivan Danyliuk Date: Tue, 12 Dec 2017 11:20:43 +0100 Subject: [PATCH] Remove tests --- tests/block_test.go | 44 ----- tests/block_test_util.go | 296 --------------------------------- tests/difficulty_test.go | 87 ---------- tests/difficulty_test_util.go | 70 -------- tests/gen_btheader.go | 128 -------------- tests/gen_difficultytest.go | 66 -------- tests/gen_stenv.go | 66 -------- tests/gen_sttransaction.go | 80 --------- tests/gen_tttransaction.go | 95 ----------- tests/gen_vmexec.go | 88 ---------- tests/init.go | 88 ---------- tests/init_test.go | 264 ----------------------------- tests/rlp_test.go | 31 ---- tests/rlp_test_util.go | 159 ------------------ tests/state_test.go | 96 ----------- tests/state_test_util.go | 245 --------------------------- tests/testdata | 1 - tests/transaction_test.go | 54 ------ tests/transaction_test_util.go | 133 --------------- tests/vm_test.go | 40 ----- tests/vm_test_util.go | 152 ----------------- 21 files changed, 2283 deletions(-) delete mode 100644 tests/block_test.go delete mode 100644 tests/block_test_util.go delete mode 100644 tests/difficulty_test.go delete mode 100644 tests/difficulty_test_util.go delete mode 100644 tests/gen_btheader.go delete mode 100644 tests/gen_difficultytest.go delete mode 100644 tests/gen_stenv.go delete mode 100644 tests/gen_sttransaction.go delete mode 100644 tests/gen_tttransaction.go delete mode 100644 tests/gen_vmexec.go delete mode 100644 tests/init.go delete mode 100644 tests/init_test.go delete mode 100644 tests/rlp_test.go delete mode 100644 tests/rlp_test_util.go delete mode 100644 tests/state_test.go delete mode 100644 tests/state_test_util.go delete mode 160000 tests/testdata delete mode 100644 tests/transaction_test.go delete mode 100644 tests/transaction_test_util.go delete mode 100644 tests/vm_test.go delete mode 100644 tests/vm_test_util.go diff --git a/tests/block_test.go b/tests/block_test.go deleted file mode 100644 index 669d3ca08a..0000000000 --- a/tests/block_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "testing" -) - -func TestBlockchain(t *testing.T) { - t.Parallel() - - bt := new(testMatcher) - // General state tests are 'exported' as blockchain tests, but we can run them natively. - bt.skipLoad(`^GeneralStateTests/`) - // Skip random failures due to selfish mining test. - bt.skipLoad(`^bcForgedTest/bcForkUncle\.json`) - bt.skipLoad(`^bcMultiChainTest/(ChainAtoChainB_blockorder|CallContractFromNotBestBlock)`) - bt.skipLoad(`^bcTotalDifficultyTest/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)`) - // Constantinople is not implemented yet. - bt.skipLoad(`(?i)(constantinople)`) - - // Still failing tests - bt.skipLoad(`^bcWalletTest.*_Byzantium$`) - - bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { - if err := bt.checkFailure(t, name, test.Run()); err != nil { - t.Error(err) - } - }) -} diff --git a/tests/block_test_util.go b/tests/block_test_util.go deleted file mode 100644 index a789e6d887..0000000000 --- a/tests/block_test_util.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2015 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 . - -// Package tests implements execution of Ethereum JSON tests. -package tests - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/consensus/ethash" - "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/ethdb" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" -) - -// A BlockTest checks handling of entire blocks. -type BlockTest struct { - json btJSON -} - -func (t *BlockTest) UnmarshalJSON(in []byte) error { - return json.Unmarshal(in, &t.json) -} - -type btJSON struct { - Blocks []btBlock `json:"blocks"` - Genesis btHeader `json:"genesisBlockHeader"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"postState"` - BestBlock common.UnprefixedHash `json:"lastblockhash"` - Network string `json:"network"` -} - -type btBlock struct { - BlockHeader *btHeader - Rlp string - UncleHeaders []*btHeader -} - -//go:generate gencodec -type btHeader -field-override btHeaderMarshaling -out gen_btheader.go - -type btHeader struct { - Bloom types.Bloom - Coinbase common.Address - MixHash common.Hash - Nonce types.BlockNonce - Number *big.Int - Hash common.Hash - ParentHash common.Hash - ReceiptTrie common.Hash - StateRoot common.Hash - TransactionsTrie common.Hash - UncleHash common.Hash - ExtraData []byte - Difficulty *big.Int - GasLimit *big.Int - GasUsed *big.Int - Timestamp *big.Int -} - -type btHeaderMarshaling struct { - ExtraData hexutil.Bytes - Number *math.HexOrDecimal256 - Difficulty *math.HexOrDecimal256 - GasLimit *math.HexOrDecimal256 - GasUsed *math.HexOrDecimal256 - Timestamp *math.HexOrDecimal256 -} - -func (t *BlockTest) Run() error { - config, ok := Forks[t.json.Network] - if !ok { - return UnsupportedForkError{t.json.Network} - } - - // import pre accounts & construct test genesis block & state root - db, _ := ethdb.NewMemDatabase() - gblock, err := t.genesis(config).Commit(db) - if err != nil { - return err - } - if gblock.Hash() != t.json.Genesis.Hash { - return fmt.Errorf("genesis block hash doesn't match test: computed=%x, test=%x\n", gblock.Hash().Bytes()[:6], t.json.Genesis.Hash[:6]) - } - if gblock.Root() != t.json.Genesis.StateRoot { - return fmt.Errorf("genesis block state root does not match test: computed=%x, test=%x", gblock.Root().Bytes()[:6], t.json.Genesis.StateRoot[:6]) - } - - chain, err := core.NewBlockChain(db, config, ethash.NewShared(), vm.Config{}) - if err != nil { - return err - } - defer chain.Stop() - - validBlocks, err := t.insertBlocks(chain) - if err != nil { - return err - } - cmlast := chain.LastBlockHash() - if common.Hash(t.json.BestBlock) != cmlast { - return fmt.Errorf("last block hash validation mismatch: want: %x, have: %x", t.json.BestBlock, cmlast) - } - newDB, err := chain.State() - if err != nil { - return err - } - if err = t.validatePostState(newDB); err != nil { - return fmt.Errorf("post state validation failed: %v", err) - } - return t.validateImportedHeaders(chain, validBlocks) -} - -func (t *BlockTest) genesis(config *params.ChainConfig) *core.Genesis { - return &core.Genesis{ - Config: config, - Nonce: t.json.Genesis.Nonce.Uint64(), - Timestamp: t.json.Genesis.Timestamp.Uint64(), - ParentHash: t.json.Genesis.ParentHash, - ExtraData: t.json.Genesis.ExtraData, - GasLimit: t.json.Genesis.GasLimit.Uint64(), - GasUsed: t.json.Genesis.GasUsed.Uint64(), - Difficulty: t.json.Genesis.Difficulty, - Mixhash: t.json.Genesis.MixHash, - Coinbase: t.json.Genesis.Coinbase, - Alloc: t.json.Pre, - } -} - -/* See https://github.com/ethereum/tests/wiki/Blockchain-Tests-II - - Whether a block is valid or not is a bit subtle, it's defined by presence of - blockHeader, transactions and uncleHeaders fields. If they are missing, the block is - invalid and we must verify that we do not accept it. - - Since some tests mix valid and invalid blocks we need to check this for every block. - - If a block is invalid it does not necessarily fail the test, if it's invalidness is - expected we are expected to ignore it and continue processing and then validate the - post state. -*/ -func (t *BlockTest) insertBlocks(blockchain *core.BlockChain) ([]btBlock, error) { - validBlocks := make([]btBlock, 0) - // insert the test blocks, which will execute all transactions - for _, b := range t.json.Blocks { - cb, err := b.decode() - if err != nil { - if b.BlockHeader == nil { - continue // OK - block is supposed to be invalid, continue with next block - } else { - return nil, fmt.Errorf("Block RLP decoding failed when expected to succeed: %v", err) - } - } - // RLP decoding worked, try to insert into chain: - blocks := types.Blocks{cb} - i, err := blockchain.InsertChain(blocks) - if err != nil { - if b.BlockHeader == nil { - continue // OK - block is supposed to be invalid, continue with next block - } else { - return nil, fmt.Errorf("Block #%v insertion into chain failed: %v", blocks[i].Number(), err) - } - } - if b.BlockHeader == nil { - return nil, fmt.Errorf("Block insertion should have failed") - } - - // validate RLP decoding by checking all values against test file JSON - if err = validateHeader(b.BlockHeader, cb.Header()); err != nil { - return nil, fmt.Errorf("Deserialised block header validation failed: %v", err) - } - validBlocks = append(validBlocks, b) - } - return validBlocks, nil -} - -func validateHeader(h *btHeader, h2 *types.Header) error { - if h.Bloom != h2.Bloom { - return fmt.Errorf("Bloom: want: %x have: %x", h.Bloom, h2.Bloom) - } - if h.Coinbase != h2.Coinbase { - return fmt.Errorf("Coinbase: want: %x have: %x", h.Coinbase, h2.Coinbase) - } - if h.MixHash != h2.MixDigest { - return fmt.Errorf("MixHash: want: %x have: %x", h.MixHash, h2.MixDigest) - } - if h.Nonce != h2.Nonce { - return fmt.Errorf("Nonce: want: %x have: %x", h.Nonce, h2.Nonce) - } - if h.Number.Cmp(h2.Number) != 0 { - return fmt.Errorf("Number: want: %v have: %v", h.Number, h2.Number) - } - if h.ParentHash != h2.ParentHash { - return fmt.Errorf("Parent hash: want: %x have: %x", h.ParentHash, h2.ParentHash) - } - if h.ReceiptTrie != h2.ReceiptHash { - return fmt.Errorf("Receipt hash: want: %x have: %x", h.ReceiptTrie, h2.ReceiptHash) - } - if h.TransactionsTrie != h2.TxHash { - return fmt.Errorf("Tx hash: want: %x have: %x", h.TransactionsTrie, h2.TxHash) - } - if h.StateRoot != h2.Root { - return fmt.Errorf("State hash: want: %x have: %x", h.StateRoot, h2.Root) - } - if h.UncleHash != h2.UncleHash { - return fmt.Errorf("Uncle hash: want: %x have: %x", h.UncleHash, h2.UncleHash) - } - if !bytes.Equal(h.ExtraData, h2.Extra) { - return fmt.Errorf("Extra data: want: %x have: %x", h.ExtraData, h2.Extra) - } - if h.Difficulty.Cmp(h2.Difficulty) != 0 { - return fmt.Errorf("Difficulty: want: %v have: %v", h.Difficulty, h2.Difficulty) - } - if h.GasLimit.Cmp(h2.GasLimit) != 0 { - return fmt.Errorf("GasLimit: want: %v have: %v", h.GasLimit, h2.GasLimit) - } - if h.GasUsed.Cmp(h2.GasUsed) != 0 { - return fmt.Errorf("GasUsed: want: %v have: %v", h.GasUsed, h2.GasUsed) - } - if h.Timestamp.Cmp(h2.Time) != 0 { - return fmt.Errorf("Timestamp: want: %v have: %v", h.Timestamp, h2.Time) - } - return nil -} - -func (t *BlockTest) validatePostState(statedb *state.StateDB) error { - // validate post state accounts in test file against what we have in state db - for addr, acct := range t.json.Post { - // address is indirectly verified by the other fields, as it's the db key - code2 := statedb.GetCode(addr) - balance2 := statedb.GetBalance(addr) - nonce2 := statedb.GetNonce(addr) - if !bytes.Equal(code2, acct.Code) { - return fmt.Errorf("account code mismatch for addr: %s want: %v have: %s", addr, acct.Code, hex.EncodeToString(code2)) - } - if balance2.Cmp(acct.Balance) != 0 { - return fmt.Errorf("account balance mismatch for addr: %s, want: %d, have: %d", addr, acct.Balance, balance2) - } - if nonce2 != acct.Nonce { - return fmt.Errorf("account nonce mismatch for addr: %s want: %d have: %d", addr, acct.Nonce, nonce2) - } - } - return nil -} - -func (t *BlockTest) validateImportedHeaders(cm *core.BlockChain, validBlocks []btBlock) error { - // to get constant lookup when verifying block headers by hash (some tests have many blocks) - bmap := make(map[common.Hash]btBlock, len(t.json.Blocks)) - for _, b := range validBlocks { - bmap[b.BlockHeader.Hash] = b - } - // iterate over blocks backwards from HEAD and validate imported - // headers vs test file. some tests have reorgs, and we import - // block-by-block, so we can only validate imported headers after - // all blocks have been processed by BlockChain, as they may not - // be part of the longest chain until last block is imported. - for b := cm.CurrentBlock(); b != nil && b.NumberU64() != 0; b = cm.GetBlockByHash(b.Header().ParentHash) { - if err := validateHeader(bmap[b.Hash()].BlockHeader, b.Header()); err != nil { - return fmt.Errorf("Imported block header validation failed: %v", err) - } - } - return nil -} - -func (bb *btBlock) decode() (*types.Block, error) { - data, err := hexutil.Decode(bb.Rlp) - if err != nil { - return nil, err - } - var b types.Block - err = rlp.DecodeBytes(data, &b) - return &b, err -} diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go deleted file mode 100644 index a449b1cfa6..0000000000 --- a/tests/difficulty_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2017 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 . -// - -package tests - -import ( - "testing" - - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/params" -) - -var ( - mainnetChainConfig = params.ChainConfig{ - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(1150000), - DAOForkBlock: big.NewInt(1920000), - DAOForkSupport: true, - EIP150Block: big.NewInt(2463000), - EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), - EIP155Block: big.NewInt(2675000), - EIP158Block: big.NewInt(2675000), - ByzantiumBlock: big.NewInt(4370000), - } -) - -func TestDifficulty(t *testing.T) { - t.Parallel() - - dt := new(testMatcher) - // Not difficulty-tests - dt.skipLoad("hexencodetest.*") - dt.skipLoad("crypto.*") - dt.skipLoad("blockgenesistest\\.json") - dt.skipLoad("genesishashestest\\.json") - dt.skipLoad("keyaddrtest\\.json") - dt.skipLoad("txtest\\.json") - - // files are 2 years old, contains strange values - dt.skipLoad("difficultyCustomHomestead\\.json") - dt.skipLoad("difficultyMorden\\.json") - dt.skipLoad("difficultyOlimpic\\.json") - - dt.config("Ropsten", *params.TestnetChainConfig) - dt.config("Morden", *params.TestnetChainConfig) - dt.config("Frontier", params.ChainConfig{}) - - dt.config("Homestead", params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - }) - - dt.config("Byzantium", params.ChainConfig{ - ByzantiumBlock: big.NewInt(0), - }) - - dt.config("Frontier", *params.TestnetChainConfig) - dt.config("MainNetwork", mainnetChainConfig) - dt.config("CustomMainNetwork", mainnetChainConfig) - dt.config("difficulty.json", mainnetChainConfig) - - dt.walk(t, difficultyTestDir, func(t *testing.T, name string, test *DifficultyTest) { - cfg := dt.findConfig(name) - if test.ParentDifficulty.Cmp(params.MinimumDifficulty) < 0 { - t.Skip("difficulty below minimum") - return - } - if err := dt.checkFailure(t, name, test.Run(cfg)); err != nil { - t.Error(err) - } - }) -} diff --git a/tests/difficulty_test_util.go b/tests/difficulty_test_util.go deleted file mode 100644 index 7541477933..0000000000 --- a/tests/difficulty_test_util.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2017 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 . -// - -package tests - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/consensus/ethash" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/params" -) - -//go:generate gencodec -type DifficultyTest -field-override difficultyTestMarshaling -out gen_difficultytest.go - -type DifficultyTest struct { - ParentTimestamp *big.Int `json:"parentTimestamp"` - ParentDifficulty *big.Int `json:"parentDifficulty"` - UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp *big.Int `json:"currentTimestamp"` - CurrentBlockNumber uint64 `json:"currentBlockNumber"` - CurrentDifficulty *big.Int `json:"currentDifficulty"` -} - -type difficultyTestMarshaling struct { - ParentTimestamp *math.HexOrDecimal256 - ParentDifficulty *math.HexOrDecimal256 - CurrentTimestamp *math.HexOrDecimal256 - CurrentDifficulty *math.HexOrDecimal256 - UncleHash common.Hash - CurrentBlockNumber math.HexOrDecimal64 -} - -func (test *DifficultyTest) Run(config *params.ChainConfig) error { - parentNumber := big.NewInt(int64(test.CurrentBlockNumber - 1)) - parent := &types.Header{ - Difficulty: test.ParentDifficulty, - Time: test.ParentTimestamp, - Number: parentNumber, - UncleHash: test.UncleHash, - } - - actual := ethash.CalcDifficulty(config, test.CurrentTimestamp.Uint64(), parent) - exp := test.CurrentDifficulty - - if actual.Cmp(exp) != 0 { - return fmt.Errorf("parent[time %v diff %v unclehash:%x] child[time %v number %v] diff %v != expected %v", - test.ParentTimestamp, test.ParentDifficulty, test.UncleHash, - test.CurrentTimestamp, test.CurrentBlockNumber, actual, exp) - } - return nil - -} diff --git a/tests/gen_btheader.go b/tests/gen_btheader.go deleted file mode 100644 index 5d65e0dbce..0000000000 --- a/tests/gen_btheader.go +++ /dev/null @@ -1,128 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/types" -) - -var _ = (*btHeaderMarshaling)(nil) - -func (b btHeader) MarshalJSON() ([]byte, error) { - type btHeader struct { - Bloom types.Bloom - Coinbase common.Address - MixHash common.Hash - Nonce types.BlockNonce - Number *math.HexOrDecimal256 - Hash common.Hash - ParentHash common.Hash - ReceiptTrie common.Hash - StateRoot common.Hash - TransactionsTrie common.Hash - UncleHash common.Hash - ExtraData hexutil.Bytes - Difficulty *math.HexOrDecimal256 - GasLimit *math.HexOrDecimal256 - GasUsed *math.HexOrDecimal256 - Timestamp *math.HexOrDecimal256 - } - var enc btHeader - enc.Bloom = b.Bloom - enc.Coinbase = b.Coinbase - enc.MixHash = b.MixHash - enc.Nonce = b.Nonce - enc.Number = (*math.HexOrDecimal256)(b.Number) - enc.Hash = b.Hash - enc.ParentHash = b.ParentHash - enc.ReceiptTrie = b.ReceiptTrie - enc.StateRoot = b.StateRoot - enc.TransactionsTrie = b.TransactionsTrie - enc.UncleHash = b.UncleHash - enc.ExtraData = b.ExtraData - enc.Difficulty = (*math.HexOrDecimal256)(b.Difficulty) - enc.GasLimit = (*math.HexOrDecimal256)(b.GasLimit) - enc.GasUsed = (*math.HexOrDecimal256)(b.GasUsed) - enc.Timestamp = (*math.HexOrDecimal256)(b.Timestamp) - return json.Marshal(&enc) -} - -func (b *btHeader) UnmarshalJSON(input []byte) error { - type btHeader struct { - Bloom *types.Bloom - Coinbase *common.Address - MixHash *common.Hash - Nonce *types.BlockNonce - Number *math.HexOrDecimal256 - Hash *common.Hash - ParentHash *common.Hash - ReceiptTrie *common.Hash - StateRoot *common.Hash - TransactionsTrie *common.Hash - UncleHash *common.Hash - ExtraData hexutil.Bytes - Difficulty *math.HexOrDecimal256 - GasLimit *math.HexOrDecimal256 - GasUsed *math.HexOrDecimal256 - Timestamp *math.HexOrDecimal256 - } - var dec btHeader - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Bloom != nil { - b.Bloom = *dec.Bloom - } - if dec.Coinbase != nil { - b.Coinbase = *dec.Coinbase - } - if dec.MixHash != nil { - b.MixHash = *dec.MixHash - } - if dec.Nonce != nil { - b.Nonce = *dec.Nonce - } - if dec.Number != nil { - b.Number = (*big.Int)(dec.Number) - } - if dec.Hash != nil { - b.Hash = *dec.Hash - } - if dec.ParentHash != nil { - b.ParentHash = *dec.ParentHash - } - if dec.ReceiptTrie != nil { - b.ReceiptTrie = *dec.ReceiptTrie - } - if dec.StateRoot != nil { - b.StateRoot = *dec.StateRoot - } - if dec.TransactionsTrie != nil { - b.TransactionsTrie = *dec.TransactionsTrie - } - if dec.UncleHash != nil { - b.UncleHash = *dec.UncleHash - } - if dec.ExtraData != nil { - b.ExtraData = dec.ExtraData - } - if dec.Difficulty != nil { - b.Difficulty = (*big.Int)(dec.Difficulty) - } - if dec.GasLimit != nil { - b.GasLimit = (*big.Int)(dec.GasLimit) - } - if dec.GasUsed != nil { - b.GasUsed = (*big.Int)(dec.GasUsed) - } - if dec.Timestamp != nil { - b.Timestamp = (*big.Int)(dec.Timestamp) - } - return nil -} diff --git a/tests/gen_difficultytest.go b/tests/gen_difficultytest.go deleted file mode 100644 index 88f36ce999..0000000000 --- a/tests/gen_difficultytest.go +++ /dev/null @@ -1,66 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*difficultyTestMarshaling)(nil) - -func (d DifficultyTest) MarshalJSON() ([]byte, error) { - type DifficultyTest struct { - ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` - ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` - UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` - CurrentBlockNumber math.HexOrDecimal64 `json:"currentBlockNumber"` - CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` - } - var enc DifficultyTest - enc.ParentTimestamp = (*math.HexOrDecimal256)(d.ParentTimestamp) - enc.ParentDifficulty = (*math.HexOrDecimal256)(d.ParentDifficulty) - enc.UncleHash = d.UncleHash - enc.CurrentTimestamp = (*math.HexOrDecimal256)(d.CurrentTimestamp) - enc.CurrentBlockNumber = math.HexOrDecimal64(d.CurrentBlockNumber) - enc.CurrentDifficulty = (*math.HexOrDecimal256)(d.CurrentDifficulty) - return json.Marshal(&enc) -} - -func (d *DifficultyTest) UnmarshalJSON(input []byte) error { - type DifficultyTest struct { - ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` - ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` - UncleHash *common.Hash `json:"parentUncles"` - CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` - CurrentBlockNumber *math.HexOrDecimal64 `json:"currentBlockNumber"` - CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` - } - var dec DifficultyTest - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.ParentTimestamp != nil { - d.ParentTimestamp = (*big.Int)(dec.ParentTimestamp) - } - if dec.ParentDifficulty != nil { - d.ParentDifficulty = (*big.Int)(dec.ParentDifficulty) - } - if dec.UncleHash != nil { - d.UncleHash = *dec.UncleHash - } - if dec.CurrentTimestamp != nil { - d.CurrentTimestamp = (*big.Int)(dec.CurrentTimestamp) - } - if dec.CurrentBlockNumber != nil { - d.CurrentBlockNumber = uint64(*dec.CurrentBlockNumber) - } - if dec.CurrentDifficulty != nil { - d.CurrentDifficulty = (*big.Int)(dec.CurrentDifficulty) - } - return nil -} diff --git a/tests/gen_stenv.go b/tests/gen_stenv.go deleted file mode 100644 index c780524bc3..0000000000 --- a/tests/gen_stenv.go +++ /dev/null @@ -1,66 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "errors" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*stEnvMarshaling)(nil) - -func (s stEnv) MarshalJSON() ([]byte, error) { - type stEnv struct { - Coinbase common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"` - Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"` - GasLimit *math.HexOrDecimal256 `json:"currentGasLimit" gencodec:"required"` - Number math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"` - Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"` - } - var enc stEnv - enc.Coinbase = common.UnprefixedAddress(s.Coinbase) - enc.Difficulty = (*math.HexOrDecimal256)(s.Difficulty) - enc.GasLimit = (*math.HexOrDecimal256)(s.GasLimit) - enc.Number = math.HexOrDecimal64(s.Number) - enc.Timestamp = math.HexOrDecimal64(s.Timestamp) - return json.Marshal(&enc) -} - -func (s *stEnv) UnmarshalJSON(input []byte) error { - type stEnv struct { - Coinbase *common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"` - Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"` - GasLimit *math.HexOrDecimal256 `json:"currentGasLimit" gencodec:"required"` - Number *math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"` - Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"` - } - var dec stEnv - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Coinbase == nil { - return errors.New("missing required field 'currentCoinbase' for stEnv") - } - s.Coinbase = common.Address(*dec.Coinbase) - if dec.Difficulty == nil { - return errors.New("missing required field 'currentDifficulty' for stEnv") - } - s.Difficulty = (*big.Int)(dec.Difficulty) - if dec.GasLimit == nil { - return errors.New("missing required field 'currentGasLimit' for stEnv") - } - s.GasLimit = (*big.Int)(dec.GasLimit) - if dec.Number == nil { - return errors.New("missing required field 'currentNumber' for stEnv") - } - s.Number = uint64(*dec.Number) - if dec.Timestamp == nil { - return errors.New("missing required field 'currentTimestamp' for stEnv") - } - s.Timestamp = uint64(*dec.Timestamp) - return nil -} diff --git a/tests/gen_sttransaction.go b/tests/gen_sttransaction.go deleted file mode 100644 index 5a489d00b8..0000000000 --- a/tests/gen_sttransaction.go +++ /dev/null @@ -1,80 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*stTransactionMarshaling)(nil) - -func (s stTransaction) MarshalJSON() ([]byte, error) { - type stTransaction struct { - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - Nonce math.HexOrDecimal64 `json:"nonce"` - To string `json:"to"` - Data []string `json:"data"` - GasLimit []math.HexOrDecimal64 `json:"gasLimit"` - Value []string `json:"value"` - PrivateKey hexutil.Bytes `json:"secretKey"` - } - var enc stTransaction - enc.GasPrice = (*math.HexOrDecimal256)(s.GasPrice) - enc.Nonce = math.HexOrDecimal64(s.Nonce) - enc.To = s.To - enc.Data = s.Data - if s.GasLimit != nil { - enc.GasLimit = make([]math.HexOrDecimal64, len(s.GasLimit)) - for k, v := range s.GasLimit { - enc.GasLimit[k] = math.HexOrDecimal64(v) - } - } - enc.Value = s.Value - enc.PrivateKey = s.PrivateKey - return json.Marshal(&enc) -} - -func (s *stTransaction) UnmarshalJSON(input []byte) error { - type stTransaction struct { - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - Nonce *math.HexOrDecimal64 `json:"nonce"` - To *string `json:"to"` - Data []string `json:"data"` - GasLimit []math.HexOrDecimal64 `json:"gasLimit"` - Value []string `json:"value"` - PrivateKey hexutil.Bytes `json:"secretKey"` - } - var dec stTransaction - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.GasPrice != nil { - s.GasPrice = (*big.Int)(dec.GasPrice) - } - if dec.Nonce != nil { - s.Nonce = uint64(*dec.Nonce) - } - if dec.To != nil { - s.To = *dec.To - } - if dec.Data != nil { - s.Data = dec.Data - } - if dec.GasLimit != nil { - s.GasLimit = make([]uint64, len(dec.GasLimit)) - for k, v := range dec.GasLimit { - s.GasLimit[k] = uint64(v) - } - } - if dec.Value != nil { - s.Value = dec.Value - } - if dec.PrivateKey != nil { - s.PrivateKey = dec.PrivateKey - } - return nil -} diff --git a/tests/gen_tttransaction.go b/tests/gen_tttransaction.go deleted file mode 100644 index b6759be912..0000000000 --- a/tests/gen_tttransaction.go +++ /dev/null @@ -1,95 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "errors" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*ttTransactionMarshaling)(nil) - -func (t ttTransaction) MarshalJSON() ([]byte, error) { - type ttTransaction struct { - Data hexutil.Bytes `gencodec:"required"` - GasLimit *math.HexOrDecimal256 `gencodec:"required"` - GasPrice *math.HexOrDecimal256 `gencodec:"required"` - Nonce math.HexOrDecimal64 `gencodec:"required"` - Value *math.HexOrDecimal256 `gencodec:"required"` - R *math.HexOrDecimal256 `gencodec:"required"` - S *math.HexOrDecimal256 `gencodec:"required"` - V *math.HexOrDecimal256 `gencodec:"required"` - To common.Address `gencodec:"required"` - } - var enc ttTransaction - enc.Data = t.Data - enc.GasLimit = (*math.HexOrDecimal256)(t.GasLimit) - enc.GasPrice = (*math.HexOrDecimal256)(t.GasPrice) - enc.Nonce = math.HexOrDecimal64(t.Nonce) - enc.Value = (*math.HexOrDecimal256)(t.Value) - enc.R = (*math.HexOrDecimal256)(t.R) - enc.S = (*math.HexOrDecimal256)(t.S) - enc.V = (*math.HexOrDecimal256)(t.V) - enc.To = t.To - return json.Marshal(&enc) -} - -func (t *ttTransaction) UnmarshalJSON(input []byte) error { - type ttTransaction struct { - Data hexutil.Bytes `gencodec:"required"` - GasLimit *math.HexOrDecimal256 `gencodec:"required"` - GasPrice *math.HexOrDecimal256 `gencodec:"required"` - Nonce *math.HexOrDecimal64 `gencodec:"required"` - Value *math.HexOrDecimal256 `gencodec:"required"` - R *math.HexOrDecimal256 `gencodec:"required"` - S *math.HexOrDecimal256 `gencodec:"required"` - V *math.HexOrDecimal256 `gencodec:"required"` - To *common.Address `gencodec:"required"` - } - var dec ttTransaction - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Data == nil { - return errors.New("missing required field 'data' for ttTransaction") - } - t.Data = dec.Data - if dec.GasLimit == nil { - return errors.New("missing required field 'gasLimit' for ttTransaction") - } - t.GasLimit = (*big.Int)(dec.GasLimit) - if dec.GasPrice == nil { - return errors.New("missing required field 'gasPrice' for ttTransaction") - } - t.GasPrice = (*big.Int)(dec.GasPrice) - if dec.Nonce == nil { - return errors.New("missing required field 'nonce' for ttTransaction") - } - t.Nonce = uint64(*dec.Nonce) - if dec.Value == nil { - return errors.New("missing required field 'value' for ttTransaction") - } - t.Value = (*big.Int)(dec.Value) - if dec.R == nil { - return errors.New("missing required field 'r' for ttTransaction") - } - t.R = (*big.Int)(dec.R) - if dec.S == nil { - return errors.New("missing required field 's' for ttTransaction") - } - t.S = (*big.Int)(dec.S) - if dec.V == nil { - return errors.New("missing required field 'v' for ttTransaction") - } - t.V = (*big.Int)(dec.V) - if dec.To == nil { - return errors.New("missing required field 'to' for ttTransaction") - } - t.To = *dec.To - return nil -} diff --git a/tests/gen_vmexec.go b/tests/gen_vmexec.go deleted file mode 100644 index dd2d3d94e7..0000000000 --- a/tests/gen_vmexec.go +++ /dev/null @@ -1,88 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "errors" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*vmExecMarshaling)(nil) - -func (v vmExec) MarshalJSON() ([]byte, error) { - type vmExec struct { - Address common.UnprefixedAddress `json:"address" gencodec:"required"` - Caller common.UnprefixedAddress `json:"caller" gencodec:"required"` - Origin common.UnprefixedAddress `json:"origin" gencodec:"required"` - Code hexutil.Bytes `json:"code" gencodec:"required"` - Data hexutil.Bytes `json:"data" gencodec:"required"` - Value *math.HexOrDecimal256 `json:"value" gencodec:"required"` - GasLimit math.HexOrDecimal64 `json:"gas" gencodec:"required"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice" gencodec:"required"` - } - var enc vmExec - enc.Address = common.UnprefixedAddress(v.Address) - enc.Caller = common.UnprefixedAddress(v.Caller) - enc.Origin = common.UnprefixedAddress(v.Origin) - enc.Code = v.Code - enc.Data = v.Data - enc.Value = (*math.HexOrDecimal256)(v.Value) - enc.GasLimit = math.HexOrDecimal64(v.GasLimit) - enc.GasPrice = (*math.HexOrDecimal256)(v.GasPrice) - return json.Marshal(&enc) -} - -func (v *vmExec) UnmarshalJSON(input []byte) error { - type vmExec struct { - Address *common.UnprefixedAddress `json:"address" gencodec:"required"` - Caller *common.UnprefixedAddress `json:"caller" gencodec:"required"` - Origin *common.UnprefixedAddress `json:"origin" gencodec:"required"` - Code hexutil.Bytes `json:"code" gencodec:"required"` - Data hexutil.Bytes `json:"data" gencodec:"required"` - Value *math.HexOrDecimal256 `json:"value" gencodec:"required"` - GasLimit *math.HexOrDecimal64 `json:"gas" gencodec:"required"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice" gencodec:"required"` - } - var dec vmExec - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Address == nil { - return errors.New("missing required field 'address' for vmExec") - } - v.Address = common.Address(*dec.Address) - if dec.Caller == nil { - return errors.New("missing required field 'caller' for vmExec") - } - v.Caller = common.Address(*dec.Caller) - if dec.Origin == nil { - return errors.New("missing required field 'origin' for vmExec") - } - v.Origin = common.Address(*dec.Origin) - if dec.Code == nil { - return errors.New("missing required field 'code' for vmExec") - } - v.Code = dec.Code - if dec.Data == nil { - return errors.New("missing required field 'data' for vmExec") - } - v.Data = dec.Data - if dec.Value == nil { - return errors.New("missing required field 'value' for vmExec") - } - v.Value = (*big.Int)(dec.Value) - if dec.GasLimit == nil { - return errors.New("missing required field 'gas' for vmExec") - } - v.GasLimit = uint64(*dec.GasLimit) - if dec.GasPrice == nil { - return errors.New("missing required field 'gasPrice' for vmExec") - } - v.GasPrice = (*big.Int)(dec.GasPrice) - return nil -} diff --git a/tests/init.go b/tests/init.go deleted file mode 100644 index 9e884efe39..0000000000 --- a/tests/init.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2017 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 . - -package tests - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/params" -) - -// This table defines supported forks and their chain config. -var Forks = map[string]*params.ChainConfig{ - "Frontier": { - ChainId: big.NewInt(1), - }, - "Homestead": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - }, - "EIP150": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - }, - "EIP158": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - }, - "Byzantium": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - DAOForkBlock: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - }, - "FrontierToHomesteadAt5": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(5), - }, - "HomesteadToEIP150At5": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(5), - }, - "HomesteadToDaoAt5": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: big.NewInt(5), - DAOForkSupport: true, - }, - "EIP158ToByzantiumAt5": { - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(5), - }, -} - -// UnsupportedForkError is returned when a test requests a fork that isn't implemented. -type UnsupportedForkError struct { - Name string -} - -func (e UnsupportedForkError) Error() string { - return fmt.Sprintf("unsupported fork %q", e.Name) -} diff --git a/tests/init_test.go b/tests/init_test.go deleted file mode 100644 index ebb0d32c34..0000000000 --- a/tests/init_test.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "regexp" - "sort" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/params" -) - -var ( - baseDir = filepath.Join(".", "testdata") - blockTestDir = filepath.Join(baseDir, "BlockchainTests") - stateTestDir = filepath.Join(baseDir, "GeneralStateTests") - transactionTestDir = filepath.Join(baseDir, "TransactionTests") - vmTestDir = filepath.Join(baseDir, "VMTests") - rlpTestDir = filepath.Join(baseDir, "RLPTests") - difficultyTestDir = filepath.Join(baseDir, "BasicTests") -) - -func readJson(reader io.Reader, value interface{}) error { - data, err := ioutil.ReadAll(reader) - if err != nil { - return fmt.Errorf("error reading JSON file: %v", err) - } - if err = json.Unmarshal(data, &value); err != nil { - if syntaxerr, ok := err.(*json.SyntaxError); ok { - line := findLine(data, syntaxerr.Offset) - return fmt.Errorf("JSON syntax error at line %v: %v", line, err) - } - return err - } - return nil -} - -func readJsonFile(fn string, value interface{}) error { - file, err := os.Open(fn) - if err != nil { - return err - } - defer file.Close() - - err = readJson(file, value) - if err != nil { - return fmt.Errorf("%s in file %s", err.Error(), fn) - } - return nil -} - -// findLine returns the line number for the given offset into data. -func findLine(data []byte, offset int64) (line int) { - line = 1 - for i, r := range string(data) { - if int64(i) >= offset { - return - } - if r == '\n' { - line++ - } - } - return -} - -// testMatcher controls skipping and chain config assignment to tests. -type testMatcher struct { - configpat []testConfig - failpat []testFailure - skiploadpat []*regexp.Regexp - skipshortpat []*regexp.Regexp -} - -type testConfig struct { - p *regexp.Regexp - config params.ChainConfig -} - -type testFailure struct { - p *regexp.Regexp - reason string -} - -// skipShortMode skips tests matching when the -short flag is used. -func (tm *testMatcher) skipShortMode(pattern string) { - tm.skipshortpat = append(tm.skipshortpat, regexp.MustCompile(pattern)) -} - -// skipLoad skips JSON loading of tests matching the pattern. -func (tm *testMatcher) skipLoad(pattern string) { - tm.skiploadpat = append(tm.skiploadpat, regexp.MustCompile(pattern)) -} - -// fails adds an expected failure for tests matching the pattern. -func (tm *testMatcher) fails(pattern string, reason string) { - if reason == "" { - panic("empty fail reason") - } - tm.failpat = append(tm.failpat, testFailure{regexp.MustCompile(pattern), reason}) -} - -// config defines chain config for tests matching the pattern. -func (tm *testMatcher) config(pattern string, cfg params.ChainConfig) { - tm.configpat = append(tm.configpat, testConfig{regexp.MustCompile(pattern), cfg}) -} - -// findSkip matches name against test skip patterns. -func (tm *testMatcher) findSkip(name string) (reason string, skipload bool) { - if testing.Short() { - for _, re := range tm.skipshortpat { - if re.MatchString(name) { - return "skipped in -short mode", false - } - } - } - for _, re := range tm.skiploadpat { - if re.MatchString(name) { - return "skipped by skipLoad", true - } - } - return "", false -} - -// findConfig returns the chain config matching defined patterns. -func (tm *testMatcher) findConfig(name string) *params.ChainConfig { - // TODO(fjl): name can be derived from testing.T when min Go version is 1.8 - for _, m := range tm.configpat { - if m.p.MatchString(name) { - return &m.config - } - } - return new(params.ChainConfig) -} - -// checkFailure checks whether a failure is expected. -func (tm *testMatcher) checkFailure(t *testing.T, name string, err error) error { - // TODO(fjl): name can be derived from t when min Go version is 1.8 - failReason := "" - for _, m := range tm.failpat { - if m.p.MatchString(name) { - failReason = m.reason - break - } - } - if failReason != "" { - t.Logf("expected failure: %s", failReason) - if err != nil { - t.Logf("error: %v", err) - return nil - } else { - return fmt.Errorf("test succeeded unexpectedly") - } - } - return err -} - -// walk invokes its runTest argument for all subtests in the given directory. -// -// runTest should be a function of type func(t *testing.T, name string, x ), -// where TestType is the type of the test contained in test files. -func (tm *testMatcher) walk(t *testing.T, dir string, runTest interface{}) { - // Walk the directory. - dirinfo, err := os.Stat(dir) - if os.IsNotExist(err) || !dirinfo.IsDir() { - fmt.Fprintf(os.Stderr, "can't find test files in %s, did you clone the tests submodule?\n", dir) - t.Skip("missing test files") - } - err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - name := filepath.ToSlash(strings.TrimPrefix(path, dir+string(filepath.Separator))) - if info.IsDir() { - if _, skipload := tm.findSkip(name + "/"); skipload { - return filepath.SkipDir - } - return nil - } - if filepath.Ext(path) == ".json" { - t.Run(name, func(t *testing.T) { tm.runTestFile(t, path, name, runTest) }) - } - return nil - }) - if err != nil { - t.Fatal(err) - } -} - -func (tm *testMatcher) runTestFile(t *testing.T, path, name string, runTest interface{}) { - if r, _ := tm.findSkip(name); r != "" { - t.Skip(r) - } - t.Parallel() - - // Load the file as map[string]. - m := makeMapFromTestFunc(runTest) - if err := readJsonFile(path, m.Addr().Interface()); err != nil { - t.Fatal(err) - } - - // Run all tests from the map. Don't wrap in a subtest if there is only one test in the file. - keys := sortedMapKeys(m) - if len(keys) == 1 { - runTestFunc(runTest, t, name, m, keys[0]) - } else { - for _, key := range keys { - name := name + "/" + key - t.Run(key, func(t *testing.T) { - if r, _ := tm.findSkip(name); r != "" { - t.Skip(r) - } - runTestFunc(runTest, t, name, m, key) - }) - } - } -} - -func makeMapFromTestFunc(f interface{}) reflect.Value { - stringT := reflect.TypeOf("") - testingT := reflect.TypeOf((*testing.T)(nil)) - ftyp := reflect.TypeOf(f) - if ftyp.Kind() != reflect.Func || ftyp.NumIn() != 3 || ftyp.NumOut() != 0 || ftyp.In(0) != testingT || ftyp.In(1) != stringT { - panic(fmt.Sprintf("bad test function type: want func(*testing.T, string, ), have %s", ftyp)) - } - testType := ftyp.In(2) - mp := reflect.New(reflect.MapOf(stringT, testType)) - return mp.Elem() -} - -func sortedMapKeys(m reflect.Value) []string { - keys := make([]string, m.Len()) - for i, k := range m.MapKeys() { - keys[i] = k.String() - } - sort.Strings(keys) - return keys -} - -func runTestFunc(runTest interface{}, t *testing.T, name string, m reflect.Value, key string) { - reflect.ValueOf(runTest).Call([]reflect.Value{ - reflect.ValueOf(t), - reflect.ValueOf(name), - m.MapIndex(reflect.ValueOf(key)), - }) -} diff --git a/tests/rlp_test.go b/tests/rlp_test.go deleted file mode 100644 index 1601625df5..0000000000 --- a/tests/rlp_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "testing" -) - -func TestRLP(t *testing.T) { - t.Parallel() - tm := new(testMatcher) - tm.walk(t, rlpTestDir, func(t *testing.T, name string, test *RLPTest) { - if err := tm.checkFailure(t, name, test.Run()); err != nil { - t.Error(err) - } - }) -} diff --git a/tests/rlp_test_util.go b/tests/rlp_test_util.go deleted file mode 100644 index 58ef8a6428..0000000000 --- a/tests/rlp_test_util.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "bytes" - "encoding/hex" - "errors" - "fmt" - "math/big" - "strings" - - "github.com/ethereum/go-ethereum/rlp" -) - -// RLPTest is the JSON structure of a single RLP test. -type RLPTest struct { - // If the value of In is "INVALID" or "VALID", the test - // checks whether Out can be decoded into a value of - // type interface{}. - // - // For other JSON values, In is treated as a driver for - // calls to rlp.Stream. The test also verifies that encoding - // In produces the bytes in Out. - In interface{} - - // Out is a hex-encoded RLP value. - Out string -} - -// Run executes the test. -func (t *RLPTest) Run() error { - outb, err := hex.DecodeString(t.Out) - if err != nil { - return fmt.Errorf("invalid hex in Out") - } - - // Handle simple decoding tests with no actual In value. - if t.In == "VALID" || t.In == "INVALID" { - return checkDecodeInterface(outb, t.In == "VALID") - } - - // Check whether encoding the value produces the same bytes. - in := translateJSON(t.In) - b, err := rlp.EncodeToBytes(in) - if err != nil { - return fmt.Errorf("encode failed: %v", err) - } - if !bytes.Equal(b, outb) { - return fmt.Errorf("encode produced %x, want %x", b, outb) - } - // Test stream decoding. - s := rlp.NewStream(bytes.NewReader(outb), 0) - return checkDecodeFromJSON(s, in) -} - -func checkDecodeInterface(b []byte, isValid bool) error { - err := rlp.DecodeBytes(b, new(interface{})) - switch { - case isValid && err != nil: - return fmt.Errorf("decoding failed: %v", err) - case !isValid && err == nil: - return fmt.Errorf("decoding of invalid value succeeded") - } - return nil -} - -// translateJSON makes test json values encodable with RLP. -func translateJSON(v interface{}) interface{} { - switch v := v.(type) { - case float64: - return uint64(v) - case string: - if len(v) > 0 && v[0] == '#' { // # starts a faux big int. - big, ok := new(big.Int).SetString(v[1:], 10) - if !ok { - panic(fmt.Errorf("bad test: bad big int: %q", v)) - } - return big - } - return []byte(v) - case []interface{}: - new := make([]interface{}, len(v)) - for i := range v { - new[i] = translateJSON(v[i]) - } - return new - default: - panic(fmt.Errorf("can't handle %T", v)) - } -} - -// checkDecodeFromJSON decodes from s guided by exp. exp drives the -// Stream by invoking decoding operations (Uint, Big, List, ...) based -// on the type of each value. The value decoded from the RLP stream -// must match the JSON value. -func checkDecodeFromJSON(s *rlp.Stream, exp interface{}) error { - switch exp := exp.(type) { - case uint64: - i, err := s.Uint() - if err != nil { - return addStack("Uint", exp, err) - } - if i != exp { - return addStack("Uint", exp, fmt.Errorf("result mismatch: got %d", i)) - } - case *big.Int: - big := new(big.Int) - if err := s.Decode(&big); err != nil { - return addStack("Big", exp, err) - } - if big.Cmp(exp) != 0 { - return addStack("Big", exp, fmt.Errorf("result mismatch: got %d", big)) - } - case []byte: - b, err := s.Bytes() - if err != nil { - return addStack("Bytes", exp, err) - } - if !bytes.Equal(b, exp) { - return addStack("Bytes", exp, fmt.Errorf("result mismatch: got %x", b)) - } - case []interface{}: - if _, err := s.List(); err != nil { - return addStack("List", exp, err) - } - for i, v := range exp { - if err := checkDecodeFromJSON(s, v); err != nil { - return addStack(fmt.Sprintf("[%d]", i), exp, err) - } - } - if err := s.ListEnd(); err != nil { - return addStack("ListEnd", exp, err) - } - default: - panic(fmt.Errorf("unhandled type: %T", exp)) - } - return nil -} - -func addStack(op string, val interface{}, err error) error { - lines := strings.Split(err.Error(), "\n") - lines = append(lines, fmt.Sprintf("\t%s: %v", op, val)) - return errors.New(strings.Join(lines, "\n")) -} diff --git a/tests/state_test.go b/tests/state_test.go deleted file mode 100644 index 5a67b290db..0000000000 --- a/tests/state_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2017 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 . - -package tests - -import ( - "bytes" - "fmt" - "reflect" - "testing" - - "github.com/ethereum/go-ethereum/core/vm" -) - -func TestState(t *testing.T) { - t.Parallel() - - st := new(testMatcher) - // Long tests: - st.skipShortMode(`^stQuadraticComplexityTest/`) - // Broken tests: - st.skipLoad(`^stTransactionTest/OverflowGasRequire\.json`) // gasLimit > 256 bits - st.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\.json`) // EIP-86 is not supported yet - // Expected failures: - st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") - st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test") - st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") - st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/Byzantium`, "bug in test") - st.fails(`^stRandom/randomStatetest645\.json/EIP150/.*`, "known bug #15119") - st.fails(`^stRandom/randomStatetest645\.json/Frontier/.*`, "known bug #15119") - st.fails(`^stRandom/randomStatetest645\.json/Homestead/.*`, "known bug #15119") - st.fails(`^stRandom/randomStatetest644\.json/EIP150/.*`, "known bug #15119") - st.fails(`^stRandom/randomStatetest644\.json/Frontier/.*`, "known bug #15119") - st.fails(`^stRandom/randomStatetest644\.json/Homestead/.*`, "known bug #15119") - st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/EIP158/2`, "known bug ") - st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/EIP158/3`, "known bug ") - st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/Byzantium/2`, "known bug ") - st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/Byzantium/3`, "known bug ") - st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { - for _, subtest := range test.Subtests() { - subtest := subtest - key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) - name := name + "/" + key - t.Run(key, func(t *testing.T) { - if subtest.Fork == "Constantinople" { - t.Skip("constantinople not supported yet") - } - withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { - _, err := test.Run(subtest, vmconfig) - return st.checkFailure(t, name, err) - }) - }) - } - }) -} - -// Transactions with gasLimit above this value will not get a VM trace on failure. -//const traceErrorLimit = 400000 -const traceErrorLimit = 0 - -func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { - err := test(vm.Config{}) - if err == nil { - return - } - t.Error(err) - if gasLimit > traceErrorLimit { - t.Log("gas limit too high for EVM trace") - return - } - tracer := vm.NewStructLogger(nil) - err2 := test(vm.Config{Debug: true, Tracer: tracer}) - if !reflect.DeepEqual(err, err2) { - t.Errorf("different error for second run: %v", err2) - } - buf := new(bytes.Buffer) - vm.WriteTrace(buf, tracer.StructLogs()) - if buf.Len() == 0 { - t.Log("no EVM operation logs generated") - } else { - t.Log("EVM operation log:\n" + buf.String()) - } -} diff --git a/tests/state_test_util.go b/tests/state_test_util.go deleted file mode 100644 index 352f840d9f..0000000000 --- a/tests/state_test_util.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2017 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 . - -package tests - -import ( - "encoding/hex" - "encoding/json" - "fmt" - "math/big" - "strings" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "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/crypto/sha3" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" -) - -// StateTest checks transaction processing without block context. -// See https://github.com/ethereum/EIPs/issues/176 for the test format specification. -type StateTest struct { - json stJSON -} - -// StateSubtest selects a specific configuration of a General State Test. -type StateSubtest struct { - Fork string - Index int -} - -func (t *StateTest) UnmarshalJSON(in []byte) error { - return json.Unmarshal(in, &t.json) -} - -type stJSON struct { - Env stEnv `json:"env"` - Pre core.GenesisAlloc `json:"pre"` - Tx stTransaction `json:"transaction"` - Out hexutil.Bytes `json:"out"` - Post map[string][]stPostState `json:"post"` -} - -type stPostState struct { - Root common.UnprefixedHash `json:"hash"` - Logs common.UnprefixedHash `json:"logs"` - Indexes struct { - Data int `json:"data"` - Gas int `json:"gas"` - Value int `json:"value"` - } -} - -//go:generate gencodec -type stEnv -field-override stEnvMarshaling -out gen_stenv.go - -type stEnv struct { - Coinbase common.Address `json:"currentCoinbase" gencodec:"required"` - Difficulty *big.Int `json:"currentDifficulty" gencodec:"required"` - GasLimit *big.Int `json:"currentGasLimit" gencodec:"required"` - Number uint64 `json:"currentNumber" gencodec:"required"` - Timestamp uint64 `json:"currentTimestamp" gencodec:"required"` -} - -type stEnvMarshaling struct { - Coinbase common.UnprefixedAddress - Difficulty *math.HexOrDecimal256 - GasLimit *math.HexOrDecimal256 - Number math.HexOrDecimal64 - Timestamp math.HexOrDecimal64 -} - -//go:generate gencodec -type stTransaction -field-override stTransactionMarshaling -out gen_sttransaction.go - -type stTransaction struct { - GasPrice *big.Int `json:"gasPrice"` - Nonce uint64 `json:"nonce"` - To string `json:"to"` - Data []string `json:"data"` - GasLimit []uint64 `json:"gasLimit"` - Value []string `json:"value"` - PrivateKey []byte `json:"secretKey"` -} - -type stTransactionMarshaling struct { - GasPrice *math.HexOrDecimal256 - Nonce math.HexOrDecimal64 - GasLimit []math.HexOrDecimal64 - PrivateKey hexutil.Bytes -} - -// Subtests returns all valid subtests of the test. -func (t *StateTest) Subtests() []StateSubtest { - var sub []StateSubtest - for fork, pss := range t.json.Post { - for i := range pss { - sub = append(sub, StateSubtest{fork, i}) - } - } - return sub -} - -// Run executes a specific subtest. -func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, error) { - config, ok := Forks[subtest.Fork] - if !ok { - return nil, UnsupportedForkError{subtest.Fork} - } - block, _ := t.genesis(config).ToBlock() - db, _ := ethdb.NewMemDatabase() - statedb := makePreState(db, t.json.Pre) - - post := t.json.Post[subtest.Fork][subtest.Index] - msg, err := t.json.Tx.toMessage(post) - if err != nil { - return nil, err - } - context := core.NewEVMContext(msg, block.Header(), nil, &t.json.Env.Coinbase) - context.GetHash = vmTestBlockHash - evm := vm.NewEVM(context, statedb, config, vmconfig) - - gaspool := new(core.GasPool) - gaspool.AddGas(block.GasLimit()) - snapshot := statedb.Snapshot() - if _, _, _, err := core.ApplyMessage(evm, msg, gaspool); err != nil { - statedb.RevertToSnapshot(snapshot) - } - if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) { - return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) - } - root, _ := statedb.CommitTo(db, config.IsEIP158(block.Number())) - if root != common.Hash(post.Root) { - return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root) - } - return statedb, nil -} - -func (t *StateTest) gasLimit(subtest StateSubtest) uint64 { - return t.json.Tx.GasLimit[t.json.Post[subtest.Fork][subtest.Index].Indexes.Gas] -} - -func makePreState(db ethdb.Database, accounts core.GenesisAlloc) *state.StateDB { - sdb := state.NewDatabase(db) - statedb, _ := state.New(common.Hash{}, sdb) - for addr, a := range accounts { - statedb.SetCode(addr, a.Code) - statedb.SetNonce(addr, a.Nonce) - statedb.SetBalance(addr, a.Balance) - for k, v := range a.Storage { - statedb.SetState(addr, k, v) - } - } - // Commit and re-open to start with a clean state. - root, _ := statedb.CommitTo(db, false) - statedb, _ = state.New(root, sdb) - return statedb -} - -func (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis { - return &core.Genesis{ - Config: config, - Coinbase: t.json.Env.Coinbase, - Difficulty: t.json.Env.Difficulty, - GasLimit: t.json.Env.GasLimit.Uint64(), - Number: t.json.Env.Number, - Timestamp: t.json.Env.Timestamp, - Alloc: t.json.Pre, - } -} - -func (tx *stTransaction) toMessage(ps stPostState) (core.Message, error) { - // Derive sender from private key if present. - var from common.Address - if len(tx.PrivateKey) > 0 { - key, err := crypto.ToECDSA(tx.PrivateKey) - if err != nil { - return nil, fmt.Errorf("invalid private key: %v", err) - } - from = crypto.PubkeyToAddress(key.PublicKey) - } - // Parse recipient if present. - var to *common.Address - if tx.To != "" { - to = new(common.Address) - if err := to.UnmarshalText([]byte(tx.To)); err != nil { - return nil, fmt.Errorf("invalid to address: %v", err) - } - } - - // Get values specific to this post state. - if ps.Indexes.Data > len(tx.Data) { - return nil, fmt.Errorf("tx data index %d out of bounds", ps.Indexes.Data) - } - if ps.Indexes.Value > len(tx.Value) { - return nil, fmt.Errorf("tx value index %d out of bounds", ps.Indexes.Value) - } - if ps.Indexes.Gas > len(tx.GasLimit) { - return nil, fmt.Errorf("tx gas limit index %d out of bounds", ps.Indexes.Gas) - } - dataHex := tx.Data[ps.Indexes.Data] - valueHex := tx.Value[ps.Indexes.Value] - gasLimit := tx.GasLimit[ps.Indexes.Gas] - // Value, Data hex encoding is messy: https://github.com/ethereum/tests/issues/203 - value := new(big.Int) - if valueHex != "0x" { - v, ok := math.ParseBig256(valueHex) - if !ok { - return nil, fmt.Errorf("invalid tx value %q", valueHex) - } - value = v - } - data, err := hex.DecodeString(strings.TrimPrefix(dataHex, "0x")) - if err != nil { - return nil, fmt.Errorf("invalid tx data %q", dataHex) - } - - msg := types.NewMessage(from, to, tx.Nonce, value, new(big.Int).SetUint64(gasLimit), tx.GasPrice, data, true) - return msg, nil -} - -func rlpHash(x interface{}) (h common.Hash) { - hw := sha3.NewKeccak256() - rlp.Encode(hw, x) - hw.Sum(h[:0]) - return h -} diff --git a/tests/testdata b/tests/testdata deleted file mode 160000 index 37f555fbc0..0000000000 --- a/tests/testdata +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 37f555fbc091fbf761aa6f02227132fb31f0681c diff --git a/tests/transaction_test.go b/tests/transaction_test.go deleted file mode 100644 index c743996c2a..0000000000 --- a/tests/transaction_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/params" -) - -func TestTransaction(t *testing.T) { - t.Parallel() - - txt := new(testMatcher) - txt.config(`^Homestead/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - }) - txt.config(`^EIP155/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ChainId: big.NewInt(1), - }) - txt.config(`^Byzantium/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - }) - - txt.walk(t, transactionTestDir, func(t *testing.T, name string, test *TransactionTest) { - cfg := txt.findConfig(name) - if err := txt.checkFailure(t, name, test.Run(cfg)); err != nil { - t.Error(err) - } - }) -} diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go deleted file mode 100644 index 472b3d6f24..0000000000 --- a/tests/transaction_test_util.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "bytes" - "errors" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" -) - -// TransactionTest checks RLP decoding and sender derivation of transactions. -type TransactionTest struct { - json ttJSON -} - -type ttJSON struct { - BlockNumber math.HexOrDecimal64 `json:"blockNumber"` - RLP hexutil.Bytes `json:"rlp"` - Sender hexutil.Bytes `json:"sender"` - Transaction *ttTransaction `json:"transaction"` -} - -//go:generate gencodec -type ttTransaction -field-override ttTransactionMarshaling -out gen_tttransaction.go - -type ttTransaction struct { - Data []byte `gencodec:"required"` - GasLimit *big.Int `gencodec:"required"` - GasPrice *big.Int `gencodec:"required"` - Nonce uint64 `gencodec:"required"` - Value *big.Int `gencodec:"required"` - R *big.Int `gencodec:"required"` - S *big.Int `gencodec:"required"` - V *big.Int `gencodec:"required"` - To common.Address `gencodec:"required"` -} - -type ttTransactionMarshaling struct { - Data hexutil.Bytes - GasLimit *math.HexOrDecimal256 - GasPrice *math.HexOrDecimal256 - Nonce math.HexOrDecimal64 - Value *math.HexOrDecimal256 - R *math.HexOrDecimal256 - S *math.HexOrDecimal256 - V *math.HexOrDecimal256 -} - -func (tt *TransactionTest) Run(config *params.ChainConfig) error { - tx := new(types.Transaction) - if err := rlp.DecodeBytes(tt.json.RLP, tx); err != nil { - if tt.json.Transaction == nil { - return nil - } else { - return fmt.Errorf("RLP decoding failed: %v", err) - } - } - // Check sender derivation. - signer := types.MakeSigner(config, new(big.Int).SetUint64(uint64(tt.json.BlockNumber))) - sender, err := types.Sender(signer, tx) - if err != nil { - return err - } - if sender != common.BytesToAddress(tt.json.Sender) { - return fmt.Errorf("Sender mismatch: got %x, want %x", sender, tt.json.Sender) - } - // Check decoded fields. - err = tt.json.Transaction.verify(signer, tx) - if tt.json.Sender == nil && err == nil { - return errors.New("field validations succeeded but should fail") - } - if tt.json.Sender != nil && err != nil { - return fmt.Errorf("field validations failed after RLP decoding: %s", err) - } - return nil -} - -func (tt *ttTransaction) verify(signer types.Signer, tx *types.Transaction) error { - if !bytes.Equal(tx.Data(), tt.Data) { - return fmt.Errorf("Tx input data mismatch: got %x want %x", tx.Data(), tt.Data) - } - if tx.Gas().Cmp(tt.GasLimit) != 0 { - return fmt.Errorf("GasLimit mismatch: got %v, want %v", tx.Gas(), tt.GasLimit) - } - if tx.GasPrice().Cmp(tt.GasPrice) != 0 { - return fmt.Errorf("GasPrice mismatch: got %v, want %v", tx.GasPrice(), tt.GasPrice) - } - if tx.Nonce() != tt.Nonce { - return fmt.Errorf("Nonce mismatch: got %v, want %v", tx.Nonce(), tt.Nonce) - } - v, r, s := tx.RawSignatureValues() - if r.Cmp(tt.R) != 0 { - return fmt.Errorf("R mismatch: got %v, want %v", r, tt.R) - } - if s.Cmp(tt.S) != 0 { - return fmt.Errorf("S mismatch: got %v, want %v", s, tt.S) - } - if v.Cmp(tt.V) != 0 { - return fmt.Errorf("V mismatch: got %v, want %v", v, tt.V) - } - if tx.To() == nil { - if tt.To != (common.Address{}) { - return fmt.Errorf("To mismatch when recipient is nil (contract creation): %x", tt.To) - } - } else if *tx.To() != tt.To { - return fmt.Errorf("To mismatch: got %x, want %x", *tx.To(), tt.To) - } - if tx.Value().Cmp(tt.Value) != 0 { - return fmt.Errorf("Value mismatch: got %x, want %x", tx.Value(), tt.Value) - } - return nil -} diff --git a/tests/vm_test.go b/tests/vm_test.go deleted file mode 100644 index c9f5e225e9..0000000000 --- a/tests/vm_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 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 . - -package tests - -import ( - "testing" - - "github.com/ethereum/go-ethereum/core/vm" -) - -func TestVM(t *testing.T) { - t.Parallel() - vmt := new(testMatcher) - vmt.fails("^vmSystemOperationsTest.json/createNameRegistrator$", "fails without parallel execution") - - vmt.skipLoad(`^vmInputLimits(Light)?.json`) // log format broken - - vmt.skipShortMode("^vmPerformanceTest.json") - vmt.skipShortMode("^vmInputLimits(Light)?.json") - - vmt.walk(t, vmTestDir, func(t *testing.T, name string, test *VMTest) { - withTrace(t, test.json.Exec.GasLimit, func(vmconfig vm.Config) error { - return vmt.checkFailure(t, name, test.Run(vmconfig)) - }) - }) -} diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go deleted file mode 100644 index 0aa37955ce..0000000000 --- a/tests/vm_test_util.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2015 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 . - -package tests - -import ( - "bytes" - "encoding/json" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/params" -) - -// VMTest checks EVM execution without block or transaction context. -// See https://github.com/ethereum/tests/wiki/VM-Tests for the test format specification. -type VMTest struct { - json vmJSON -} - -func (t *VMTest) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &t.json) -} - -type vmJSON struct { - Env stEnv `json:"env"` - Exec vmExec `json:"exec"` - Logs common.UnprefixedHash `json:"logs"` - GasRemaining *math.HexOrDecimal64 `json:"gas"` - Out hexutil.Bytes `json:"out"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"post"` - PostStateRoot common.Hash `json:"postStateRoot"` -} - -//go:generate gencodec -type vmExec -field-override vmExecMarshaling -out gen_vmexec.go - -type vmExec struct { - Address common.Address `json:"address" gencodec:"required"` - Caller common.Address `json:"caller" gencodec:"required"` - Origin common.Address `json:"origin" gencodec:"required"` - Code []byte `json:"code" gencodec:"required"` - Data []byte `json:"data" gencodec:"required"` - Value *big.Int `json:"value" gencodec:"required"` - GasLimit uint64 `json:"gas" gencodec:"required"` - GasPrice *big.Int `json:"gasPrice" gencodec:"required"` -} - -type vmExecMarshaling struct { - Address common.UnprefixedAddress - Caller common.UnprefixedAddress - Origin common.UnprefixedAddress - Code hexutil.Bytes - Data hexutil.Bytes - Value *math.HexOrDecimal256 - GasLimit math.HexOrDecimal64 - GasPrice *math.HexOrDecimal256 -} - -func (t *VMTest) Run(vmconfig vm.Config) error { - db, _ := ethdb.NewMemDatabase() - statedb := makePreState(db, t.json.Pre) - ret, gasRemaining, err := t.exec(statedb, vmconfig) - - if t.json.GasRemaining == nil { - if err == nil { - return fmt.Errorf("gas unspecified (indicating an error), but VM returned no error") - } - if gasRemaining > 0 { - return fmt.Errorf("gas unspecified (indicating an error), but VM returned gas remaining > 0") - } - return nil - } - // Test declares gas, expecting outputs to match. - if !bytes.Equal(ret, t.json.Out) { - return fmt.Errorf("return data mismatch: got %x, want %x", ret, t.json.Out) - } - if gasRemaining != uint64(*t.json.GasRemaining) { - return fmt.Errorf("remaining gas %v, want %v", gasRemaining, *t.json.GasRemaining) - } - for addr, account := range t.json.Post { - for k, wantV := range account.Storage { - if haveV := statedb.GetState(addr, k); haveV != wantV { - return fmt.Errorf("wrong storage value at %x:\n got %x\n want %x", k, haveV, wantV) - } - } - } - // if root := statedb.IntermediateRoot(false); root != t.json.PostStateRoot { - // return fmt.Errorf("post state root mismatch, got %x, want %x", root, t.json.PostStateRoot) - // } - if logs := rlpHash(statedb.Logs()); logs != common.Hash(t.json.Logs) { - return fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, t.json.Logs) - } - return nil -} - -func (t *VMTest) exec(statedb *state.StateDB, vmconfig vm.Config) ([]byte, uint64, error) { - evm := t.newEVM(statedb, vmconfig) - e := t.json.Exec - return evm.Call(vm.AccountRef(e.Caller), e.Address, e.Data, e.GasLimit, e.Value) -} - -func (t *VMTest) newEVM(statedb *state.StateDB, vmconfig vm.Config) *vm.EVM { - initialCall := true - canTransfer := func(db vm.StateDB, address common.Address, amount *big.Int) bool { - if initialCall { - initialCall = false - return true - } - return core.CanTransfer(db, address, amount) - } - transfer := func(db vm.StateDB, sender, recipient common.Address, amount *big.Int) {} - context := vm.Context{ - CanTransfer: canTransfer, - Transfer: transfer, - GetHash: vmTestBlockHash, - Origin: t.json.Exec.Origin, - Coinbase: t.json.Env.Coinbase, - BlockNumber: new(big.Int).SetUint64(t.json.Env.Number), - Time: new(big.Int).SetUint64(t.json.Env.Timestamp), - GasLimit: t.json.Env.GasLimit, - Difficulty: t.json.Env.Difficulty, - GasPrice: t.json.Exec.GasPrice, - } - vmconfig.NoRecursion = true - return vm.NewEVM(context, statedb, params.MainnetChainConfig, vmconfig) -} - -func vmTestBlockHash(n uint64) common.Hash { - return common.BytesToHash(crypto.Keccak256([]byte(big.NewInt(int64(n)).String()))) -}