Mercurial
comparison third_party/libuv/test/test-get-passwd.c @ 160:948de3f54cea
[ThirdParty] Added libuv
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Wed, 14 Jan 2026 19:39:52 -0800 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 159:05cf9467a1c3 | 160:948de3f54cea |
|---|---|
| 1 /* Copyright libuv contributors. All rights reserved. | |
| 2 * | |
| 3 * Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 4 * of this software and associated documentation files (the "Software"), to | |
| 5 * deal in the Software without restriction, including without limitation the | |
| 6 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
| 7 * sell copies of the Software, and to permit persons to whom the Software is | |
| 8 * furnished to do so, subject to the following conditions: | |
| 9 * | |
| 10 * The above copyright notice and this permission notice shall be included in | |
| 11 * all copies or substantial portions of the Software. | |
| 12 * | |
| 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| 18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
| 19 * IN THE SOFTWARE. | |
| 20 */ | |
| 21 | |
| 22 #include "uv.h" | |
| 23 #include "task.h" | |
| 24 #include <string.h> | |
| 25 #ifndef _WIN32 | |
| 26 #include <unistd.h> | |
| 27 #include <sys/types.h> | |
| 28 #endif | |
| 29 | |
| 30 TEST_IMPL(get_passwd) { | |
| 31 /* TODO(gengjiawen): Fix test on QEMU. */ | |
| 32 #if defined(__QEMU__) | |
| 33 RETURN_SKIP("Test does not currently work in QEMU"); | |
| 34 #endif | |
| 35 | |
| 36 uv_passwd_t pwd; | |
| 37 size_t len; | |
| 38 int r; | |
| 39 | |
| 40 /* Test the normal case */ | |
| 41 r = uv_os_get_passwd(&pwd); | |
| 42 ASSERT_OK(r); | |
| 43 len = strlen(pwd.username); | |
| 44 ASSERT_GT(len, 0); | |
| 45 | |
| 46 #ifdef _WIN32 | |
| 47 ASSERT_NULL(pwd.shell); | |
| 48 #else | |
| 49 len = strlen(pwd.shell); | |
| 50 # ifndef __PASE__ | |
| 51 ASSERT_GT(len, 0); | |
| 52 # endif | |
| 53 #endif | |
| 54 | |
| 55 len = strlen(pwd.homedir); | |
| 56 ASSERT_GT(len, 0); | |
| 57 | |
| 58 #ifdef _WIN32 | |
| 59 if (len == 3 && pwd.homedir[1] == ':') | |
| 60 ASSERT_EQ(pwd.homedir[2], '\\'); | |
| 61 else | |
| 62 ASSERT_NE(pwd.homedir[len - 1], '\\'); | |
| 63 #else | |
| 64 if (len == 1) | |
| 65 ASSERT_EQ(pwd.homedir[0], '/'); | |
| 66 else | |
| 67 ASSERT_NE(pwd.homedir[len - 1], '/'); | |
| 68 #endif | |
| 69 | |
| 70 #ifdef _WIN32 | |
| 71 ASSERT_EQ(pwd.uid, (unsigned)-1); | |
| 72 ASSERT_EQ(pwd.gid, (unsigned)-1); | |
| 73 #else | |
| 74 ASSERT_NE(pwd.uid, (unsigned)-1); | |
| 75 ASSERT_NE(pwd.gid, (unsigned)-1); | |
| 76 ASSERT_EQ(pwd.uid, geteuid()); | |
| 77 if (pwd.uid != 0 && pwd.gid != getgid()) | |
| 78 /* This will be likely true, as only root could have changed it. */ | |
| 79 ASSERT_EQ(pwd.gid, getegid()); | |
| 80 #endif | |
| 81 | |
| 82 /* Test uv_os_free_passwd() */ | |
| 83 uv_os_free_passwd(&pwd); | |
| 84 | |
| 85 ASSERT_NULL(pwd.username); | |
| 86 ASSERT_NULL(pwd.shell); | |
| 87 ASSERT_NULL(pwd.homedir); | |
| 88 | |
| 89 /* Test a double free */ | |
| 90 uv_os_free_passwd(&pwd); | |
| 91 | |
| 92 ASSERT_NULL(pwd.username); | |
| 93 ASSERT_NULL(pwd.shell); | |
| 94 ASSERT_NULL(pwd.homedir); | |
| 95 | |
| 96 /* Test invalid input */ | |
| 97 r = uv_os_get_passwd(NULL); | |
| 98 ASSERT_EQ(r, UV_EINVAL); | |
| 99 | |
| 100 return 0; | |
| 101 } | |
| 102 | |
| 103 | |
| 104 TEST_IMPL(get_passwd2) { | |
| 105 /* TODO(gengjiawen): Fix test on QEMU. */ | |
| 106 #if defined(__QEMU__) | |
| 107 RETURN_SKIP("Test does not currently work in QEMU"); | |
| 108 #endif | |
| 109 | |
| 110 uv_passwd_t pwd; | |
| 111 uv_passwd_t pwd2; | |
| 112 size_t len; | |
| 113 int r; | |
| 114 | |
| 115 /* Test the normal case */ | |
| 116 r = uv_os_get_passwd(&pwd); | |
| 117 ASSERT_OK(r); | |
| 118 | |
| 119 r = uv_os_get_passwd2(&pwd2, pwd.uid); | |
| 120 | |
| 121 #ifdef _WIN32 | |
| 122 ASSERT_EQ(r, UV_ENOTSUP); | |
| 123 (void) &len; | |
| 124 | |
| 125 #else | |
| 126 ASSERT_OK(r); | |
| 127 ASSERT_EQ(pwd.uid, pwd2.uid); | |
| 128 ASSERT_STR_EQ(pwd.username, pwd2.username); | |
| 129 ASSERT_STR_EQ(pwd.shell, pwd2.shell); | |
| 130 ASSERT_STR_EQ(pwd.homedir, pwd2.homedir); | |
| 131 uv_os_free_passwd(&pwd2); | |
| 132 | |
| 133 r = uv_os_get_passwd2(&pwd2, 0); | |
| 134 ASSERT_OK(r); | |
| 135 | |
| 136 len = strlen(pwd2.username); | |
| 137 ASSERT_GT(len, 0); | |
| 138 #if defined(__PASE__) | |
| 139 // uid 0 is qsecofr on IBM i | |
| 140 ASSERT_STR_EQ(pwd2.username, "qsecofr"); | |
| 141 #else | |
| 142 ASSERT_STR_EQ(pwd2.username, "root"); | |
| 143 #endif | |
| 144 len = strlen(pwd2.homedir); | |
| 145 # ifndef __PASE__ | |
| 146 ASSERT_GT(len, 0); | |
| 147 #endif | |
| 148 len = strlen(pwd2.shell); | |
| 149 # ifndef __PASE__ | |
| 150 ASSERT_GT(len, 0); | |
| 151 # endif | |
| 152 | |
| 153 uv_os_free_passwd(&pwd2); | |
| 154 #endif | |
| 155 | |
| 156 uv_os_free_passwd(&pwd); | |
| 157 | |
| 158 /* Test invalid input */ | |
| 159 r = uv_os_get_passwd2(NULL, pwd.uid); | |
| 160 #ifdef _WIN32 | |
| 161 ASSERT_EQ(r, UV_ENOTSUP); | |
| 162 #else | |
| 163 ASSERT_EQ(r, UV_EINVAL); | |
| 164 #endif | |
| 165 | |
| 166 return 0; | |
| 167 } | |
| 168 | |
| 169 | |
| 170 TEST_IMPL(get_group) { | |
| 171 /* TODO(gengjiawen): Fix test on QEMU. */ | |
| 172 #if defined(__QEMU__) | |
| 173 RETURN_SKIP("Test does not currently work in QEMU"); | |
| 174 #endif | |
| 175 | |
| 176 uv_passwd_t pwd; | |
| 177 uv_group_t grp; | |
| 178 size_t len; | |
| 179 int r; | |
| 180 | |
| 181 r = uv_os_get_passwd(&pwd); | |
| 182 ASSERT_OK(r); | |
| 183 | |
| 184 r = uv_os_get_group(&grp, pwd.gid); | |
| 185 | |
| 186 #ifdef _WIN32 | |
| 187 ASSERT_EQ(r, UV_ENOTSUP); | |
| 188 (void) &len; | |
| 189 | |
| 190 #else | |
| 191 ASSERT_OK(r); | |
| 192 ASSERT_EQ(pwd.gid, grp.gid); | |
| 193 | |
| 194 len = strlen(grp.groupname); | |
| 195 ASSERT_GT(len, 0); | |
| 196 | |
| 197 uv_os_free_group(&grp); | |
| 198 #endif | |
| 199 | |
| 200 uv_os_free_passwd(&pwd); | |
| 201 | |
| 202 /* Test invalid input */ | |
| 203 r = uv_os_get_group(NULL, pwd.gid); | |
| 204 #ifdef _WIN32 | |
| 205 ASSERT_EQ(r, UV_ENOTSUP); | |
| 206 #else | |
| 207 ASSERT_EQ(r, UV_EINVAL); | |
| 208 #endif | |
| 209 | |
| 210 return 0; | |
| 211 } |