1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. 9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which 11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms 12e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * are also available at http://curl.haxx.se/docs/copyright.html. 13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is 16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file. 17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied. 20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/ 229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "test.h" 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 24e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "testtrace.h" 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h" 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 27e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef LIB585 28e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 29e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstatic int counter; 30e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 31e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstatic curl_socket_t tst_opensocket(void *clientp, 32e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curlsocktype purpose, 33e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct curl_sockaddr *addr) 34e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{ 35e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (void)clientp; 36e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (void)purpose; 37e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET printf("[OPEN] counter: %d\n", ++counter); 38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return socket(addr->family, addr->socktype, addr->protocol); 39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} 40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstatic int tst_closesocket(void *clientp, curl_socket_t sock) 42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{ 43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (void)clientp; 44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET printf("[CLOSE] counter: %d\n", counter--); 45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return sclose(sock); 46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} 47e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstatic void setupcallbacks(CURL *curl) 49e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{ 50e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, tst_opensocket); 51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, tst_closesocket); 52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET counter = 0; 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} 54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 55e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#else 56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define setupcallbacks(x) Curl_nop_stmt 57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 59e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint test(char *URL) 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLcode res; 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURL *curl; 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char *ipstr=NULL; 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_global_init() failed\n"); 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if ((curl = curl_easy_init()) == NULL) { 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_easy_init() failed\n"); 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_URL, URL); 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_HEADER, 1L); 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET libtest_debug_config.nohex = 1; 81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET libtest_debug_config.tracetime = 1; 82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET test_setopt(curl, CURLOPT_DEBUGDATA, &libtest_debug_config); 83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET test_setopt(curl, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); 84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET test_setopt(curl, CURLOPT_VERBOSE, 1L); 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(libtest_arg3 && !strcmp(libtest_arg3, "activeftp")) 87e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET test_setopt(curl, CURLOPT_FTPPORT, "-"); 88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 89e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET setupcallbacks(curl); 90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!res) { 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ipstr); 95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if (libtest_arg2) { 96e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FILE *moo = fopen(libtest_arg2, "wb"); 97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(moo) { 98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET double time_namelookup; 99e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET double time_connect; 100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET double time_pretransfer; 101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET double time_starttransfer; 102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET double time_total; 103e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fprintf(moo, "IP: %s\n", ipstr); 104e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &time_namelookup); 105e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &time_connect); 106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &time_pretransfer); 107e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, 108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET &time_starttransfer); 109e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &time_total); 110e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 111e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* since the timing will always vary we only compare relative differences 112e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET between these 5 times */ 113e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(time_namelookup > time_connect) { 114e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fprintf(moo, "namelookup vs connect: %f %f\n", 115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET time_namelookup, time_connect); 116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 117e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(time_connect > time_pretransfer) { 118e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fprintf(moo, "connect vs pretransfer: %f %f\n", 119e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET time_connect, time_pretransfer); 120e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 121e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(time_pretransfer > time_starttransfer) { 122e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fprintf(moo, "pretransfer vs starttransfer: %f %f\n", 123e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET time_pretransfer, time_starttransfer); 124e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 125e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(time_starttransfer > time_total) { 126e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fprintf(moo, "starttransfer vs total: %f %f\n", 127e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET time_starttransfer, time_total); 128e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 129e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 130e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fclose(moo); 131e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 1329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelstest_cleanup: 1369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 1389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return (int)res; 1419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 143