aboutsummaryrefslogtreecommitdiff
path: root/lib/util/test
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-04-21 19:53:57 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-04-21 20:16:46 +0200
commit73d342861a03c38528ca5f97cdd479b4fdb5b3fd (patch)
tree00cecdb98b09dfa4b61e4c055a4bf75a15edfa9d /lib/util/test
parentf8270c05898313a8e75c367172958335dbec4a36 (diff)
libutil: Add a method to the directory iterator to open a sub directory
This is also the reason we need to lug around the original directory path on Windows. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/util/test')
-rw-r--r--lib/util/test/dir_iterator.c149
1 files changed, 147 insertions, 2 deletions
diff --git a/lib/util/test/dir_iterator.c b/lib/util/test/dir_iterator.c
index 22b05dc..d209afd 100644
--- a/lib/util/test/dir_iterator.c
+++ b/lib/util/test/dir_iterator.c
@@ -7,6 +7,7 @@
#include "config.h"
#include "util/dir_iterator.h"
+#include "sqfs/error.h"
#include "util/test.h"
#include "compat.h"
@@ -20,8 +21,8 @@ static int compare_entries(const void *a, const void *b)
int main(int argc, char **argv)
{
- dir_iterator_t *dir;
- dir_entry_t *ent[6];
+ dir_iterator_t *dir, *suba, *subb, *subc, *sub;
+ dir_entry_t *dent, *ent[6];
size_t i;
int ret;
(void)argc; (void)argv;
@@ -210,5 +211,149 @@ int main(int argc, char **argv)
for (i = 0; i < 5; ++i)
free(ent[i]);
+ /* test sub directory iterators */
+ suba = NULL;
+ subb = NULL;
+ subc = NULL;
+
+ dir = dir_iterator_create(TEST_PATH);
+ TEST_NOT_NULL(dir);
+
+ for (i = 0; i < 5; ++i) {
+ ret = dir->next(dir, &dent);
+ TEST_NOT_NULL(dent);
+ TEST_EQUAL_I(ret, 0);
+
+ if (!strcmp(dent->name, "dira")) {
+ TEST_NULL(suba);
+ ret = dir->open_subdir(dir, &suba);
+ TEST_NOT_NULL(suba);
+ TEST_EQUAL_I(ret, 0);
+ } else if (!strcmp(dent->name, "dirb")) {
+ TEST_NULL(subb);
+ ret = dir->open_subdir(dir, &subb);
+ TEST_NOT_NULL(subb);
+ TEST_EQUAL_I(ret, 0);
+ } else if (!strcmp(dent->name, "dirc")) {
+ TEST_NULL(subc);
+ ret = dir->open_subdir(dir, &subc);
+ TEST_NOT_NULL(subc);
+ TEST_EQUAL_I(ret, 0);
+ }
+
+ free(dent);
+ }
+
+ ret = dir->next(dir, &dent);
+ TEST_NULL(dent);
+ TEST_ASSERT(ret > 0);
+ dir = sqfs_drop(dir);
+
+ TEST_NOT_NULL(suba);
+ TEST_NOT_NULL(subb);
+ TEST_NOT_NULL(subc);
+
+ /* sub iterator a */
+ for (i = 0; i < 5; ++i) {
+ ret = suba->next(suba, &ent[i]);
+ TEST_NOT_NULL(ent[0]);
+ TEST_EQUAL_I(ret, 0);
+
+ if (S_ISREG(ent[i]->mode)) {
+ ret = suba->open_subdir(suba, &sub);
+ TEST_NULL(sub);
+ TEST_EQUAL_I(ret, SQFS_ERROR_NOT_DIR);
+ }
+ }
+
+ ret = suba->next(suba, &dent);
+ TEST_NULL(dent);
+ TEST_ASSERT(ret > 0);
+ suba = sqfs_drop(suba);
+
+ qsort(ent, 5, sizeof(ent[0]), compare_entries);
+
+ TEST_STR_EQUAL(ent[0]->name, ".");
+ TEST_ASSERT(S_ISDIR(ent[0]->mode));
+ TEST_STR_EQUAL(ent[1]->name, "..");
+ TEST_ASSERT(S_ISDIR(ent[1]->mode));
+ TEST_STR_EQUAL(ent[2]->name, "file_a0");
+ TEST_ASSERT(S_ISREG(ent[2]->mode));
+ TEST_STR_EQUAL(ent[3]->name, "file_a1");
+ TEST_ASSERT(S_ISREG(ent[3]->mode));
+ TEST_STR_EQUAL(ent[4]->name, "file_a2");
+ TEST_ASSERT(S_ISREG(ent[4]->mode));
+
+ for (i = 0; i < 5; ++i)
+ free(ent[i]);
+
+ /* sub iterator b */
+ for (i = 0; i < 5; ++i) {
+ ret = subb->next(subb, &ent[i]);
+ TEST_NOT_NULL(ent[0]);
+ TEST_EQUAL_I(ret, 0);
+
+ if (S_ISREG(ent[i]->mode)) {
+ ret = subb->open_subdir(subb, &sub);
+ TEST_NULL(sub);
+ TEST_EQUAL_I(ret, SQFS_ERROR_NOT_DIR);
+ }
+ }
+
+ ret = subb->next(subb, &dent);
+ TEST_NULL(dent);
+ TEST_ASSERT(ret > 0);
+ subb = sqfs_drop(subb);
+
+ qsort(ent, 5, sizeof(ent[0]), compare_entries);
+
+ TEST_STR_EQUAL(ent[0]->name, ".");
+ TEST_ASSERT(S_ISDIR(ent[0]->mode));
+ TEST_STR_EQUAL(ent[1]->name, "..");
+ TEST_ASSERT(S_ISDIR(ent[1]->mode));
+ TEST_STR_EQUAL(ent[2]->name, "file_b0");
+ TEST_ASSERT(S_ISREG(ent[2]->mode));
+ TEST_STR_EQUAL(ent[3]->name, "file_b1");
+ TEST_ASSERT(S_ISREG(ent[3]->mode));
+ TEST_STR_EQUAL(ent[4]->name, "file_b2");
+ TEST_ASSERT(S_ISREG(ent[4]->mode));
+
+ for (i = 0; i < 5; ++i)
+ free(ent[i]);
+
+ /* sub iterator c */
+ for (i = 0; i < 5; ++i) {
+ ret = subc->next(subc, &ent[i]);
+ TEST_NOT_NULL(ent[0]);
+ TEST_EQUAL_I(ret, 0);
+
+ if (S_ISREG(ent[i]->mode)) {
+ ret = subc->open_subdir(subc, &sub);
+ TEST_NULL(sub);
+ TEST_EQUAL_I(ret, SQFS_ERROR_NOT_DIR);
+ }
+ }
+
+ ret = subc->next(subc, &dent);
+ TEST_NULL(dent);
+ TEST_ASSERT(ret > 0);
+ subc = sqfs_drop(subc);
+
+ qsort(ent, 5, sizeof(ent[0]), compare_entries);
+
+ TEST_STR_EQUAL(ent[0]->name, ".");
+ TEST_ASSERT(S_ISDIR(ent[0]->mode));
+ TEST_STR_EQUAL(ent[1]->name, "..");
+ TEST_ASSERT(S_ISDIR(ent[1]->mode));
+ TEST_STR_EQUAL(ent[2]->name, "file_c0");
+ TEST_ASSERT(S_ISREG(ent[2]->mode));
+ TEST_STR_EQUAL(ent[3]->name, "file_c1");
+ TEST_ASSERT(S_ISREG(ent[3]->mode));
+ TEST_STR_EQUAL(ent[4]->name, "file_c2");
+ TEST_ASSERT(S_ISREG(ent[4]->mode));
+
+ for (i = 0; i < 5; ++i)
+ free(ent[i]);
+
return EXIT_SUCCESS;
}