| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package os_test |
| |
| import ( |
| "internal/poll" |
| . "os" |
| "testing" |
| ) |
| |
| var ( |
| copyFileTests = []copyFileTestFunc{newCopyFileRangeTest} |
| copyFileHooks = []copyFileTestHook{hookCopyFileRange} |
| ) |
| |
| func testCopyFiles(t *testing.T, size, limit int64) { |
| testCopyFileRange(t, size, limit) |
| } |
| |
| func testCopyFileRange(t *testing.T, size int64, limit int64) { |
| dst, src, data, hook, name := newCopyFileRangeTest(t, size) |
| testCopyFile(t, dst, src, data, hook, limit, name) |
| } |
| |
| // newCopyFileRangeTest initializes a new test for copy_file_range. |
| // It hooks package os' call to poll.CopyFileRange and returns the hook, |
| // so it can be inspected. |
| func newCopyFileRangeTest(t *testing.T, size int64) (dst, src *File, data []byte, hook *copyFileHook, name string) { |
| t.Helper() |
| |
| name = "newCopyFileRangeTest" |
| |
| dst, src, data = newCopyFileTest(t, size) |
| hook, _ = hookCopyFileRange(t) |
| |
| return |
| } |
| |
| func hookCopyFileRange(t *testing.T) (hook *copyFileHook, name string) { |
| name = "hookCopyFileRange" |
| |
| hook = new(copyFileHook) |
| orig := *PollCopyFileRangeP |
| t.Cleanup(func() { |
| *PollCopyFileRangeP = orig |
| }) |
| *PollCopyFileRangeP = func(dst, src *poll.FD, remain int64) (int64, bool, error) { |
| hook.called = true |
| hook.dstfd = dst.Sysfd |
| hook.srcfd = src.Sysfd |
| hook.written, hook.handled, hook.err = orig(dst, src, remain) |
| return hook.written, hook.handled, hook.err |
| } |
| return |
| } |