summaryrefslogtreecommitdiff
path: root/tests/libsqfs
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-05 12:31:48 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-08 19:17:35 +0200
commit4a607edbdfc12f97da0810563fd2e699dcecaa71 (patch)
tree7e504c39477ba15ad9260c3ceae312a7e15f234d /tests/libsqfs
parent75063b2e14dacc13fcbeeba24e580198a7c1c638 (diff)
Add test case for sqfs_tree_node_get_path
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'tests/libsqfs')
-rw-r--r--tests/libsqfs/Makemodule.am5
-rw-r--r--tests/libsqfs/get_node_path.c130
2 files changed, 134 insertions, 1 deletions
diff --git a/tests/libsqfs/Makemodule.am b/tests/libsqfs/Makemodule.am
index ca24caf..38f5006 100644
--- a/tests/libsqfs/Makemodule.am
+++ b/tests/libsqfs/Makemodule.am
@@ -10,8 +10,11 @@ test_xattr_writer_LDADD = libsquashfs.la libcompat.a
xattr_benchmark_SOURCES = tests/libsqfs/xattr_benchmark.c
xattr_benchmark_LDADD = libcommon.a libsquashfs.la libcompat.a
+test_get_node_path_SOURCES = tests/libsqfs/get_node_path.c
+test_get_node_path_LDADD = libcommon.a libsquashfs.la libcompat.a
+
LIBSQFS_TESTS = \
- test_abi test_table test_xattr_writer
+ test_abi test_table test_xattr_writer test_get_node_path
if BUILD_TOOLS
noinst_PROGRAMS += xattr_benchmark
diff --git a/tests/libsqfs/get_node_path.c b/tests/libsqfs/get_node_path.c
new file mode 100644
index 0000000..d2ca9f8
--- /dev/null
+++ b/tests/libsqfs/get_node_path.c
@@ -0,0 +1,130 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * get_node_path.c
+ *
+ * Copyright (C) 2022 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "config.h"
+#include "compat.h"
+#include "util/test.h"
+
+#include "sqfs/dir_reader.h"
+#include "sqfs/error.h"
+
+int main(void)
+{
+ sqfs_tree_node_t *n0, *n1, *n2;
+ char *str;
+ int ret;
+
+ n0 = calloc(1, sizeof(*n0) + 16);
+ TEST_NOT_NULL(n0);
+
+ n1 = calloc(1, sizeof(*n1) + 16);
+ TEST_NOT_NULL(n1);
+
+ n2 = calloc(1, sizeof(*n2) + 16);
+ TEST_NOT_NULL(n2);
+
+ /* no parent -> must return "/" */
+ ret = sqfs_tree_node_get_path(n0, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/");
+ sqfs_free(str);
+
+ /* hiearchy levels */
+ n1->parent = n0;
+ n0->children = n1;
+ strcpy((char *)n1->name, "bar");
+
+ n2->parent = n1;
+ n1->children = n2;
+ strcpy((char *)n2->name, "baz");
+
+ ret = sqfs_tree_node_get_path(n1, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/bar");
+ sqfs_free(str);
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/bar/baz");
+ sqfs_free(str);
+
+ /* root node must not have a name */
+ strcpy((char *)n0->name, "foo");
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, SQFS_ERROR_ARG_INVALID);
+ TEST_NULL(str);
+ n0->name[0] = '\0';
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/bar/baz");
+ sqfs_free(str);
+
+ /* non-root nodes must have names */
+ n1->name[0] = '\0';
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, SQFS_ERROR_CORRUPTED);
+ TEST_NULL(str);
+ n1->name[0] = 'b';
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/bar/baz");
+ sqfs_free(str);
+
+ /* some names are illegal */
+ strcpy((char *)n1->name, "..");
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, SQFS_ERROR_CORRUPTED);
+ TEST_NULL(str);
+
+ strcpy((char *)n1->name, ".");
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, SQFS_ERROR_CORRUPTED);
+ TEST_NULL(str);
+
+ strcpy((char *)n1->name, "a/b");
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, SQFS_ERROR_CORRUPTED);
+ TEST_NULL(str);
+
+ strcpy((char *)n1->name, "bar");
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/bar/baz");
+ sqfs_free(str);
+
+ /* link loops must be detected */
+ n0->parent = n2;
+ strcpy((char *)n0->name, "foo");
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, SQFS_ERROR_LINK_LOOP);
+ TEST_NULL(str);
+
+ n0->parent = NULL;
+ n0->name[0] = '\0';
+
+ ret = sqfs_tree_node_get_path(n2, &str);
+ TEST_EQUAL_I(ret, 0);
+ TEST_NOT_NULL(str);
+ TEST_STR_EQUAL(str, "/bar/baz");
+ sqfs_free(str);
+
+ /* cleanup */
+ free(n0);
+ free(n1);
+ free(n2);
+ return EXIT_SUCCESS;
+}