xref: /freebsd/lib/libutil/tests/getlocalbase_test.c (revision c93f3b55e67fe465d93f3f54ae4408f131fec3aa)
1*c93f3b55SDag-Erling Smørgrav /*-
2*c93f3b55SDag-Erling Smørgrav  * Copyright (c) 2026 Dag-Erling Smørgrav
3*c93f3b55SDag-Erling Smørgrav  *
4*c93f3b55SDag-Erling Smørgrav  * SPDX-License-Identifier: BSD-2-Clause
5*c93f3b55SDag-Erling Smørgrav  */
6*c93f3b55SDag-Erling Smørgrav 
7*c93f3b55SDag-Erling Smørgrav #include <sys/param.h>
8*c93f3b55SDag-Erling Smørgrav #include <sys/wait.h>
9*c93f3b55SDag-Erling Smørgrav 
10*c93f3b55SDag-Erling Smørgrav #include <libutil.h>
11*c93f3b55SDag-Erling Smørgrav #include <paths.h>
12*c93f3b55SDag-Erling Smørgrav #include <stdlib.h>
13*c93f3b55SDag-Erling Smørgrav #include <string.h>
14*c93f3b55SDag-Erling Smørgrav #include <unistd.h>
15*c93f3b55SDag-Erling Smørgrav 
16*c93f3b55SDag-Erling Smørgrav #include <atf-c.h>
17*c93f3b55SDag-Erling Smørgrav 
18*c93f3b55SDag-Erling Smørgrav #define INVALID_PREFIX "/dev/null/"
19*c93f3b55SDag-Erling Smørgrav 
20*c93f3b55SDag-Erling Smørgrav #define X31 "/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
21*c93f3b55SDag-Erling Smørgrav #define X32 "/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
22*c93f3b55SDag-Erling Smørgrav #define X64 X32 X32
23*c93f3b55SDag-Erling Smørgrav #define X128 X64 X64
24*c93f3b55SDag-Erling Smørgrav #define X256 X128 X128
25*c93f3b55SDag-Erling Smørgrav #define X512 X256 X256
26*c93f3b55SDag-Erling Smørgrav #define X1024 X512 X512
27*c93f3b55SDag-Erling Smørgrav #define X1023 X512 X256 X128 X64 X32 X31
28*c93f3b55SDag-Erling Smørgrav 
29*c93f3b55SDag-Erling Smørgrav static struct {
30*c93f3b55SDag-Erling Smørgrav 	const char *in, *out;
31*c93f3b55SDag-Erling Smørgrav } tests[] = {
32*c93f3b55SDag-Erling Smørgrav 	{ "", _PATH_LOCALBASE },
33*c93f3b55SDag-Erling Smørgrav 	{ "/", "/" },
34*c93f3b55SDag-Erling Smørgrav 	{ "//", "/" },
35*c93f3b55SDag-Erling Smørgrav 	{ "///", "/" },
36*c93f3b55SDag-Erling Smørgrav 	{ "foo", INVALID_PREFIX },
37*c93f3b55SDag-Erling Smørgrav 	{ "/foo", "/foo" },
38*c93f3b55SDag-Erling Smørgrav 	{ "//foo", "/foo" },
39*c93f3b55SDag-Erling Smørgrav 	{ "/foo/", "/foo" },
40*c93f3b55SDag-Erling Smørgrav 	{ "/foo//", "/foo" },
41*c93f3b55SDag-Erling Smørgrav 	{ "//foo//", "/foo" },
42*c93f3b55SDag-Erling Smørgrav 	{ "/foo/bar", "/foo/bar" },
43*c93f3b55SDag-Erling Smørgrav 	{ "/foo/bar/", "/foo/bar" },
44*c93f3b55SDag-Erling Smørgrav 	{ "/foo//bar", "/foo/bar" },
45*c93f3b55SDag-Erling Smørgrav 	{ "/foo//bar/", "/foo/bar" },
46*c93f3b55SDag-Erling Smørgrav 	{ "//foo/bar", "/foo/bar" },
47*c93f3b55SDag-Erling Smørgrav 	{ "//foo/bar/", "/foo/bar" },
48*c93f3b55SDag-Erling Smørgrav 	{ "//foo//bar", "/foo/bar" },
49*c93f3b55SDag-Erling Smørgrav 	{ "//foo//bar/", "/foo/bar" },
50*c93f3b55SDag-Erling Smørgrav 	{ _PATH_LOCALBASE, _PATH_LOCALBASE },
51*c93f3b55SDag-Erling Smørgrav 	{ X31, X31 },
52*c93f3b55SDag-Erling Smørgrav 	{ X32, X32 },
53*c93f3b55SDag-Erling Smørgrav 	{ X64, X64 },
54*c93f3b55SDag-Erling Smørgrav 	{ X128, X128 },
55*c93f3b55SDag-Erling Smørgrav 	{ X256, X256 },
56*c93f3b55SDag-Erling Smørgrav 	{ X512, X512 },
57*c93f3b55SDag-Erling Smørgrav 	{ X1023, X1023 },
58*c93f3b55SDag-Erling Smørgrav 	{ X1024, INVALID_PREFIX },
59*c93f3b55SDag-Erling Smørgrav 	{ 0 }
60*c93f3b55SDag-Erling Smørgrav };
61*c93f3b55SDag-Erling Smørgrav _Static_assert(sizeof(X1023) == MAXPATHLEN, "Unexpected MAXPATHLEN value");
62*c93f3b55SDag-Erling Smørgrav 
63*c93f3b55SDag-Erling Smørgrav ATF_TC(environment);
ATF_TC_HEAD(environment,tc)64*c93f3b55SDag-Erling Smørgrav ATF_TC_HEAD(environment, tc)
65*c93f3b55SDag-Erling Smørgrav {
66*c93f3b55SDag-Erling Smørgrav 	atf_tc_set_md_var(tc, "descr", "Tests getting the local base from the "
67*c93f3b55SDag-Erling Smørgrav 	    "environment and path normalization");
68*c93f3b55SDag-Erling Smørgrav }
69*c93f3b55SDag-Erling Smørgrav 
ATF_TC_BODY(environment,tc)70*c93f3b55SDag-Erling Smørgrav ATF_TC_BODY(environment, tc)
71*c93f3b55SDag-Erling Smørgrav {
72*c93f3b55SDag-Erling Smørgrav 	pid_t pid;
73*c93f3b55SDag-Erling Smørgrav 	int i, wstatus;
74*c93f3b55SDag-Erling Smørgrav 
75*c93f3b55SDag-Erling Smørgrav 	for (i = 0; tests[i].in != NULL; i++) {
76*c93f3b55SDag-Erling Smørgrav 		ATF_REQUIRE((pid = fork()) >= 0);
77*c93f3b55SDag-Erling Smørgrav 		if (pid == 0) {
78*c93f3b55SDag-Erling Smørgrav 			ATF_REQUIRE_EQ(setenv("LOCALBASE", tests[i].in, 1), 0);
79*c93f3b55SDag-Erling Smørgrav 			ATF_REQUIRE_STREQ(getlocalbase(), tests[i].out);
80*c93f3b55SDag-Erling Smørgrav 			_exit(0);
81*c93f3b55SDag-Erling Smørgrav 		}
82*c93f3b55SDag-Erling Smørgrav 		ATF_REQUIRE_EQ(waitpid(0, &wstatus, 0), pid);
83*c93f3b55SDag-Erling Smørgrav 		ATF_CHECK(WIFEXITED(wstatus));
84*c93f3b55SDag-Erling Smørgrav 		ATF_CHECK_EQ(WEXITSTATUS(wstatus), 0);
85*c93f3b55SDag-Erling Smørgrav 	}
86*c93f3b55SDag-Erling Smørgrav }
87*c93f3b55SDag-Erling Smørgrav 
ATF_TP_ADD_TCS(tp)88*c93f3b55SDag-Erling Smørgrav ATF_TP_ADD_TCS(tp)
89*c93f3b55SDag-Erling Smørgrav {
90*c93f3b55SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, environment);
91*c93f3b55SDag-Erling Smørgrav 	return (atf_no_error());
92*c93f3b55SDag-Erling Smørgrav }
93