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
5//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
6// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
7
8package unix_test
9
10import (
11	"testing"
12
13	"golang.org/x/sys/unix"
14)
15
16func TestFdSet(t *testing.T) {
17	var fdSet unix.FdSet
18	fdSet.Zero()
19	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
20		if fdSet.IsSet(fd) {
21			t.Fatalf("Zero did not clear fd %d", fd)
22		}
23		fdSet.Set(fd)
24	}
25
26	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
27		if !fdSet.IsSet(fd) {
28			t.Fatalf("IsSet(%d): expected true, got false", fd)
29		}
30	}
31
32	fdSet.Zero()
33	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
34		if fdSet.IsSet(fd) {
35			t.Fatalf("Zero did not clear fd %d", fd)
36		}
37	}
38
39	for fd := 1; fd < unix.FD_SETSIZE; fd += 2 {
40		fdSet.Set(fd)
41	}
42
43	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
44		if fd&0x1 == 0x1 {
45			if !fdSet.IsSet(fd) {
46				t.Fatalf("IsSet(%d): expected true, got false", fd)
47			}
48		} else {
49			if fdSet.IsSet(fd) {
50				t.Fatalf("IsSet(%d): expected false, got true", fd)
51			}
52		}
53	}
54
55	for fd := 1; fd < unix.FD_SETSIZE; fd += 2 {
56		fdSet.Clear(fd)
57	}
58
59	for fd := 0; fd < unix.FD_SETSIZE; fd++ {
60		if fdSet.IsSet(fd) {
61			t.Fatalf("Clear(%d) did not clear fd", fd)
62		}
63	}
64}
65