xref: /freebsd/contrib/libarchive/cpio/test/test_option_t.c (revision bd66c1b43e33540205dbc1187c2f2a15c58b57ba)
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 
96c95142eSMartin Matuska #ifdef HAVE_LOCALE_H
106c95142eSMartin Matuska #include <locale.h>
116c95142eSMartin Matuska #endif
12caf54c4fSMartin Matuska 
DEFINE_TEST(test_option_t)13caf54c4fSMartin Matuska DEFINE_TEST(test_option_t)
14caf54c4fSMartin Matuska {
15caf54c4fSMartin Matuska 	char *p;
16caf54c4fSMartin Matuska 	int r;
176c95142eSMartin Matuska 	time_t mtime;
18*bd66c1b4SMartin Matuska 	char date[48];
196c95142eSMartin Matuska 	char date2[32];
20bd5e624aSMartin Matuska 	struct tm *tmptr;
21e64fe029SMartin Matuska #if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S)
22bd5e624aSMartin Matuska 	struct tm tmbuf;
23bd5e624aSMartin Matuska #endif
24caf54c4fSMartin Matuska 
25caf54c4fSMartin Matuska 	/* List reference archive, make sure the TOC is correct. */
26caf54c4fSMartin Matuska 	extract_reference_file("test_option_t.cpio");
27caf54c4fSMartin Matuska 	r = systemf("%s -it < test_option_t.cpio >it.out 2>it.err", testprog);
28caf54c4fSMartin Matuska 	assertEqualInt(r, 0);
29caf54c4fSMartin Matuska 	assertTextFileContents("1 block\n", "it.err");
30caf54c4fSMartin Matuska 	extract_reference_file("test_option_t.stdout");
31caf54c4fSMartin Matuska 	p = slurpfile(NULL, "test_option_t.stdout");
32caf54c4fSMartin Matuska 	assertTextFileContents(p, "it.out");
33caf54c4fSMartin Matuska 	free(p);
34caf54c4fSMartin Matuska 
35caf54c4fSMartin Matuska 	/* We accept plain "-t" as a synonym for "-it" */
36caf54c4fSMartin Matuska 	r = systemf("%s -t < test_option_t.cpio >t.out 2>t.err", testprog);
37caf54c4fSMartin Matuska 	assertEqualInt(r, 0);
38caf54c4fSMartin Matuska 	assertTextFileContents("1 block\n", "t.err");
39caf54c4fSMartin Matuska 	extract_reference_file("test_option_t.stdout");
40caf54c4fSMartin Matuska 	p = slurpfile(NULL, "test_option_t.stdout");
41caf54c4fSMartin Matuska 	assertTextFileContents(p, "t.out");
42caf54c4fSMartin Matuska 	free(p);
43caf54c4fSMartin Matuska 
44caf54c4fSMartin Matuska 	/* But "-ot" is an error. */
45caf54c4fSMartin Matuska 	assert(0 != systemf("%s -ot < test_option_t.cpio >ot.out 2>ot.err",
46caf54c4fSMartin Matuska 			    testprog));
47caf54c4fSMartin Matuska 	assertEmptyFile("ot.out");
48caf54c4fSMartin Matuska 
49caf54c4fSMartin Matuska 	/* List reference archive verbosely, make sure the TOC is correct. */
50caf54c4fSMartin Matuska 	r = systemf("%s -itv < test_option_t.cpio >tv.out 2>tv.err", testprog);
51caf54c4fSMartin Matuska 	assertEqualInt(r, 0);
52caf54c4fSMartin Matuska 	assertTextFileContents("1 block\n", "tv.err");
53caf54c4fSMartin Matuska 	extract_reference_file("test_option_tv.stdout");
54caf54c4fSMartin Matuska 
55caf54c4fSMartin Matuska 	/* This doesn't work because the usernames on different systems
56caf54c4fSMartin Matuska 	 * are different and cpio now looks up numeric UIDs on
57caf54c4fSMartin Matuska 	 * the local system. */
58caf54c4fSMartin Matuska 	/* assertEqualFile("tv.out", "test_option_tv.stdout"); */
59caf54c4fSMartin Matuska 
60caf54c4fSMartin Matuska 	/* List reference archive with numeric IDs, verify TOC is correct. */
61caf54c4fSMartin Matuska 	r = systemf("%s -itnv < test_option_t.cpio >itnv.out 2>itnv.err",
62caf54c4fSMartin Matuska 		    testprog);
63caf54c4fSMartin Matuska 	assertEqualInt(r, 0);
64caf54c4fSMartin Matuska 	assertTextFileContents("1 block\n", "itnv.err");
65caf54c4fSMartin Matuska 	p = slurpfile(NULL, "itnv.out");
66caf54c4fSMartin Matuska 	/* Since -n uses numeric UID/GID, this part should be the
67caf54c4fSMartin Matuska 	 * same on every system. */
68caf54c4fSMartin Matuska 	assertEqualMem(p, "-rw-r--r--   1 1000     1000            0 ",42);
696c95142eSMartin Matuska 
706c95142eSMartin Matuska 	/* Date varies depending on local timezone and locale. */
716c95142eSMartin Matuska 	mtime = 1;
726c95142eSMartin Matuska #ifdef HAVE_LOCALE_H
736c95142eSMartin Matuska 	setlocale(LC_ALL, "");
74*bd66c1b4SMartin Matuska 	setlocale(LC_TIME, "");
756c95142eSMartin Matuska #endif
76e64fe029SMartin Matuska #if defined(HAVE_LOCALTIME_S)
77e64fe029SMartin Matuska         tmptr = localtime_s(&tmbuf, &mtime) ? NULL : &tmbuf;
78e64fe029SMartin Matuska #elif defined(HAVE_LOCALTIME_R)
79bd5e624aSMartin Matuska         tmptr = localtime_r(&mtime, &tmbuf);
80bd5e624aSMartin Matuska #else
81bd5e624aSMartin Matuska         tmptr = localtime(&mtime);
82bd5e624aSMartin Matuska #endif
836c95142eSMartin Matuska #if defined(_WIN32) && !defined(__CYGWIN__)
84bd5e624aSMartin Matuska 	strftime(date2, sizeof(date2)-1, "%b %d  %Y", tmptr);
85*bd66c1b4SMartin Matuska 	_snprintf(date, sizeof(date)-1, "%12s file", date2);
866c95142eSMartin Matuska #else
87bd5e624aSMartin Matuska 	strftime(date2, sizeof(date2)-1, "%b %e  %Y", tmptr);
88*bd66c1b4SMartin Matuska 	snprintf(date, sizeof(date)-1, "%12s file", date2);
896c95142eSMartin Matuska #endif
906c95142eSMartin Matuska 	assertEqualMem(p + 42, date, strlen(date));
91caf54c4fSMartin Matuska 	free(p);
92caf54c4fSMartin Matuska 
93caf54c4fSMartin Matuska 	/* But "-n" without "-t" is an error. */
94caf54c4fSMartin Matuska 	assert(0 != systemf("%s -in < test_option_t.cpio >in.out 2>in.err",
95caf54c4fSMartin Matuska 			    testprog));
96caf54c4fSMartin Matuska 	assertEmptyFile("in.out");
97caf54c4fSMartin Matuska }
98