]> Cypherpunks repositories - gostls13.git/commitdiff
bytes, strings: add Reader.ReadAt race tests
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 10 Apr 2014 22:46:07 +0000 (15:46 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 10 Apr 2014 22:46:07 +0000 (15:46 -0700)
Tests for the race detector to catch anybody
trying to mutate Reader in ReadAt.

LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/86700043

src/pkg/bytes/reader.go
src/pkg/bytes/reader_test.go
src/pkg/strings/reader.go
src/pkg/strings/reader_test.go

index cdc323321991523f7362cc81fd78b0625e15a02c..61845e350b5a27b303a72f5c0228f8951e178884 100644 (file)
@@ -43,6 +43,7 @@ func (r *Reader) Read(b []byte) (n int, err error) {
 }
 
 func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) {
+       // cannot modify state - see io.ReaderAt
        if off < 0 {
                return 0, errors.New("bytes: invalid offset")
        }
index a25f8ff0e3c0031e60e168731f04f93939e23c2e..7abaee7fad4a0a1b4c4ae403c5a389530c411e02 100644 (file)
@@ -10,6 +10,7 @@ import (
        "io"
        "io/ioutil"
        "os"
+       "sync"
        "testing"
 )
 
@@ -98,6 +99,22 @@ func TestReaderAt(t *testing.T) {
        }
 }
 
+func TestReaderAtConcurrent(t *testing.T) {
+       // Test for the race detector, to verify ReadAt doesn't mutate
+       // any state.
+       r := NewReader([]byte("0123456789"))
+       var wg sync.WaitGroup
+       for i := 0; i < 5; i++ {
+               wg.Add(1)
+               go func(i int) {
+                       defer wg.Done()
+                       var buf [1]byte
+                       r.ReadAt(buf[:], int64(i))
+               }(i)
+       }
+       wg.Wait()
+}
+
 func TestReaderWriteTo(t *testing.T) {
        for i := 0; i < 30; i += 3 {
                var l int
index 93ff804ed1bc8af2b6c8cf8a941ee0491c3e1789..c02d33bd61016f469afc9624a49c2a6f84becdbe 100644 (file)
@@ -42,6 +42,7 @@ func (r *Reader) Read(b []byte) (n int, err error) {
 }
 
 func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) {
+       // cannot modify state - see io.ReaderAt
        if off < 0 {
                return 0, errors.New("strings: invalid offset")
        }
index c7a34123accbcf14463ef87eb34547e07ab5e2a5..5995f210386889fa289a3556e6ef231967fe03d5 100644 (file)
@@ -10,6 +10,7 @@ import (
        "io"
        "os"
        "strings"
+       "sync"
        "testing"
 )
 
@@ -98,6 +99,22 @@ func TestReaderAt(t *testing.T) {
        }
 }
 
+func TestReaderAtConcurrent(t *testing.T) {
+       // Test for the race detector, to verify ReadAt doesn't mutate
+       // any state.
+       r := strings.NewReader("0123456789")
+       var wg sync.WaitGroup
+       for i := 0; i < 5; i++ {
+               wg.Add(1)
+               go func(i int) {
+                       defer wg.Done()
+                       var buf [1]byte
+                       r.ReadAt(buf[:], int64(i))
+               }(i)
+       }
+       wg.Wait()
+}
+
 func TestWriteTo(t *testing.T) {
        const str = "0123456789"
        for i := 0; i <= len(str); i++ {