xref: /freebsd/contrib/libarchive/tar/test/test_option_U_upper.c (revision bd66c1b43e33540205dbc1187c2f2a15c58b57ba)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2010 Tim Kientzle
5  * All rights reserved.
6  */
7 #include "test.h"
8 
DEFINE_TEST(test_option_U_upper)9 DEFINE_TEST(test_option_U_upper)
10 {
11 	int r;
12 
13 	assertMakeFile("file1", 0644, "file1");
14 	assertMakeDir("d1", 0755);
15 	assertMakeFile("d1/file1", 0644, "d1/file1");
16 	assertEqualInt(0, systemf("%s -cf archive.tar file1 d1/file1", testprog));
17 
18 	/*
19 	 * bsdtar's man page used to claim that -x without -U would
20 	 * not break hard links.  This was and is nonsense.  The first
21 	 * two tests here simply verify that existing hard links get
22 	 * broken regardless.
23 	 */
24 
25 	/* Test 1: -x without -U */
26 	assertMakeDir("test1", 0755);
27 	assertChdir("test1");
28 	assertMakeFile("file1", 0644, "file1new");
29 	assertMakeHardlink("file2", "file1");
30 	assertEqualInt(0,
31 	    systemf("%s -xf ../archive.tar >test.out 2>test.err", testprog));
32 	assertFileContents("file1", 5, "file1");
33 	assertFileContents("file1new", 8, "file2");
34 	assertEmptyFile("test.out");
35 	assertEmptyFile("test.err");
36 	assertChdir("..");
37 
38 
39 	/* Test 2: -x with -U */
40 	assertMakeDir("test2", 0755);
41 	assertChdir("test2");
42 	assertMakeFile("file1", 0644, "file1new");
43 	assertMakeHardlink("file2", "file1");
44 	assertEqualInt(0,
45 	    systemf("%s -xUf ../archive.tar >test.out 2>test.err", testprog));
46 	assertFileContents("file1", 5, "file1");
47 	assertFileContents("file1new", 8, "file2");
48 	assertEmptyFile("test.out");
49 	assertEmptyFile("test.err");
50 	assertChdir("..");
51 
52 	/*
53 	 * -U does make a difference in how bsdtar handles unwanted symlinks,
54 	 * though.  It interacts with -P.
55 	 */
56 	if (!canSymlink())
57 		return;
58 
59 	/* Test 3: Intermediate dir symlink causes error by default */
60 	assertMakeDir("test3", 0755);
61 	assertChdir("test3");
62 	assertMakeDir("realDir", 0755);
63 	assertMakeSymlink("d1", "realDir", 1);
64 	r = systemf("%s -xf ../archive.tar d1/file1 >test.out 2>test.err", testprog);
65 	assert(r != 0);
66 	assertIsSymlink("d1", "realDir", 1);
67 	assertFileNotExists("d1/file1");
68 	assertEmptyFile("test.out");
69 	assertNonEmptyFile("test.err");
70 	assertChdir("..");
71 
72 	/* Test 4: Intermediate dir symlink gets removed with -U */
73 	assertMakeDir("test4", 0755);
74 	assertChdir("test4");
75 	assertMakeDir("realDir", 0755);
76 	assertMakeSymlink("d1", "realDir", 1);
77 	assertEqualInt(0,
78 	    systemf("%s -xUf ../archive.tar >test.out 2>test.err", testprog));
79 	assertIsDir("d1", -1);
80 	assertFileContents("d1/file1", 8, "d1/file1");
81 	assertEmptyFile("test.out");
82 	assertEmptyFile("test.err");
83 	assertChdir("..");
84 
85 	/* Test 5: Intermediate dir symlink is followed with -P */
86 	assertMakeDir("test5", 0755);
87 	assertChdir("test5");
88 	assertMakeDir("realDir", 0755);
89 	assertMakeSymlink("d1", "realDir", 1);
90 	assertEqualInt(0,
91 	    systemf("%s -xPf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
92 	assertIsSymlink("d1", "realDir", 1);
93 	assertFileContents("d1/file1", 8, "d1/file1");
94 	assertEmptyFile("test.out");
95 	assertEmptyFile("test.err");
96 	assertChdir("..");
97 
98 	/* Test 6: Intermediate dir symlink is followed with -PU */
99 	assertMakeDir("test6", 0755);
100 	assertChdir("test6");
101 	assertMakeDir("realDir", 0755);
102 	assertMakeSymlink("d1", "realDir", 1);
103 	assertEqualInt(0,
104 	    systemf("%s -xPUf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
105 	assertIsSymlink("d1", "realDir", 1);
106 	assertFileContents("d1/file1", 8, "d1/file1");
107 	assertEmptyFile("test.out");
108 	assertEmptyFile("test.err");
109 	assertChdir("..");
110 
111 	/* Test 7: Final file symlink replaced by default */
112 	assertMakeDir("test7", 0755);
113 	assertChdir("test7");
114 	assertMakeDir("d1", 0755);
115 	assertMakeFile("d1/realfile1", 0644, "realfile1");
116 	assertMakeSymlink("d1/file1", "d1/realfile1", 0);
117 	assertEqualInt(0,
118 	    systemf("%s -xf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
119 	assertIsReg("d1/file1", umasked(0644));
120 	assertFileContents("d1/file1", 8, "d1/file1");
121 	assertFileContents("realfile1", 9, "d1/realfile1");
122 	assertEmptyFile("test.out");
123 	assertEmptyFile("test.err");
124 	assertChdir("..");
125 
126 	/* Test 8: Final file symlink replaced with -PU */
127 	assertMakeDir("test8", 0755);
128 	assertChdir("test8");
129 	assertMakeDir("d1", 0755);
130 	assertMakeFile("d1/realfile1", 0644, "realfile1");
131 	assertMakeSymlink("d1/file1", "d1/realfile1", 0);
132 	assertEqualInt(0,
133 	    systemf("%s -xPUf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
134 	assertIsReg("d1/file1", umasked(0644));
135 	assertFileContents("d1/file1", 8, "d1/file1");
136 	assertFileContents("realfile1", 9, "d1/realfile1");
137 	assertEmptyFile("test.out");
138 	assertEmptyFile("test.err");
139 	assertChdir("..");
140 }
141