]> Cypherpunks repositories - gostls13.git/commitdiff
os: add more File.WriteAt tests
authorqmuntal <quimmuntal@gmail.com>
Mon, 10 Mar 2025 09:36:08 +0000 (10:36 +0100)
committerQuim Muntal <quimmuntal@gmail.com>
Tue, 11 Mar 2025 21:29:30 +0000 (14:29 -0700)
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 <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
src/os/os_test.go

index 424c5286eabf02d329478f72c1174441cf3e2b82..4c90525bb1490130be0964fdb81660ec875bfdd4 100644 (file)
@@ -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)
        }
 }