Skip to content

Commit

Permalink
os/File: add stubs for os.File Deadlines (#4465)
Browse files Browse the repository at this point in the history
os/File: add stubs for os.File Deadlines
* add os.SetDeadline, os.SetReadDeadline, os.SetWriteDeadline stubs for
posix files.
* deadline: add tests

Signed-off-by: leongross <[email protected]>
  • Loading branch information
leongross authored Sep 17, 2024
1 parent a9bf981 commit 84048f2
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 1 deletion.
50 changes: 50 additions & 0 deletions src/os/deadline_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//go:build posix && !baremetal && !js

package os_test

import (
"errors"
. "os"
"testing"
)

func TestDeadlines(t *testing.T) {
// Create a handle to a known-good, existing file
f, err := Open("/dev/null")
if err != nil {
t.Fatal(err)
}

if err := f.SetDeadline(0); err == nil {
if err != nil {
t.Errorf("wanted nil, got %v", err)
}
}

if err := f.SetDeadline(1); err == nil {
if !errors.Is(err, ErrNotImplemented) {
t.Errorf("wanted ErrNotImplemented, got %v", err)
}
}

if err := f.SetReadDeadline(1); err == nil {
if !errors.Is(err, ErrNotImplemented) {
t.Errorf("wanted ErrNotImplemented, got %v", err)
}
}

if err := f.SetWriteDeadline(1); err == nil {
if !errors.Is(err, ErrNotImplemented) {
t.Errorf("wanted ErrNotImplemented, got %v", err)
}
}

// Closed files must return an error
f.Close()

if err := f.SetDeadline(0); err == nil {
if err != ErrClosed {
t.Errorf("wanted ErrClosed, got %v", err)
}
}
}
17 changes: 17 additions & 0 deletions src/os/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,12 +257,29 @@ func (f *File) SyscallConn() (conn syscall.RawConn, err error) {
return
}

// SetDeadline sets the read and write deadlines for a File.
// Calls to SetDeadline for files that do not support deadlines will return ErrNoDeadline
// This stub always returns ErrNoDeadline.
// A zero value for t means I/O operations will not time out.
func (f *File) SetDeadline(t time.Time) error {
if f.handle == nil {
return ErrClosed
}
return f.setDeadline(t)
}

// SetReadDeadline sets the deadline for future Read calls and any
// currently-blocked Read call.
func (f *File) SetReadDeadline(t time.Time) error {
return f.setReadDeadline(t)
}

// SetWriteDeadline sets the deadline for any future Write calls and any
// currently-blocked Write call.
func (f *File) SetWriteDeadline(t time.Time) error {
return f.setWriteDeadline(t)
}

// fd is an internal interface that is used to try a type assertion in order to
// call the Fd() method of the underlying file handle if it is implemented.
type fd interface {
Expand Down
25 changes: 24 additions & 1 deletion src/os/file_posix.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,35 @@ import (
"time"
)

//TODO: re-implement the ErrNoDeadline error in the correct code path

// Chtimes is a stub, not yet implemented
func Chtimes(name string, atime time.Time, mtime time.Time) error {
return ErrNotImplemented
}

// setDeadline sets the read and write deadline.
func (f *File) setDeadline(t time.Time) error {
if t.IsZero() {
return nil
}
return ErrNotImplemented
}

// setReadDeadline sets the read deadline, not yet implemented
func (f *File) setReadDeadline(_ time.Time) error {
// A zero value for t means Read will not time out.
func (f *File) setReadDeadline(t time.Time) error {
if t.IsZero() {
return nil
}
return ErrNotImplemented
}

// setWriteDeadline sets the write deadline, not yet implemented
// A zero value for t means Read will not time out.
func (f *File) setWriteDeadline(t time.Time) error {
if t.IsZero() {
return nil
}
return ErrNotImplemented
}

0 comments on commit 84048f2

Please sign in to comment.