From: raphael.beamonte@gmail.com (Raphaël Beamonte)
Subject: [lttng-dev] [lttng-tools PATCH 4/5] Tests: add symlink tests for test_utils_expand_path
Date: Sat, 23 Nov 2013 17:32:27 -0500 [thread overview]
Message-ID: <1385245948-23011-5-git-send-email-raphael.beamonte@gmail.com> (raw)
In-Reply-To: <1385245948-23011-1-git-send-email-raphael.beamonte@gmail.com>
These new test cases allows to test the utils_expand_path
function with an existing tree using symlinks. It allows
to verify the right behavior of the function in complex
situation.
Signed-off-by: Rapha?l Beamonte <raphael.beamonte at gmail.com>
---
tests/unit/test_utils_expand_path.c | 173 ++++++++++++++++++++++++++++++++++-
1 file changed, 168 insertions(+), 5 deletions(-)
diff --git a/tests/unit/test_utils_expand_path.c b/tests/unit/test_utils_expand_path.c
index bb460a2..6b809b8 100644
--- a/tests/unit/test_utils_expand_path.c
+++ b/tests/unit/test_utils_expand_path.c
@@ -21,6 +21,9 @@
#include <stdlib.h>
#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
#include <tap/tap.h>
#include <src/common/utils.h>
@@ -35,6 +38,16 @@ struct valid_test_input {
char *absolute_part;
};
+struct tree_symlink {
+ char *orig;
+ char *dest;
+};
+
+struct symlink_test_input {
+ char *input;
+ char *expected_result;
+};
+
/* Valid test cases */
static struct valid_test_input valid_tests_inputs[] = {
{ "/a/b/c/d/e", "", "/a/b/c/d/e" },
@@ -62,6 +75,39 @@ char **valid_tests_expected_results;
static const int num_valid_tests =
sizeof(valid_tests_inputs) / sizeof(valid_tests_inputs[0]);
+/* Symlinks test cases */
+char tree_origin[] = "/tmp/test_utils_expand_path.XXXXXX";
+
+static const char * const tree_dirs[] = {
+ "a",
+ "a/b",
+ "a/b/c",
+ "a/e",
+};
+static const int num_tree_dirs =
+ sizeof(tree_dirs) / sizeof(tree_dirs[0]);
+
+static struct tree_symlink tree_symlinks[] = {
+ { "a/d", "b/c/" },
+ { "a/g", "d/" },
+ { "a/b/f", "../e/" },
+ { "a/b/h", "../g/" },
+ { "a/b/k", "c/g/" },
+ { "a/b/c/g", "../../../" },
+};
+static const int num_tree_symlinks =
+ sizeof(tree_symlinks) / sizeof(tree_symlinks[0]);
+
+static struct symlink_test_input symlink_tests_inputs[] = {
+ { "a/g/../l/.", "a/b/l" },
+ { "a/g/../l/./", "a/b/l/" },
+ { "a/g/../l/..", "a/b" },
+ { "a/g/../l/../", "a/b/" },
+ { "a/b/h/g/", "" },
+};
+static const int num_symlink_tests =
+ sizeof(symlink_tests_inputs) / sizeof(symlink_tests_inputs[0]);
+
/* Invalid test cases */
static char *invalid_tests_inputs[] = {
NULL,
@@ -69,6 +115,13 @@ static char *invalid_tests_inputs[] = {
static const int num_invalid_tests =
sizeof(invalid_tests_inputs) / sizeof(invalid_tests_inputs[0]);
+#define ERRSIZE 100
+char errmsg[ERRSIZE];
+static void printerr(char *msg)
+{
+ fprintf(stderr, "test_utils_expand_path: error: %s\n", msg);
+}
+
int prepare_valid_results()
{
int i;
@@ -85,7 +138,7 @@ int prepare_valid_results()
for (i = 0; i < num_valid_tests; i++) {
valid_tests_expected_results[i] = malloc(PATH_MAX);
if (valid_tests_expected_results[i] == NULL) {
- fprintf(stderr, "malloc expected results");
+ printerr("malloc expected results");
return 1;
}
@@ -124,14 +177,96 @@ int free_valid_results()
return 0;
}
+int prepare_symlink_tree()
+{
+ int i;
+ char tmppath[PATH_MAX];
+
+ /* Create the temporary directory */
+ if (mkdtemp(tree_origin) == NULL) {
+ printerr("mkdtemp");
+ goto error;
+ }
+
+ /* Create the directories of the test tree */
+ for (i = 0; i < num_tree_dirs; i++) {
+ snprintf(tmppath, PATH_MAX, "%s/%s", tree_origin, tree_dirs[i]);
+
+ if (mkdir(tmppath, 0755) != 0) {
+ snprintf(errmsg, ERRSIZE, "mkdir %s", tmppath);
+ printerr(errmsg);
+ goto error;
+ }
+ }
+
+ /* Create the symlinks of the test tree */
+ for (i = 0; i < num_tree_symlinks; i++) {
+ snprintf(tmppath, PATH_MAX, "%s/%s",
+ tree_origin, tree_symlinks[i].orig);
+
+ if (symlink(tree_symlinks[i].dest, tmppath) != 0) {
+ snprintf(errmsg, ERRSIZE, "symlink %s to %s",
+ tmppath, tree_symlinks[i].dest);
+ printerr(errmsg);
+ goto error;
+ }
+ }
+
+ return 0;
+
+error:
+ return 1;
+}
+
+int free_symlink_tree()
+{
+ int i;
+ char tmppath[PATH_MAX];
+
+ /* Remove the symlinks from the test tree */
+ for (i = num_tree_symlinks - 1; i > -1; i--) {
+ snprintf(tmppath, PATH_MAX, "%s/%s",
+ tree_origin, tree_symlinks[i].orig);
+
+ if (unlink(tmppath) != 0) {
+ snprintf(errmsg, ERRSIZE, "unlink %s", tmppath);
+ printerr(errmsg);
+ goto error;
+ }
+ }
+
+ /* Remove the directories from the test tree */
+ for (i = num_tree_dirs - 1; i > -1; i--) {
+ snprintf(tmppath, PATH_MAX, "%s/%s", tree_origin, tree_dirs[i]);
+
+ if (rmdir(tmppath) != 0) {
+ snprintf(errmsg, ERRSIZE, "rmdir %s", tmppath);
+ printerr(errmsg);
+ goto error;
+ }
+ }
+
+ /* Remove the temporary directory */
+ if (rmdir(tree_origin) != 0) {
+ snprintf(errmsg, ERRSIZE, "rmdir %s", tree_origin);
+ printerr(errmsg);
+ goto error;
+ }
+
+ return 0;
+
+error:
+ return 1;
+}
+
static void test_utils_expand_path(void)
{
char *result;
+ char name[100], tmppath[PATH_MAX];
int i;
/* Test valid cases */
for (i = 0; i < num_valid_tests; i++) {
- char name[100];
sprintf(name, "valid test case: %s", valid_tests_inputs[i].input);
result = utils_expand_path(valid_tests_inputs[i].input);
@@ -141,9 +276,23 @@ static void test_utils_expand_path(void)
free(result);
}
+ /* Test symlink tree cases */
+ int treelen = strlen(tree_origin) + 1;
+ for (i = 0; i < num_symlink_tests; i++) {
+ sprintf(name, "symlink tree test case: [tmppath/]%s",
+ symlink_tests_inputs[i].input);
+
+ snprintf(tmppath, PATH_MAX, "%s/%s",
+ tree_origin, symlink_tests_inputs[i].input);
+ result = utils_expand_path(tmppath);
+ ok(result != NULL && strcmp(result + treelen,
+ symlink_tests_inputs[i].expected_result) == 0, name);
+
+ free(result);
+ }
+
/* Test invalid cases */
for (i = 0; i < num_invalid_tests; i++) {
- char name[100];
sprintf(name, "invalid test case: %s", invalid_tests_inputs[i]);
result = utils_expand_path(invalid_tests_inputs[i]);
@@ -156,16 +305,30 @@ static void test_utils_expand_path(void)
int main(int argc, char **argv)
{
+ if (prepare_symlink_tree() != 0) {
+ goto error_mkdir;
+ }
+
if (prepare_valid_results() != 0) {
- return 1;
+ goto error_malloc;
}
- plan_tests(num_valid_tests + num_invalid_tests);
+ plan_tests(num_valid_tests + num_invalid_tests + num_symlink_tests);
diag("utils_expand_path tests");
test_utils_expand_path();
free_valid_results();
+ free_symlink_tree();
+
return exit_status();
+
+error_malloc:
+ free_valid_results();
+
+error_mkdir:
+ free_symlink_tree();
+
+ return 1;
}
--
1.7.10.4
next prev parent reply other threads:[~2013-11-23 22:32 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-08 4:32 [lttng-dev] [lttng-tools PATCH 0/2] utils_expand_path as realpath(3) for non-existing directories Raphaël Beamonte
2013-11-08 4:32 ` [lttng-dev] [lttng-tools PATCH 1/2] Introduce a new utils_resolve_relative function Raphaël Beamonte
2013-11-12 19:51 ` David Goulet
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 0/4] Update to utils_expand_path as realpath(3) for non-existing directories Raphaël Beamonte
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 1/4] Introduce a new utils_resolve_relative function Raphaël Beamonte
2013-11-14 14:19 ` Mathieu Desnoyers
2013-11-14 17:07 ` Raphaël Beamonte
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 2/4] Tests: Add test_utils_resolve_relative to unit tests Raphaël Beamonte
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 3/4] Correct the behavior of the utils_expand_path function Raphaël Beamonte
2013-11-14 2:44 ` Mathieu Desnoyers
2013-11-14 3:27 ` Raphaël Beamonte
2013-11-14 13:46 ` Mathieu Desnoyers
2013-11-14 14:10 ` Mathieu Desnoyers
2013-11-14 16:00 ` Raphaël Beamonte
2013-11-14 16:14 ` Mathieu Desnoyers
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 0/5] Follow up to the realpath(3) for unexistent paths Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 1/5] Tests: add a check in test_utils_expand_path to avoid segfault if result is NULL Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 2/5] Tests: move invalid tests in test_utils_expand_path that should be valid Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 3/5] Introduce a new utils_partial_realpath function Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 4/5] Change the utils_expand_path function to use utils_partial_realpath Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 5/5] Remove the utils_resolve_relative function that is not useful anymore Raphaël Beamonte
2013-11-15 15:45 ` [lttng-dev] [lttng-tools PATCH 0/5] Follow up to the realpath(3) for unexistent paths David Goulet
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 0/5] utils_expand_path fix Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 1/5] Add missing copyright to utils.c Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 2/5] Fix: comment indentation Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 3/5] Fix: utils_expand_path now works for paths that ends with '/.' or '/..' Raphaël Beamonte
2013-11-23 22:32 ` Raphaël Beamonte [this message]
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 5/5] Tests: add valid test cases to test_utils_expand_path Raphaël Beamonte
2013-11-25 15:51 ` [lttng-dev] [lttng-tools PATCH 0/5] utils_expand_path fix David Goulet
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 4/4] Tests: Add test_utils_expand_path to unit tests Raphaël Beamonte
2013-11-13 21:28 ` [lttng-dev] [lttng-tools PATCH 0/4] Update to utils_expand_path as realpath(3) for non-existing directories David Goulet
2013-11-08 4:32 ` [lttng-dev] [lttng-tools PATCH 2/2] Correct the behavior of the utils_expand_path function Raphaël Beamonte
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385245948-23011-5-git-send-email-raphael.beamonte@gmail.com \
--to=raphael.beamonte@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox