github.com/maeglindeveloper/gqlgen@v0.13.1-0.20210413081235-57808b12a0a0/graphql/handler/transport/reader_test.go (about) 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 // Test for the race detector, to verify a Read that doesn't yield any bytes 14 // is okay to use from multiple goroutines. This was our historic behavior. 15 // See golang.org/issue/7856 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 }