From 1be51b107dd08a9575cb07a0a71d459927a85494 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Tue, 7 Feb 2023 18:20:20 +0100 Subject: libtar: Add an istream_t implementation The tar_istream_t reads the data from a tar file, having been given the header, and synthesizes zero bytes for sparse regions. Signed-off-by: David Oberhollenzer --- lib/tar/test/tar_istream.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 lib/tar/test/tar_istream.c (limited to 'lib/tar/test/tar_istream.c') diff --git a/lib/tar/test/tar_istream.c b/lib/tar/test/tar_istream.c new file mode 100644 index 0000000..cc31282 --- /dev/null +++ b/lib/tar/test/tar_istream.c @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * tar_istream.c + * + * Copyright (C) 2019 David Oberhollenzer + */ +#include "config.h" +#include "io/file.h" +#include "tar/tar.h" +#include "util/test.h" + +#ifndef TESTUID +#define TESTUID 1000 +#endif + +#ifndef TESTGID +#define TESTGID TESTUID +#endif + +#ifndef TESTFNAME +#define TESTFNAME input.txt +#endif + +#ifndef TESTTS +#define TESTTS 1542905892 +#endif + +static const char *fname = STRVALUE(TESTFNAME); + +int main(int argc, char **argv) +{ + tar_header_decoded_t hdr; + char buffer[100]; + sqfs_s64 ts; + istream_t *fp; + istream_t *ti; + sqfs_s32 ret; + (void)argc; (void)argv; + + fp = istream_open_file(STRVALUE(TESTPATH) "/" STRVALUE(TESTFILE)); + TEST_NOT_NULL(fp); + TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1); + TEST_ASSERT(read_header(fp, &hdr) == 0); + TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1); + TEST_EQUAL_UI(hdr.mode, S_IFREG | 0644); + TEST_EQUAL_UI(hdr.uid, TESTUID); + TEST_EQUAL_UI(hdr.gid, TESTGID); + TEST_EQUAL_UI(hdr.actual_size, 5); + + ts = TESTTS; + TEST_EQUAL_UI(hdr.mtime, ts); + TEST_STR_EQUAL(hdr.name, fname); + TEST_ASSERT(!hdr.unknown_record); + + ti = tar_record_istream_create(fp, &hdr); + TEST_NOT_NULL(ti); + TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 2); + TEST_EQUAL_UI(((sqfs_object_t *)ti)->refcount, 1); + + ret = istream_read(ti, buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 5); + buffer[5] = '\0'; + TEST_STR_EQUAL(buffer, "test\n"); + + ret = istream_read(ti, buffer, sizeof(buffer)); + TEST_EQUAL_I(ret, 0); + + clear_header(&hdr); + sqfs_drop(ti); + TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1); + sqfs_drop(fp); + return EXIT_SUCCESS; +} -- cgit v1.2.3