Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
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




  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