github.com/aavshr/aws-sdk-go@v1.41.3/aws/request/offset_reader_test.go (about) 1 package request 2 3 import ( 4 "bytes" 5 "io" 6 "math/rand" 7 "sync" 8 "testing" 9 "time" 10 11 "github.com/aavshr/aws-sdk-go/internal/sdkio" 12 ) 13 14 func TestOffsetReaderRead(t *testing.T) { 15 buf := []byte("testData") 16 reader := &offsetReader{buf: bytes.NewReader(buf)} 17 18 tempBuf := make([]byte, len(buf)) 19 20 n, err := reader.Read(tempBuf) 21 22 if e, a := n, len(buf); e != a { 23 t.Errorf("expect %v, got %v", e, a) 24 } 25 if err != nil { 26 t.Fatalf("expect no error, got %v", err) 27 } 28 if e, a := buf, tempBuf; !bytes.Equal(e, a) { 29 t.Errorf("expect %v, got %v", e, a) 30 } 31 } 32 33 func TestOffsetReaderSeek(t *testing.T) { 34 buf := []byte("testData") 35 reader, err := newOffsetReader(bytes.NewReader(buf), 0) 36 if err != nil { 37 t.Fatalf("expect no error, got %v", err) 38 } 39 40 orig, err := reader.Seek(0, sdkio.SeekCurrent) 41 if err != nil { 42 t.Fatalf("expect no error, got %v", err) 43 } 44 if e, a := int64(0), orig; e != a { 45 t.Errorf("expect %v, got %v", e, a) 46 } 47 48 n, err := reader.Seek(0, sdkio.SeekEnd) 49 if err != nil { 50 t.Fatalf("expect no error, got %v", err) 51 } 52 if e, a := int64(len(buf)), n; e != a { 53 t.Errorf("expect %v, got %v", e, a) 54 } 55 56 n, err = reader.Seek(orig, sdkio.SeekStart) 57 if err != nil { 58 t.Fatalf("expect no error, got %v", err) 59 } 60 if e, a := int64(0), n; e != a { 61 t.Errorf("expect %v, got %v", e, a) 62 } 63 } 64 65 func TestOffsetReaderClose(t *testing.T) { 66 buf := []byte("testData") 67 reader := &offsetReader{buf: bytes.NewReader(buf)} 68 69 err := reader.Close() 70 if err != nil { 71 t.Fatalf("expect no error, got %v", err) 72 } 73 74 tempBuf := make([]byte, len(buf)) 75 n, err := reader.Read(tempBuf) 76 if e, a := n, 0; e != a { 77 t.Errorf("expect %v, got %v", e, a) 78 } 79 if e, a := err, io.EOF; e != a { 80 t.Errorf("expect %v, got %v", e, a) 81 } 82 } 83 84 func TestOffsetReaderCloseAndCopy(t *testing.T) { 85 buf := []byte("testData") 86 tempBuf := make([]byte, len(buf)) 87 reader := &offsetReader{buf: bytes.NewReader(buf)} 88 89 newReader, err := reader.CloseAndCopy(0) 90 if err != nil { 91 t.Fatalf("expect no error, got %v", err) 92 } 93 94 n, err := reader.Read(tempBuf) 95 if e, a := n, 0; e != a { 96 t.Errorf("expect %v, got %v", e, a) 97 } 98 if e, a := err, io.EOF; e != a { 99 t.Errorf("expect %v, got %v", e, a) 100 } 101 102 n, err = newReader.Read(tempBuf) 103 if e, a := n, len(buf); e != a { 104 t.Errorf("expect %v, got %v", e, a) 105 } 106 if err != nil { 107 t.Fatalf("expect no error, got %v", err) 108 } 109 if e, a := buf, tempBuf; !bytes.Equal(e, a) { 110 t.Errorf("expect %v, got %v", e, a) 111 } 112 } 113 114 func TestOffsetReaderCloseAndCopyOffset(t *testing.T) { 115 buf := []byte("testData") 116 tempBuf := make([]byte, len(buf)) 117 reader := &offsetReader{buf: bytes.NewReader(buf)} 118 119 newReader, err := reader.CloseAndCopy(4) 120 if err != nil { 121 t.Fatalf("expect no error, got %v", err) 122 } 123 124 n, err := newReader.Read(tempBuf) 125 if e, a := n, len(buf)-4; e != a { 126 t.Errorf("expect %v, got %v", e, a) 127 } 128 if err != nil { 129 t.Fatalf("expect no error, got %v", err) 130 } 131 132 expected := []byte{'D', 'a', 't', 'a', 0, 0, 0, 0} 133 if e, a := expected, tempBuf; !bytes.Equal(e, a) { 134 t.Errorf("expect %v, got %v", e, a) 135 } 136 } 137 138 func TestOffsetReaderRace(t *testing.T) { 139 wg := sync.WaitGroup{} 140 141 f := func(reader *offsetReader) { 142 defer wg.Done() 143 var err error 144 buf := make([]byte, 1) 145 _, err = reader.Read(buf) 146 for err != io.EOF { 147 _, err = reader.Read(buf) 148 } 149 150 } 151 152 closeFn := func(reader *offsetReader) { 153 defer wg.Done() 154 time.Sleep(time.Duration(rand.Intn(20)+1) * time.Millisecond) 155 reader.Close() 156 } 157 for i := 0; i < 50; i++ { 158 reader := &offsetReader{buf: bytes.NewReader(make([]byte, 1024*1024))} 159 wg.Add(1) 160 go f(reader) 161 wg.Add(1) 162 go closeFn(reader) 163 } 164 wg.Wait() 165 } 166 167 func BenchmarkOffsetReader(b *testing.B) { 168 bufSize := 1024 * 1024 * 100 169 buf := make([]byte, bufSize) 170 reader := &offsetReader{buf: bytes.NewReader(buf)} 171 172 tempBuf := make([]byte, 1024) 173 174 for i := 0; i < b.N; i++ { 175 reader.Read(tempBuf) 176 } 177 } 178 179 func BenchmarkBytesReader(b *testing.B) { 180 bufSize := 1024 * 1024 * 100 181 buf := make([]byte, bufSize) 182 reader := bytes.NewReader(buf) 183 184 tempBuf := make([]byte, 1024) 185 186 for i := 0; i < b.N; i++ { 187 reader.Read(tempBuf) 188 } 189 }