xref: /freebsd/lib/libc/tests/stdlib/clearenv_test.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
1597b0267SMariusz Zaborski /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3597b0267SMariusz Zaborski  *
4597b0267SMariusz Zaborski  * Copyright (C) 2021 Mariusz Zaborski <oshogbo@FreeBSD.org>
5597b0267SMariusz Zaborski  *
6597b0267SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
7597b0267SMariusz Zaborski  * modification, are permitted provided that the following conditions
8597b0267SMariusz Zaborski  * are met:
9597b0267SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
10597b0267SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
11597b0267SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
12597b0267SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
13597b0267SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
14597b0267SMariusz Zaborski  *
15597b0267SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16597b0267SMariusz Zaborski  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17597b0267SMariusz Zaborski  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18597b0267SMariusz Zaborski  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19597b0267SMariusz Zaborski  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20597b0267SMariusz Zaborski  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21597b0267SMariusz Zaborski  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22597b0267SMariusz Zaborski  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23597b0267SMariusz Zaborski  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24597b0267SMariusz Zaborski  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25597b0267SMariusz Zaborski  * SUCH DAMAGE.
26597b0267SMariusz Zaborski  */
27597b0267SMariusz Zaborski 
28597b0267SMariusz Zaborski /*
29597b0267SMariusz Zaborski  * Test for clearenv(3) routine.
30597b0267SMariusz Zaborski  */
31597b0267SMariusz Zaborski 
32597b0267SMariusz Zaborski #include <atf-c.h>
33597b0267SMariusz Zaborski 
34597b0267SMariusz Zaborski #include <stdio.h>
35597b0267SMariusz Zaborski #include <stdlib.h>
36597b0267SMariusz Zaborski 
37597b0267SMariusz Zaborski #define TEST_VARIABLE		"TEST_VAR"
38597b0267SMariusz Zaborski #define TEST_SYSTEM_VARIABLE	"PWD"
39597b0267SMariusz Zaborski 
40597b0267SMariusz Zaborski extern char **environ;
41597b0267SMariusz Zaborski 
42597b0267SMariusz Zaborski void
create_multiple_variables(int num)43597b0267SMariusz Zaborski create_multiple_variables(int num)
44597b0267SMariusz Zaborski {
45597b0267SMariusz Zaborski 	char name[64];
46597b0267SMariusz Zaborski 	char value[64];
47597b0267SMariusz Zaborski 	int i;
48597b0267SMariusz Zaborski 
49597b0267SMariusz Zaborski 	for (i = 0; i < num; i++) {
50597b0267SMariusz Zaborski 		snprintf(name, sizeof(name), "%s_%d", TEST_VARIABLE, i);
51597b0267SMariusz Zaborski 		snprintf(value, sizeof(value), "%d", i);
52597b0267SMariusz Zaborski 		ATF_CHECK(getenv(name) == NULL);
53597b0267SMariusz Zaborski 		ATF_CHECK(setenv(name, value, 0) != -1);
54597b0267SMariusz Zaborski 		ATF_CHECK_STREQ(getenv(name), value);
55597b0267SMariusz Zaborski 	}
56597b0267SMariusz Zaborski }
57597b0267SMariusz Zaborski 
58597b0267SMariusz Zaborski void
check_if_nulled_variables(int num)59597b0267SMariusz Zaborski check_if_nulled_variables(int num)
60597b0267SMariusz Zaborski {
61597b0267SMariusz Zaborski 	char name[64];
62597b0267SMariusz Zaborski 	int i;
63597b0267SMariusz Zaborski 
64597b0267SMariusz Zaborski 	for (i = 0; i < num; i++) {
65597b0267SMariusz Zaborski 		snprintf(name, sizeof(name), "%s_%d", TEST_VARIABLE, i);
66597b0267SMariusz Zaborski 		ATF_CHECK(getenv(name) == NULL);
67597b0267SMariusz Zaborski 	}
68597b0267SMariusz Zaborski }
69597b0267SMariusz Zaborski 
70597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__single_var_test);
ATF_TC_BODY(clearenv__single_var_test,tc)71597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__single_var_test, tc)
72597b0267SMariusz Zaborski {
73597b0267SMariusz Zaborski 
74597b0267SMariusz Zaborski 	ATF_CHECK(setenv(TEST_VARIABLE, "true", 0) != -1);
75597b0267SMariusz Zaborski 	ATF_CHECK_STREQ(getenv(TEST_VARIABLE), "true");
76597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
77597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_VARIABLE) == NULL);
78597b0267SMariusz Zaborski }
79597b0267SMariusz Zaborski 
80597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__multiple_vars_test);
ATF_TC_BODY(clearenv__multiple_vars_test,tc)81597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__multiple_vars_test, tc)
82597b0267SMariusz Zaborski {
83597b0267SMariusz Zaborski 
84597b0267SMariusz Zaborski 	create_multiple_variables(10);
85597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
86597b0267SMariusz Zaborski 	check_if_nulled_variables(10);
87597b0267SMariusz Zaborski }
88597b0267SMariusz Zaborski 
89597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__recreated_vars_test);
ATF_TC_BODY(clearenv__recreated_vars_test,tc)90597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__recreated_vars_test, tc)
91597b0267SMariusz Zaborski {
92597b0267SMariusz Zaborski 
93597b0267SMariusz Zaborski 	create_multiple_variables(10);
94597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
95597b0267SMariusz Zaborski 	check_if_nulled_variables(10);
96597b0267SMariusz Zaborski 	create_multiple_variables(10);
97597b0267SMariusz Zaborski }
98597b0267SMariusz Zaborski 
99597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__system_var_test);
ATF_TC_BODY(clearenv__system_var_test,tc)100597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__system_var_test, tc)
101597b0267SMariusz Zaborski {
102597b0267SMariusz Zaborski 
103597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) != NULL);
104597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
105597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) == NULL);
106597b0267SMariusz Zaborski }
107597b0267SMariusz Zaborski 
108597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__recreated_system_var_test);
ATF_TC_BODY(clearenv__recreated_system_var_test,tc)109597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__recreated_system_var_test, tc)
110597b0267SMariusz Zaborski {
111597b0267SMariusz Zaborski 
112597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) != NULL);
113597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
114597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) == NULL);
115597b0267SMariusz Zaborski 	ATF_CHECK(setenv(TEST_SYSTEM_VARIABLE, "test", 0) != -1);
116597b0267SMariusz Zaborski 	ATF_CHECK_STREQ(getenv(TEST_SYSTEM_VARIABLE), "test");
117597b0267SMariusz Zaborski }
118597b0267SMariusz Zaborski 
119597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__double_clear_vars);
ATF_TC_BODY(clearenv__double_clear_vars,tc)120597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__double_clear_vars, tc)
121597b0267SMariusz Zaborski {
122597b0267SMariusz Zaborski 
123597b0267SMariusz Zaborski 	create_multiple_variables(10);
124597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
125597b0267SMariusz Zaborski 	check_if_nulled_variables(10);
126597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
127597b0267SMariusz Zaborski 	check_if_nulled_variables(10);
128597b0267SMariusz Zaborski 	create_multiple_variables(10);
129597b0267SMariusz Zaborski }
130597b0267SMariusz Zaborski 
131597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__environ_null);
ATF_TC_BODY(clearenv__environ_null,tc)132597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__environ_null, tc)
133597b0267SMariusz Zaborski {
134597b0267SMariusz Zaborski 
135597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
136748a707fSMariusz Zaborski 	ATF_CHECK(environ != NULL);
137597b0267SMariusz Zaborski }
138597b0267SMariusz Zaborski 
139597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__putenv_vars);
ATF_TC_BODY(clearenv__putenv_vars,tc)140597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__putenv_vars, tc)
141597b0267SMariusz Zaborski {
142597b0267SMariusz Zaborski 	char buf[64], ref[64];
143597b0267SMariusz Zaborski 
144597b0267SMariusz Zaborski 	snprintf(buf, sizeof(buf), "%s=1", TEST_VARIABLE);
145597b0267SMariusz Zaborski 	strcpy(ref, buf);
146597b0267SMariusz Zaborski 
147597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_VARIABLE) == NULL);
148597b0267SMariusz Zaborski 	ATF_CHECK(putenv(buf) != -1);
149597b0267SMariusz Zaborski 	ATF_CHECK(strcmp(getenv(TEST_VARIABLE), "1") == 0);
150597b0267SMariusz Zaborski 
151597b0267SMariusz Zaborski 	ATF_CHECK(clearenv() == 0);
152597b0267SMariusz Zaborski 
153597b0267SMariusz Zaborski 	ATF_CHECK(getenv(TEST_VARIABLE) == NULL);
154597b0267SMariusz Zaborski 	ATF_CHECK(strcmp(buf, ref) == 0);
155597b0267SMariusz Zaborski }
156597b0267SMariusz Zaborski 
ATF_TP_ADD_TCS(tp)157597b0267SMariusz Zaborski ATF_TP_ADD_TCS(tp)
158597b0267SMariusz Zaborski {
159597b0267SMariusz Zaborski 
160597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__single_var_test);
161597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__multiple_vars_test);
162597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__recreated_vars_test);
163597b0267SMariusz Zaborski 
164597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__system_var_test);
165597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__recreated_system_var_test);
166597b0267SMariusz Zaborski 
167597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__double_clear_vars);
168597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__environ_null);
169597b0267SMariusz Zaborski 
170597b0267SMariusz Zaborski 	ATF_TP_ADD_TC(tp, clearenv__putenv_vars);
171597b0267SMariusz Zaborski 
172597b0267SMariusz Zaborski 	return (atf_no_error());
173597b0267SMariusz Zaborski }
174