Home | History | Annotate | Line # | Download | only in test
      1 /*-
      2  * SPDX-License-Identifier: BSD-2-Clause
      3  *
      4  * Copyright (c) 2021 Ryan Libby
      5  * All rights reserved.
      6  */
      7 #include "test.h"
      8 
      9 static int
     10 make_files(void)
     11 {
     12 	int ret;
     13 
     14 	assertMakeDir("in", 0755);
     15 	assertMakeDir("out", 0755);
     16 	assertMakeFile("in/a", 0644, "a");
     17 	assertMakeFile("in/b", 0644, "b");
     18 	assertMakeFile("in/c", 0644, "c");
     19 	assertEqualInt(0, systemf("%s cf a.tar -C in a", testprog));
     20 	assertEqualInt(0, systemf("%s cf b.tar -C in b", testprog));
     21 	/* An archive formed with cat, and readable with --ignore-zeros. */
     22 	ret = systemf("cat a.tar b.tar > ab-cat.tar");
     23 	if (ret != 0) {
     24 		skipping("This test requires a `cat` program");
     25 		return (ret);
     26 	}
     27 
     28 	return (0);
     29 }
     30 
     31 DEFINE_TEST(test_option_ignore_zeros_mode_t)
     32 {
     33 	if (make_files())
     34 		return;
     35 
     36 	/* Generate expected t-mode output. */
     37 	assertEqualInt(0, systemf(
     38 	    "%s cf ab-norm.tar -C in a b > norm-c.out 2> norm-c.err",
     39 	    testprog));
     40 	assertEmptyFile("norm-c.err");
     41 	assertEmptyFile("norm-c.out");
     42 	assertEqualInt(0, systemf(
     43 	    "%s tf ab-norm.tar > norm-t.out 2> norm-t.err",
     44 	    testprog));
     45 	assertEmptyFile("norm-t.err");
     46 
     47 	/* Test output. */
     48 	assertEqualInt(0, systemf(
     49 	    "%s tf ab-cat.tar --ignore-zeros > test.out 2> test.err",
     50 	    testprog));
     51 	assertEmptyFile("test.err");
     52 
     53 	assertEqualFile("test.out", "norm-t.out");
     54 }
     55 
     56 DEFINE_TEST(test_option_ignore_zeros_mode_x)
     57 {
     58 	if (make_files())
     59 		return;
     60 
     61 	assertEqualInt(0, systemf(
     62 	    "%s xf ab-cat.tar --ignore-zeros -C out > test.out 2> test.err",
     63 	    testprog));
     64 	assertEmptyFile("test.err");
     65 	assertEmptyFile("test.out");
     66 
     67 	assertEqualFile("out/a", "in/a");
     68 	assertEqualFile("out/b", "in/b");
     69 }
     70 
     71 DEFINE_TEST(test_option_ignore_zeros_mode_c)
     72 {
     73 #if defined(_WIN32) && !defined(__CYGWIN__)
     74 	// The first command run by systemf below prints this to stderr:
     75 	// bsdtar.exe: a: Can't translate uname '(null)' to UTF-8
     76 	// bsdtar.exe: b: Can't translate uname '(null)' to UTF-8
     77 	skipping("TODO: figure out why this test fails on github workflows with MSVC");
     78 	return;
     79 #else
     80 	if (make_files())
     81 		return;
     82 
     83 	assertEqualInt(0, systemf(
     84 	    "%s cf abc.tar --ignore-zeros @ab-cat.tar -C in c "
     85 	    "> test-c.out 2> test-c.err",
     86 	    testprog));
     87 	assertEmptyFile("test-c.err");
     88 	assertEmptyFile("test-c.out");
     89 
     90 	assertEqualInt(0, systemf(
     91 	    "%s xf abc.tar -C out > test-x.out 2> test-x.err",
     92 	    testprog));
     93 	assertEmptyFile("test-x.err");
     94 	assertEmptyFile("test-x.out");
     95 
     96 	assertEqualFile("out/a", "in/a");
     97 	assertEqualFile("out/b", "in/b");
     98 	assertEqualFile("out/c", "in/c");
     99 #endif
    100 }
    101 
    102 static void
    103 test_option_ignore_zeros_mode_ru(const char *mode)
    104 {
    105 	if (make_files())
    106 		return;
    107 
    108 	assertEqualInt(0, systemf(
    109 	    "%s %sf ab-cat.tar --ignore-zeros -C in c "
    110 	    "> test-ru.out 2> test-ru.err",
    111 	    testprog, mode));
    112 	assertEmptyFile("test-ru.err");
    113 	assertEmptyFile("test-ru.out");
    114 
    115 	assertEqualInt(0, systemf(
    116 	    "%s xf ab-cat.tar --ignore-zeros -C out "
    117 	    "> test-x.out 2> test-x.err",
    118 	    testprog));
    119 	assertEmptyFile("test-x.err");
    120 	assertEmptyFile("test-x.out");
    121 
    122 	assertEqualFile("out/a", "in/a");
    123 	assertEqualFile("out/b", "in/b");
    124 	assertEqualFile("out/c", "in/c");
    125 }
    126 
    127 DEFINE_TEST(test_option_ignore_zeros_mode_r)
    128 {
    129 	test_option_ignore_zeros_mode_ru("r");
    130 }
    131 
    132 DEFINE_TEST(test_option_ignore_zeros_mode_u)
    133 {
    134 	test_option_ignore_zeros_mode_ru("u");
    135 }
    136