Browse Source

Small coverage improvements on compat.c

Nick Mathewson 7 years ago
parent
commit
603cb712ef
2 changed files with 59 additions and 8 deletions
  1. 14 7
      src/common/compat.c
  2. 45 1
      src/test/test_util.c

+ 14 - 7
src/common/compat.c

@@ -1145,14 +1145,12 @@ tor_close_socket(tor_socket_t s)
       --n_sockets_open;
 #else
     if (r != EBADF)
-      --n_sockets_open;
+      --n_sockets_open; // LCOV_EXCL_LINE -- EIO and EINTR too hard to force.
 #endif
     r = -1;
   }
 
-  if (n_sockets_open < 0)
-    log_warn(LD_BUG, "Our socket count is below zero: %d. Please submit a "
-             "bug report.", n_sockets_open);
+  tor_assert_nonfatal(n_sockets_open >= 0);
   socket_accounting_unlock();
   return r;
 }
@@ -1932,7 +1930,7 @@ tor_getpwnam(const char *username)
     return NULL;
 
   if (! strcmp(username, passwd_cached->pw_name))
-    return passwd_cached;
+    return passwd_cached; // LCOV_EXCL_LINE - would need to make getpwnam flaky
 
   return NULL;
 }
@@ -1958,7 +1956,7 @@ tor_getpwuid(uid_t uid)
     return NULL;
 
   if (uid == passwd_cached->pw_uid)
-    return passwd_cached;
+    return passwd_cached; // LCOV_EXCL_LINE - would need to make getpwnam flaky
 
   return NULL;
 }
@@ -2750,7 +2748,9 @@ MOCK_IMPL(const char *, get_uname, (void))
       }
 #endif
 #else
+        /* LCOV_EXCL_START -- can't provoke uname failure */
         strlcpy(uname_result, "Unknown platform", sizeof(uname_result));
+        /* LCOV_EXCL_STOP */
 #endif
       }
     uname_result_is_set = 1;
@@ -2824,11 +2824,14 @@ compute_num_cpus(void)
   if (num_cpus == -2) {
     num_cpus = compute_num_cpus_impl();
     tor_assert(num_cpus != -2);
-    if (num_cpus > MAX_DETECTABLE_CPUS)
+    if (num_cpus > MAX_DETECTABLE_CPUS) {
+      /* LCOV_EXCL_START */
       log_notice(LD_GENERAL, "Wow!  I detected that you have %d CPUs. I "
                  "will not autodetect any more than %d, though.  If you "
                  "want to configure more, set NumCPUs in your torrc",
                  num_cpus, MAX_DETECTABLE_CPUS);
+      /* LCOV_EXCL_STOP */
+    }
   }
   return num_cpus;
 }
@@ -3358,9 +3361,11 @@ get_total_system_memory_impl(void)
   return result * 1024;
 
  err:
+  /* LCOV_EXCL_START Can't reach this unless proc is broken. */
   tor_free(s);
   close(fd);
   return 0;
+  /* LCOV_EXCL_STOP */
 #elif defined (_WIN32)
   /* Windows has MEMORYSTATUSEX; pretty straightforward. */
   MEMORYSTATUSEX ms;
@@ -3409,6 +3414,7 @@ get_total_system_memory(size_t *mem_out)
   static size_t mem_cached=0;
   uint64_t m = get_total_system_memory_impl();
   if (0 == m) {
+    /* LCOV_EXCL_START -- can't make this happen without mocking. */
     /* We couldn't find our memory total */
     if (0 == mem_cached) {
       /* We have no cached value either */
@@ -3418,6 +3424,7 @@ get_total_system_memory(size_t *mem_out)
 
     *mem_out = mem_cached;
     return 0;
+    /* LCOV_EXCL_STOP */
   }
 
 #if SIZE_MAX != UINT64_MAX

+ 45 - 1
src/test/test_util.c

@@ -1951,7 +1951,6 @@ test_util_gzip_compression_bomb(void *arg)
                                            compression_bomb, 1039,
                                            ZLIB_METHOD, 0, LOG_WARN));
 
-
   /* Now try streaming that. */
   state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
   tor_zlib_output_t r;
@@ -3400,6 +3399,21 @@ test_util_ftruncate(void *ptr)
   tor_free(buf);
 }
 
+static void
+test_util_num_cpus(void *arg)
+{
+  (void)arg;
+  int num = compute_num_cpus();
+  if (num < 0)
+    tt_skip();
+
+  tt_int_op(num, OP_GE, 1);
+  tt_int_op(num, OP_LE, 16);
+
+ done:
+  ;
+}
+
 #ifdef _WIN32
 static void
 test_util_load_win_lib(void *ptr)
@@ -4921,6 +4935,35 @@ test_util_pwdb(void *arg)
   dir = get_user_homedir(name);
   tt_assert(dir != NULL);
 
+  /* Try failing cases.  First find a user that doesn't exist by name */
+  char rand[4];
+  char badname[9];
+  int i, found=0;
+  for (i = 0; i < 100; ++i) {
+    crypto_rand(rand, sizeof(rand));
+    base16_encode(badname, sizeof(badname), rand, sizeof(rand));
+    if (tor_getpwnam(badname) == NULL) {
+      found = 1;
+      break;
+    }
+  }
+  tt_assert(found);
+  tor_free(dir);
+  dir = get_user_homedir(badname);
+  tt_assert(dir == NULL);
+
+  /* Now try to find a user that doesn't exist by ID. */
+  found = 0;
+  for (i = 0; i < 1000; ++i) {
+    uid_t u;
+    crypto_rand((char*)&u, sizeof(u));
+    if (tor_getpwuid(u) == NULL) {
+      found = 1;
+      break;
+    }
+  }
+  tt_assert(found);
+
  done:
   tor_free(name);
   tor_free(dir);
@@ -5006,6 +5049,7 @@ struct testcase_t util_tests[] = {
   UTIL_TEST(listdir, 0),
   UTIL_TEST(parent_dir, 0),
   UTIL_TEST(ftruncate, 0),
+  UTIL_TEST(num_cpus, 0),
   UTIL_TEST_WIN_ONLY(load_win_lib, 0),
   UTIL_TEST_NO_WIN(exit_status, 0),
   UTIL_TEST_NO_WIN(fgets_eagain, 0),