|
@@ -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
|
|
|
};
|
|
|
|