1package io_test
2
3import (
4	"encoding/binary"
5	"io/ioutil"
6	"math/rand"
7	"reflect"
8	"testing"
9	"time"
10
11	"github.com/gogo/protobuf/test"
12	example "github.com/gogo/protobuf/test/example"
13
14	"github.com/gogo/protobuf/io"
15)
16
17func BenchmarkUint32DelimWriterMarshaller(b *testing.B) {
18	w := io.NewUint32DelimitedWriter(ioutil.Discard, binary.BigEndian)
19	r := rand.New(rand.NewSource(time.Now().UnixNano()))
20	msg := example.NewPopulatedA(r, true)
21
22	for i := 0; i < b.N; i++ {
23		if err := w.WriteMsg(msg); err != nil {
24			b.Fatal(err)
25		}
26	}
27}
28
29func BenchmarkUint32DelimWriterFallback(b *testing.B) {
30	w := io.NewUint32DelimitedWriter(ioutil.Discard, binary.BigEndian)
31	r := rand.New(rand.NewSource(time.Now().UnixNano()))
32	msg := test.NewPopulatedNinOptNative(r, true)
33
34	for i := 0; i < b.N; i++ {
35		if err := w.WriteMsg(msg); err != nil {
36			b.Fatal(err)
37		}
38	}
39}
40
41// Writing the same size messaged twice should not cause another
42// reader buffer allocation
43func TestUint32SameSizeNoAlloc(t *testing.T) {
44	buf := newBuffer()
45	writer := io.NewUint32DelimitedWriter(buf, binary.LittleEndian)
46	reader := io.NewUint32DelimitedReader(buf, binary.LittleEndian, 1024*1024)
47
48	err := writer.WriteMsg(&test.NinOptNative{Field15: []byte("numbercatinvention")})
49	if err != nil {
50		t.Fatal(err)
51	}
52	err = writer.WriteMsg(&test.NinOptNative{Field15: []byte("fastenselectionsky")})
53	if err != nil {
54		t.Fatal(err)
55	}
56	if err := writer.Close(); err != nil {
57		t.Fatal(err)
58	}
59
60	msg := &test.NinOptNative{}
61	if err := reader.ReadMsg(msg); err != nil {
62		t.Fatal(err)
63	}
64	firstRead := reflect.ValueOf(reader).Elem().FieldByName("buf").Pointer()
65	if err := reader.ReadMsg(msg); err != nil {
66		t.Fatal(err)
67	}
68	secondRead := reflect.ValueOf(reader).Elem().FieldByName("buf").Pointer()
69
70	if firstRead != secondRead {
71		t.Fatalf("reader buf byte slice pointer did not stay the same after second same size read (%d != %d).", firstRead, secondRead)
72	}
73}
74