| // 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{newSendfileTest} | |
| copyFileHooks = []copyFileTestHook{hookSendFile} | |
| ) | |
| func testCopyFiles(t *testing.T, size, limit int64) { | |
| testSendfile(t, size, limit) | |
| } | |
| func testSendfile(t *testing.T, size int64, limit int64) { | |
| dst, src, data, hook, name := newSendfileTest(t, size) | |
| testCopyFile(t, dst, src, data, hook, limit, name) | |
| } | |
| // newSendFileTest initializes a new test for sendfile over copy_file_range. | |
| // It hooks package os' call to poll.SendFile and returns the hook, | |
| // so it can be inspected. | |
| func newSendfileTest(t *testing.T, size int64) (dst, src *File, data []byte, hook *copyFileHook, name string) { | |
| t.Helper() | |
| name = "newSendfileTest" | |
| dst, src, data = newCopyFileTest(t, size) | |
| hook, _ = hookSendFile(t) | |
| return | |
| } | |
| func hookSendFile(t *testing.T) (*copyFileHook, string) { | |
| return hookSendFileTB(t), "hookSendFile" | |
| } | |
| func hookSendFileTB(tb testing.TB) *copyFileHook { | |
| hook := new(copyFileHook) | |
| orig := poll.TestHookDidSendFile | |
| tb.Cleanup(func() { | |
| poll.TestHookDidSendFile = orig | |
| }) | |
| poll.TestHookDidSendFile = func(dstFD *poll.FD, src uintptr, written int64, err error, handled bool) { | |
| hook.called = true | |
| hook.dstfd = dstFD.Sysfd | |
| hook.srcfd = int(src) | |
| hook.written = written | |
| hook.err = err | |
| hook.handled = handled | |
| } | |
| return hook | |
| } |