diff options
author | Eric Blake <eblake@redhat.com> | 2011-03-30 22:07:20 -0600 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2011-03-31 13:09:17 +0200 |
commit | 111a4bf8dd3d9646133305c19964d8080e0b7085 (patch) | |
tree | 23b50460faefde2529c213b60a8c33ffe6acca29 /tests | |
parent | 98336a3006ddc5ce4743587889c2e78eb15f1cb1 (diff) | |
download | gnulib-111a4bf8dd3d9646133305c19964d8080e0b7085.tar.gz |
nonblocking: new module
* modules/nonblocking: New module.
* modules/nonblocking-tests: Likewise.
* lib/nonblocking.h: New file.
* lib/nonblocking.c: Likewise.
* tests/test-nonblocking.c: New test.
* lib/ioctl.c (ioctl) [mingw]: Update comment.
Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test-nonblocking.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/tests/test-nonblocking.c b/tests/test-nonblocking.c new file mode 100644 index 0000000000..0762cd0ae1 --- /dev/null +++ b/tests/test-nonblocking.c @@ -0,0 +1,125 @@ +/* Test manipulation of non-blocking flag. + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Eric Blake <ebb9@byu.net>, 2011. */ + +#include <config.h> + +#include "nonblocking.h" + +#include <errno.h> +#include <fcntl.h> +#include <sys/socket.h> +#include <unistd.h> + +#include "macros.h" + +int +main (void) +{ + const char *file = "test-nonblock.tmp"; + int fd_file; + int fd_pipe[2]; + int fd_sock; + bool sock_works = true; + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + /* For now, we can't get nonblocking status of windows sockets. */ + sock_works = false; +#endif + + fd_file = creat (file, 0600); + + /* Assume std descriptors were provided by invoker. */ + ASSERT (STDERR_FILENO < fd_file); + + /* Test regular files; setting nonblocking on file is unspecified. */ + ASSERT (get_nonblocking_flag (fd_file) == 0); + ASSERT (set_nonblocking_flag (fd_file, false) == 0); + ASSERT (get_nonblocking_flag (fd_file) == 0); + ASSERT (close (fd_file) == 0); + ASSERT (unlink (file) == 0); + + /* Test directories; setting nonblocking is unspecified. */ + fd_file = open (".", O_RDONLY); + ASSERT (STDERR_FILENO < fd_file); + ASSERT (get_nonblocking_flag (fd_file) == 0); + ASSERT (set_nonblocking_flag (fd_file, false) == 0); + ASSERT (get_nonblocking_flag (fd_file) == 0); + ASSERT (close (fd_file) == 0); + + /* Test pipes. */ + ASSERT (pipe (fd_pipe) == 0); + ASSERT (get_nonblocking_flag (fd_pipe[0]) == 0); + ASSERT (get_nonblocking_flag (fd_pipe[1]) == 0); + ASSERT (set_nonblocking_flag (fd_pipe[0], true) == 0); + ASSERT (get_nonblocking_flag (fd_pipe[0]) == 1); + ASSERT (get_nonblocking_flag (fd_pipe[1]) == 0); + ASSERT (set_nonblocking_flag (fd_pipe[1], true) == 0); + ASSERT (set_nonblocking_flag (fd_pipe[0], false) == 0); + ASSERT (get_nonblocking_flag (fd_pipe[0]) == 0); + ASSERT (get_nonblocking_flag (fd_pipe[1]) == 1); + ASSERT (close (fd_pipe[0]) == 0); + ASSERT (close (fd_pipe[1]) == 0); + +#if GNULIB_TEST_PIPE2 + /* mingw still lacks O_NONBLOCK replacement. */ + ASSERT (pipe2 (fd_pipe, O_NONBLOCK) == 0); + ASSERT (get_nonblocking_flag (fd_pipe[0]) == !!O_NONBLOCK); + ASSERT (get_nonblocking_flag (fd_pipe[1]) == !!O_NONBLOCK); + ASSERT (close (fd_pipe[0]) == 0); + ASSERT (close (fd_pipe[1]) == 0); +#endif /* GNULIB_TEST_PIPE2 */ + + /* Test sockets. */ + fd_sock = socket (AF_INET, SOCK_STREAM, 0); + ASSERT (get_nonblocking_flag (fd_sock) == (sock_works ? 0 : -1)); + ASSERT (set_nonblocking_flag (fd_sock, true) == 0); + ASSERT (get_nonblocking_flag (fd_sock) == (sock_works ? 1 : -1)); + ASSERT (set_nonblocking_flag (fd_sock, false) == 0); + ASSERT (get_nonblocking_flag (fd_sock) == (sock_works ? 0 : -1)); + ASSERT (close (fd_sock) == 0); + +#if SOCK_NONBLOCK + fd_sock = socket (AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + ASSERT (get_nonblocking_flag (fd_sock) == (sock_works ? 1 : -1)); + ASSERT (close (fd_sock) == 0); +#endif /* SOCK_NONBLOCK */ + + /* Test error handling. */ + { + errno = 0; + ASSERT (get_nonblocking_flag (-1) == -1); + ASSERT (errno == EBADF); + } + { + errno = 0; + ASSERT (set_nonblocking_flag (-1, false) == -1); + ASSERT (errno == EBADF); + } + { + errno = 0; + ASSERT (set_nonblocking_flag (-1, true) == -1); + ASSERT (errno == EBADF); + } + { + errno = 0; + ASSERT (set_nonblocking_flag (10000000, false) == -1); + ASSERT (errno == EBADF); + } + + return 0; +} |