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 }