blob: 186049951f0ac2b238f8a34eae8701ffd9c41524 [file] [log] [blame]
// 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
}