1caf54c4fSMartin Matuska /*-
2*bd66c1b4SMartin Matuska * SPDX-License-Identifier: BSD-2-Clause
3*bd66c1b4SMartin Matuska *
4caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle
5caf54c4fSMartin Matuska * All rights reserved.
6caf54c4fSMartin Matuska */
7caf54c4fSMartin Matuska #include "test.h"
8caf54c4fSMartin Matuska #if defined(HAVE_UTIME_H)
9caf54c4fSMartin Matuska #include <utime.h>
10caf54c4fSMartin Matuska #elif defined(HAVE_SYS_UTIME_H)
11caf54c4fSMartin Matuska #include <sys/utime.h>
12caf54c4fSMartin Matuska #endif
13caf54c4fSMartin Matuska
DEFINE_TEST(test_option_u)14caf54c4fSMartin Matuska DEFINE_TEST(test_option_u)
15caf54c4fSMartin Matuska {
16caf54c4fSMartin Matuska struct utimbuf times;
17caf54c4fSMartin Matuska char *p;
18caf54c4fSMartin Matuska size_t s;
19caf54c4fSMartin Matuska int r;
20caf54c4fSMartin Matuska
21caf54c4fSMartin Matuska /* Create a file. */
22caf54c4fSMartin Matuska assertMakeFile("f", 0644, "a");
23caf54c4fSMartin Matuska
24caf54c4fSMartin Matuska /* Copy the file to the "copy" dir. */
25caf54c4fSMartin Matuska r = systemf("echo f| %s -pd copy >copy.out 2>copy.err",
26caf54c4fSMartin Matuska testprog);
27caf54c4fSMartin Matuska assertEqualInt(r, 0);
28caf54c4fSMartin Matuska
29caf54c4fSMartin Matuska /* Check that the file contains only a single "a" */
30caf54c4fSMartin Matuska p = slurpfile(&s, "copy/f");
31caf54c4fSMartin Matuska assertEqualInt(s, 1);
32caf54c4fSMartin Matuska assertEqualMem(p, "a", 1);
3363ecfce8SEnji Cooper free(p);
34caf54c4fSMartin Matuska
35caf54c4fSMartin Matuska /* Recreate the file with a single "b" */
36caf54c4fSMartin Matuska assertMakeFile("f", 0644, "b");
37caf54c4fSMartin Matuska
38caf54c4fSMartin Matuska /* Set the mtime to the distant past. */
39caf54c4fSMartin Matuska memset(×, 0, sizeof(times));
40caf54c4fSMartin Matuska times.actime = 1;
41caf54c4fSMartin Matuska times.modtime = 3;
42caf54c4fSMartin Matuska assertEqualInt(0, utime("f", ×));
43caf54c4fSMartin Matuska
44caf54c4fSMartin Matuska /* Copy the file to the "copy" dir. */
45caf54c4fSMartin Matuska r = systemf("echo f| %s -pd copy >copy.out 2>copy.err",
46caf54c4fSMartin Matuska testprog);
47caf54c4fSMartin Matuska assertEqualInt(r, 0);
48caf54c4fSMartin Matuska
49caf54c4fSMartin Matuska /* Verify that the file hasn't changed (it wasn't overwritten) */
50caf54c4fSMartin Matuska p = slurpfile(&s, "copy/f");
51caf54c4fSMartin Matuska assertEqualInt(s, 1);
52caf54c4fSMartin Matuska assertEqualMem(p, "a", 1);
5363ecfce8SEnji Cooper free(p);
54caf54c4fSMartin Matuska
55caf54c4fSMartin Matuska /* Copy the file to the "copy" dir with -u (force) */
56caf54c4fSMartin Matuska r = systemf("echo f| %s -pud copy >copy.out 2>copy.err",
57caf54c4fSMartin Matuska testprog);
58caf54c4fSMartin Matuska assertEqualInt(r, 0);
59caf54c4fSMartin Matuska
60caf54c4fSMartin Matuska /* Verify that the file has changed (it was overwritten) */
61caf54c4fSMartin Matuska p = slurpfile(&s, "copy/f");
62caf54c4fSMartin Matuska assertEqualInt(s, 1);
63caf54c4fSMartin Matuska assertEqualMem(p, "b", 1);
6463ecfce8SEnji Cooper free(p);
65caf54c4fSMartin Matuska }
66