Skip to content

Commit

Permalink
chore: add epoll monitor epoll fd test
Browse files Browse the repository at this point in the history
  • Loading branch information
joway committed Mar 15, 2024
1 parent 6039df7 commit 08ef431
Showing 1 changed file with 109 additions and 0 deletions.
109 changes: 109 additions & 0 deletions poll_default_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,115 @@ func TestEpollConnectSameFD(t *testing.T) {
Assert(t, n == 0)
}

func TestEpollWaitEpollFD(t *testing.T) {
epollfd1, err := EpollCreate(0) // monitor epollfd2
MustNil(t, err)
epollfd2, err := EpollCreate(0) // monitor io fds
MustNil(t, err)
MustNil(t, err)
defer syscall.Close(epollfd1)
defer syscall.Close(epollfd2)

rfd, wfd := GetSysFdPairs()
defer syscall.Close(wfd)
send := []byte("hello")
recv := make([]byte, 5)
events := make([]epollevent, 128)
n := 0

// register epollfd2 into epollfd1
event := &epollevent{
events: syscall.EPOLLIN | syscall.EPOLLRDHUP | syscall.EPOLLERR,
data: [8]byte{},
}
err = EpollCtl(epollfd1, syscall.EPOLL_CTL_ADD, epollfd2, event)
MustNil(t, err)
_, err = epollWaitUntil(epollfd1, events, 0)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN == 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// register rfd into epollfd2
err = EpollCtl(epollfd2, syscall.EPOLL_CTL_ADD, rfd, event)
MustNil(t, err)
n, err = epollWaitUntil(epollfd2, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN == 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// check epollfd2 readable
n, err = syscall.Write(wfd, send)
Equal(t, n, len(send))
MustNil(t, err)
n, err = epollWaitUntil(epollfd1, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN != 0)

// check rfd readable
n, err = epollWaitUntil(epollfd2, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN != 0)

// read rfd
n, err = syscall.Read(rfd, recv)
Equal(t, n, len(send))
MustTrue(t, err == nil && string(recv) == string(send))

// check epollfd1 non-readable
n, err = epollWaitUntil(epollfd1, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN == 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// check epollfd2 non-readable
n, err = epollWaitUntil(epollfd2, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN == 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// close wfd
err = syscall.Close(wfd)
MustNil(t, err)

// check epollfd1 notified when peer closed
n, err = epollWaitUntil(epollfd1, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN != 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// check epollfd2 notified when peer closed
n, err = epollWaitUntil(epollfd2, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN != 0)
Assert(t, events[0].events&syscall.EPOLLRDHUP != 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// close rfd
err = syscall.Close(rfd)
MustNil(t, err)

// check epollfd1 non-readable
n, err = epollWaitUntil(epollfd1, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN == 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)

// check epollfd2 non-readable
n, err = epollWaitUntil(epollfd2, events, 0)
Equal(t, n, 1)
MustNil(t, err)
Assert(t, events[0].events&syscall.EPOLLIN == 0)
Assert(t, events[0].events&syscall.EPOLLERR == 0)
}

func TestRuntimeNetpoller(t *testing.T) {
pfd, err := openPollFile()
MustNil(t, err)
Expand Down

0 comments on commit 08ef431

Please sign in to comment.