test-get-passwd.c revision 1.1.1.2
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 30TEST_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(r == 0); 43 len = strlen(pwd.username); 44 ASSERT(len > 0); 45 46#ifdef _WIN32 47 ASSERT_NULL(pwd.shell); 48#else 49 len = strlen(pwd.shell); 50# ifndef __PASE__ 51 ASSERT(len > 0); 52# endif 53#endif 54 55 len = strlen(pwd.homedir); 56 ASSERT(len > 0); 57 58#ifdef _WIN32 59 if (len == 3 && pwd.homedir[1] == ':') 60 ASSERT(pwd.homedir[2] == '\\'); 61 else 62 ASSERT(pwd.homedir[len - 1] != '\\'); 63#else 64 if (len == 1) 65 ASSERT(pwd.homedir[0] == '/'); 66 else 67 ASSERT(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(r == UV_EINVAL); 99 100 return 0; 101} 102