github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/rlp/encode_test.go (about)

     1  // Copyright 2014 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package rlp
    18  
    19  import (
    20  	"bytes"
    21  	"errors"
    22  	"fmt"
    23  	"io"
    24  	"io/ioutil"
    25  	"math/big"
    26  	"sync"
    27  	"testing"
    28  
    29  	"github.com/sixexorg/magnetic-ring/common"
    30  )
    31  
    32  type testEncoder struct {
    33  	err error
    34  }
    35  
    36  func (e *testEncoder) EncodeRLP(w io.Writer) error {
    37  	if e == nil {
    38  		w.Write([]byte{0, 0, 0, 0})
    39  	} else if e.err != nil {
    40  		return e.err
    41  	} else {
    42  		w.Write([]byte{0, 1, 0, 1, 0, 1, 0, 1, 0, 1})
    43  	}
    44  	return nil
    45  }
    46  
    47  type byteEncoder byte
    48  
    49  func (e byteEncoder) EncodeRLP(w io.Writer) error {
    50  	w.Write(EmptyList)
    51  	return nil
    52  }
    53  
    54  type encodableReader struct {
    55  	A, B uint
    56  }
    57  
    58  func (e *encodableReader) Read(b []byte) (int, error) {
    59  	panic("called")
    60  }
    61  
    62  type namedByteType byte
    63  
    64  var (
    65  	_ = Encoder(&testEncoder{})
    66  	_ = Encoder(byteEncoder(0))
    67  
    68  	reader io.Reader = &encodableReader{1, 2}
    69  )
    70  
    71  type encTest struct {
    72  	val           interface{}
    73  	output, error string
    74  }
    75  
    76  var encTests = []encTest{
    77  	// booleans
    78  	{val: true, output: "01"},
    79  	{val: false, output: "80"},
    80  
    81  	// integers
    82  	{val: uint32(0), output: "80"},
    83  	{val: uint32(127), output: "7F"},
    84  	{val: uint32(128), output: "8180"},
    85  	{val: uint32(256), output: "820100"},
    86  	{val: uint32(1024), output: "820400"},
    87  	{val: uint32(0xFFFFFF), output: "83FFFFFF"},
    88  	{val: uint32(0xFFFFFFFF), output: "84FFFFFFFF"},
    89  	{val: uint64(0xFFFFFFFF), output: "84FFFFFFFF"},
    90  	{val: uint64(0xFFFFFFFFFF), output: "85FFFFFFFFFF"},
    91  	{val: uint64(0xFFFFFFFFFFFF), output: "86FFFFFFFFFFFF"},
    92  	{val: uint64(0xFFFFFFFFFFFFFF), output: "87FFFFFFFFFFFFFF"},
    93  	{val: uint64(0xFFFFFFFFFFFFFFFF), output: "88FFFFFFFFFFFFFFFF"},
    94  
    95  	// big integers (should match uint for small values)
    96  	{val: big.NewInt(0), output: "80"},
    97  	{val: big.NewInt(1), output: "01"},
    98  	{val: big.NewInt(127), output: "7F"},
    99  	{val: big.NewInt(128), output: "8180"},
   100  	{val: big.NewInt(256), output: "820100"},
   101  	{val: big.NewInt(1024), output: "820400"},
   102  	{val: big.NewInt(0xFFFFFF), output: "83FFFFFF"},
   103  	{val: big.NewInt(0xFFFFFFFF), output: "84FFFFFFFF"},
   104  	{val: big.NewInt(0xFFFFFFFFFF), output: "85FFFFFFFFFF"},
   105  	{val: big.NewInt(0xFFFFFFFFFFFF), output: "86FFFFFFFFFFFF"},
   106  	{val: big.NewInt(0xFFFFFFFFFFFFFF), output: "87FFFFFFFFFFFFFF"},
   107  	{
   108  		val:    big.NewInt(0).SetBytes(unhex("102030405060708090A0B0C0D0E0F2")),
   109  		output: "8F102030405060708090A0B0C0D0E0F2",
   110  	},
   111  	{
   112  		val:    big.NewInt(0).SetBytes(unhex("0100020003000400050006000700080009000A000B000C000D000E01")),
   113  		output: "9C0100020003000400050006000700080009000A000B000C000D000E01",
   114  	},
   115  	{
   116  		val:    big.NewInt(0).SetBytes(unhex("010000000000000000000000000000000000000000000000000000000000000000")),
   117  		output: "A1010000000000000000000000000000000000000000000000000000000000000000",
   118  	},
   119  
   120  	// non-pointer big.Int
   121  	{val: *big.NewInt(0), output: "80"},
   122  	{val: *big.NewInt(0xFFFFFF), output: "83FFFFFF"},
   123  
   124  	// negative ints are not supported
   125  	{val: big.NewInt(-1), error: "rlp: cannot encode negative *big.Int"},
   126  
   127  	// byte slices, strings
   128  	{val: []byte{}, output: "80"},
   129  	{val: []byte{0x7E}, output: "7E"},
   130  	{val: []byte{0x7F}, output: "7F"},
   131  	{val: []byte{0x80}, output: "8180"},
   132  	{val: []byte{1, 2, 3}, output: "83010203"},
   133  
   134  	{val: []namedByteType{1, 2, 3}, output: "83010203"},
   135  	{val: [...]namedByteType{1, 2, 3}, output: "83010203"},
   136  
   137  	{val: "", output: "80"},
   138  	{val: "\x7E", output: "7E"},
   139  	{val: "\x7F", output: "7F"},
   140  	{val: "\x80", output: "8180"},
   141  	{val: "dog", output: "83646F67"},
   142  	{
   143  		val:    "Lorem ipsum dolor sit amet, consectetur adipisicing eli",
   144  		output: "B74C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E7365637465747572206164697069736963696E6720656C69",
   145  	},
   146  	{
   147  		val:    "Lorem ipsum dolor sit amet, consectetur adipisicing elit",
   148  		output: "B8384C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E7365637465747572206164697069736963696E6720656C6974",
   149  	},
   150  	{
   151  		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",
   152  		output: "B904004C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E73656374657475722061646970697363696E6720656C69742E20437572616269747572206D6175726973206D61676E612C20737573636970697420736564207665686963756C61206E6F6E2C20696163756C697320666175636962757320746F72746F722E2050726F696E20737573636970697420756C74726963696573206D616C6573756164612E204475697320746F72746F7220656C69742C2064696374756D2071756973207472697374697175652065752C20756C7472696365732061742072697375732E204D6F72626920612065737420696D70657264696574206D6920756C6C616D636F7270657220616C6971756574207375736369706974206E6563206C6F72656D2E2041656E65616E2071756973206C656F206D6F6C6C69732C2076756C70757461746520656C6974207661726975732C20636F6E73657175617420656E696D2E204E756C6C6120756C74726963657320747572706973206A7573746F2C20657420706F73756572652075726E6120636F6E7365637465747572206E65632E2050726F696E206E6F6E20636F6E76616C6C6973206D657475732E20446F6E65632074656D706F7220697073756D20696E206D617572697320636F6E67756520736F6C6C696369747564696E2E20566573746962756C756D20616E746520697073756D207072696D697320696E206661756369627573206F726369206C756374757320657420756C74726963657320706F737565726520637562696C69612043757261653B2053757370656E646973736520636F6E76616C6C69732073656D2076656C206D617373612066617563696275732C2065676574206C6163696E6961206C616375732074656D706F722E204E756C6C61207175697320756C747269636965732070757275732E2050726F696E20617563746F722072686F6E637573206E69626820636F6E64696D656E74756D206D6F6C6C69732E20416C697175616D20636F6E73657175617420656E696D206174206D65747573206C75637475732C206120656C656966656E6420707572757320656765737461732E20437572616269747572206174206E696268206D657475732E204E616D20626962656E64756D2C206E6571756520617420617563746F72207472697374697175652C206C6F72656D206C696265726F20616C697175657420617263752C206E6F6E20696E74657264756D2074656C6C7573206C65637475732073697420616D65742065726F732E20437261732072686F6E6375732C206D65747573206163206F726E617265206375727375732C20646F6C6F72206A7573746F20756C747269636573206D657475732C20617420756C6C616D636F7270657220766F6C7574706174",
   153  	},
   154  
   155  	// slices
   156  	{val: []uint{}, output: "C0"},
   157  	{val: []uint{1, 2, 3}, output: "C3010203"},
   158  	{
   159  		// [ [], [[]], [ [], [[]] ] ]
   160  		val:    []interface{}{[]interface{}{}, [][]interface{}{{}}, []interface{}{[]interface{}{}, [][]interface{}{{}}}},
   161  		output: "C7C0C1C0C3C0C1C0",
   162  	},
   163  	{
   164  		val:    []string{"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo"},
   165  		output: "F83C836161618362626283636363836464648365656583666666836767678368686883696969836A6A6A836B6B6B836C6C6C836D6D6D836E6E6E836F6F6F",
   166  	},
   167  	{
   168  		val:    []interface{}{uint(1), uint(0xFFFFFF), []interface{}{[]uint{4, 5, 5}}, "abc"},
   169  		output: "CE0183FFFFFFC4C304050583616263",
   170  	},
   171  	{
   172  		val: [][]string{
   173  			{"asdf", "qwer", "zxcv"},
   174  			{"asdf", "qwer", "zxcv"},
   175  			{"asdf", "qwer", "zxcv"},
   176  			{"asdf", "qwer", "zxcv"},
   177  			{"asdf", "qwer", "zxcv"},
   178  			{"asdf", "qwer", "zxcv"},
   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  		},
   206  		output: "F90200CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376",
   207  	},
   208  
   209  	// RawValue
   210  	{val: RawValue(unhex("01")), output: "01"},
   211  	{val: RawValue(unhex("82FFFF")), output: "82FFFF"},
   212  	{val: []RawValue{unhex("01"), unhex("02")}, output: "C20102"},
   213  
   214  	// structs
   215  	{val: simplestruct{}, output: "C28080"},
   216  	{val: simplestruct{A: 3, B: "foo"}, output: "C50383666F6F"},
   217  	{val: &recstruct{5, nil}, output: "C205C0"},
   218  	{val: &recstruct{5, &recstruct{4, &recstruct{3, nil}}}, output: "C605C404C203C0"},
   219  	{val: &tailRaw{A: 1, Tail: []RawValue{unhex("02"), unhex("03")}}, output: "C3010203"},
   220  	{val: &tailRaw{A: 1, Tail: []RawValue{unhex("02")}}, output: "C20102"},
   221  	{val: &tailRaw{A: 1, Tail: []RawValue{}}, output: "C101"},
   222  	{val: &tailRaw{A: 1, Tail: nil}, output: "C101"},
   223  	{val: &hasIgnoredField{A: 1, B: 2, C: 3}, output: "C20103"},
   224  
   225  	// nil
   226  	{val: (*uint)(nil), output: "80"},
   227  	{val: (*string)(nil), output: "80"},
   228  	{val: (*[]byte)(nil), output: "80"},
   229  	{val: (*[10]byte)(nil), output: "80"},
   230  	{val: (*big.Int)(nil), output: "80"},
   231  	{val: (*[]string)(nil), output: "C0"},
   232  	{val: (*[10]string)(nil), output: "C0"},
   233  	{val: (*[]interface{})(nil), output: "C0"},
   234  	{val: (*[]struct{ uint })(nil), output: "C0"},
   235  	{val: (*interface{})(nil), output: "C0"},
   236  
   237  	// interfaces
   238  	{val: []io.Reader{reader}, output: "C3C20102"}, // the contained value is a struct
   239  
   240  	// Encoder
   241  	{val: (*testEncoder)(nil), output: "00000000"},
   242  	{val: &testEncoder{}, output: "00010001000100010001"},
   243  	{val: &testEncoder{errors.New("test error")}, error: "test error"},
   244  	// verify that pointer method testEncoder.EncodeRLP is called for
   245  	// addressable non-pointer values.
   246  	{val: &struct{ TE testEncoder }{testEncoder{}}, output: "CA00010001000100010001"},
   247  	{val: &struct{ TE testEncoder }{testEncoder{errors.New("test error")}}, error: "test error"},
   248  	// verify the error for non-addressable non-pointer Encoder
   249  	{val: testEncoder{}, error: "rlp: game over: unadressable value of type rlp.testEncoder, EncodeRLP is pointer method"},
   250  	// verify the special case for []byte
   251  	{val: []byteEncoder{0, 1, 2, 3, 4}, output: "C5C0C0C0C0C0"},
   252  }
   253  
   254  func runEncTests(t *testing.T, f func(val interface{}) ([]byte, error)) {
   255  	for i, test := range encTests {
   256  		output, err := f(test.val)
   257  		if err != nil && test.error == "" {
   258  			t.Errorf("test %d: unexpected error: %v\nvalue %#v\ntype %T",
   259  				i, err, test.val, test.val)
   260  			continue
   261  		}
   262  		if test.error != "" && fmt.Sprint(err) != test.error {
   263  			t.Errorf("test %d: error mismatch\ngot   %v\nwant  %v\nvalue %#v\ntype  %T",
   264  				i, err, test.error, test.val, test.val)
   265  			continue
   266  		}
   267  		if err == nil && !bytes.Equal(output, unhex(test.output)) {
   268  			t.Errorf("test %d: output mismatch:\ngot   %X\nwant  %s\nvalue %#v\ntype  %T",
   269  				i, output, test.output, test.val, test.val)
   270  		}
   271  	}
   272  }
   273  
   274  func TestEncode(t *testing.T) {
   275  	runEncTests(t, func(val interface{}) ([]byte, error) {
   276  		b := new(bytes.Buffer)
   277  		err := Encode(b, val)
   278  		return b.Bytes(), err
   279  	})
   280  }
   281  
   282  func TestEncodeToBytes(t *testing.T) {
   283  	runEncTests(t, EncodeToBytes)
   284  }
   285  
   286  func TestEncodeToReader(t *testing.T) {
   287  	runEncTests(t, func(val interface{}) ([]byte, error) {
   288  		_, r, err := EncodeToReader(val)
   289  		if err != nil {
   290  			return nil, err
   291  		}
   292  		return ioutil.ReadAll(r)
   293  	})
   294  }
   295  
   296  func TestEncodeToReaderPiecewise(t *testing.T) {
   297  	runEncTests(t, func(val interface{}) ([]byte, error) {
   298  		size, r, err := EncodeToReader(val)
   299  		if err != nil {
   300  			return nil, err
   301  		}
   302  
   303  		// read output piecewise
   304  		output := make([]byte, size)
   305  		for start, end := 0, 0; start < size; start = end {
   306  			if remaining := size - start; remaining < 3 {
   307  				end += remaining
   308  			} else {
   309  				end = start + 3
   310  			}
   311  			n, err := r.Read(output[start:end])
   312  			end = start + n
   313  			if err == io.EOF {
   314  				break
   315  			} else if err != nil {
   316  				return nil, err
   317  			}
   318  		}
   319  		return output, nil
   320  	})
   321  }
   322  
   323  // This is a regression test verifying that encReader
   324  // returns its encbuf to the pool only once.
   325  func TestEncodeToReaderReturnToPool(t *testing.T) {
   326  	buf := make([]byte, 50)
   327  	wg := new(sync.WaitGroup)
   328  	for i := 0; i < 5; i++ {
   329  		wg.Add(1)
   330  		go func() {
   331  			for i := 0; i < 1000; i++ {
   332  				_, r, _ := EncodeToReader("foo")
   333  				ioutil.ReadAll(r)
   334  				r.Read(buf)
   335  				r.Read(buf)
   336  				r.Read(buf)
   337  				r.Read(buf)
   338  			}
   339  			wg.Done()
   340  		}()
   341  	}
   342  	wg.Wait()
   343  }
   344  
   345  type TxAmount struct {
   346  	Address common.Address
   347  	Amount  *big.Int
   348  }
   349  
   350  var txAmount TxAmounts
   351  
   352  type TxAmounts struct {
   353  	Tss []*TxAmount
   354  }
   355  
   356  func TestAAAA(t *testing.T) {
   357  	buff := new(bytes.Buffer)
   358  	err := Encode(buff, txAmount)
   359  	t.Log(err)
   360  	t.Log(len(buff.Bytes()))
   361  	t.Log(buff.Bytes())
   362  	var fs TxAmounts
   363  	err = Decode(bytes.NewReader(buff.Bytes()), &fs)
   364  	t.Log(err)
   365  	for _, v := range fs.Tss {
   366  
   367  		t.Log(v.Address.ToString(), v.Amount.String())
   368  	}
   369  
   370  	t.Log()
   371  }
   372  func TestEncodeAndDecode(t *testing.T) {
   373  	a := int(10)
   374  	buff := bytes.NewBuffer(nil)
   375  	err := Encode(buff, a)
   376  	if err != nil {
   377  		t.Error(err)
   378  		t.Fail()
   379  		return
   380  	}
   381  	var b int
   382  	err = Decode(buff, &b)
   383  	if err != nil {
   384  		t.Error(err)
   385  		t.Fail()
   386  		return
   387  	}
   388  	t.Log(b)
   389  
   390  }
   391  
   392  type Integer struct {
   393  	Age  int
   394  	Name string
   395  }
   396  
   397  func TestInteger(t *testing.T) {
   398  	m := make(map[string]*Integer)
   399  	m["1"] = &Integer{
   400  		Age:  10,
   401  		Name: "Jack",
   402  	}
   403  	m["2"] = &Integer{
   404  		Age:  20,
   405  		Name: "Peter",
   406  	}
   407  	buff := bytes.NewBuffer(nil)
   408  	err := Encode(buff, m)
   409  	if err != nil {
   410  		t.Error(err)
   411  		t.Fail()
   412  		return
   413  	}
   414  	/*var b *Integer
   415  	err = Decode(buff, &b)
   416  	if err != nil {
   417  		t.Error(err)
   418  		t.Fail()
   419  		return
   420  	}
   421  	t.Log(b)*/
   422  
   423  }