1// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package poll_test
6
7import (
8	"fmt"
9	"io/fs"
10	"net"
11	"os"
12	"testing"
13	"time"
14)
15
16func TestReadError(t *testing.T) {
17	t.Run("ErrNotPollable", func(t *testing.T) {
18		f, err := badStateFile()
19		if err != nil {
20			t.Skip(err)
21		}
22		defer f.Close()
23
24		// Give scheduler a chance to have two separated
25		// goroutines: an event poller and an event waiter.
26		time.Sleep(100 * time.Millisecond)
27
28		var b [1]byte
29		_, err = f.Read(b[:])
30		if perr := parseReadError(err, isBadStateFileError); perr != nil {
31			t.Fatal(perr)
32		}
33	})
34}
35
36func parseReadError(nestedErr error, verify func(error) (string, bool)) error {
37	err := nestedErr
38	if nerr, ok := err.(*net.OpError); ok {
39		err = nerr.Err
40	}
41	if nerr, ok := err.(*fs.PathError); ok {
42		err = nerr.Err
43	}
44	if nerr, ok := err.(*os.SyscallError); ok {
45		err = nerr.Err
46	}
47	if s, ok := verify(err); !ok {
48		return fmt.Errorf("got %v; want %s", nestedErr, s)
49	}
50	return nil
51}
52