1 package transport
2
3 import (
4 "io"
5 "sync"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9 )
10
11 func TestBytesRead(t *testing.T) {
12 t.Run("test concurrency", func(t *testing.T) {
13
14
15
16 r := bytesReader{s: &([]byte{})}
17 var wg sync.WaitGroup
18 for i := 0; i < 5; i++ {
19 wg.Add(2)
20 go func() {
21 defer wg.Done()
22 var buf [1]byte
23 r.Read(buf[:])
24 }()
25 go func() {
26 defer wg.Done()
27 r.Read(nil)
28 }()
29 }
30 wg.Wait()
31 })
32
33 t.Run("fail to read if pointer is nil", func(t *testing.T) {
34 n, err := (&bytesReader{}).Read(nil)
35 require.Equal(t, 0, n)
36 require.NotNil(t, err)
37 require.Equal(t, "byte slice pointer is nil", err.Error())
38 })
39
40 t.Run("read using buffer", func(t *testing.T) {
41 data := []byte("0123456789")
42 r := bytesReader{s: &data}
43
44 got := make([]byte, 0, 11)
45 buf := make([]byte, 1)
46 for {
47 n, err := r.Read(buf)
48 if n < 0 {
49 require.Fail(t, "unexpected bytes read size")
50 }
51 got = append(got, buf[:n]...)
52 if err != nil {
53 if err == io.EOF {
54 break
55 }
56 require.Fail(t, "unexpected error while reading", err.Error())
57 }
58 }
59 require.Equal(t, "0123456789", string(got))
60 })
61
62 t.Run("read updated pointer value", func(t *testing.T) {
63 data := []byte("0123456789")
64 pointer := &data
65 r := bytesReader{s: pointer}
66 data[2] = []byte("9")[0]
67
68 got := make([]byte, 0, 11)
69 buf := make([]byte, 1)
70 for {
71 n, err := r.Read(buf)
72 if n < 0 {
73 require.Fail(t, "unexpected bytes read size")
74 }
75 got = append(got, buf[:n]...)
76 if err != nil {
77 if err == io.EOF {
78 break
79 }
80 require.Fail(t, "unexpected error while reading", err.Error())
81 }
82 }
83 require.Equal(t, "0193456789", string(got))
84 })
85
86 t.Run("read using buffer multiple times", func(t *testing.T) {
87 data := []byte("0123456789")
88 r := bytesReader{s: &data}
89
90 got := make([]byte, 0, 11)
91 buf := make([]byte, 1)
92 for {
93 n, err := r.Read(buf)
94 if n < 0 {
95 require.Fail(t, "unexpected bytes read size")
96 }
97 got = append(got, buf[:n]...)
98 if err != nil {
99 if err == io.EOF {
100 break
101 }
102 require.Fail(t, "unexpected error while reading", err.Error())
103 }
104 }
105 require.Equal(t, "0123456789", string(got))
106
107 pos, err := r.Seek(0, io.SeekStart)
108 require.NoError(t, err)
109 require.Equal(t, int64(0), pos)
110
111 got = make([]byte, 0, 11)
112 for {
113 n, err := r.Read(buf)
114 if n < 0 {
115 require.Fail(t, "unexpected bytes read size")
116 }
117 got = append(got, buf[:n]...)
118 if err != nil {
119 if err == io.EOF {
120 break
121 }
122 require.Fail(t, "unexpected error while reading", err.Error())
123 }
124 }
125 require.Equal(t, "0123456789", string(got))
126 })
127 }
128
View as plain text