github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/rlp/encode_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  //版权所有2014 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package rlp
    26  
    27  import (
    28  	"bytes"
    29  	"errors"
    30  	"fmt"
    31  	"io"
    32  	"io/ioutil"
    33  	"math/big"
    34  	"sync"
    35  	"testing"
    36  )
    37  
    38  type testEncoder struct {
    39  	err error
    40  }
    41  
    42  func (e *testEncoder) EncodeRLP(w io.Writer) error {
    43  	if e == nil {
    44  		w.Write([]byte{0, 0, 0, 0})
    45  	} else if e.err != nil {
    46  		return e.err
    47  	} else {
    48  		w.Write([]byte{0, 1, 0, 1, 0, 1, 0, 1, 0, 1})
    49  	}
    50  	return nil
    51  }
    52  
    53  type byteEncoder byte
    54  
    55  func (e byteEncoder) EncodeRLP(w io.Writer) error {
    56  	w.Write(EmptyList)
    57  	return nil
    58  }
    59  
    60  type encodableReader struct {
    61  	A, B uint
    62  }
    63  
    64  func (e *encodableReader) Read(b []byte) (int, error) {
    65  	panic("called")
    66  }
    67  
    68  type namedByteType byte
    69  
    70  var (
    71  	_ = Encoder(&testEncoder{})
    72  	_ = Encoder(byteEncoder(0))
    73  
    74  	reader io.Reader = &encodableReader{1, 2}
    75  )
    76  
    77  type encTest struct {
    78  	val           interface{}
    79  	output, error string
    80  }
    81  
    82  var encTests = []encTest{
    83  //布尔运算
    84  	{val: true, output: "01"},
    85  	{val: false, output: "80"},
    86  
    87  //整数
    88  	{val: uint32(0), output: "80"},
    89  	{val: uint32(127), output: "7F"},
    90  	{val: uint32(128), output: "8180"},
    91  	{val: uint32(256), output: "820100"},
    92  	{val: uint32(1024), output: "820400"},
    93  	{val: uint32(0xFFFFFF), output: "83FFFFFF"},
    94  	{val: uint32(0xFFFFFFFF), output: "84FFFFFFFF"},
    95  	{val: uint64(0xFFFFFFFF), output: "84FFFFFFFF"},
    96  	{val: uint64(0xFFFFFFFFFF), output: "85FFFFFFFFFF"},
    97  	{val: uint64(0xFFFFFFFFFFFF), output: "86FFFFFFFFFFFF"},
    98  	{val: uint64(0xFFFFFFFFFFFFFF), output: "87FFFFFFFFFFFFFF"},
    99  	{val: uint64(0xFFFFFFFFFFFFFFFF), output: "88FFFFFFFFFFFFFFFF"},
   100  
   101  //大整数(小值应与uint匹配)
   102  	{val: big.NewInt(0), output: "80"},
   103  	{val: big.NewInt(1), output: "01"},
   104  	{val: big.NewInt(127), output: "7F"},
   105  	{val: big.NewInt(128), output: "8180"},
   106  	{val: big.NewInt(256), output: "820100"},
   107  	{val: big.NewInt(1024), output: "820400"},
   108  	{val: big.NewInt(0xFFFFFF), output: "83FFFFFF"},
   109  	{val: big.NewInt(0xFFFFFFFF), output: "84FFFFFFFF"},
   110  	{val: big.NewInt(0xFFFFFFFFFF), output: "85FFFFFFFFFF"},
   111  	{val: big.NewInt(0xFFFFFFFFFFFF), output: "86FFFFFFFFFFFF"},
   112  	{val: big.NewInt(0xFFFFFFFFFFFFFF), output: "87FFFFFFFFFFFFFF"},
   113  	{
   114  		val:    big.NewInt(0).SetBytes(unhex("102030405060708090A0B0C0D0E0F2")),
   115  		output: "8F102030405060708090A0B0C0D0E0F2",
   116  	},
   117  	{
   118  		val:    big.NewInt(0).SetBytes(unhex("0100020003000400050006000700080009000A000B000C000D000E01")),
   119  		output: "9C0100020003000400050006000700080009000A000B000C000D000E01",
   120  	},
   121  	{
   122  		val:    big.NewInt(0).SetBytes(unhex("010000000000000000000000000000000000000000000000000000000000000000")),
   123  		output: "A1010000000000000000000000000000000000000000000000000000000000000000",
   124  	},
   125  
   126  //非指针大整数
   127  	{val: *big.NewInt(0), output: "80"},
   128  	{val: *big.NewInt(0xFFFFFF), output: "83FFFFFF"},
   129  
   130  //不支持负整数
   131  	{val: big.NewInt(-1), error: "rlp: cannot encode negative *big.Int"},
   132  
   133  //字节片、字符串
   134  	{val: []byte{}, output: "80"},
   135  	{val: []byte{0x7E}, output: "7E"},
   136  	{val: []byte{0x7F}, output: "7F"},
   137  	{val: []byte{0x80}, output: "8180"},
   138  	{val: []byte{1, 2, 3}, output: "83010203"},
   139  
   140  	{val: []namedByteType{1, 2, 3}, output: "83010203"},
   141  	{val: [...]namedByteType{1, 2, 3}, output: "83010203"},
   142  
   143  	{val: "", output: "80"},
   144  	{val: "\x7E", output: "7E"},
   145  	{val: "\x7F", output: "7F"},
   146  	{val: "\x80", output: "8180"},
   147  	{val: "dog", output: "83646F67"},
   148  	{
   149  		val:    "Lorem ipsum dolor sit amet, consectetur adipisicing eli",
   150  		output: "B74C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E7365637465747572206164697069736963696E6720656C69",
   151  	},
   152  	{
   153  		val:    "Lorem ipsum dolor sit amet, consectetur adipisicing elit",
   154  		output: "B8384C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E7365637465747572206164697069736963696E6720656C6974",
   155  	},
   156  	{
   157  		val:    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat",
   158  		output: "B904004C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E73656374657475722061646970697363696E6720656C69742E20437572616269747572206D6175726973206D61676E612C20737573636970697420736564207665686963756C61206E6F6E2C20696163756C697320666175636962757320746F72746F722E2050726F696E20737573636970697420756C74726963696573206D616C6573756164612E204475697320746F72746F7220656C69742C2064696374756D2071756973207472697374697175652065752C20756C7472696365732061742072697375732E204D6F72626920612065737420696D70657264696574206D6920756C6C616D636F7270657220616C6971756574207375736369706974206E6563206C6F72656D2E2041656E65616E2071756973206C656F206D6F6C6C69732C2076756C70757461746520656C6974207661726975732C20636F6E73657175617420656E696D2E204E756C6C6120756C74726963657320747572706973206A7573746F2C20657420706F73756572652075726E6120636F6E7365637465747572206E65632E2050726F696E206E6F6E20636F6E76616C6C6973206D657475732E20446F6E65632074656D706F7220697073756D20696E206D617572697320636F6E67756520736F6C6C696369747564696E2E20566573746962756C756D20616E746520697073756D207072696D697320696E206661756369627573206F726369206C756374757320657420756C74726963657320706F737565726520637562696C69612043757261653B2053757370656E646973736520636F6E76616C6C69732073656D2076656C206D617373612066617563696275732C2065676574206C6163696E6961206C616375732074656D706F722E204E756C6C61207175697320756C747269636965732070757275732E2050726F696E20617563746F722072686F6E637573206E69626820636F6E64696D656E74756D206D6F6C6C69732E20416C697175616D20636F6E73657175617420656E696D206174206D65747573206C75637475732C206120656C656966656E6420707572757320656765737461732E20437572616269747572206174206E696268206D657475732E204E616D20626962656E64756D2C206E6571756520617420617563746F72207472697374697175652C206C6F72656D206C696265726F20616C697175657420617263752C206E6F6E20696E74657264756D2074656C6C7573206C65637475732073697420616D65742065726F732E20437261732072686F6E6375732C206D65747573206163206F726E617265206375727375732C20646F6C6F72206A7573746F20756C747269636573206D657475732C20617420756C6C616D636F7270657220766F6C7574706174",
   159  	},
   160  
   161  //片
   162  	{val: []uint{}, output: "C0"},
   163  	{val: []uint{1, 2, 3}, output: "C3010203"},
   164  	{
   165  //[答],[答],[答],[答],[答]]
   166  		val:    []interface{}{[]interface{}{}, [][]interface{}{{}}, []interface{}{[]interface{}{}, [][]interface{}{{}}}},
   167  		output: "C7C0C1C0C3C0C1C0",
   168  	},
   169  	{
   170  		val:    []string{"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo"},
   171  		output: "F83C836161618362626283636363836464648365656583666666836767678368686883696969836A6A6A836B6B6B836C6C6C836D6D6D836E6E6E836F6F6F",
   172  	},
   173  	{
   174  		val:    []interface{}{uint(1), uint(0xFFFFFF), []interface{}{[]uint{4, 5, 5}}, "abc"},
   175  		output: "CE0183FFFFFFC4C304050583616263",
   176  	},
   177  	{
   178  		val: [][]string{
   179  			{"asdf", "qwer", "zxcv"},
   180  			{"asdf", "qwer", "zxcv"},
   181  			{"asdf", "qwer", "zxcv"},
   182  			{"asdf", "qwer", "zxcv"},
   183  			{"asdf", "qwer", "zxcv"},
   184  			{"asdf", "qwer", "zxcv"},
   185  			{"asdf", "qwer", "zxcv"},
   186  			{"asdf", "qwer", "zxcv"},
   187  			{"asdf", "qwer", "zxcv"},
   188  			{"asdf", "qwer", "zxcv"},
   189  			{"asdf", "qwer", "zxcv"},
   190  			{"asdf", "qwer", "zxcv"},
   191  			{"asdf", "qwer", "zxcv"},
   192  			{"asdf", "qwer", "zxcv"},
   193  			{"asdf", "qwer", "zxcv"},
   194  			{"asdf", "qwer", "zxcv"},
   195  			{"asdf", "qwer", "zxcv"},
   196  			{"asdf", "qwer", "zxcv"},
   197  			{"asdf", "qwer", "zxcv"},
   198  			{"asdf", "qwer", "zxcv"},
   199  			{"asdf", "qwer", "zxcv"},
   200  			{"asdf", "qwer", "zxcv"},
   201  			{"asdf", "qwer", "zxcv"},
   202  			{"asdf", "qwer", "zxcv"},
   203  			{"asdf", "qwer", "zxcv"},
   204  			{"asdf", "qwer", "zxcv"},
   205  			{"asdf", "qwer", "zxcv"},
   206  			{"asdf", "qwer", "zxcv"},
   207  			{"asdf", "qwer", "zxcv"},
   208  			{"asdf", "qwer", "zxcv"},
   209  			{"asdf", "qwer", "zxcv"},
   210  			{"asdf", "qwer", "zxcv"},
   211  		},
   212  		output: "F90200CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376",
   213  	},
   214  
   215  //RAW值
   216  	{val: RawValue(unhex("01")), output: "01"},
   217  	{val: RawValue(unhex("82FFFF")), output: "82FFFF"},
   218  	{val: []RawValue{unhex("01"), unhex("02")}, output: "C20102"},
   219  
   220  //结构体
   221  	{val: simplestruct{}, output: "C28080"},
   222  	{val: simplestruct{A: 3, B: "foo"}, output: "C50383666F6F"},
   223  	{val: &recstruct{5, nil}, output: "C205C0"},
   224  	{val: &recstruct{5, &recstruct{4, &recstruct{3, nil}}}, output: "C605C404C203C0"},
   225  	{val: &tailRaw{A: 1, Tail: []RawValue{unhex("02"), unhex("03")}}, output: "C3010203"},
   226  	{val: &tailRaw{A: 1, Tail: []RawValue{unhex("02")}}, output: "C20102"},
   227  	{val: &tailRaw{A: 1, Tail: []RawValue{}}, output: "C101"},
   228  	{val: &tailRaw{A: 1, Tail: nil}, output: "C101"},
   229  	{val: &hasIgnoredField{A: 1, B: 2, C: 3}, output: "C20103"},
   230  
   231  //零
   232  	{val: (*uint)(nil), output: "80"},
   233  	{val: (*string)(nil), output: "80"},
   234  	{val: (*[]byte)(nil), output: "80"},
   235  	{val: (*[10]byte)(nil), output: "80"},
   236  	{val: (*big.Int)(nil), output: "80"},
   237  	{val: (*[]string)(nil), output: "C0"},
   238  	{val: (*[10]string)(nil), output: "C0"},
   239  	{val: (*[]interface{})(nil), output: "C0"},
   240  	{val: (*[]struct{ uint })(nil), output: "C0"},
   241  	{val: (*interface{})(nil), output: "C0"},
   242  
   243  //界面
   244  {val: []io.Reader{reader}, output: "C3C20102"}, //包含的值是结构
   245  
   246  //编码器
   247  	{val: (*testEncoder)(nil), output: "00000000"},
   248  	{val: &testEncoder{}, output: "00010001000100010001"},
   249  	{val: &testEncoder{errors.New("test error")}, error: "test error"},
   250  //验证是否为调用了指针方法testencoder.encoderlp
   251  //可寻址非指针值。
   252  	{val: &struct{ TE testEncoder }{testEncoder{}}, output: "CA00010001000100010001"},
   253  	{val: &struct{ TE testEncoder }{testEncoder{errors.New("test error")}}, error: "test error"},
   254  //验证非可寻址非指针编码器的错误
   255  	{val: testEncoder{}, error: "rlp: game over: unadressable value of type rlp.testEncoder, EncodeRLP is pointer method"},
   256  //验证[]字节的特殊情况
   257  	{val: []byteEncoder{0, 1, 2, 3, 4}, output: "C5C0C0C0C0C0"},
   258  }
   259  
   260  func runEncTests(t *testing.T, f func(val interface{}) ([]byte, error)) {
   261  	for i, test := range encTests {
   262  		output, err := f(test.val)
   263  		if err != nil && test.error == "" {
   264  			t.Errorf("test %d: unexpected error: %v\nvalue %#v\ntype %T",
   265  				i, err, test.val, test.val)
   266  			continue
   267  		}
   268  		if test.error != "" && fmt.Sprint(err) != test.error {
   269  			t.Errorf("test %d: error mismatch\ngot   %v\nwant  %v\nvalue %#v\ntype  %T",
   270  				i, err, test.error, test.val, test.val)
   271  			continue
   272  		}
   273  		if err == nil && !bytes.Equal(output, unhex(test.output)) {
   274  			t.Errorf("test %d: output mismatch:\ngot   %X\nwant  %s\nvalue %#v\ntype  %T",
   275  				i, output, test.output, test.val, test.val)
   276  		}
   277  	}
   278  }
   279  
   280  func TestEncode(t *testing.T) {
   281  	runEncTests(t, func(val interface{}) ([]byte, error) {
   282  		b := new(bytes.Buffer)
   283  		err := Encode(b, val)
   284  		return b.Bytes(), err
   285  	})
   286  }
   287  
   288  func TestEncodeToBytes(t *testing.T) {
   289  	runEncTests(t, EncodeToBytes)
   290  }
   291  
   292  func TestEncodeToReader(t *testing.T) {
   293  	runEncTests(t, func(val interface{}) ([]byte, error) {
   294  		_, r, err := EncodeToReader(val)
   295  		if err != nil {
   296  			return nil, err
   297  		}
   298  		return ioutil.ReadAll(r)
   299  	})
   300  }
   301  
   302  func TestEncodeToReaderPiecewise(t *testing.T) {
   303  	runEncTests(t, func(val interface{}) ([]byte, error) {
   304  		size, r, err := EncodeToReader(val)
   305  		if err != nil {
   306  			return nil, err
   307  		}
   308  
   309  //逐段读取输出
   310  		output := make([]byte, size)
   311  		for start, end := 0, 0; start < size; start = end {
   312  			if remaining := size - start; remaining < 3 {
   313  				end += remaining
   314  			} else {
   315  				end = start + 3
   316  			}
   317  			n, err := r.Read(output[start:end])
   318  			end = start + n
   319  			if err == io.EOF {
   320  				break
   321  			} else if err != nil {
   322  				return nil, err
   323  			}
   324  		}
   325  		return output, nil
   326  	})
   327  }
   328  
   329  //这是一个回归测试,用于验证加密程序
   330  //仅将其encbuf返回池一次。
   331  func TestEncodeToReaderReturnToPool(t *testing.T) {
   332  	buf := make([]byte, 50)
   333  	wg := new(sync.WaitGroup)
   334  	for i := 0; i < 5; i++ {
   335  		wg.Add(1)
   336  		go func() {
   337  			for i := 0; i < 1000; i++ {
   338  				_, r, _ := EncodeToReader("foo")
   339  				ioutil.ReadAll(r)
   340  				r.Read(buf)
   341  				r.Read(buf)
   342  				r.Read(buf)
   343  				r.Read(buf)
   344  			}
   345  			wg.Done()
   346  		}()
   347  	}
   348  	wg.Wait()
   349  }