Browse Source

New testing-only tor_sleep_msec function

In the unit tests I want to loop with a delay, but I want less than
a 1 second delay.  This, sadly, requires compatibility code.
Nick Mathewson 10 years ago
parent
commit
e2e588175e
3 changed files with 32 additions and 0 deletions
  1. 2 0
      configure.ac
  2. 26 0
      src/common/compat.c
  3. 4 0
      src/common/compat.h

+ 2 - 0
configure.ac

@@ -355,6 +355,7 @@ AC_CHECK_FUNCS(
         sysconf \
 	sysctl \
         uname \
+        usleep \
         vasprintf \
 	_vscprintf
 )
@@ -885,6 +886,7 @@ AC_CHECK_HEADERS(
         sys/param.h \
         sys/prctl.h \
         sys/resource.h \
+        sys/select.h \
         sys/socket.h \
 	sys/sysctl.h \
         sys/syslimits.h \

+ 26 - 0
src/common/compat.c

@@ -114,6 +114,12 @@
 /* Only use the linux prctl;  the IRIX prctl is totally different */
 #include <sys/prctl.h>
 #endif
+#ifdef TOR_UNIT_TESTS
+#if !defined(HAVE_USLEEP) && defined(HAVE_SYS_SELECT_H)
+/* as fallback implementation for tor_sleep_msec */
+#include <sys/select.h>
+#endif
+#endif
 
 #include "torlog.h"
 #include "util.h"
@@ -3450,3 +3456,23 @@ get_total_system_memory(size_t *mem_out)
   return -1;
 }
 
+#ifdef TOR_UNIT_TESTS
+/** Delay for <b>msec</b> milliseconds.  Only used in tests. */
+void
+tor_sleep_msec(int msec)
+{
+#ifdef _WIN32
+  Sleep(msec);
+#elif defined(HAVE_USLEEP)
+  sleep(msec / 1000);
+  /* Some usleep()s hate sleeping more than 1 sec */
+  usleep((msec % 1000) * 1000);
+#elif defined(HAVE_SYS_SELECT_H)
+  struct timeval tv = { msec / 1000, (msec % 1000) * 1000};
+  select(0, NULL, NULL, NULL, &tv);
+#else
+  sleep(CEIL_DIV(msec, 1000));
+#endif
+}
+#endif
+

+ 4 - 0
src/common/compat.h

@@ -744,6 +744,10 @@ char *format_win32_error(DWORD err);
 
 #endif
 
+#ifdef TOR_UNIT_TESTS
+void tor_sleep_msec(int msec);
+#endif
+
 #ifdef COMPAT_PRIVATE
 #if !defined(HAVE_SOCKETPAIR) || defined(_WIN32) || defined(TOR_UNIT_TESTS)
 #define NEED_ERSATZ_SOCKETPAIR