From b557c1f16165a1d28d45ea0bb045b61017aea5a2 Mon Sep 17 00:00:00 2001 From: Graham Percival Date: Sat, 28 Dec 2024 11:01:19 -0800 Subject: [PATCH] Add tar/test/test_list_item (#2454) --- Makefile.am | 2 + tar/test/CMakeLists.txt | 1 + tar/test/test_list_item.c | 115 ++++++++++++++++++++++ tar/test/test_list_item.tar.uu | 169 +++++++++++++++++++++++++++++++++ 4 files changed, 287 insertions(+) create mode 100644 tar/test/test_list_item.c create mode 100644 tar/test/test_list_item.tar.uu diff --git a/Makefile.am b/Makefile.am index 43d022d73..a40e37da7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1130,6 +1130,7 @@ bsdtar_test_SOURCES= \ tar/test/test_format_newc.c \ tar/test/test_help.c \ tar/test/test_leading_slash.c \ + tar/test/test_list_item.c \ tar/test/test_missing_file.c \ tar/test/test_option_C_mtree.c \ tar/test/test_option_C_upper.c \ @@ -1215,6 +1216,7 @@ bsdtar_test_EXTRA_DIST= \ tar/test/test_extract.tar.lzo.uu \ tar/test/test_extract.tar.xz.uu \ tar/test/test_leading_slash.tar.uu \ + tar/test/test_list_item.tar.uu \ tar/test/test_option_keep_newer_files.tar.Z.uu \ tar/test/test_option_passphrase.zip.uu \ tar/test/test_option_s.tar.Z.uu \ diff --git a/tar/test/CMakeLists.txt b/tar/test/CMakeLists.txt index 53949656b..7a3006f75 100644 --- a/tar/test/CMakeLists.txt +++ b/tar/test/CMakeLists.txt @@ -29,6 +29,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_format_newc.c test_help.c test_leading_slash.c + test_list_item.c test_missing_file.c test_option_C_upper.c test_option_C_mtree.c diff --git a/tar/test/test_list_item.c b/tar/test/test_list_item.c new file mode 100644 index 000000000..df64acfad --- /dev/null +++ b/tar/test/test_list_item.c @@ -0,0 +1,115 @@ +/*-SPDX-License-Identifier: BSD-2-Clause + * Copyright (c) 2024 Tarsnap Backup Inc. + * All rights reserved. + */ +#include "test.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#endif + +/* These lists of files come from 'test_list_archive.tar.uu', which includes + * the script which generated it. */ + +static const char *tf_out = +"f\n" +"hl\n" +"sl\n" +"d/\n" +"d/f\n" +"fake-username\n" +"fake-groupname\n" +"f\n"; + +#if defined(_WIN32) && !defined(__CYGWIN__) +static const char *tvf_out = +"-rw-r--r-- 0 1000 1000 0 Jan 01 1980 f\n" +"hrw-r--r-- 0 1000 1000 0 Jan 01 1980 hl link to f\n" +"lrwxr-xr-x 0 1000 1000 0 Jan 01 1980 sl -> f\n" +"drwxrwxrwx 0 1000 1000 0 Jan 01 1980 d/\n" +"-r-------- 0 1000 1000 0 Jan 01 1980 d/f\n" +"-rw-r--r-- 0 long-fake-uname 1000 0 Jan 01 1980 fake-username\n" +"-rw-r--r-- 0 1000 long-fake-gname 0 Jan 01 1980 fake-groupname\n" +"-rw-r--r-- 0 1000 1000 0 Jan 01 1980 f\n"; +#else +static const char *tvf_out = +"-rw-r--r-- 0 1000 1000 0 Jan 1 1980 f\n" +"hrw-r--r-- 0 1000 1000 0 Jan 1 1980 hl link to f\n" +"lrwxr-xr-x 0 1000 1000 0 Jan 1 1980 sl -> f\n" +"drwxrwxrwx 0 1000 1000 0 Jan 1 1980 d/\n" +"-r-------- 0 1000 1000 0 Jan 1 1980 d/f\n" +"-rw-r--r-- 0 long-fake-uname 1000 0 Jan 1 1980 fake-username\n" +"-rw-r--r-- 0 1000 long-fake-gname 0 Jan 1 1980 fake-groupname\n" +"-rw-r--r-- 0 1000 1000 0 Jan 1 1980 f\n"; +#endif + +static void +set_lc_time(const char * str) +{ + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (!SetEnvironmentVariable("LC_TIME", str)) { + fprintf(stderr, "SetEnvironmentVariable failed with %d\n", + (int)GetLastError()); + } +#else + if (setenv("LC_TIME", str, 1) == -1) + fprintf(stderr, "setenv: %s\n", strerror(errno)); +#endif +} + +static int +run_tvf(void) +{ + char * orig_lc_time; + char * lc_time; + int exact_tvf_check; + + orig_lc_time = getenv("LC_TIME"); + + /* Try to set LC_TIME to known (English) dates. */ + set_lc_time("en_US.UTF-8"); + + /* Check if we've got the right LC_TIME; if not, don't check output. */ + lc_time = getenv("LC_TIME"); + if ((lc_time != NULL) && strcmp(lc_time, "en_US.UTF-8") == 0) + exact_tvf_check = 1; + else + exact_tvf_check = 0; + + assertEqualInt(0, + systemf("%s tvf test_list_item.tar >tvf.out 2>tvf.err", testprog)); + + /* Restore the original date formatting. */ + if (orig_lc_time != NULL) + set_lc_time(orig_lc_time); + + return (exact_tvf_check); +} + +DEFINE_TEST(test_list_item) +{ + int exact_tvf_check; + + extract_reference_file("test_list_item.tar"); + + /* Run 'tf' and check output. */ + assertEqualInt(0, + systemf("%s tf test_list_item.tar >tf.out 2>tf.err", testprog)); + failure("'t' mode should write results to stdout"); + assertTextFileContents(tf_out, "tf.out"); + assertEmptyFile("tf.err"); + + /* Run 'tvf'. */ + exact_tvf_check = run_tvf(); + + /* Check 'tvf' output. */ + failure("'t' mode with 'v' should write more results to stdout"); + assertEmptyFile("tvf.err"); + if (exact_tvf_check) + assertTextFileContents(tvf_out, "tvf.out"); + else { + /* The 'skipping' macro requires braces. */ + skipping("Can't check exact tvf output"); + } +} diff --git a/tar/test/test_list_item.tar.uu b/tar/test/test_list_item.tar.uu new file mode 100644 index 000000000..f0e174793 --- /dev/null +++ b/tar/test/test_list_item.tar.uu @@ -0,0 +1,169 @@ +begin 644 test_list_item.tar +M9@`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#8T-"``,#`Q-S4P(``P,#$W-3`@`#`P,#`P,#`P,#`P +M(#`R,C8S-C$S,C`Q(#`P-S0P-P`@,``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U> test_list_item.tar.uu +mv test_list_item.tar.uu ../ + +# Don't delete the temporary directory; leave that up to the developer to +# delete manually when they want to. -- 2.47.2