Unit tests for check_or_create_data_subdir and write_to_data_subdir.

This commit is contained in:
Peter Retzlaff 2013-02-02 01:40:41 +01:00 committed by Nick Mathewson
parent 5b7eaa3765
commit 78cc5833a1

View File

@ -170,6 +170,119 @@ test_config_addressmap(void *arg)
done:
;
}
static int
is_private_dir(const char* path)
{
struct stat st;
int r = stat(path, &st);
if (r) {
return 0;
}
#if !defined (_WIN32) || defined (WINCE)
if (st.st_mode != (S_IFDIR | 0700)) {
return 0;
}
#endif
return 1;
}
static void
test_config_check_or_create_data_subdir(void *arg)
{
or_options_t* options = get_options_mutable();
options->DataDirectory = "test_data";
const char* subdir = "test_stats";
const char* subpath = get_datadir_fname(subdir);
struct stat st;
#if defined (_WIN32) && !defined (WINCE)
mkdir(options->DataDirectory);
#else
mkdir(options->DataDirectory, 0700);
#endif
int r = stat(subpath, &st);
// The subdirectory shouldn't exist yet,
// but should be created by the call to check_or_create_data_subdir.
test_assert(r && (errno == ENOENT));
test_assert(!check_or_create_data_subdir(subdir));
test_assert(is_private_dir(subpath));
// The check should return 0, if the directory already exists
// and is private to the user.
test_assert(!check_or_create_data_subdir(subdir));
#if !defined (_WIN32) || defined (WINCE)
unsigned group_permission = st.st_mode | 0070;
r = chmod(subpath, group_permission);
if (r) {
test_fail_msg("Changing permissions for the subdirectory failed.");
}
// If the directory exists, but its mode is too permissive
// a call to check_or_create_data_subdir should reset the mode.
test_assert(!is_private_dir(subpath));
test_assert(!check_or_create_data_subdir(subdir));
test_assert(is_private_dir(subpath));
#endif
done:
rmdir(subpath);
rmdir(options->DataDirectory);
}
static void
test_config_write_to_data_subdir(void* arg)
{
or_options_t* options = get_options_mutable();
options->DataDirectory = "test_data";
const char* subdir = "test_stats";
const char* fname = "test_file";
const char* str =
"Lorem ipsum dolor sit amet, consetetur sadipscing\n"
"elitr, sed diam nonumy eirmod\n"
"tempor invidunt ut labore et dolore magna aliquyam\n"
"erat, sed diam voluptua.\n"
"At vero eos et accusam et justo duo dolores et ea\n"
"rebum. Stet clita kasd gubergren,\n"
"no sea takimata sanctus est Lorem ipsum dolor sit amet.\n"
"Lorem ipsum dolor sit amet,\n"
"consetetur sadipscing elitr, sed diam nonumy eirmod\n"
"tempor invidunt ut labore et dolore\n"
"magna aliquyam erat, sed diam voluptua. At vero eos et\n"
"accusam et justo duo dolores et\n"
"ea rebum. Stet clita kasd gubergren, no sea takimata\n"
"sanctus est Lorem ipsum dolor sit amet.";
const char* subpath = get_datadir_fname(subdir);
const char* filepath = get_datadir_fname2(subdir, fname);
#if defined (_WIN32) && !defined (WINCE)
mkdir(options->DataDirectory);
#else
mkdir(options->DataDirectory, 0700);
#endif
// Write attempt shoudl fail, if subdirectory doesn't exist.
test_assert(write_to_data_subdir(subdir, fname, str, NULL));
check_or_create_data_subdir(subdir);
// Content of file after write attempt should be
// equal to the original string.
test_assert(!write_to_data_subdir(subdir, fname, str, NULL));
test_streq(read_file_to_str(filepath, 0, NULL), str);
// A second write operation should overwrite the old content.
test_assert(!write_to_data_subdir(subdir, fname, str, NULL));
test_streq(read_file_to_str(filepath, 0, NULL), str);
done:
remove(filepath);
rmdir(subpath);
rmdir(options->DataDirectory);
}
/* Test helper function: Make sure that a bridge line gets parsed
* properly. Also make sure that the resulting bridge_line_t structure
@ -324,6 +437,8 @@ test_config_parse_bridge_line(void *arg)
struct testcase_t config_tests[] = {
CONFIG_TEST(addressmap, 0),
CONFIG_TEST(parse_bridge_line, 0),
CONFIG_TEST(check_or_create_data_subdir, 0),
CONFIG_TEST(write_to_data_subdir, 0),
END_OF_TESTCASES
};