From 111a4bf8dd3d9646133305c19964d8080e0b7085 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Wed, 30 Mar 2011 22:07:20 -0600 Subject: 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 --- tests/test-nonblocking.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 tests/test-nonblocking.c (limited to 'tests') 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 . */ + +/* Written by Eric Blake , 2011. */ + +#include + +#include "nonblocking.h" + +#include +#include +#include +#include + +#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; +} -- cgit v1.2.1