1 /* $NetBSD: user_test.c,v 1.3 2014/12/10 04:38:03 christos Exp $ */ 2 3 /* 4 * Automated Testing Framework (atf) 5 * 6 * Copyright (c) 2007 The NetBSD Foundation, Inc. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 19 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 25 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 27 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 29 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/param.h> 33 #include <sys/types.h> 34 35 #include <limits.h> 36 #include <stdio.h> 37 #include <unistd.h> 38 39 #include <atf-c.h> 40 41 #include "test_helpers.h" 42 #include "user.h" 43 44 /* --------------------------------------------------------------------- 45 * Test cases for the free functions. 46 * --------------------------------------------------------------------- */ 47 48 ATF_TC(euid); 49 ATF_TC_HEAD(euid, tc) 50 { 51 atf_tc_set_md_var(tc, "descr", "Tests the atf_user_euid function"); 52 } 53 ATF_TC_BODY(euid, tc) 54 { 55 ATF_REQUIRE_EQ(atf_user_euid(), geteuid()); 56 } 57 58 ATF_TC(is_member_of_group); 59 ATF_TC_HEAD(is_member_of_group, tc) 60 { 61 atf_tc_set_md_var(tc, "descr", "Tests the atf_user_is_member_of_group " 62 "function"); 63 } 64 ATF_TC_BODY(is_member_of_group, tc) 65 { 66 gid_t gids[NGROUPS_MAX]; 67 gid_t g, maxgid; 68 int ngids; 69 const gid_t maxgid_limit = 1 << 16; 70 71 { 72 int i; 73 74 ngids = getgroups(NGROUPS_MAX, gids); 75 if (ngids == -1) 76 atf_tc_fail("Call to getgroups failed"); 77 maxgid = 0; 78 for (i = 0; i < ngids; i++) { 79 printf("User group %d is %u\n", i, gids[i]); 80 if (maxgid < gids[i]) 81 maxgid = gids[i]; 82 } 83 printf("User belongs to %d groups\n", ngids); 84 printf("Last GID is %u\n", maxgid); 85 } 86 87 if (maxgid > maxgid_limit) { 88 printf("Test truncated from %u groups to %u to keep the run time " 89 "reasonable enough\n", maxgid, maxgid_limit); 90 maxgid = maxgid_limit; 91 } 92 93 for (g = 0; g < maxgid; g++) { 94 bool found = false; 95 int i; 96 97 for (i = 0; !found && i < ngids; i++) { 98 if (gids[i] == g) 99 found = true; 100 } 101 102 if (found) { 103 printf("Checking if user belongs to group %d\n", g); 104 ATF_REQUIRE(atf_user_is_member_of_group(g)); 105 } else { 106 printf("Checking if user does not belong to group %d\n", g); 107 ATF_REQUIRE(!atf_user_is_member_of_group(g)); 108 } 109 } 110 } 111 112 ATF_TC(is_root); 113 ATF_TC_HEAD(is_root, tc) 114 { 115 atf_tc_set_md_var(tc, "descr", "Tests the atf_user_is_root function"); 116 } 117 ATF_TC_BODY(is_root, tc) 118 { 119 if (geteuid() == 0) 120 ATF_REQUIRE(atf_user_is_root()); 121 else 122 ATF_REQUIRE(!atf_user_is_root()); 123 } 124 125 ATF_TC(is_unprivileged); 126 ATF_TC_HEAD(is_unprivileged, tc) 127 { 128 atf_tc_set_md_var(tc, "descr", "Tests the atf_user_is_unprivileged " 129 "function"); 130 } 131 ATF_TC_BODY(is_unprivileged, tc) 132 { 133 if (geteuid() != 0) 134 ATF_REQUIRE(atf_user_is_unprivileged()); 135 else 136 ATF_REQUIRE(!atf_user_is_unprivileged()); 137 } 138 139 /* --------------------------------------------------------------------- 140 * Main. 141 * --------------------------------------------------------------------- */ 142 143 ATF_TP_ADD_TCS(tp) 144 { 145 ATF_TP_ADD_TC(tp, euid); 146 ATF_TP_ADD_TC(tp, is_member_of_group); 147 ATF_TP_ADD_TC(tp, is_root); 148 ATF_TP_ADD_TC(tp, is_unprivileged); 149 150 return atf_no_error(); 151 } 152