...

Source file src/github.com/99designs/gqlgen/graphql/handler/transport/reader_test.go

Documentation: github.com/99designs/gqlgen/graphql/handler/transport

     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  
    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