From e34de96d588b93c3c4ee8c6a11f99a8f8f3390a6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 10 Aug 2023 10:39:58 -0400 Subject: [PATCH] os: define TestIssue60181 only on Unix platforms MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In CL 517755 the test was added in the unconstrained os_test.go because it appeared to be portable, but it turned out not to be valid on plan9. (The build error was masked on the misc-compile TryBots by #61923.) Although the test can also compile and run on Windows, the bug it checks for is specific to Linux and only really needs to run there, so I am moving it to os_unix_test.go instead of adding yet another test file for “Unix and Windows but not Plan 9”. Updates #60181. Change-Id: I41fd11b288217e95652b5daa72460c0d26bde606 Reviewed-on: https://go-review.googlesource.com/c/go/+/518255 Auto-Submit: Bryan Mills Reviewed-by: Tobias Klauser Run-TryBot: Bryan Mills TryBot-Result: Gopher Robot Reviewed-by: Dmitri Shuralyov --- src/os/os_test.go | 56 ------------------------------------------ src/os/os_unix_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/os/os_test.go b/src/os/os_test.go index 28256ee213..94c3ad04f3 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -3270,59 +3270,3 @@ func TestPipeCloseRace(t *testing.T) { t.Errorf("got nils %d errs %d, want 2 2", nils, errs) } } - -// Test that copying to files opened with O_APPEND works and -// the copy_file_range syscall isn't used on Linux. -// -// Regression test for go.dev/issue/60181 -func TestIssue60181(t *testing.T) { - defer chtmpdir(t)() - - want := "hello gopher" - - a, err := CreateTemp("", "a") - if err != nil { - t.Fatal(err) - } - a.WriteString(want[:5]) - a.Close() - - b, err := CreateTemp("", "b") - if err != nil { - t.Fatal(err) - } - b.WriteString(want[5:]) - b.Close() - - afd, err := syscall.Open(a.Name(), syscall.O_RDWR|syscall.O_APPEND, 0) - if err != nil { - t.Fatal(err) - } - - bfd, err := syscall.Open(b.Name(), syscall.O_RDONLY, 0) - if err != nil { - t.Fatal(err) - } - - aa := NewFile(uintptr(afd), a.Name()) - defer aa.Close() - bb := NewFile(uintptr(bfd), b.Name()) - defer bb.Close() - - // This would fail on Linux in case the copy_file_range syscall was used because it doesn't - // support destination files opened with O_APPEND, see - // https://man7.org/linux/man-pages/man2/copy_file_range.2.html#ERRORS - _, err = io.Copy(aa, bb) - if err != nil { - t.Fatal(err) - } - - buf, err := ReadFile(aa.Name()) - if err != nil { - t.Fatal(err) - } - - if got := string(buf); got != want { - t.Errorf("files not concatenated: got %q, want %q", got, want) - } -} diff --git a/src/os/os_unix_test.go b/src/os/os_unix_test.go index 98e7afd0f6..9041b25471 100644 --- a/src/os/os_unix_test.go +++ b/src/os/os_unix_test.go @@ -346,3 +346,59 @@ func TestSplitPath(t *testing.T) { } } } + +// Test that copying to files opened with O_APPEND works and +// the copy_file_range syscall isn't used on Linux. +// +// Regression test for go.dev/issue/60181 +func TestIssue60181(t *testing.T) { + defer chtmpdir(t)() + + want := "hello gopher" + + a, err := CreateTemp("", "a") + if err != nil { + t.Fatal(err) + } + a.WriteString(want[:5]) + a.Close() + + b, err := CreateTemp("", "b") + if err != nil { + t.Fatal(err) + } + b.WriteString(want[5:]) + b.Close() + + afd, err := syscall.Open(a.Name(), syscall.O_RDWR|syscall.O_APPEND, 0) + if err != nil { + t.Fatal(err) + } + + bfd, err := syscall.Open(b.Name(), syscall.O_RDONLY, 0) + if err != nil { + t.Fatal(err) + } + + aa := NewFile(uintptr(afd), a.Name()) + defer aa.Close() + bb := NewFile(uintptr(bfd), b.Name()) + defer bb.Close() + + // This would fail on Linux in case the copy_file_range syscall was used because it doesn't + // support destination files opened with O_APPEND, see + // https://man7.org/linux/man-pages/man2/copy_file_range.2.html#ERRORS + _, err = io.Copy(aa, bb) + if err != nil { + t.Fatal(err) + } + + buf, err := ReadFile(aa.Name()) + if err != nil { + t.Fatal(err) + } + + if got := string(buf); got != want { + t.Errorf("files not concatenated: got %q, want %q", got, want) + } +} -- 2.48.1