1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2025 Zhaofeng Li
5 * All rights reserved.
6 */
7 #include "test.h"
8
9 #if defined(_WIN32) && !defined(__CYGWIN__)
10 /* system() on Windows runs its arguments through CMD.EXE, which has
11 * notoriously unfriendly quoting rules. The current best documented way around
12 * them is to wrap your *entire commandline* in sacrificial quotes.
13 *
14 * See CMD.EXE /? for more information. Excerpted here:
15 * | Otherwise, old behavior is to see if the first character is
16 * | a quote character and if so, strip the leading character and
17 * | remove the last quote character on the command line, preserving
18 * | any text after the last quote character.
19 *
20 * Since this test makes heavy use of systemf() with quoted arguments inside
21 * the commandline, this macro is unfortunately an easier workaround.
22 */
23 #define systemf(command, ...) systemf("\"" command "\"", __VA_ARGS__)
24 #endif
25
DEFINE_TEST(test_option_mtime)26 DEFINE_TEST(test_option_mtime)
27 {
28 /* Create three files with different mtimes. */
29 assertMakeDir("in", 0755);
30 assertChdir("in");
31 assertMakeFile("new_mtime", 0666, "new");
32 assertUtimes("new_mtime", 100000, 0, 100000, 0);
33 assertMakeFile("mid_mtime", 0666, "mid");
34 assertUtimes("mid_mtime", 10000, 0, 10000, 0);
35 assertMakeFile("old_mtime", 0666, "old");
36 // assertion_utimes silently discards 0 :(
37 assertUtimes("old_mtime", 1, 0, 1, 0);
38
39 /* Archive with --mtime 86400 */
40 assertEqualInt(0,
41 systemf("%s --format pax -cf ../noclamp.tar "
42 "--mtime \"1970/1/2 0:0:0 UTC\" .",
43 testprog));
44 assertChdir("..");
45
46 assertMakeDir("out.noclamp", 0755);
47 assertChdir("out.noclamp");
48 assertEqualInt(0, systemf("%s xf ../noclamp.tar", testprog));
49 assertFileMtime("new_mtime", 86400, 0);
50 assertFileMtime("mid_mtime", 86400, 0);
51 assertFileMtime("old_mtime", 86400, 0);
52 assertChdir("..");
53
54 /* Archive with --mtime 86400 --clamp-mtime */
55 assertChdir("in");
56 assertEqualInt(0,
57 systemf("%s --format pax -cf ../clamp.tar "
58 "--mtime \"1970/1/2 0:0:0 UTC\" --clamp-mtime .",
59 testprog));
60 assertChdir("..");
61
62 assertMakeDir("out.clamp", 0755);
63 assertChdir("out.clamp");
64 assertEqualInt(0, systemf("%s xf ../clamp.tar", testprog));
65 assertFileMtime("new_mtime", 86400, 0);
66 assertFileMtime("mid_mtime", 10000, 0);
67 assertFileMtime("old_mtime", 1, 0);
68 assertChdir("..");
69
70 /* Archive-to-archive copy with --mtime 0 */
71 assertEqualInt(0,
72 systemf("%s --format pax -cf ./archive2archive.tar "
73 "--mtime \"1970/1/1 0:0:0 UTC\" @noclamp.tar",
74 testprog));
75 assertMakeDir("out.archive2archive", 0755);
76 assertChdir("out.archive2archive");
77 assertEqualInt(0, systemf("%s xf ../archive2archive.tar", testprog));
78 assertFileMtime("new_mtime", 0, 0);
79 assertFileMtime("mid_mtime", 0, 0);
80 assertFileMtime("old_mtime", 0, 0);
81 assertChdir("..");
82 }
83