/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #if defined(__BIONIC__) #define CHECK_GETPWNAM_FOR(username, uid, uid_type) \ SCOPED_TRACE(username); \ ASSERT_NO_FATAL_FAILURE(check_getpwnam(username, uid, uid_type)); typedef enum { TYPE_SYSTEM, TYPE_APP } uid_type_t; static void check_getpwnam(const char* username, uid_t uid, uid_type_t uid_type) { errno = 0; passwd* pwd = getpwuid(uid); ASSERT_TRUE(pwd != NULL); ASSERT_EQ(0, errno); EXPECT_STREQ(username, pwd->pw_name); EXPECT_EQ(uid, pwd->pw_uid); EXPECT_EQ(uid, pwd->pw_gid); ASSERT_EQ(NULL, pwd->pw_passwd); #ifdef __LP64__ ASSERT_EQ(NULL, pwd->pw_gecos); #endif if (uid_type == TYPE_SYSTEM) { EXPECT_STREQ("/", pwd->pw_dir); } else if (uid_type == TYPE_APP) { EXPECT_STREQ("/data", pwd->pw_dir); } EXPECT_STREQ("/system/bin/sh", pwd->pw_shell); } #else #define CHECK_GETPWNAM_FOR(username, uid, uid_type) \ GTEST_LOG_(INFO) << "This test does nothing.\n"; #endif TEST(getpwnam, system_id_root) { CHECK_GETPWNAM_FOR("root", 0, TYPE_SYSTEM); } TEST(getpwnam, system_id_system) { CHECK_GETPWNAM_FOR("system", 1000, TYPE_SYSTEM); } TEST(getpwnam, app_id_radio) { CHECK_GETPWNAM_FOR("radio", 1001, TYPE_SYSTEM); } TEST(getpwnam, app_id_nobody) { CHECK_GETPWNAM_FOR("nobody", 9999, TYPE_SYSTEM); } TEST(getpwnam, app_id_all_a0) { CHECK_GETPWNAM_FOR("all_a0", 50000, TYPE_APP); } TEST(getpwnam, app_id_u1_a40000) { CHECK_GETPWNAM_FOR("u1_a40000", 150000, TYPE_APP); } TEST(getpwnam, app_id_u0_a0) { CHECK_GETPWNAM_FOR("u0_a0", 10000, TYPE_APP); } TEST(getpwnam, app_id_u0_a1234) { CHECK_GETPWNAM_FOR("u0_a1234", 11234, TYPE_APP); } TEST(getpwnam, app_id_u0_a9999) { CHECK_GETPWNAM_FOR("u0_a9999", 19999, TYPE_APP); } // nonsensical, but expected TEST(getpwnam, app_id_u1_root) { CHECK_GETPWNAM_FOR("u1_root", 100000, TYPE_SYSTEM); } TEST(getpwnam, app_id_u1_radio) { CHECK_GETPWNAM_FOR("u1_radio", 101001, TYPE_SYSTEM); } TEST(getpwnam, app_id_u1_a0) { CHECK_GETPWNAM_FOR("u1_a0", 110000, TYPE_APP); } TEST(getpwnam, app_id_u1_i0) { CHECK_GETPWNAM_FOR("u1_i0", 199000, TYPE_APP); }