aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Retzlaff <pe.retzlaff@gmail.com>2013-02-02 01:40:41 +0100
committerNick Mathewson <nickm@torproject.org>2013-05-24 13:13:21 -0400
commit78cc5833a1da038331186ddf07f4add7f8f1094b (patch)
treed1d4c01cfbf77d1fcb6334201005a92192037dd9 /src
parent5b7eaa3765b8c616c93dbda26a02c780d5c95084 (diff)
downloadtor-78cc5833a1da038331186ddf07f4add7f8f1094b.tar
tor-78cc5833a1da038331186ddf07f4add7f8f1094b.tar.gz
Unit tests for check_or_create_data_subdir and write_to_data_subdir.
Diffstat (limited to 'src')
-rw-r--r--src/test/test_config.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/test/test_config.c b/src/test/test_config.c
index d1e7ccf59..78def700c 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -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
};