|  | @@ -542,6 +542,89 @@ test_util_config_line_escaped_content(void)
 | 
	
		
			
				|  |  |    tor_free(v);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#ifndef MS_WINDOWS
 | 
	
		
			
				|  |  | +static void
 | 
	
		
			
				|  |  | +test_util_expand_filename(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  char *str;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  setenv("HOME", "/home/itv", 1); /* For "internal test value" */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("");
 | 
	
		
			
				|  |  | +  test_streq("", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("/normal/path");
 | 
	
		
			
				|  |  | +  test_streq("/normal/path", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("/normal/trailing/path/");
 | 
	
		
			
				|  |  | +  test_streq("/normal/trailing/path/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~");
 | 
	
		
			
				|  |  | +  test_streq("/home/itv/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("$HOME/nodice");
 | 
	
		
			
				|  |  | +  test_streq("$HOME/nodice", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/");
 | 
	
		
			
				|  |  | +  test_streq("/home/itv/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/foobarqux");
 | 
	
		
			
				|  |  | +  test_streq("/home/itv/foobarqux", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/../../etc/passwd");
 | 
	
		
			
				|  |  | +  test_streq("/home/itv/../../etc/passwd", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/trailing/");
 | 
	
		
			
				|  |  | +  test_streq("/home/itv/trailing/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +  /* Ideally we'd test ~anotheruser, but that's shady to test (we'd
 | 
	
		
			
				|  |  | +     have to somehow inject/fake the get_user_homedir call) */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /* Try with empty $HOME */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  setenv("HOME", "", 1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~");
 | 
	
		
			
				|  |  | +  test_streq("/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/");
 | 
	
		
			
				|  |  | +  test_streq("/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/foobar");
 | 
	
		
			
				|  |  | +  test_streq("/foobar", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /* Try with $HOME unset */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  unsetenv("HOME");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~");
 | 
	
		
			
				|  |  | +  test_streq("/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/");
 | 
	
		
			
				|  |  | +  test_streq("/", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  str = expand_filename("~/foobar");
 | 
	
		
			
				|  |  | +  test_streq("/foobar", str);
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | + done:
 | 
	
		
			
				|  |  | +  tor_free(str);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /** Test basic string functionality. */
 | 
	
		
			
				|  |  |  static void
 | 
	
		
			
				|  |  |  test_util_strmisc(void)
 | 
	
	
		
			
				|  | @@ -2740,6 +2823,7 @@ struct testcase_t util_tests[] = {
 | 
	
		
			
				|  |  |    UTIL_LEGACY(config_line_quotes),
 | 
	
		
			
				|  |  |    UTIL_LEGACY(config_line_comment_character),
 | 
	
		
			
				|  |  |    UTIL_LEGACY(config_line_escaped_content),
 | 
	
		
			
				|  |  | +  UTIL_LEGACY(expand_filename),
 | 
	
		
			
				|  |  |    UTIL_LEGACY(strmisc),
 | 
	
		
			
				|  |  |    UTIL_LEGACY(pow2),
 | 
	
		
			
				|  |  |    UTIL_LEGACY(gzip),
 |