test_fs_search_ranking.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*
  2. This file is part of GNUnet.
  3. (C) 2004, 2005, 2006, 2008 Christian Grothoff (and other contributing authors)
  4. GNUnet is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published
  6. by the Free Software Foundation; either version 3, or (at your
  7. option) any later version.
  8. GNUnet is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNUnet; see the file COPYING. If not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17. /**
  18. * @file applications/fs/fsui/search_ranking_test.c
  19. * @brief testcase for search ranking (availability, etc)
  20. * @author Christian Grothoff
  21. */
  22. #include "platform.h"
  23. #include "gnunet_util.h"
  24. #include "gnunet_fsui_lib.h"
  25. #define CHECK_VERBOSE GNUNET_NO
  26. #define CHECK(a) if (!(a)) { ok = GNUNET_NO; GNUNET_GE_BREAK(NULL, 0); goto FAILURE; }
  27. static char *
  28. makeName (unsigned int i)
  29. {
  30. char *fn;
  31. fn = GNUNET_malloc (strlen ("/tmp/gnunet-fsui-searchranktest/FSUITEST") + 14);
  32. GNUNET_snprintf (fn, strlen ("/tmp/gnunet-fsui-searchranktest/FSUITEST") + 14,
  33. "/tmp/gnunet-fsui-searchranktest/FSUITEST%u", i);
  34. GNUNET_disk_directory_create_for_file (NULL, fn);
  35. return fn;
  36. }
  37. static struct GNUNET_FSUI_SearchList *search;
  38. static enum GNUNET_FSUI_EventType lastEvent;
  39. static struct GNUNET_ECRS_URI *uri;
  40. static int availability;
  41. static unsigned int rank;
  42. static enum GNUNET_FSUI_EventType waitForEvent;
  43. static void *
  44. eventCallback (void *cls, const GNUNET_FSUI_Event * event)
  45. {
  46. static char unused;
  47. switch (event->type)
  48. {
  49. case GNUNET_FSUI_search_resumed:
  50. search = event->data.SearchResumed.sc.pos;
  51. break;
  52. case GNUNET_FSUI_search_suspended:
  53. search = NULL;
  54. break;
  55. case GNUNET_FSUI_search_update:
  56. availability = event->data.SearchUpdate.availability_rank;
  57. rank = event->data.SearchUpdate.applicability_rank;
  58. break;
  59. case GNUNET_FSUI_search_paused:
  60. case GNUNET_FSUI_search_restarted:
  61. break;
  62. case GNUNET_FSUI_download_resumed:
  63. case GNUNET_FSUI_upload_resumed:
  64. case GNUNET_FSUI_unindex_resumed:
  65. return &unused;
  66. case GNUNET_FSUI_search_result:
  67. #if CHECK_VERBOSE
  68. printf ("Received search result\n");
  69. #endif
  70. uri = GNUNET_ECRS_uri_duplicate (event->data.SearchResult.fi.uri);
  71. break;
  72. case GNUNET_FSUI_upload_completed:
  73. #if CHECK_VERBOSE
  74. printf ("Upload complete.\n");
  75. #endif
  76. break;
  77. case GNUNET_FSUI_download_completed:
  78. #if CHECK_VERBOSE
  79. printf ("Download complete.\n");
  80. #endif
  81. break;
  82. case GNUNET_FSUI_unindex_completed:
  83. #if CHECK_VERBOSE
  84. printf ("Unindex complete.\n");
  85. #endif
  86. break;
  87. case GNUNET_FSUI_upload_error:
  88. printf ("Upload error.\n");
  89. break;
  90. case GNUNET_FSUI_download_error:
  91. printf ("Download error.\n");
  92. break;
  93. case GNUNET_FSUI_unindex_error:
  94. printf ("Unindex error.\n");
  95. break;
  96. default:
  97. break;
  98. }
  99. if (lastEvent != waitForEvent)
  100. lastEvent = event->type;
  101. return NULL;
  102. }
  103. #define START_DAEMON 1
  104. int
  105. main (int argc, char *argv[])
  106. {
  107. #if START_DAEMON
  108. struct GNUNET_OS_Process *daemon;
  109. #endif
  110. int ok;
  111. char *fn = NULL;
  112. char *keywords[] = {
  113. "search_foo",
  114. "search_bar",
  115. };
  116. char keyword[40];
  117. int prog;
  118. struct GNUNET_MetaData *meta;
  119. struct GNUNET_ECRS_URI *kuri;
  120. struct GNUNET_GC_Configuration *cfg;
  121. struct GNUNET_FSUI_UploadList *upload;
  122. struct GNUNET_ECRS_URI *luri;
  123. struct GNUNET_FSUI_Context *ctx = NULL;
  124. ok = GNUNET_YES;
  125. cfg = GNUNET_GC_create ();
  126. if (-1 == GNUNET_GC_parse_configuration (cfg, "check.conf"))
  127. {
  128. GNUNET_GC_free (cfg);
  129. return -1;
  130. }
  131. #if START_DAEMON
  132. GNUNET_disk_directory_remove (NULL, "/tmp/gnunet-fsui-searchranktest/");
  133. daemon = GNUNET_daemon_start (NULL, cfg, "peer.conf", GNUNET_NO);
  134. GNUNET_GE_ASSERT (NULL, daemon != NULL);
  135. CHECK (GNUNET_OK ==
  136. GNUNET_wait_for_daemon_running (NULL, cfg, 30 * GNUNET_CRON_SECONDS));
  137. GNUNET_thread_sleep (5 * GNUNET_CRON_SECONDS); /* give apps time to start */
  138. /* ACTUAL TEST CODE */
  139. #endif
  140. ctx =
  141. GNUNET_FSUI_start (NULL, cfg, "fsuisearchranktest", 32, GNUNET_YES,
  142. &eventCallback, NULL);
  143. CHECK (ctx != NULL);
  144. /* upload */
  145. fn = makeName (42);
  146. GNUNET_disk_file_write (NULL, fn, "foo bar test!", strlen ("foo bar test!"),
  147. "600");
  148. meta = GNUNET_meta_data_create ();
  149. kuri =
  150. GNUNET_ECRS_keyword_command_line_to_uri (NULL, 2,
  151. (const char **) keywords);
  152. waitForEvent = GNUNET_FSUI_upload_completed;
  153. upload =
  154. GNUNET_FSUI_upload_start (ctx, fn,
  155. (GNUNET_FSUI_DirectoryScanCallback) &
  156. GNUNET_disk_directory_scan, NULL, 0, 0,
  157. GNUNET_YES, GNUNET_NO, GNUNET_NO,
  158. GNUNET_get_time () + 5 * GNUNET_CRON_HOURS,
  159. meta, kuri, kuri);
  160. CHECK (NULL != upload);
  161. GNUNET_free (fn);
  162. fn = NULL;
  163. GNUNET_ECRS_uri_destroy (kuri);
  164. GNUNET_meta_data_destroy (meta);
  165. prog = 0;
  166. while (lastEvent != GNUNET_FSUI_upload_completed)
  167. {
  168. prog++;
  169. if (prog == 10000)
  170. {
  171. fprintf (stderr, "Upload failed to complete -- last event: %u\n",
  172. lastEvent);
  173. }
  174. CHECK (prog < 10000);
  175. GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS);
  176. if (GNUNET_shutdown_test () == GNUNET_YES)
  177. break;
  178. }
  179. GNUNET_FSUI_upload_stop (upload);
  180. /* search */
  181. GNUNET_snprintf (keyword, 40, "%s %s", keywords[0], keywords[1]);
  182. luri = GNUNET_ECRS_keyword_string_to_uri (NULL, keyword);
  183. uri = NULL;
  184. search = GNUNET_FSUI_search_start (ctx, 0, luri);
  185. GNUNET_ECRS_uri_destroy (luri);
  186. luri = NULL;
  187. CHECK (NULL != search);
  188. GNUNET_FSUI_search_pause (search);
  189. GNUNET_FSUI_search_restart (search);
  190. while ((uri == NULL) && (availability < 3) && (rank != 2) &&
  191. (GNUNET_shutdown_test () != GNUNET_YES))
  192. {
  193. prog++;
  194. CHECK (prog < 10000);
  195. GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS);
  196. }
  197. GNUNET_FSUI_search_abort (search);
  198. GNUNET_FSUI_search_stop (search);
  199. CHECK (uri != NULL);
  200. /* END OF TEST CODE */
  201. FAILURE:
  202. if (ctx != NULL)
  203. GNUNET_FSUI_stop (ctx);
  204. GNUNET_free_non_null (fn);
  205. /* TODO: verify file 'fn(42)' == file 'fn(43)' */
  206. fn = makeName (42);
  207. UNLINK (fn);
  208. GNUNET_free (fn);
  209. fn = makeName (43);
  210. UNLINK (fn);
  211. GNUNET_free (fn);
  212. #if START_DAEMON
  213. GNUNET_GE_ASSERT (NULL, GNUNET_OK == GNUNET_daemon_stop (NULL, daemon));
  214. GNUNET_OS_process_close (daemon);
  215. daemon = NULL;
  216. #endif
  217. GNUNET_GC_free (cfg);
  218. return (ok == GNUNET_YES) ? 0 : 1;
  219. }
  220. /* end of searchtest.c */