11 func TestBytesPipeRead(t *testing.T) {
13 buf.Write([]byte("12"))
14 buf.Write([]byte("34"))
15 buf.Write([]byte("56"))
16 buf.Write([]byte("78"))
17 buf.Write([]byte("90"))
19 n, err := buf.Read(rd)
24 t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 4)
26 if string(rd) != "1234" {
27 t.Fatalf("Read %s, but must be %s", rd, "1234")
34 t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 4)
36 if string(rd) != "5678" {
37 t.Fatalf("Read %s, but must be %s", rd, "5679")
44 t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 2)
46 if string(rd[:n]) != "90" {
47 t.Fatalf("Read %s, but must be %s", rd, "90")
51 func TestBytesPipeWrite(t *testing.T) {
53 buf.Write([]byte("12"))
54 buf.Write([]byte("34"))
55 buf.Write([]byte("56"))
56 buf.Write([]byte("78"))
57 buf.Write([]byte("90"))
58 if buf.buf[0].String() != "1234567890" {
59 t.Fatalf("Buffer %q, must be %q", buf.buf[0].String(), "1234567890")
63 // Write and read in different speeds/chunk sizes and check valid data is read.
64 func TestBytesPipeWriteRandomChunks(t *testing.T) {
65 cases := []struct{ iterations, writesPerLoop, readsPerLoop int }{
73 testMessage := []byte("this is a random string for testing")
74 // random slice sizes to read and write
75 writeChunks := []int{25, 35, 15, 20}
76 readChunks := []int{5, 45, 20, 25}
78 for _, c := range cases {
79 // first pass: write directly to hash
81 for i := 0; i < c.iterations*c.writesPerLoop; i++ {
82 if _, err := hash.Write(testMessage[:writeChunks[i%len(writeChunks)]]); err != nil {
86 expected := hex.EncodeToString(hash.Sum(nil))
88 // write/read through buffer
92 done := make(chan struct{})
95 // random delay before read starts
96 <-time.After(time.Duration(rand.Intn(10)) * time.Millisecond)
98 p := make([]byte, readChunks[(c.iterations*c.readsPerLoop+i)%len(readChunks)])
109 for i := 0; i < c.iterations; i++ {
110 for w := 0; w < c.writesPerLoop; w++ {
111 buf.Write(testMessage[:writeChunks[(i*c.writesPerLoop+w)%len(writeChunks)]])
117 actual := hex.EncodeToString(hash.Sum(nil))
119 if expected != actual {
120 t.Fatalf("BytesPipe returned invalid data. Expected checksum %v, got %v", expected, actual)
126 func BenchmarkBytesPipeWrite(b *testing.B) {
127 testData := []byte("pretty short line, because why not?")
128 for i := 0; i < b.N; i++ {
129 readBuf := make([]byte, 1024)
130 buf := NewBytesPipe()
134 _, err = buf.Read(readBuf)
137 for j := 0; j < 1000; j++ {
144 func BenchmarkBytesPipeRead(b *testing.B) {
145 rd := make([]byte, 512)
146 for i := 0; i < b.N; i++ {
148 buf := NewBytesPipe()
149 for j := 0; j < 500; j++ {
150 buf.Write(make([]byte, 1024))
153 for j := 0; j < 1000; j++ {
154 if n, _ := buf.Read(rd); n != 512 {
155 b.Fatalf("Wrong number of bytes: %d", n)