|  | @@ -789,6 +789,27 @@ test_util_strmisc(void)
 | 
	
		
			
				|  |  |      test_streq(cp, "### Sm\n#### a\n#### l\n#### l\n#### t\n#### e\n#### s\n#### t\n");
 | 
	
		
			
				|  |  |      tor_free(cp);
 | 
	
		
			
				|  |  |      SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
 | 
	
		
			
				|  |  | +    smartlist_clear(sl);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    wrap_string(sl, "First null", 6, NULL, "> ");
 | 
	
		
			
				|  |  | +    cp = smartlist_join_strings(sl, "", 0, NULL);
 | 
	
		
			
				|  |  | +    test_streq(cp, "First\n> null\n");
 | 
	
		
			
				|  |  | +    tor_free(cp);
 | 
	
		
			
				|  |  | +    SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
 | 
	
		
			
				|  |  | +    smartlist_clear(sl);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    wrap_string(sl, "Second null", 6, "> ", NULL);
 | 
	
		
			
				|  |  | +    cp = smartlist_join_strings(sl, "", 0, NULL);
 | 
	
		
			
				|  |  | +    test_streq(cp, "> Seco\nnd\nnull\n");
 | 
	
		
			
				|  |  | +    tor_free(cp);
 | 
	
		
			
				|  |  | +    SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
 | 
	
		
			
				|  |  | +    smartlist_clear(sl);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    wrap_string(sl, "Both null", 6, NULL, NULL);
 | 
	
		
			
				|  |  | +    cp = smartlist_join_strings(sl, "", 0, NULL);
 | 
	
		
			
				|  |  | +    test_streq(cp, "Both\nnull\n");
 | 
	
		
			
				|  |  | +    tor_free(cp);
 | 
	
		
			
				|  |  | +    SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
 | 
	
		
			
				|  |  |      smartlist_free(sl);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /* Can't test prefixes that have the same length as the line width, because
 | 
	
	
		
			
				|  | @@ -797,7 +818,7 @@ test_util_strmisc(void)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Test hex_str */
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  | -    char binary_data[64];
 | 
	
		
			
				|  |  | +    char binary_data[68];
 | 
	
		
			
				|  |  |      size_t i;
 | 
	
		
			
				|  |  |      for (i = 0; i < sizeof(binary_data); ++i)
 | 
	
		
			
				|  |  |        binary_data[i] = i;
 | 
	
	
		
			
				|  | @@ -807,11 +828,36 @@ test_util_strmisc(void)
 | 
	
		
			
				|  |  |      test_streq(hex_str(binary_data, 32),
 | 
	
		
			
				|  |  |                 "000102030405060708090A0B0C0D0E0F"
 | 
	
		
			
				|  |  |                 "101112131415161718191A1B1C1D1E1F");
 | 
	
		
			
				|  |  | +    test_streq(hex_str(binary_data, 34),
 | 
	
		
			
				|  |  | +               "000102030405060708090A0B0C0D0E0F"
 | 
	
		
			
				|  |  | +               "101112131415161718191A1B1C1D1E1F");
 | 
	
		
			
				|  |  |      /* Repeat these tests for shorter strings after longer strings
 | 
	
		
			
				|  |  |         have been tried, to make sure we're correctly terminating strings */
 | 
	
		
			
				|  |  |      test_streq(hex_str(binary_data, 1), "00");
 | 
	
		
			
				|  |  |      test_streq(hex_str(binary_data, 0), "");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /* Test strcmp_opt */
 | 
	
		
			
				|  |  | +  test_eq(-1, strcmp_opt("",   "foo"));
 | 
	
		
			
				|  |  | +  test_eq(0,  strcmp_opt("",    ""));
 | 
	
		
			
				|  |  | +  test_eq(1,  strcmp_opt("foo", ""));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  test_eq(-1, strcmp_opt(NULL,  ""));
 | 
	
		
			
				|  |  | +  test_eq(0,  strcmp_opt(NULL,  NULL));
 | 
	
		
			
				|  |  | +  test_eq(1,  strcmp_opt("",    NULL));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  test_eq(-1, strcmp_opt(NULL,  "foo"));
 | 
	
		
			
				|  |  | +  test_eq(1,  strcmp_opt("foo", NULL));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /* Test strcmp_len */
 | 
	
		
			
				|  |  | +  test_eq(1,  strcmp_len("foo", "bar", 3));
 | 
	
		
			
				|  |  | +  test_eq(-1, strcmp_len("foo", "bar", 2)); /* First len, then lexical */
 | 
	
		
			
				|  |  | +  test_eq(1,  strcmp_len("foo2", "foo1", 4));
 | 
	
		
			
				|  |  | +  test_eq(-1, strcmp_len("foo2", "foo1", 3)); /* Really stop at len */
 | 
	
		
			
				|  |  | +  test_eq(0, strcmp_len("foo2", "foo", 3));   /* Really stop at len */
 | 
	
		
			
				|  |  | +  test_eq(1, strcmp_len("blah", "", 4));
 | 
	
		
			
				|  |  | +  test_eq(0, strcmp_len("blah", "", 0));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |   done:
 | 
	
		
			
				|  |  |    ;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -1565,6 +1611,7 @@ test_util_find_str_at_start_of_line(void *ptr)
 | 
	
		
			
				|  |  |    (void)ptr;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    test_eq_ptr(long_string, find_str_at_start_of_line(long_string, ""));
 | 
	
		
			
				|  |  | +  test_eq_ptr(NULL, find_str_at_start_of_line(short_string, "nonsense"));
 | 
	
		
			
				|  |  |    test_eq_ptr(NULL, find_str_at_start_of_line(long_string, "nonsense"));
 | 
	
		
			
				|  |  |    test_eq_ptr(NULL, find_str_at_start_of_line(long_string, "\n"));
 | 
	
		
			
				|  |  |    test_eq_ptr(NULL, find_str_at_start_of_line(long_string, "how "));
 |