1 // Copyright 2015 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.
13 "golang.org/x/sys/unix"
18 func makeTestFd(t *testing.T) testFd {
20 errno := unix.Pipe(tfd[:])
22 t.Fatalf("Failed to create pipe: %v", errno)
27 func (tfd testFd) fd() int {
31 func (tfd testFd) closeWrite(t *testing.T) {
32 errno := unix.Close(tfd[1])
34 t.Fatalf("Failed to close write end of pipe: %v", errno)
38 func (tfd testFd) put(t *testing.T) {
39 buf := make([]byte, 10)
40 _, errno := unix.Write(tfd[1], buf)
42 t.Fatalf("Failed to write to pipe: %v", errno)
46 func (tfd testFd) get(t *testing.T) {
47 buf := make([]byte, 10)
48 _, errno := unix.Read(tfd[0], buf)
50 t.Fatalf("Failed to read from pipe: %v", errno)
54 func (tfd testFd) close() {
59 func makePoller(t *testing.T) (testFd, *fdPoller) {
61 poller, err := newFdPoller(tfd.fd())
63 t.Fatalf("Failed to create poller: %v", err)
68 func TestPollerWithBadFd(t *testing.T) {
69 _, err := newFdPoller(-1)
70 if err != unix.EBADF {
71 t.Fatalf("Expected EBADF, got: %v", err)
75 func TestPollerWithData(t *testing.T) {
76 tfd, poller := makePoller(t)
81 ok, err := poller.wait()
83 t.Fatalf("poller failed: %v", err)
86 t.Fatalf("expected poller to return true")
91 func TestPollerWithWakeup(t *testing.T) {
92 tfd, poller := makePoller(t)
98 t.Fatalf("wake failed: %v", err)
100 ok, err := poller.wait()
102 t.Fatalf("poller failed: %v", err)
105 t.Fatalf("expected poller to return false")
109 func TestPollerWithClose(t *testing.T) {
110 tfd, poller := makePoller(t)
115 ok, err := poller.wait()
117 t.Fatalf("poller failed: %v", err)
120 t.Fatalf("expected poller to return true")
124 func TestPollerWithWakeupAndData(t *testing.T) {
125 tfd, poller := makePoller(t)
132 t.Fatalf("wake failed: %v", err)
135 // both data and wakeup
136 ok, err := poller.wait()
138 t.Fatalf("poller failed: %v", err)
141 t.Fatalf("expected poller to return true")
144 // data is still in the buffer, wakeup is cleared
145 ok, err = poller.wait()
147 t.Fatalf("poller failed: %v", err)
150 t.Fatalf("expected poller to return true")
154 // data is gone, only wakeup now
157 t.Fatalf("wake failed: %v", err)
159 ok, err = poller.wait()
161 t.Fatalf("poller failed: %v", err)
164 t.Fatalf("expected poller to return false")
168 func TestPollerConcurrent(t *testing.T) {
169 tfd, poller := makePoller(t)
173 oks := make(chan bool)
174 live := make(chan bool)
179 ok, err := poller.wait()
181 t.Fatalf("poller failed: %v", err)
192 case <-time.After(50 * time.Millisecond):
194 t.Fatalf("poller did not wait")
198 t.Fatalf("expected true")
205 case <-time.After(50 * time.Millisecond):
207 t.Fatalf("poller did not wait")
211 t.Fatalf("wake failed: %v", err)
214 t.Fatalf("expected false")
220 case <-time.After(50 * time.Millisecond):
222 t.Fatalf("poller did not wait")
226 t.Fatalf("expected true")