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