| // Copyright 2019 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 poll_test |
| |
| import ( |
| "fmt" |
| "io/fs" |
| "net" |
| "os" |
| "testing" |
| "time" |
| ) |
| |
| func TestReadError(t *testing.T) { |
| t.Run("ErrNotPollable", func(t *testing.T) { |
| f, err := badStateFile() |
| if err != nil { |
| t.Skip(err) |
| } |
| defer f.Close() |
| |
| // Give scheduler a chance to have two separated |
| // goroutines: an event poller and an event waiter. |
| time.Sleep(100 * time.Millisecond) |
| |
| var b [1]byte |
| _, err = f.Read(b[:]) |
| if perr := parseReadError(err, isBadStateFileError); perr != nil { |
| t.Fatal(perr) |
| } |
| }) |
| } |
| |
| func parseReadError(nestedErr error, verify func(error) (string, bool)) error { |
| err := nestedErr |
| if nerr, ok := err.(*net.OpError); ok { |
| err = nerr.Err |
| } |
| if nerr, ok := err.(*fs.PathError); ok { |
| err = nerr.Err |
| } |
| if nerr, ok := err.(*os.SyscallError); ok { |
| err = nerr.Err |
| } |
| if s, ok := verify(err); !ok { |
| return fmt.Errorf("got %v; want %s", nestedErr, s) |
| } |
| return nil |
| } |