| /* |
| * WvTest: |
| * Copyright (C)1997-2012 Net Integration Technologies and contributors. |
| * Licensed under the GNU Library General Public License, version 2. |
| * See the included file named LICENSE for license information. |
| * You can get wvtest from: http://github.com/apenwarr/wvtest |
| */ |
| #include "wvtest.h" |
| #ifdef HAVE_WVCRASH |
| # include "wvcrash.h" |
| #endif |
| #include <stdlib.h> |
| #include <stdio.h> |
| #ifdef _WIN32 |
| #include <io.h> |
| #include <windows.h> |
| #else |
| #include <unistd.h> |
| #include <fcntl.h> |
| #endif |
| |
| static bool fd_is_valid(int fd) |
| { |
| #ifdef _WIN32 |
| if ((HANDLE)_get_osfhandle(fd) != INVALID_HANDLE_VALUE) return true; |
| #endif |
| int nfd = dup(fd); |
| if (nfd >= 0) |
| { |
| close(nfd); |
| return true; |
| } |
| return false; |
| |
| } |
| |
| |
| static int fd_count(const char *when) |
| { |
| int count = 0; |
| |
| printf("fds open at %s:", when); |
| |
| for (int fd = 0; fd < 1024; fd++) |
| { |
| if (fd_is_valid(fd)) |
| { |
| count++; |
| printf(" %d", fd); |
| fflush(stdout); |
| } |
| } |
| printf("\n"); |
| |
| return count; |
| } |
| |
| |
| int main(int argc, char **argv) |
| { |
| char buf[200]; |
| #if defined(_WIN32) && defined(HAVE_WVCRASH) |
| setup_console_crash(); |
| #endif |
| |
| // test wvtest itself. Not very thorough, but you have to draw the |
| // line somewhere :) |
| WVPASS(true); |
| WVPASS(1); |
| WVFAIL(false); |
| WVFAIL(0); |
| int startfd, endfd; |
| char * const *prefixes = NULL; |
| |
| if (argc > 1) |
| prefixes = argv + 1; |
| |
| startfd = fd_count("start"); |
| int ret = WvTest::run_all(prefixes); |
| |
| if (ret == 0) // don't pollute the strace output if we failed anyway |
| { |
| endfd = fd_count("end"); |
| |
| WVPASS(startfd == endfd); |
| #ifndef _WIN32 |
| if (startfd != endfd) |
| { |
| sprintf(buf, "ls -l /proc/%d/fd", getpid()); |
| if (system(buf) == -1) { |
| fprintf(stderr, "Unable to list open fds\n"); |
| } |
| } |
| #endif |
| } |
| |
| // keep 'make' from aborting if this environment variable is set |
| if (getenv("WVTEST_NO_FAIL")) |
| return 0; |
| else |
| return ret; |
| } |