aboutsummaryrefslogtreecommitdiffstats
path: root/tests/transaction_test_util.go
diff options
context:
space:
mode:
authorGustav Simonsson <gustav.simonsson@gmail.com>2015-04-10 17:55:31 +0800
committerGustav Simonsson <gustav.simonsson@gmail.com>2015-04-10 17:55:31 +0800
commit9ac5671c18ae3c36370981cd42a99639f9799042 (patch)
tree8957bac6f83e33209686d2dc221783bc5b42cce7 /tests/transaction_test_util.go
parent1e18f4544b7e85619c8902a5e2fb408984f277b6 (diff)
downloaddexon-9ac5671c18ae3c36370981cd42a99639f9799042.tar.gz
dexon-9ac5671c18ae3c36370981cd42a99639f9799042.tar.zst
dexon-9ac5671c18ae3c36370981cd42a99639f9799042.zip
Add TransactionTests wrapped as Go tests
* Add initial go wrapping for TransactionTests with some tests disabled in lieu of consistent HEX encodings and a few other pending bugfixes * TODO: Consider better way of perhaps modelling each test in the JSON files as a single Go test, instead of one Go test per JSON file
Diffstat (limited to 'tests/transaction_test_util.go')
-rw-r--r--tests/transaction_test_util.go134
1 files changed, 134 insertions, 0 deletions
diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go
new file mode 100644
index 000000000..800891887
--- /dev/null
+++ b/tests/transaction_test_util.go
@@ -0,0 +1,134 @@
+package tests
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+ "runtime"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+// Transaction Test JSON Format
+type TtTransaction struct {
+ Data string
+ GasLimit string
+ GasPrice string
+ Nonce string
+ R string
+ S string
+ To string
+ V string
+ Value string
+}
+
+type TransactionTest struct {
+ Rlp string
+ Sender string
+ Transaction TtTransaction
+}
+
+func RunTransactionTests(file string, notWorking map[string]bool) error {
+ bt := make(map[string]TransactionTest)
+ if err := LoadJSON(file, &bt); err != nil {
+ return err
+ }
+ for name, in := range bt {
+ var err error
+ // TODO: remove this, we currently ignore some tests which are broken
+ if !notWorking[name] {
+ if err = runTest(in); err != nil {
+ return fmt.Errorf("bad test %s: %v", name, err)
+ }
+ fmt.Println("Test passed:", name)
+ }
+ }
+ return nil
+}
+
+func runTest(txTest TransactionTest) (err error) {
+ expectedSender, expectedTo, expectedData, rlpBytes, expectedGasLimit, expectedGasPrice, expectedValue, expectedR, expectedS, expectedNonce, expectedV, err := convertTestTypes(txTest)
+
+ if err != nil {
+ if txTest.Sender == "" { // tx is invalid and this is expected (test OK)
+ return nil
+ } else {
+ return err // tx is invalid and this is NOT expected (test FAIL)
+ }
+ }
+ tx := new(types.Transaction)
+ rlp.DecodeBytes(rlpBytes, tx)
+
+ sender, err := tx.From()
+ if err != nil {
+ return err
+ }
+
+ if expectedSender != sender {
+ return fmt.Errorf("Sender mismatch: %v %v", expectedSender, sender)
+ }
+ if !bytes.Equal(expectedData, tx.Payload) {
+ return fmt.Errorf("Tx input data mismatch: %#v %#v", expectedData, tx.Payload)
+ }
+ if expectedGasLimit.Cmp(tx.GasLimit) != 0 {
+ return fmt.Errorf("GasLimit mismatch: %v %v", expectedGasLimit, tx.GasLimit)
+ }
+ if expectedGasPrice.Cmp(tx.Price) != 0 {
+ return fmt.Errorf("GasPrice mismatch: %v %v", expectedGasPrice, tx.Price)
+ }
+ if expectedNonce != tx.AccountNonce {
+ return fmt.Errorf("Nonce mismatch: %v %v", expectedNonce, tx.AccountNonce)
+ }
+ if expectedR.Cmp(tx.R) != 0 {
+ return fmt.Errorf("R mismatch: %v %v", expectedR, tx.R)
+ }
+ if expectedS.Cmp(tx.S) != 0 {
+ return fmt.Errorf("S mismatch: %v %v", expectedS, tx.S)
+ }
+ if expectedV != uint64(tx.V) {
+ return fmt.Errorf("V mismatch: %v %v", expectedV, uint64(tx.V))
+ }
+ if expectedTo != *tx.Recipient {
+ return fmt.Errorf("To mismatch: %v %v", expectedTo, *tx.Recipient)
+ }
+ if expectedValue.Cmp(tx.Amount) != 0 {
+ return fmt.Errorf("Value mismatch: %v %v", expectedValue, tx.Amount)
+ }
+
+ return nil
+}
+
+func convertTestTypes(txTest TransactionTest) (sender, to common.Address,
+ txInputData, rlpBytes []byte,
+ gasLimit, gasPrice, value, r, s *big.Int,
+ nonce, v uint64,
+ err error) {
+
+ defer func() {
+ if recovered := recover(); recovered != nil {
+ buf := make([]byte, 64<<10)
+ buf = buf[:runtime.Stack(buf, false)]
+ err = fmt.Errorf("%v\n%s", recovered, buf)
+ }
+ }()
+
+ sender = mustConvertAddress(txTest.Sender)
+ to = mustConvertAddress(txTest.Transaction.To)
+
+ txInputData = mustConvertBytes(txTest.Transaction.Data)
+ rlpBytes = mustConvertBytes(txTest.Rlp)
+
+ gasLimit = mustConvertBigIntHex(txTest.Transaction.GasLimit)
+ gasPrice = mustConvertBigIntHex(txTest.Transaction.GasPrice)
+ value = mustConvertBigIntHex(txTest.Transaction.Value)
+
+ r = common.Bytes2Big(mustConvertBytes(txTest.Transaction.R))
+ s = common.Bytes2Big(mustConvertBytes(txTest.Transaction.S))
+
+ nonce = mustConvertUintHex(txTest.Transaction.Nonce)
+ v = mustConvertUintHex(txTest.Transaction.V)
+
+ return sender, to, txInputData, rlpBytes, gasLimit, gasPrice, value, r, s, nonce, v, nil
+}