lib507.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*****************************************************************************
  2. * _ _ ____ _
  3. * Project ___| | | | _ \| |
  4. * / __| | | | |_) | |
  5. * | (__| |_| | _ <| |___
  6. * \___|\___/|_| \_\_____|
  7. *
  8. * $Id$
  9. */
  10. #include "test.h"
  11. #include "testutil.h"
  12. #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
  13. #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
  14. int test(char *URL)
  15. {
  16. CURL* curls;
  17. CURLM* multi;
  18. int still_running;
  19. int i = -1;
  20. CURLMsg *msg;
  21. CURLMcode res;
  22. struct timeval ml_start;
  23. struct timeval mp_start;
  24. char ml_timedout = FALSE;
  25. char mp_timedout = FALSE;
  26. if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
  27. fprintf(stderr, "curl_global_init() failed\n");
  28. return TEST_ERR_MAJOR_BAD;
  29. }
  30. if ((multi = curl_multi_init()) == NULL) {
  31. fprintf(stderr, "curl_multi_init() failed\n");
  32. curl_global_cleanup();
  33. return TEST_ERR_MAJOR_BAD;
  34. }
  35. if ((curls = curl_easy_init()) == NULL) {
  36. fprintf(stderr, "curl_easy_init() failed\n");
  37. curl_multi_cleanup(multi);
  38. curl_global_cleanup();
  39. return TEST_ERR_MAJOR_BAD;
  40. }
  41. curl_easy_setopt(curls, CURLOPT_URL, URL);
  42. if ((res = curl_multi_add_handle(multi, curls)) != CURLM_OK) {
  43. fprintf(stderr, "curl_multi_add_handle() failed, "
  44. "with code %d\n", res);
  45. curl_easy_cleanup(curls);
  46. curl_multi_cleanup(multi);
  47. curl_global_cleanup();
  48. return TEST_ERR_MAJOR_BAD;
  49. }
  50. mp_timedout = FALSE;
  51. mp_start = tutil_tvnow();
  52. do {
  53. res = curl_multi_perform(multi, &still_running);
  54. if (tutil_tvdiff(tutil_tvnow(), mp_start) >
  55. MULTI_PERFORM_HANG_TIMEOUT) {
  56. mp_timedout = TRUE;
  57. break;
  58. }
  59. } while (res == CURLM_CALL_MULTI_PERFORM);
  60. ml_timedout = FALSE;
  61. ml_start = tutil_tvnow();
  62. while ((!ml_timedout) && (!mp_timedout) && (still_running)) {
  63. struct timeval timeout;
  64. int rc;
  65. fd_set fdread;
  66. fd_set fdwrite;
  67. fd_set fdexcep;
  68. int maxfd;
  69. FD_ZERO(&fdread);
  70. FD_ZERO(&fdwrite);
  71. FD_ZERO(&fdexcep);
  72. timeout.tv_sec = 1;
  73. timeout.tv_usec = 0;
  74. if (tutil_tvdiff(tutil_tvnow(), ml_start) >
  75. MAIN_LOOP_HANG_TIMEOUT) {
  76. ml_timedout = TRUE;
  77. break;
  78. }
  79. curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
  80. rc = select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
  81. switch(rc) {
  82. case -1:
  83. break;
  84. case 0:
  85. default:
  86. mp_timedout = FALSE;
  87. mp_start = tutil_tvnow();
  88. do {
  89. res = curl_multi_perform(multi, &still_running);
  90. if (tutil_tvdiff(tutil_tvnow(), mp_start) >
  91. MULTI_PERFORM_HANG_TIMEOUT) {
  92. mp_timedout = TRUE;
  93. break;
  94. }
  95. } while (res == CURLM_CALL_MULTI_PERFORM);
  96. break;
  97. }
  98. }
  99. if (ml_timedout || mp_timedout) {
  100. if (ml_timedout) fprintf(stderr, "ml_timedout\n");
  101. if (mp_timedout) fprintf(stderr, "mp_timedout\n");
  102. fprintf(stderr, "ABORTING TEST, since it seems "
  103. "that it would have run forever.\n");
  104. i = TEST_ERR_RUNS_FOREVER;
  105. }
  106. else {
  107. msg = curl_multi_info_read(multi, &still_running);
  108. if(msg)
  109. /* this should now contain a result code from the easy handle,
  110. get it */
  111. i = msg->data.result;
  112. }
  113. curl_multi_cleanup(multi);
  114. curl_easy_cleanup(curls);
  115. curl_global_cleanup();
  116. return i; /* return the final return code */
  117. }