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
make_files(void)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
DEFINE_TEST(test_option_ignore_zeros_mode_t)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
DEFINE_TEST(test_option_ignore_zeros_mode_x)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
DEFINE_TEST(test_option_ignore_zeros_mode_c)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 #endif
80
81 if (make_files())
82 return;
83
84 assertEqualInt(0, systemf(
85 "%s cf abc.tar --ignore-zeros @ab-cat.tar -C in c "
86 "> test-c.out 2> test-c.err",
87 testprog));
88 assertEmptyFile("test-c.err");
89 assertEmptyFile("test-c.out");
90
91 assertEqualInt(0, systemf(
92 "%s xf abc.tar -C out > test-x.out 2> test-x.err",
93 testprog));
94 assertEmptyFile("test-x.err");
95 assertEmptyFile("test-x.out");
96
97 assertEqualFile("out/a", "in/a");
98 assertEqualFile("out/b", "in/b");
99 assertEqualFile("out/c", "in/c");
100 }
101
102 static void
test_option_ignore_zeros_mode_ru(const char * mode)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
DEFINE_TEST(test_option_ignore_zeros_mode_r)127 DEFINE_TEST(test_option_ignore_zeros_mode_r)
128 {
129 test_option_ignore_zeros_mode_ru("r");
130 }
131
DEFINE_TEST(test_option_ignore_zeros_mode_u)132 DEFINE_TEST(test_option_ignore_zeros_mode_u)
133 {
134 test_option_ignore_zeros_mode_ru("u");
135 }
136