xref: /netbsd-src/tests/lib/libc/stdlib/t_getenv.c (revision 94d18b32c6799f7f1cc4f5a22c951530f619098d)
1*94d18b32Smartin /*	$NetBSD: t_getenv.c,v 1.3 2015/02/27 08:55:35 martin Exp $ */
29b5c5259Sjruoho 
39b5c5259Sjruoho /*-
49b5c5259Sjruoho  * Copyright (c) 2010 The NetBSD Foundation, Inc.
59b5c5259Sjruoho  * All rights reserved.
69b5c5259Sjruoho  *
79b5c5259Sjruoho  * This code is derived from software contributed to The NetBSD Foundation
89b5c5259Sjruoho  * by Christos Zoulas
99b5c5259Sjruoho  *
109b5c5259Sjruoho  * Redistribution and use in source and binary forms, with or without
119b5c5259Sjruoho  * modification, are permitted provided that the following conditions
129b5c5259Sjruoho  * are met:
139b5c5259Sjruoho  *
149b5c5259Sjruoho  * 1. Redistributions of source code must retain the above copyright
159b5c5259Sjruoho  *    notice, this list of conditions and the following disclaimer.
169b5c5259Sjruoho  * 2. Redistributions in binary form must reproduce the above copyright
179b5c5259Sjruoho  *    notice, this list of conditions and the following disclaimer in
189b5c5259Sjruoho  *    the documentation and/or other materials provided with the
199b5c5259Sjruoho  *    distribution.
209b5c5259Sjruoho  *
219b5c5259Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
229b5c5259Sjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
239b5c5259Sjruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
249b5c5259Sjruoho  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
259b5c5259Sjruoho  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
269b5c5259Sjruoho  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
279b5c5259Sjruoho  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
289b5c5259Sjruoho  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
299b5c5259Sjruoho  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
309b5c5259Sjruoho  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
319b5c5259Sjruoho  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
329b5c5259Sjruoho  * SUCH DAMAGE.
339b5c5259Sjruoho  */
349b5c5259Sjruoho 
359b5c5259Sjruoho #include <sys/cdefs.h>
36*94d18b32Smartin __RCSID("$NetBSD: t_getenv.c,v 1.3 2015/02/27 08:55:35 martin Exp $");
379b5c5259Sjruoho 
389b5c5259Sjruoho #include <atf-c.h>
399b5c5259Sjruoho #include <errno.h>
409b5c5259Sjruoho #include <stdio.h>
419b5c5259Sjruoho #include <stdlib.h>
429b5c5259Sjruoho #include <string.h>
439b5c5259Sjruoho 
449b5c5259Sjruoho extern char	**environ;
459b5c5259Sjruoho 
469b5c5259Sjruoho ATF_TC(clearenv_basic);
ATF_TC_HEAD(clearenv_basic,tc)479b5c5259Sjruoho ATF_TC_HEAD(clearenv_basic, tc)
489b5c5259Sjruoho {
499b5c5259Sjruoho 	atf_tc_set_md_var(tc, "descr",
509b5c5259Sjruoho 	    "Test user clearing environment directly");
519b5c5259Sjruoho }
529b5c5259Sjruoho 
ATF_TC_BODY(clearenv_basic,tc)539b5c5259Sjruoho ATF_TC_BODY(clearenv_basic, tc)
549b5c5259Sjruoho {
559b5c5259Sjruoho 	char name[1024], value[1024];
569b5c5259Sjruoho 
579b5c5259Sjruoho 	for (size_t i = 0; i < 1024; i++) {
589b5c5259Sjruoho 		snprintf(name, sizeof(name), "crap%zu", i);
599b5c5259Sjruoho 		snprintf(value, sizeof(value), "%zu", i);
609b5c5259Sjruoho 		ATF_CHECK(setenv(name, value, 1) != -1);
619b5c5259Sjruoho 	}
629b5c5259Sjruoho 
639b5c5259Sjruoho 	*environ = NULL;
649b5c5259Sjruoho 
659b5c5259Sjruoho 	for (size_t i = 0; i < 1; i++) {
669b5c5259Sjruoho 		snprintf(name, sizeof(name), "crap%zu", i);
679b5c5259Sjruoho 		snprintf(value, sizeof(value), "%zu", i);
689b5c5259Sjruoho 		ATF_CHECK(setenv(name, value, 1) != -1);
699b5c5259Sjruoho 	}
709b5c5259Sjruoho 
719b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("crap0"), "0");
729b5c5259Sjruoho 	ATF_CHECK(getenv("crap1") == NULL);
739b5c5259Sjruoho 	ATF_CHECK(getenv("crap2") == NULL);
749b5c5259Sjruoho }
759b5c5259Sjruoho 
769b5c5259Sjruoho ATF_TC(getenv_basic);
ATF_TC_HEAD(getenv_basic,tc)779b5c5259Sjruoho ATF_TC_HEAD(getenv_basic, tc)
789b5c5259Sjruoho {
799b5c5259Sjruoho 	atf_tc_set_md_var(tc, "descr",
809b5c5259Sjruoho 	    "Test setenv(3), getenv(3)");
819b5c5259Sjruoho }
829b5c5259Sjruoho 
ATF_TC_BODY(getenv_basic,tc)839b5c5259Sjruoho ATF_TC_BODY(getenv_basic, tc)
849b5c5259Sjruoho {
859b5c5259Sjruoho 	ATF_CHECK(setenv("EVIL", "very=bad", 1) != -1);
869b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("EVIL"), "very=bad");
879b5c5259Sjruoho 	ATF_CHECK(getenv("EVIL=very") == NULL);
889b5c5259Sjruoho 	ATF_CHECK(unsetenv("EVIL") != -1);
899b5c5259Sjruoho }
909b5c5259Sjruoho 
919b5c5259Sjruoho ATF_TC(putenv_basic);
ATF_TC_HEAD(putenv_basic,tc)929b5c5259Sjruoho ATF_TC_HEAD(putenv_basic, tc)
939b5c5259Sjruoho {
949b5c5259Sjruoho 	atf_tc_set_md_var(tc, "descr",
959b5c5259Sjruoho 	    "Test putenv(3), getenv(3), unsetenv(3)");
969b5c5259Sjruoho }
979b5c5259Sjruoho 
989b5c5259Sjruoho 
ATF_TC_BODY(putenv_basic,tc)999b5c5259Sjruoho ATF_TC_BODY(putenv_basic, tc)
1009b5c5259Sjruoho {
1019b5c5259Sjruoho 	char string[1024];
1029b5c5259Sjruoho 
1039b5c5259Sjruoho 	snprintf(string, sizeof(string), "crap=true");
1049b5c5259Sjruoho 	ATF_CHECK(putenv(string) != -1);
1059b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("crap"), "true");
1069b5c5259Sjruoho 	string[1] = 'l';
1079b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("clap"), "true");
1089b5c5259Sjruoho 	ATF_CHECK(getenv("crap") == NULL);
1099b5c5259Sjruoho 	string[1] = 'r';
1109b5c5259Sjruoho 	ATF_CHECK(unsetenv("crap") != -1);
1119b5c5259Sjruoho 	ATF_CHECK(getenv("crap") == NULL);
1129b5c5259Sjruoho 
1139b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, putenv(NULL) == -1);
1149b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, putenv(__UNCONST("val")) == -1);
1159b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, putenv(__UNCONST("=val")) == -1);
1169b5c5259Sjruoho }
1179b5c5259Sjruoho 
1189b5c5259Sjruoho ATF_TC(setenv_basic);
ATF_TC_HEAD(setenv_basic,tc)1199b5c5259Sjruoho ATF_TC_HEAD(setenv_basic, tc)
1209b5c5259Sjruoho {
1219b5c5259Sjruoho 	atf_tc_set_md_var(tc, "descr",
1229b5c5259Sjruoho 	    "Test setenv(3), getenv(3), unsetenv(3)");
123*94d18b32Smartin 	atf_tc_set_md_var(tc, "timeout", "600");
1249b5c5259Sjruoho }
1259b5c5259Sjruoho 
ATF_TC_BODY(setenv_basic,tc)1269b5c5259Sjruoho ATF_TC_BODY(setenv_basic, tc)
1279b5c5259Sjruoho {
1289b5c5259Sjruoho 	const size_t numvars = 8192;
1299b5c5259Sjruoho 	size_t i, offset;
1309b5c5259Sjruoho 	char name[1024];
1319b5c5259Sjruoho 	char value[1024];
1329b5c5259Sjruoho 
1339b5c5259Sjruoho 	offset = lrand48();
1349b5c5259Sjruoho 	for (i = 0; i < numvars; i++) {
1359b5c5259Sjruoho 		(void)snprintf(name, sizeof(name), "var%zu",
1369b5c5259Sjruoho 		    (i * 7 + offset) % numvars);
1379b5c5259Sjruoho 		(void)snprintf(value, sizeof(value), "value%ld", lrand48());
1389b5c5259Sjruoho 		ATF_CHECK(setenv(name, value, 1) != -1);
1399b5c5259Sjruoho 		ATF_CHECK(setenv(name, "foo", 0) != -1);
1409b5c5259Sjruoho 		ATF_CHECK_STREQ(getenv(name), value);
1419b5c5259Sjruoho 	}
1429b5c5259Sjruoho 
1439b5c5259Sjruoho 	offset = lrand48();
1449b5c5259Sjruoho 	for (i = 0; i < numvars; i++) {
1459b5c5259Sjruoho 		(void)snprintf(name, sizeof(name), "var%zu",
1469b5c5259Sjruoho 		    (i * 11 + offset) % numvars);
1479b5c5259Sjruoho 		ATF_CHECK(unsetenv(name) != -1);
1489b5c5259Sjruoho 		ATF_CHECK(getenv(name) == NULL);
1499b5c5259Sjruoho 		ATF_CHECK(unsetenv(name) != -1);
1509b5c5259Sjruoho 	}
1519b5c5259Sjruoho 
1529b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, setenv(NULL, "val", 1) == -1);
1539b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, setenv("", "val", 1) == -1);
1549b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, setenv("v=r", "val", 1) == -1);
1559b5c5259Sjruoho 	ATF_CHECK_ERRNO(EINVAL, setenv("var", NULL, 1) == -1);
1569b5c5259Sjruoho 
1579b5c5259Sjruoho 	ATF_CHECK(setenv("var", "=val", 1) == 0);
1589b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("var"), "=val");
1599b5c5259Sjruoho }
1609b5c5259Sjruoho 
1619b5c5259Sjruoho ATF_TC(setenv_mixed);
ATF_TC_HEAD(setenv_mixed,tc)1629b5c5259Sjruoho ATF_TC_HEAD(setenv_mixed, tc)
1639b5c5259Sjruoho {
1649b5c5259Sjruoho 	atf_tc_set_md_var(tc, "descr",
1659b5c5259Sjruoho 	    "Test mixing setenv(3), unsetenv(3) and putenv(3)");
1669b5c5259Sjruoho }
1679b5c5259Sjruoho 
ATF_TC_BODY(setenv_mixed,tc)1689b5c5259Sjruoho ATF_TC_BODY(setenv_mixed, tc)
1699b5c5259Sjruoho {
1709b5c5259Sjruoho 	char string[32];
1719b5c5259Sjruoho 
1729b5c5259Sjruoho 	(void)strcpy(string, "mixedcrap=putenv");
1739b5c5259Sjruoho 
1749b5c5259Sjruoho 	ATF_CHECK(setenv("mixedcrap", "setenv", 1) != -1);
1759b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("mixedcrap"), "setenv");
1769b5c5259Sjruoho 	ATF_CHECK(putenv(string) != -1);
1779b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("mixedcrap"), "putenv");
1789b5c5259Sjruoho 	ATF_CHECK(unsetenv("mixedcrap") != -1);
1799b5c5259Sjruoho 	ATF_CHECK(getenv("mixedcrap") == NULL);
1809b5c5259Sjruoho 
1819b5c5259Sjruoho 	ATF_CHECK(putenv(string) != -1);
1829b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("mixedcrap"), "putenv");
1839b5c5259Sjruoho 	ATF_CHECK(setenv("mixedcrap", "setenv", 1) != -1);
1849b5c5259Sjruoho 	ATF_CHECK_STREQ(getenv("mixedcrap"), "setenv");
1859b5c5259Sjruoho 	ATF_CHECK(unsetenv("mixedcrap") != -1);
1869b5c5259Sjruoho 	ATF_CHECK(getenv("mixedcrap") == NULL);
1879b5c5259Sjruoho }
1889b5c5259Sjruoho 
ATF_TP_ADD_TCS(tp)1899b5c5259Sjruoho ATF_TP_ADD_TCS(tp)
1909b5c5259Sjruoho {
191dacd6ba8Sjruoho 
1929b5c5259Sjruoho 	ATF_TP_ADD_TC(tp, clearenv_basic);
1939b5c5259Sjruoho 	ATF_TP_ADD_TC(tp, getenv_basic);
1949b5c5259Sjruoho 	ATF_TP_ADD_TC(tp, putenv_basic);
1959b5c5259Sjruoho 	ATF_TP_ADD_TC(tp, setenv_basic);
1969b5c5259Sjruoho 	ATF_TP_ADD_TC(tp, setenv_mixed);
1979b5c5259Sjruoho 
1989b5c5259Sjruoho 	return atf_no_error();
1999b5c5259Sjruoho }
200