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  }