github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/signer/core/validation_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2018 Go Ethereum作者
    10  //此文件是Go以太坊的一部分。
    11  //
    12  //Go以太坊是免费软件:您可以重新发布和/或修改它
    13  //根据GNU通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊的分布希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU通用公共许可证了解更多详细信息。
    21  //
    22  //你应该已经收到一份GNU通用公共许可证的副本
    23  //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package core
    26  
    27  import (
    28  	"fmt"
    29  	"math/big"
    30  	"testing"
    31  
    32  	"github.com/ethereum/go-ethereum/common"
    33  	"github.com/ethereum/go-ethereum/common/hexutil"
    34  )
    35  
    36  func hexAddr(a string) common.Address { return common.BytesToAddress(common.FromHex(a)) }
    37  func mixAddr(a string) (*common.MixedcaseAddress, error) {
    38  	return common.NewMixedcaseAddressFromString(a)
    39  }
    40  func toHexBig(h string) hexutil.Big {
    41  	b := big.NewInt(0).SetBytes(common.FromHex(h))
    42  	return hexutil.Big(*b)
    43  }
    44  func toHexUint(h string) hexutil.Uint64 {
    45  	b := big.NewInt(0).SetBytes(common.FromHex(h))
    46  	return hexutil.Uint64(b.Uint64())
    47  }
    48  func dummyTxArgs(t txtestcase) *SendTxArgs {
    49  	to, _ := mixAddr(t.to)
    50  	from, _ := mixAddr(t.from)
    51  	n := toHexUint(t.n)
    52  	gas := toHexUint(t.g)
    53  	gasPrice := toHexBig(t.gp)
    54  	value := toHexBig(t.value)
    55  	var (
    56  		data, input *hexutil.Bytes
    57  	)
    58  	if t.d != "" {
    59  		a := hexutil.Bytes(common.FromHex(t.d))
    60  		data = &a
    61  	}
    62  	if t.i != "" {
    63  		a := hexutil.Bytes(common.FromHex(t.i))
    64  		input = &a
    65  
    66  	}
    67  	return &SendTxArgs{
    68  		From:     *from,
    69  		To:       to,
    70  		Value:    value,
    71  		Nonce:    n,
    72  		GasPrice: gasPrice,
    73  		Gas:      gas,
    74  		Data:     data,
    75  		Input:    input,
    76  	}
    77  }
    78  
    79  type txtestcase struct {
    80  	from, to, n, g, gp, value, d, i string
    81  	expectErr                       bool
    82  	numMessages                     int
    83  }
    84  
    85  func TestValidator(t *testing.T) {
    86  	var (
    87  //使用空数据库,对ABI特定的东西还有其他测试
    88  		db, _ = NewEmptyAbiDB()
    89  		v     = NewValidator(db)
    90  	)
    91  	testcases := []txtestcase{
    92  //校验和无效
    93  		{from: "000000000000000000000000000000000000dead", to: "000000000000000000000000000000000000dead",
    94  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1},
    95  //有效的0x0000000000000000000000000000000标题
    96  		{from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD",
    97  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 0},
    98  //输入和数据冲突
    99  		{from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD",
   100  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", i: "0x02", expectErr: true},
   101  //无法分析数据
   102  		{from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD",
   103  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x0102", numMessages: 1},
   104  //无法分析(输入时)数据
   105  		{from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD",
   106  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", i: "0x0102", numMessages: 1},
   107  //发送到0
   108  		{from: "000000000000000000000000000000000000dead", to: "0x0000000000000000000000000000000000000000",
   109  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1},
   110  //创建空合同(无值)
   111  		{from: "000000000000000000000000000000000000dead", to: "",
   112  			n: "0x01", g: "0x20", gp: "0x40", value: "0x00", numMessages: 1},
   113  //创建空合同(带值)
   114  		{from: "000000000000000000000000000000000000dead", to: "",
   115  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", expectErr: true},
   116  //用于创建的小负载
   117  		{from: "000000000000000000000000000000000000dead", to: "",
   118  			n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", numMessages: 1},
   119  	}
   120  	for i, test := range testcases {
   121  		msgs, err := v.ValidateTransaction(dummyTxArgs(test), nil)
   122  		if err == nil && test.expectErr {
   123  			t.Errorf("Test %d, expected error", i)
   124  			for _, msg := range msgs.Messages {
   125  				fmt.Printf("* %s: %s\n", msg.Typ, msg.Message)
   126  			}
   127  		}
   128  		if err != nil && !test.expectErr {
   129  			t.Errorf("Test %d, unexpected error: %v", i, err)
   130  		}
   131  		if err == nil {
   132  			got := len(msgs.Messages)
   133  			if got != test.numMessages {
   134  				for _, msg := range msgs.Messages {
   135  					fmt.Printf("* %s: %s\n", msg.Typ, msg.Message)
   136  				}
   137  				t.Errorf("Test %d, expected %d messages, got %d", i, test.numMessages, got)
   138  			} else {
   139  //调试打印输出,稍后删除
   140  				for _, msg := range msgs.Messages {
   141  					fmt.Printf("* [%d] %s: %s\n", i, msg.Typ, msg.Message)
   142  				}
   143  				fmt.Println()
   144  			}
   145  		}
   146  	}
   147  }