github.com/chrislusf/greenpack@v3.7.1-0.20170911073826-ad5bd10b7c47+incompatible/msgp/read_test.go (about) 1 package msgp 2 3 import ( 4 "bytes" 5 "io" 6 "math" 7 "math/rand" 8 "reflect" 9 "testing" 10 "time" 11 ) 12 13 func TestSanity(t *testing.T) { 14 if !isfixint(0) { 15 t.Fatal("WUT.") 16 } 17 } 18 19 func TestReadIntf(t *testing.T) { 20 // NOTE: if you include cases 21 // with, say, int32s, the test 22 // will fail, b/c integers are 23 // always read out as int64, and 24 // unsigned integers as uint64 25 26 var testCases = []interface{}{ 27 float64(128.032), 28 float32(9082.092), 29 int64(-40), 30 uint64(9082981), 31 time.Now().Round(0), // Round(0) will strip off the monotone part of the go1.9 time. 32 "hello!", 33 []byte("hello!"), 34 map[string]interface{}{ 35 "thing-1": "thing-1-value", 36 "thing-2": int64(800), 37 "thing-3": []byte("some inner bytes..."), 38 "thing-4": false, 39 }, 40 } 41 42 var buf bytes.Buffer 43 var v interface{} 44 dec := NewReader(&buf) 45 enc := NewWriter(&buf) 46 47 for i, ts := range testCases { 48 buf.Reset() 49 err := enc.WriteIntf(ts) 50 if err != nil { 51 t.Errorf("Test case %d: %s", i, err) 52 continue 53 } 54 err = enc.Flush() 55 if err != nil { 56 t.Fatal(err) 57 } 58 v, err = dec.ReadIntf() 59 if err != nil { 60 t.Errorf("Test case: %d: %s", i, err) 61 } 62 if !reflect.DeepEqual(v, ts) { 63 t.Errorf("'%v' in; '%v' out", ts, v) 64 } 65 } 66 67 } 68 69 func TestReadMapHeader(t *testing.T) { 70 tests := []struct { 71 Sz uint32 72 }{ 73 {0}, 74 {1}, 75 {tuint16}, 76 {tuint32}, 77 } 78 79 var buf bytes.Buffer 80 var sz uint32 81 var err error 82 wr := NewWriter(&buf) 83 rd := NewReader(&buf) 84 for i, test := range tests { 85 buf.Reset() 86 err = wr.WriteMapHeader(test.Sz) 87 if err != nil { 88 t.Fatal(err) 89 } 90 err = wr.Flush() 91 if err != nil { 92 t.Fatal(err) 93 } 94 sz, err = rd.ReadMapHeader() 95 if err != nil { 96 t.Errorf("Test case %d: got error %s", i, err) 97 } 98 if sz != test.Sz { 99 t.Errorf("Test case %d: wrote size %d; got size %d", i, test.Sz, sz) 100 } 101 } 102 } 103 104 func BenchmarkReadMapHeader(b *testing.B) { 105 sizes := []uint32{0, 1, tuint16, tuint32} 106 data := make([]byte, 0, len(sizes)*5) 107 for _, d := range sizes { 108 data = AppendMapHeader(data, d) 109 } 110 rd := NewReader(NewEndlessReader(data, b)) 111 b.SetBytes(int64(len(data) / len(sizes))) 112 b.ReportAllocs() 113 b.ResetTimer() 114 for i := 0; i < b.N; i++ { 115 rd.ReadMapHeader() 116 } 117 } 118 119 func TestReadArrayHeader(t *testing.T) { 120 tests := []struct { 121 Sz uint32 122 }{ 123 {0}, 124 {1}, 125 {tuint16}, 126 {tuint32}, 127 } 128 129 var buf bytes.Buffer 130 var sz uint32 131 var err error 132 wr := NewWriter(&buf) 133 rd := NewReader(&buf) 134 for i, test := range tests { 135 buf.Reset() 136 err = wr.WriteArrayHeader(test.Sz) 137 if err != nil { 138 t.Fatal(err) 139 } 140 err = wr.Flush() 141 if err != nil { 142 t.Fatal(err) 143 } 144 sz, err = rd.ReadArrayHeader() 145 if err != nil { 146 t.Errorf("Test case %d: got error %s", i, err) 147 } 148 if sz != test.Sz { 149 t.Errorf("Test case %d: wrote size %d; got size %d", i, test.Sz, sz) 150 } 151 } 152 } 153 154 func BenchmarkReadArrayHeader(b *testing.B) { 155 sizes := []uint32{0, 1, tuint16, tuint32} 156 data := make([]byte, 0, len(sizes)*5) 157 for _, d := range sizes { 158 data = AppendArrayHeader(data, d) 159 } 160 rd := NewReader(NewEndlessReader(data, b)) 161 b.ReportAllocs() 162 b.SetBytes(int64(len(data) / len(sizes))) 163 b.ResetTimer() 164 for i := 0; i < b.N; i++ { 165 rd.ReadArrayHeader() 166 } 167 } 168 169 func TestReadNil(t *testing.T) { 170 var buf bytes.Buffer 171 wr := NewWriter(&buf) 172 rd := NewReader(&buf) 173 174 wr.WriteNil() 175 wr.Flush() 176 err := rd.ReadNil() 177 if err != nil { 178 t.Fatal(err) 179 } 180 } 181 182 func BenchmarkReadNil(b *testing.B) { 183 data := AppendNil(nil) 184 rd := NewReader(NewEndlessReader(data, b)) 185 b.ReportAllocs() 186 b.SetBytes(1) 187 b.ResetTimer() 188 for i := 0; i < b.N; i++ { 189 err := rd.ReadNil() 190 if err != nil { 191 b.Fatal(err) 192 } 193 } 194 } 195 196 func TestReadFloat64(t *testing.T) { 197 var buf bytes.Buffer 198 wr := NewWriter(&buf) 199 rd := NewReader(&buf) 200 201 for i := 0; i < 100; i++ { 202 buf.Reset() 203 204 flt := (rand.Float64() - 0.5) * math.MaxFloat64 205 err := wr.WriteFloat64(flt) 206 if err != nil { 207 t.Fatal(err) 208 } 209 err = wr.Flush() 210 if err != nil { 211 t.Fatal(err) 212 } 213 out, err := rd.ReadFloat64() 214 if err != nil { 215 t.Errorf("Error reading %f: %s", flt, err) 216 continue 217 } 218 219 if out != flt { 220 t.Errorf("Put in %f but got out %f", flt, out) 221 } 222 } 223 } 224 225 func BenchmarkReadFloat64(b *testing.B) { 226 fs := []float64{rand.Float64(), rand.Float64(), rand.Float64(), rand.Float64()} 227 data := make([]byte, 0, 9*len(fs)) 228 for _, f := range fs { 229 data = AppendFloat64(data, f) 230 } 231 rd := NewReader(NewEndlessReader(data, b)) 232 b.SetBytes(9) 233 b.ReportAllocs() 234 b.ResetTimer() 235 for i := 0; i < b.N; i++ { 236 _, err := rd.ReadFloat64() 237 if err != nil { 238 b.Fatal(err) 239 } 240 } 241 } 242 243 func TestReadFloat32(t *testing.T) { 244 var buf bytes.Buffer 245 wr := NewWriter(&buf) 246 rd := NewReader(&buf) 247 248 for i := 0; i < 10000; i++ { 249 buf.Reset() 250 251 flt := (rand.Float32() - 0.5) * math.MaxFloat32 252 err := wr.WriteFloat32(flt) 253 if err != nil { 254 t.Fatal(err) 255 } 256 err = wr.Flush() 257 if err != nil { 258 t.Fatal(err) 259 } 260 out, err := rd.ReadFloat32() 261 if err != nil { 262 t.Errorf("Error reading %f: %s", flt, err) 263 continue 264 } 265 266 if out != flt { 267 t.Errorf("Put in %f but got out %f", flt, out) 268 } 269 } 270 } 271 272 func BenchmarkReadFloat32(b *testing.B) { 273 fs := []float32{rand.Float32(), rand.Float32(), rand.Float32(), rand.Float32()} 274 data := make([]byte, 0, 5*len(fs)) 275 for _, f := range fs { 276 data = AppendFloat32(data, f) 277 } 278 rd := NewReader(NewEndlessReader(data, b)) 279 b.SetBytes(5) 280 b.ReportAllocs() 281 b.ResetTimer() 282 for i := 0; i < b.N; i++ { 283 _, err := rd.ReadFloat32() 284 if err != nil { 285 b.Fatal(err) 286 } 287 } 288 } 289 290 func TestReadInt64(t *testing.T) { 291 var buf bytes.Buffer 292 wr := NewWriter(&buf) 293 rd := NewReader(&buf) 294 295 ints := []int64{-100000, -5000, -5, 0, 8, 240, int64(tuint16), int64(tuint32), int64(tuint64)} 296 297 for i, num := range ints { 298 buf.Reset() 299 300 err := wr.WriteInt64(num) 301 if err != nil { 302 t.Fatal(err) 303 } 304 err = wr.Flush() 305 if err != nil { 306 t.Fatal(err) 307 } 308 out, err := rd.ReadInt64() 309 if err != nil { 310 t.Fatal(err) 311 } 312 if out != num { 313 t.Errorf("Test case %d: put %d in and got %d out", i, num, out) 314 } 315 } 316 } 317 318 func BenchmarkReadInt64(b *testing.B) { 319 is := []int64{0, 1, 65000, rand.Int63()} 320 data := make([]byte, 0, 9*len(is)) 321 for _, n := range is { 322 data = AppendInt64(data, n) 323 } 324 rd := NewReader(NewEndlessReader(data, b)) 325 b.SetBytes(int64(len(data) / len(is))) 326 b.ReportAllocs() 327 b.ResetTimer() 328 for i := 0; i < b.N; i++ { 329 _, err := rd.ReadInt64() 330 if err != nil { 331 b.Fatal(err) 332 } 333 } 334 } 335 336 func TestReadUint64(t *testing.T) { 337 var buf bytes.Buffer 338 wr := NewWriter(&buf) 339 rd := NewReader(&buf) 340 341 ints := []uint64{0, 8, 240, uint64(tuint16), uint64(tuint32), uint64(tuint64)} 342 343 for i, num := range ints { 344 buf.Reset() 345 346 err := wr.WriteUint64(num) 347 if err != nil { 348 t.Fatal(err) 349 } 350 err = wr.Flush() 351 if err != nil { 352 t.Fatal(err) 353 } 354 out, err := rd.ReadUint64() 355 if out != num { 356 t.Errorf("Test case %d: put %d in and got %d out", i, num, out) 357 } 358 } 359 } 360 361 func BenchmarkReadUint64(b *testing.B) { 362 us := []uint64{0, 1, 10000, uint64(rand.Uint32() * 4)} 363 data := make([]byte, 0, 9*len(us)) 364 for _, n := range us { 365 data = AppendUint64(data, n) 366 } 367 rd := NewReader(NewEndlessReader(data, b)) 368 b.SetBytes(int64(len(data) / len(us))) 369 b.ReportAllocs() 370 b.ResetTimer() 371 for i := 0; i < b.N; i++ { 372 _, err := rd.ReadUint64() 373 if err != nil { 374 b.Fatal(err) 375 } 376 } 377 } 378 379 func TestReadBytes(t *testing.T) { 380 var buf bytes.Buffer 381 wr := NewWriter(&buf) 382 rd := NewReader(&buf) 383 384 sizes := []int{0, 1, 225, int(tuint32)} 385 var scratch []byte 386 for i, size := range sizes { 387 buf.Reset() 388 bts := RandBytes(size) 389 390 err := wr.WriteBytes(bts) 391 if err != nil { 392 t.Fatal(err) 393 } 394 err = wr.Flush() 395 if err != nil { 396 t.Fatal(err) 397 } 398 399 out, err := rd.ReadBytes(scratch) 400 if err != nil { 401 t.Errorf("test case %d: %s", i, err) 402 continue 403 } 404 405 if !bytes.Equal(bts, out) { 406 t.Errorf("test case %d: Bytes not equal.", i) 407 } 408 409 } 410 } 411 412 func benchBytes(size uint32, b *testing.B) { 413 data := make([]byte, 0, size+5) 414 data = AppendBytes(data, RandBytes(int(size))) 415 416 rd := NewReader(NewEndlessReader(data, b)) 417 b.SetBytes(int64(len(data))) 418 b.ReportAllocs() 419 b.ResetTimer() 420 var scratch []byte 421 var err error 422 for i := 0; i < b.N; i++ { 423 scratch, err = rd.ReadBytes(scratch) 424 if err != nil { 425 b.Fatal(err) 426 } 427 } 428 } 429 430 func BenchmarkRead16Bytes(b *testing.B) { 431 benchBytes(16, b) 432 } 433 434 func BenchmarkRead256Bytes(b *testing.B) { 435 benchBytes(256, b) 436 } 437 438 // This particular case creates 439 // an object larger than the default 440 // read buffer size, so it's a decent 441 // indicator of worst-case performance. 442 func BenchmarkRead2048Bytes(b *testing.B) { 443 benchBytes(2048, b) 444 } 445 446 func TestReadString(t *testing.T) { 447 var buf bytes.Buffer 448 wr := NewWriter(&buf) 449 rd := NewReader(&buf) 450 451 sizes := []int{0, 1, 225, int(math.MaxUint16 + 5)} 452 for i, size := range sizes { 453 buf.Reset() 454 in := string(RandBytes(size)) 455 456 err := wr.WriteString(in) 457 if err != nil { 458 t.Fatal(err) 459 } 460 err = wr.Flush() 461 if err != nil { 462 t.Fatal(err) 463 } 464 465 out, err := rd.ReadString() 466 if err != nil { 467 t.Errorf("test case %d: %s", i, err) 468 } 469 if out != in { 470 t.Errorf("test case %d: strings not equal.", i) 471 t.Errorf("string (len = %d) in; string (len = %d) out", size, len(out)) 472 } 473 474 } 475 } 476 477 func benchString(size uint32, b *testing.B) { 478 str := string(RandBytes(int(size))) 479 data := make([]byte, 0, len(str)+5) 480 data = AppendString(data, str) 481 rd := NewReader(NewEndlessReader(data, b)) 482 b.SetBytes(int64(len(data))) 483 b.ReportAllocs() 484 b.ResetTimer() 485 for i := 0; i < b.N; i++ { 486 _, err := rd.ReadString() 487 if err != nil { 488 b.Fatal(err) 489 } 490 } 491 } 492 493 func benchStringAsBytes(size uint32, b *testing.B) { 494 str := string(RandBytes(int(size))) 495 data := make([]byte, 0, len(str)+5) 496 data = AppendString(data, str) 497 rd := NewReader(NewEndlessReader(data, b)) 498 b.SetBytes(int64(len(data))) 499 b.ReportAllocs() 500 b.ResetTimer() 501 var scratch []byte 502 var err error 503 for i := 0; i < b.N; i++ { 504 scratch, err = rd.ReadStringAsBytes(scratch) 505 if err != nil { 506 b.Fatal(err) 507 } 508 } 509 } 510 511 func BenchmarkRead16StringAsBytes(b *testing.B) { 512 benchStringAsBytes(16, b) 513 } 514 515 func BenchmarkRead256StringAsBytes(b *testing.B) { 516 benchStringAsBytes(256, b) 517 } 518 519 func BenchmarkRead16String(b *testing.B) { 520 benchString(16, b) 521 } 522 523 func BenchmarkRead256String(b *testing.B) { 524 benchString(256, b) 525 } 526 527 func TestReadComplex64(t *testing.T) { 528 var buf bytes.Buffer 529 wr := NewWriter(&buf) 530 rd := NewReader(&buf) 531 532 for i := 0; i < 100; i++ { 533 buf.Reset() 534 f := complex(rand.Float32()*math.MaxFloat32, rand.Float32()*math.MaxFloat32) 535 536 wr.WriteComplex64(f) 537 err := wr.Flush() 538 if err != nil { 539 t.Fatal(err) 540 } 541 542 out, err := rd.ReadComplex64() 543 if err != nil { 544 t.Error(err) 545 continue 546 } 547 548 if out != f { 549 t.Errorf("Wrote %f; read %f", f, out) 550 } 551 552 } 553 } 554 555 func BenchmarkReadComplex64(b *testing.B) { 556 f := complex(rand.Float32(), rand.Float32()) 557 data := AppendComplex64(nil, f) 558 rd := NewReader(NewEndlessReader(data, b)) 559 b.SetBytes(int64(len(data))) 560 b.ReportAllocs() 561 b.ResetTimer() 562 for i := 0; i < b.N; i++ { 563 _, err := rd.ReadComplex64() 564 if err != nil { 565 b.Fatal(err) 566 } 567 } 568 } 569 570 func TestReadComplex128(t *testing.T) { 571 var buf bytes.Buffer 572 wr := NewWriter(&buf) 573 rd := NewReader(&buf) 574 575 for i := 0; i < 10; i++ { 576 buf.Reset() 577 f := complex(rand.Float64()*math.MaxFloat64, rand.Float64()*math.MaxFloat64) 578 579 wr.WriteComplex128(f) 580 err := wr.Flush() 581 if err != nil { 582 t.Fatal(err) 583 } 584 585 out, err := rd.ReadComplex128() 586 if err != nil { 587 t.Error(err) 588 continue 589 } 590 if out != f { 591 t.Errorf("Wrote %f; read %f", f, out) 592 } 593 594 } 595 } 596 597 func BenchmarkReadComplex128(b *testing.B) { 598 f := complex(rand.Float64(), rand.Float64()) 599 data := AppendComplex128(nil, f) 600 rd := NewReader(NewEndlessReader(data, b)) 601 b.SetBytes(int64(len(data))) 602 b.ReportAllocs() 603 b.ResetTimer() 604 for i := 0; i < b.N; i++ { 605 _, err := rd.ReadComplex128() 606 if err != nil { 607 b.Fatal(err) 608 } 609 } 610 } 611 612 func TestTime(t *testing.T) { 613 var buf bytes.Buffer 614 now := time.Now().Round(0) // Round(0) will strip the monotone clock. 615 en := NewWriter(&buf) 616 dc := NewReader(&buf) 617 618 err := en.WriteTime(now) 619 if err != nil { 620 t.Fatal(err) 621 } 622 err = en.Flush() 623 if err != nil { 624 t.Fatal(err) 625 } 626 627 out, err := dc.ReadTime() 628 if err != nil { 629 t.Fatal(err) 630 } 631 632 // check for equivalence 633 if !now.Equal(out) { 634 t.Fatalf("%s in; %s out", now, out) 635 } 636 637 // check for time.Local zone 638 if now != out { 639 t.Error("returned time.Time not set to time.Local") 640 } 641 } 642 643 func BenchmarkReadTime(b *testing.B) { 644 t := time.Now() 645 data := AppendTime(nil, t) 646 rd := NewReader(NewEndlessReader(data, b)) 647 b.SetBytes(int64(len(data))) 648 b.ReportAllocs() 649 b.ResetTimer() 650 for i := 0; i < b.N; i++ { 651 _, err := rd.ReadTime() 652 if err != nil { 653 b.Fatal(err) 654 } 655 } 656 } 657 658 func TestSkip(t *testing.T) { 659 var buf bytes.Buffer 660 wr := NewWriter(&buf) 661 rd := NewReader(&buf) 662 663 wr.WriteMapHeader(4) 664 wr.WriteString("key_1") 665 wr.WriteBytes([]byte("value_1")) 666 wr.WriteString("key_2") 667 wr.WriteFloat64(2.0) 668 wr.WriteString("key_3") 669 wr.WriteComplex128(3.0i) 670 wr.WriteString("key_4") 671 wr.WriteInt64(49080432189) 672 wr.Flush() 673 674 // this should skip the whole map 675 err := rd.Skip() 676 if err != nil { 677 t.Fatal(err) 678 } 679 680 tp, err := rd.NextType() 681 if err != io.EOF { 682 t.Errorf("expected %q; got %q", io.EOF, err) 683 t.Errorf("returned type %q", tp) 684 } 685 686 } 687 688 func BenchmarkSkip(b *testing.B) { 689 var buf bytes.Buffer 690 en := NewWriter(&buf) 691 en.WriteMapHeader(6) 692 693 en.WriteString("thing_one") 694 en.WriteString("value_one") 695 696 en.WriteString("thing_two") 697 en.WriteFloat64(3.14159) 698 699 en.WriteString("some_bytes") 700 en.WriteBytes([]byte("nkl4321rqw908vxzpojnlk2314rqew098-s09123rdscasd")) 701 702 en.WriteString("the_time") 703 en.WriteTime(time.Now()) 704 705 en.WriteString("what?") 706 en.WriteBool(true) 707 708 en.WriteString("ext") 709 en.WriteExtension(&RawExtension{Type: 55, Data: []byte("raw data!!!")}) 710 en.Flush() 711 712 bts := buf.Bytes() 713 b.SetBytes(int64(len(bts))) 714 b.ReportAllocs() 715 b.ResetTimer() 716 717 rd := NewReader(NewEndlessReader(bts, b)) 718 for i := 0; i < b.N; i++ { 719 err := rd.Skip() 720 if err != nil { 721 b.Fatal(err) 722 } 723 } 724 }