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  }