1 /*
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2026 Tobias Stoeckmann
5 * All rights reserved.
6 */
7 #include "test.h"
8
9 /* Test symlinks */
DEFINE_TEST(test_symlink)10 DEFINE_TEST(test_symlink)
11 {
12 const char *reffile1 = "test_symlink_1.zip";
13 const char *reffile2 = "test_symlink_2.zip";
14 int r;
15
16 if (!canSymlink()) {
17 skipping("System cannot create symlinks.");
18 return;
19 }
20
21 assertUmask(0);
22 extract_reference_file(reffile1);
23 extract_reference_file(reffile2);
24
25 /* Extract first archive */
26 r = systemf("%s %s >test.out 2>test.err", testprog, reffile1);
27 assertEqualInt(0, r);
28 assertNonEmptyFile("test.out");
29 assertNonEmptyFile("test.err");
30 assertIsDir("dir", 0755);
31 assertIsSymlink("dlink", "dir", 1);
32 assertIsReg("file.txt", 0644);
33 assertIsSymlink("flink", "file.txt", 0);
34 assertFileNotExists("link.insecure");
35
36 /* Create dangling symlinks by deleting targets */
37 rmdir("dir");
38 unlink("file.txt");
39 assertFileNotExists("dir");
40 assertFileNotExists("file.txt");
41 assertIsSymlink("dlink", "dir", 1);
42 assertIsSymlink("flink", "file.txt", 0);
43
44 /* Extract second archive, overwriting dangling symlinks */
45 r = systemf("%s -o %s >test.out 2>test.err", testprog, reffile2);
46 assertEqualInt(0, r);
47 assertEmptyFile("test.out");
48 assertEmptyFile("test.err");
49 assertFileNotExists("dir");
50 assertIsDir("dlink", 0755);
51 assertTextFileContents("hello world\n", "dlink/file.txt");
52 assertIsReg("flink", 0644);
53 }
54