From: qmuntal Date: Mon, 10 Mar 2025 09:36:08 +0000 (+0100) Subject: os: add more File.WriteAt tests X-Git-Tag: go1.25rc1~759 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8867af920748f8aa4e9beb5bb8b88c34c85766f2;p=gostls13.git os: add more File.WriteAt tests The File.WriteAt doesn't verify that the file offset is not changed when calling WriteAt, although it is what users expect. Add some new tests to verify that this behavior doesn't regress. Change-Id: Ib1e048c7333d6efec71bd8f75a4fa745775306f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/656355 Reviewed-by: David Chase LUCI-TryBot-Result: Go LUCI Reviewed-by: Ian Lance Taylor --- diff --git a/src/os/os_test.go b/src/os/os_test.go index 424c5286ea..4c90525bb1 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -19,6 +19,7 @@ import ( "runtime" "runtime/debug" "slices" + "strconv" "strings" "sync" "syscall" @@ -2044,20 +2045,58 @@ func TestWriteAt(t *testing.T) { f := newFile(t) - const data = "hello, world\n" + const data = "hello, world" io.WriteString(f, data) - n, err := f.WriteAt([]byte("WORLD"), 7) - if err != nil || n != 5 { + n, err := f.WriteAt([]byte("WOR"), 7) + if err != nil || n != 3 { t.Fatalf("WriteAt 7: %d, %v", n, err) } + n, err = io.WriteString(f, "!") // test that WriteAt doesn't change the file offset + if err != nil || n != 1 { + t.Fatal(err) + } + + got, err := ReadFile(f.Name()) + if err != nil { + t.Fatalf("ReadFile %s: %v", f.Name(), err) + } + want := "hello, WORld!" + if string(got) != want { + t.Fatalf("after write: have %q want %q", string(got), want) + } +} + +func TestWriteAtConcurrent(t *testing.T) { + t.Parallel() + + f := newFile(t) + io.WriteString(f, "0000000000") + + var wg sync.WaitGroup + for i := range 10 { + wg.Add(1) + go func() { + defer wg.Done() + n, err := f.WriteAt([]byte(strconv.Itoa(i)), int64(i)) + if err != nil || n != 1 { + t.Errorf("WriteAt %d: %d, %v", i, n, err) + } + n, err = io.WriteString(f, "!") // test that WriteAt doesn't change the file offset + if err != nil || n != 1 { + t.Error(err) + } + }() + } + wg.Wait() - b, err := ReadFile(f.Name()) + got, err := ReadFile(f.Name()) if err != nil { t.Fatalf("ReadFile %s: %v", f.Name(), err) } - if string(b) != "hello, WORLD\n" { - t.Fatalf("after write: have %q want %q", string(b), "hello, WORLD\n") + want := "0123456789!!!!!!!!!!" + if string(got) != want { + t.Fatalf("after write: have %q want %q", string(got), want) } }