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	"net"
10	"os"
11	"testing"
12	"time"
13)
14
15func TestReadError(t *testing.T) {
16	t.Run("ErrNotPollable", func(t *testing.T) {
17		f, err := badStateFile()
18		if err != nil {
19			t.Skip(err)
20		}
21		defer f.Close()
22
23		// Give scheduler a chance to have two separated
24		// goroutines: an event poller and an event waiter.
25		time.Sleep(100 * time.Millisecond)
26
27		var b [1]byte
28		_, err = f.Read(b[:])
29		if perr := parseReadError(err, isBadStateFileError); perr != nil {
30			t.Fatal(perr)
31		}
32	})
33}
34
35func parseReadError(nestedErr error, verify func(error) (string, bool)) error {
36	err := nestedErr
37	if nerr, ok := err.(*net.OpError); ok {
38		err = nerr.Err
39	}
40	if nerr, ok := err.(*os.PathError); ok {
41		err = nerr.Err
42	}
43	if nerr, ok := err.(*os.SyscallError); ok {
44		err = nerr.Err
45	}
46	if s, ok := verify(err); !ok {
47		return fmt.Errorf("got %v; want %s", nestedErr, s)
48	}
49	return nil
50}
51