51 lines
1 KiB
Go
51 lines
1 KiB
Go
// 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
|
|
}
|