From a7bf75ebdb991092dd9165db99acfa034166fb43 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sat, 15 Jul 2023 13:33:51 +0200 Subject: Implement pen_file_ro method in native dir iterators Signed-off-by: David Oberhollenzer --- lib/io/test/dir_iterator.c | 47 +++++++++++++++++++++++++++++++++++++++- lib/io/test/testdir/dirc/file_c0 | 1 + lib/io/test/testdir/dirc/file_c2 | 1 + 3 files changed, 48 insertions(+), 1 deletion(-) (limited to 'lib/io/test') diff --git a/lib/io/test/dir_iterator.c b/lib/io/test/dir_iterator.c index 1f04b96..48a57ec 100644 --- a/lib/io/test/dir_iterator.c +++ b/lib/io/test/dir_iterator.c @@ -9,6 +9,7 @@ #include "io/dir_iterator.h" #include "sqfs/error.h" #include "util/test.h" +#include "sqfs/io.h" #include "compat.h" static int compare_entries(const void *a, const void *b) @@ -19,11 +20,22 @@ static int compare_entries(const void *a, const void *b) return strcmp((*lhs)->name, (*rhs)->name); } +static int compare_files(const void *a, const void *b) +{ + const sqfs_istream_t *const *lhs = a; + const sqfs_istream_t *const *rhs = b; + + return strcmp((*lhs)->get_filename(*lhs), + (*rhs)->get_filename(*rhs)); +} + int main(int argc, char **argv) { dir_iterator_t *dir, *suba, *subb, *subc, *sub; sqfs_dir_entry_t *dent, *ent[6]; - size_t i; + sqfs_istream_t *files[3]; + char buffer[128]; + size_t i, j; int ret; (void)argc; (void)argv; @@ -330,6 +342,8 @@ int main(int argc, char **argv) free(ent[i]); /* sub iterator c */ + j = 0; + for (i = 0; i < 5; ++i) { ret = subc->next(subc, &ent[i]); TEST_NOT_NULL(ent[0]); @@ -339,15 +353,22 @@ int main(int argc, char **argv) ret = subc->open_subdir(subc, &sub); TEST_NULL(sub); TEST_EQUAL_I(ret, SQFS_ERROR_NOT_DIR); + + TEST_ASSERT(j < 3); + ret = subc->open_file_ro(subc, &(files[j++])); + TEST_EQUAL_I(ret, 0); } } + TEST_EQUAL_UI(j, 3); + ret = subc->next(subc, &dent); TEST_NULL(dent); TEST_ASSERT(ret > 0); subc = sqfs_drop(subc); qsort(ent, 5, sizeof(ent[0]), compare_entries); + qsort(files, 3, sizeof(files[0]), compare_files); TEST_STR_EQUAL(ent[0]->name, "."); TEST_ASSERT(S_ISDIR(ent[0]->mode)); @@ -363,5 +384,29 @@ int main(int argc, char **argv) for (i = 0; i < 5; ++i) free(ent[i]); + TEST_STR_EQUAL(files[0]->get_filename(files[0]), "file_c0"); + TEST_STR_EQUAL(files[1]->get_filename(files[1]), "file_c1"); + TEST_STR_EQUAL(files[2]->get_filename(files[2]), "file_c2"); + + ret = sqfs_istream_read(files[0], buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 12); + buffer[ret] = '\0'; + TEST_STR_EQUAL(buffer, "test string\n"); + ret = sqfs_istream_read(files[0], buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 0); + + ret = sqfs_istream_read(files[1], buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 0); + + ret = sqfs_istream_read(files[2], buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 10); + buffer[ret] = '\0'; + TEST_STR_EQUAL(buffer, "你好!\n"); + ret = sqfs_istream_read(files[2], buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 0); + + for (i = 0; i < j; ++i) + sqfs_drop(files[i]); + return EXIT_SUCCESS; } diff --git a/lib/io/test/testdir/dirc/file_c0 b/lib/io/test/testdir/dirc/file_c0 index e69de29..71c1922 100644 --- a/lib/io/test/testdir/dirc/file_c0 +++ b/lib/io/test/testdir/dirc/file_c0 @@ -0,0 +1 @@ +test string diff --git a/lib/io/test/testdir/dirc/file_c2 b/lib/io/test/testdir/dirc/file_c2 index e69de29..efde6ef 100644 --- a/lib/io/test/testdir/dirc/file_c2 +++ b/lib/io/test/testdir/dirc/file_c2 @@ -0,0 +1 @@ +你好! -- cgit v1.2.3