File tree Expand file tree Collapse file tree 3 files changed +91
-1
lines changed Expand file tree Collapse file tree 3 files changed +91
-1
lines changed Original file line number Diff line number Diff line change
1
+ //go:build posix && !baremetal && !js
2
+
3
+ package os_test
4
+
5
+ import (
6
+ "errors"
7
+ . "os"
8
+ "testing"
9
+ )
10
+
11
+ func TestDeadlines (t * testing.T ) {
12
+ // Create a handle to a known-good, existing file
13
+ f , err := Open ("/dev/null" )
14
+ if err != nil {
15
+ t .Fatal (err )
16
+ }
17
+
18
+ if err := f .SetDeadline (0 ); err == nil {
19
+ if err != nil {
20
+ t .Errorf ("wanted nil, got %v" , err )
21
+ }
22
+ }
23
+
24
+ if err := f .SetDeadline (1 ); err == nil {
25
+ if ! errors .Is (err , ErrNotImplemented ) {
26
+ t .Errorf ("wanted ErrNotImplemented, got %v" , err )
27
+ }
28
+ }
29
+
30
+ if err := f .SetReadDeadline (1 ); err == nil {
31
+ if ! errors .Is (err , ErrNotImplemented ) {
32
+ t .Errorf ("wanted ErrNotImplemented, got %v" , err )
33
+ }
34
+ }
35
+
36
+ if err := f .SetWriteDeadline (1 ); err == nil {
37
+ if ! errors .Is (err , ErrNotImplemented ) {
38
+ t .Errorf ("wanted ErrNotImplemented, got %v" , err )
39
+ }
40
+ }
41
+
42
+ // Closed files must return an error
43
+ f .Close ()
44
+
45
+ if err := f .SetDeadline (0 ); err == nil {
46
+ if err != ErrClosed {
47
+ t .Errorf ("wanted ErrClosed, got %v" , err )
48
+ }
49
+ }
50
+ }
Original file line number Diff line number Diff line change @@ -257,12 +257,29 @@ func (f *File) SyscallConn() (conn syscall.RawConn, err error) {
257
257
return
258
258
}
259
259
260
+ // SetDeadline sets the read and write deadlines for a File.
261
+ // Calls to SetDeadline for files that do not support deadlines will return ErrNoDeadline
262
+ // This stub always returns ErrNoDeadline.
263
+ // A zero value for t means I/O operations will not time out.
264
+ func (f * File ) SetDeadline (t time.Time ) error {
265
+ if f .handle == nil {
266
+ return ErrClosed
267
+ }
268
+ return f .setDeadline (t )
269
+ }
270
+
260
271
// SetReadDeadline sets the deadline for future Read calls and any
261
272
// currently-blocked Read call.
262
273
func (f * File ) SetReadDeadline (t time.Time ) error {
263
274
return f .setReadDeadline (t )
264
275
}
265
276
277
+ // SetWriteDeadline sets the deadline for any future Write calls and any
278
+ // currently-blocked Write call.
279
+ func (f * File ) SetWriteDeadline (t time.Time ) error {
280
+ return f .setWriteDeadline (t )
281
+ }
282
+
266
283
// fd is an internal interface that is used to try a type assertion in order to
267
284
// call the Fd() method of the underlying file handle if it is implemented.
268
285
type fd interface {
Original file line number Diff line number Diff line change @@ -4,12 +4,35 @@ import (
4
4
"time"
5
5
)
6
6
7
+ //TODO: re-implement the ErrNoDeadline error in the correct code path
8
+
7
9
// Chtimes is a stub, not yet implemented
8
10
func Chtimes (name string , atime time.Time , mtime time.Time ) error {
9
11
return ErrNotImplemented
10
12
}
11
13
14
+ // setDeadline sets the read and write deadline.
15
+ func (f * File ) setDeadline (t time.Time ) error {
16
+ if t .IsZero () {
17
+ return nil
18
+ }
19
+ return ErrNotImplemented
20
+ }
21
+
12
22
// setReadDeadline sets the read deadline, not yet implemented
13
- func (f * File ) setReadDeadline (_ time.Time ) error {
23
+ // A zero value for t means Read will not time out.
24
+ func (f * File ) setReadDeadline (t time.Time ) error {
25
+ if t .IsZero () {
26
+ return nil
27
+ }
28
+ return ErrNotImplemented
29
+ }
30
+
31
+ // setWriteDeadline sets the write deadline, not yet implemented
32
+ // A zero value for t means Read will not time out.
33
+ func (f * File ) setWriteDeadline (t time.Time ) error {
34
+ if t .IsZero () {
35
+ return nil
36
+ }
14
37
return ErrNotImplemented
15
38
}
You can’t perform that action at this time.
0 commit comments