#include "test.h"
#include "first.h"
#ifdef HAVE_LOCALE_H
# include <locale.h>
#endif
#include "memdebug.h"
#include "curlx/timediff.h"
#include "tool_binmode.h"
int select_wrapper(int nfds, fd_set *rd, fd_set *wr, fd_set *exc,
struct timeval *tv)
{
if(nfds < 0) {
SET_SOCKERRNO(SOCKEINVAL);
return -1;
}
#ifdef USE_WINSOCK
if(!nfds) {
Sleep((DWORD)curlx_tvtoms(tv));
return 0;
}
#endif
return select(nfds, rd, wr, exc, tv);
}
void wait_ms(int ms)
{
if(ms < 0)
return;
#ifdef USE_WINSOCK
Sleep((DWORD)ms);
#else
{
struct timeval t;
curlx_mstotv(&t, ms);
select_wrapper(0, NULL, NULL, NULL, &t);
}
#endif
}
char *libtest_arg2 = NULL;
char *libtest_arg3 = NULL;
char *libtest_arg4 = NULL;
int test_argc;
char **test_argv;
struct timeval tv_test_start;
int unitfail;
#ifdef CURLDEBUG
static void memory_tracking_init(void)
{
char *env;
env = getenv("CURL_MEMDEBUG");
if(env) {
curl_dbg_memdebug(env);
}
env = getenv("CURL_MEMLIMIT");
if(env) {
char *endptr;
long num = strtol(env, &endptr, 10);
if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
curl_dbg_memlimit(num);
}
}
#else
# define memory_tracking_init() Curl_nop_stmt
#endif
char *hexdump(const unsigned char *buf, size_t len)
{
static char dump[200 * 3 + 1];
char *p = dump;
size_t i;
if(len > 200)
return NULL;
for(i = 0; i < len; i++, p += 3)
curl_msnprintf(p, 4, "%02x ", buf[i]);
return dump;
}
int main(int argc, char **argv)
{
char *URL;
CURLcode result;
int basearg;
test_func_t test_func;
CURL_SET_BINMODE(stdout);
memory_tracking_init();
#ifdef HAVE_SETLOCALE
setlocale(LC_ALL, "");
#endif
test_argc = argc;
test_argv = argv;
#ifdef CURLTESTS_BUNDLED
{
char *test_name;
--test_argc;
++test_argv;
basearg = 2;
if(argc < (basearg + 1)) {
curl_mfprintf(stderr, "Pass testname and URL as arguments please\n");
return 1;
}
test_name = argv[basearg - 1];
test_func = NULL;
{
size_t tmp;
for(tmp = 0; tmp < CURL_ARRAYSIZE(s_tests); ++tmp) {
if(strcmp(test_name, s_tests[tmp].name) == 0) {
test_func = s_tests[tmp].ptr;
break;
}
}
}
if(!test_func) {
curl_mfprintf(stderr, "Test '%s' not found.\n", test_name);
return 1;
}
}
#else
basearg = 1;
if(argc < (basearg + 1)) {
curl_mfprintf(stderr, "Pass URL as argument please\n");
return 1;
}
test_func = test;
#endif
if(argc > (basearg + 1))
libtest_arg2 = argv[basearg + 1];
if(argc > (basearg + 2))
libtest_arg3 = argv[basearg + 2];
if(argc > (basearg + 2))
libtest_arg4 = argv[basearg + 3];
URL = argv[basearg];
curl_mfprintf(stderr, "URL: %s\n", URL);
result = test_func(URL);
curl_mfprintf(stderr, "Test ended with result %d\n", result);
#ifdef _WIN32
_flushall();
#endif
return (int)result <= 125 ? (int)result : 125;
}