[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r14185: More unit tests to improve coverage. (in tor/trunk: . src/common src/or)



Author: nickm
Date: 2008-03-25 16:20:45 -0400 (Tue, 25 Mar 2008)
New Revision: 14185

Modified:
   tor/trunk/
   tor/trunk/src/common/test.h
   tor/trunk/src/or/test.c
Log:
 r19041@catbus:  nickm | 2008-03-25 16:20:42 -0400
 More unit tests to improve coverage.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r19041] on 8246c3cf-6607-4228-993b-4d95d33730f1

Modified: tor/trunk/src/common/test.h
===================================================================
--- tor/trunk/src/common/test.h	2008-03-25 19:24:03 UTC (rev 14184)
+++ tor/trunk/src/common/test.h	2008-03-25 20:20:45 UTC (rev 14185)
@@ -144,25 +144,25 @@
 
 #define test_memeq_hex(expr1, hex)                                      \
   STMT_BEGIN                                                            \
-    const void *_test_v1 = (expr1);                                     \
+    const char *_test_v1 = (char*)(expr1);                              \
     const char *_test_v2 = (hex);                                       \
     size_t _len_v2 = strlen(_test_v2);                                  \
-    char *mem2 = tor_malloc(_len_v2/2);                                 \
+    char *_mem2 = tor_malloc(_len_v2/2);                                \
     tor_assert((_len_v2 & 1) == 0);                                     \
-    base16_decode(mem2, _len_v2/2, _test_v2, _len_v2);                  \
-    if (!memcmp(mem2, _test_v1, _len_v2/2)) {                           \
+    base16_decode(_mem2, _len_v2/2, _test_v2, _len_v2);                 \
+    if (!memcmp(_mem2, _test_v1, _len_v2/2)) {                          \
       printf("."); fflush(stdout); } else {                             \
-      char *mem1 = tor_malloc(_len_v2)+1;                               \
-      base16_encode(mem1, _len_v2+1, _test_v1, _len_v2/2);              \
+      char *_mem1 = tor_malloc(_len_v2+1);                              \
+      base16_encode(_mem1, _len_v2+1, _test_v1, _len_v2/2);             \
       printf("\nFile %s: line %d (%s): Assertion failed: (%s==%s)\n"    \
              "      %s != %s\n",                                        \
              _SHORT_FILE_,                                              \
              __LINE__,                                                  \
              PRETTY_FUNCTION,                                           \
-             #expr1, _test_v2, mem1, _test_v2);                         \
+             #expr1, _test_v2, _mem1, _test_v2);                        \
       return;                                                           \
     }                                                                   \
-    tor_free(mem2);                                                     \
+    tor_free(_mem2);                                                    \
   STMT_END
 
 #define test_memneq(expr1, expr2, len)                          \

Modified: tor/trunk/src/or/test.c
===================================================================
--- tor/trunk/src/or/test.c	2008-03-25 19:24:03 UTC (rev 14184)
+++ tor/trunk/src/or/test.c	2008-03-25 20:20:45 UTC (rev 14185)
@@ -373,6 +373,12 @@
   test_eq(s1len, s2len);
   test_memeq(s1, s2, s1len);
 
+  {
+    /* XXXX Now fabricate some bad values and make sure they get caught,
+     * Check 0, 1, N-1, >= N, etc.
+     */
+  }
+
   crypto_dh_free(dh1);
   crypto_dh_free(dh2);
 }
@@ -383,7 +389,7 @@
   crypto_cipher_env_t *env1, *env2;
   crypto_pk_env_t *pk1, *pk2;
   char *data1, *data2, *data3, *cp;
-  int i, j, p, len, idx;
+  int i, j, p, len, idx, allok;
   size_t size;
 
   data1 = tor_malloc(1024);
@@ -396,6 +402,28 @@
   crypto_rand(data1, 100);
   crypto_rand(data2, 100);
   test_memneq(data1,data2,100);
+  allok = 1;
+  for (i = 0; i < 100; ++i) {
+    uint64_t big;
+    char *host;
+    j = crypto_rand_int(100);
+    if (i < 0 || i >= 100)
+      allok = 0;
+    big = crypto_rand_uint64(U64_LITERAL(1)<<40);
+    if (big >= (U64_LITERAL(1)<<40))
+      allok = 0;
+    big = crypto_rand_uint64(U64_LITERAL(5));
+    if (big >= 5)
+      allok = 0;
+    host = crypto_random_hostname(3,8,"www.",".onion");
+    if (strcmpstart(host,"www.") ||
+        strcmpend(host,".onion") ||
+        strlen(host) < 13 ||
+        strlen(host) > 18)
+      allok = 0;
+    tor_free(host);
+  }
+  test_assert(allok);
 
   /* Now, test encryption and decryption with stream cipher. */
   data1[0]='\0';
@@ -578,12 +606,19 @@
   /* File operations: save and load private key */
   test_assert(! crypto_pk_write_private_key_to_filename(pk1,
                                                         get_fname("pkey1")));
-
+  /* failing case for read: can't read. */
+  test_assert(crypto_pk_read_private_key_from_filename(pk2,
+                                                   get_fname("xyzzy")) < 0);
+  write_str_to_file(get_fname("xyzzy"), "foobar", 6);
+  /* Failing case for read: no key. */
+  test_assert(crypto_pk_read_private_key_from_filename(pk2,
+                                                   get_fname("xyzzy")) < 0);
   test_assert(! crypto_pk_read_private_key_from_filename(pk2,
                                                          get_fname("pkey1")));
   test_eq(15, crypto_pk_private_decrypt(pk2, data3, data1, 128,
                                         PK_PKCS1_OAEP_PADDING,1));
 
+
   /* Now try signing. */
   strlcpy(data1, "Ossifrage", 1024);
   test_eq(128, crypto_pk_private_sign(pk1, data2, data1, 10));
@@ -652,6 +687,8 @@
   test_memeq(data1, data3, DIGEST_LEN);
   test_eq(99, data3[DIGEST_LEN+1]);
 
+  test_assert(digest_from_base64(data3, "###") < 0);
+
   /* Base32 tests */
   strlcpy(data1, "5chrs", 1024);
   /* bit pattern is:  [35 63 68 72 73] ->
@@ -695,6 +732,45 @@
     tor_free(data1);
     tor_free(data2);
   }
+
+  /* Check fingerprint */
+  {
+    test_assert(crypto_pk_check_fingerprint_syntax(
+                "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"));
+    test_assert(!crypto_pk_check_fingerprint_syntax(
+                "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 000"));
+    test_assert(!crypto_pk_check_fingerprint_syntax(
+                "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 00000"));
+    test_assert(!crypto_pk_check_fingerprint_syntax(
+                "ABCD 1234 ABCD 5678 0000 ABCD1234 ABCD 5678 0000"));
+    test_assert(!crypto_pk_check_fingerprint_syntax(
+                "ABCD 1234 ABCD 5678 0000 ABCD1234 ABCD 5678 00000"));
+    test_assert(!crypto_pk_check_fingerprint_syntax(
+                "ACD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 00000"));
+  }
+
+  /* Incremental digest code. */
+  {
+    crypto_digest_env_t *d1, *d2;
+    char d_out1[DIGEST_LEN], d_out2[DIGEST_LEN];
+    d1 = crypto_new_digest_env();
+    test_assert(d1);
+    crypto_digest_add_bytes(d1, "abcdef", 6);
+    d2 = crypto_digest_dup(d1);
+    test_assert(d2);
+    crypto_digest_add_bytes(d2, "ghijkl", 6);
+    crypto_digest_get_digest(d2, d_out1, sizeof(d_out1));
+    crypto_digest(d_out2, "abcdefghijkl", 12);
+    test_memeq(d_out1, d_out2, DIGEST_LEN);
+    crypto_digest_assign(d2, d1);
+    crypto_digest_add_bytes(d2, "mno", 3);
+    crypto_digest_get_digest(d2, d_out1, sizeof(d_out1));
+    crypto_digest(d_out2, "abcdefmno", 9);
+    test_memeq(d_out1, d_out2, DIGEST_LEN);
+    crypto_digest_get_digest(d1, d_out1, sizeof(d_out1));
+    crypto_digest(d_out2, "abcdef", 6);
+    test_memeq(d_out1, d_out2, DIGEST_LEN);
+  }
 }
 
 static void
@@ -878,6 +954,10 @@
               tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp));
   test_assert(i == 0);
 
+  /* Test failing snprintf cases */
+  test_eq(-1, tor_snprintf(buf, 0, "Foo"));
+  test_eq(-1, tor_snprintf(buf, 2, "Foo"));
+
   /* Test printf with uint64 */
   tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x",
                U64_PRINTF_ARG(U64_LITERAL(12345678901)));
@@ -1640,6 +1720,24 @@
   test_assert(!smartlist_string_isin_case(sl, "nooNooN"));
   test_assert(smartlist_string_num_isin(sl, 50));
   test_assert(!smartlist_string_num_isin(sl, 60));
+
+  /* Test smartlist_choose */
+  {
+    int i;
+    int allsame = 1;
+    int allin = 1;
+    void *first = smartlist_choose(sl);
+    test_assert(smartlist_isin(sl, first));
+    for (i = 0; i < 100; ++i) {
+      void *second = smartlist_choose(sl);
+      if (second != first)
+        allsame = 0;
+      if (!smartlist_isin(sl, second))
+        allin = 0;
+    }
+    test_assert(!allsame);
+    test_assert(allin);
+  }
   SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
   smartlist_clear(sl);
 
@@ -2062,8 +2160,11 @@
   smartlist_t *found_keys;
 
   map = strmap_new();
+  test_eq(strmap_size(map), 0);
+  test_assert(strmap_isempty(map));
   v = strmap_set(map, "K1", (void*)99);
   test_eq(v, NULL);
+  test_assert(!strmap_isempty(map));
   v = strmap_set(map, "K2", (void*)101);
   test_eq(v, NULL);
   v = strmap_set(map, "K1", (void*)100);
@@ -2082,6 +2183,7 @@
   strmap_set(map, "K2", (void*)101);
   strmap_set(map, "K3", (void*)102);
   strmap_set(map, "K4", (void*)103);
+  test_eq(strmap_size(map), 4);
   strmap_assert_ok(map);
   strmap_set(map, "K5", (void*)104);
   strmap_set(map, "K6", (void*)105);
@@ -2142,6 +2244,9 @@
 
   crypto_rand(buf, buflen);
 
+  mapping = tor_mmap_file(fname1);
+  test_assert(! mapping);
+
   write_str_to_file(fname1, "Short file.", 1);
   write_bytes_to_file(fname2, buf, buflen, 1);
   write_bytes_to_file(fname3, buf, 16384, 1);
@@ -3431,6 +3536,10 @@
   res = base32_decode(decoded, 60, encoded, 96);
   test_eq(res, 0);
   test_memneq(plain, decoded, 60);
+  /* Bad encodings. */
+  encoded[0] = '!';
+  res = base32_decode(decoded, 60, encoded, 96);
+  test_assert(res < 0);
 }
 
 /* Test encoding and parsing of v2 rendezvous service descriptors. */
@@ -3695,6 +3804,7 @@
   }
 
   options->command = CMD_RUN_UNITTESTS;
+  crypto_global_init(0);
   rep_hist_init();
   network_init();
   setup_directory();
@@ -3729,6 +3839,8 @@
   }
   puts("");
 
+  crypto_global_cleanup();
+
   if (have_failed)
     return 1;
   else