blob: 8dcf7715cec5b4cdf14c9b78f73f83371a97d705 [file] [log] [blame]
Kenny Root2a54e5e2012-09-13 10:52:52 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
Yabin Cuia04c79b2014-11-18 16:14:54 -080019// Below are the header files we want to test.
20#include <grp.h>
Kenny Root2a54e5e2012-09-13 10:52:52 -070021#include <pwd.h>
Yabin Cuia04c79b2014-11-18 16:14:54 -080022
Kenny Root2a54e5e2012-09-13 10:52:52 -070023#include <errno.h>
24#include <limits.h>
Yabin Cuia04c79b2014-11-18 16:14:54 -080025#include <sys/cdefs.h>
26#include <sys/types.h>
Kenny Root2a54e5e2012-09-13 10:52:52 -070027#include <unistd.h>
28
Mark Salyzyn722ab052016-04-06 10:35:48 -070029#include <bitset>
30
31#include <private/android_filesystem_config.h>
32
William Roberts1a13db52016-04-08 13:44:19 -070033// Generated android_ids array
34#include "generated_android_ids.h"
35
Yabin Cuia04c79b2014-11-18 16:14:54 -080036enum uid_type_t {
Kenny Root2a54e5e2012-09-13 10:52:52 -070037 TYPE_SYSTEM,
38 TYPE_APP
Yabin Cuia04c79b2014-11-18 16:14:54 -080039};
Kenny Root2a54e5e2012-09-13 10:52:52 -070040
Yabin Cuia04c79b2014-11-18 16:14:54 -080041#if defined(__BIONIC__)
42
43static void check_passwd(const passwd* pwd, const char* username, uid_t uid, uid_type_t uid_type) {
Kenny Root2a54e5e2012-09-13 10:52:52 -070044 ASSERT_TRUE(pwd != NULL);
Yabin Cuia04c79b2014-11-18 16:14:54 -080045 ASSERT_STREQ(username, pwd->pw_name);
46 ASSERT_EQ(uid, pwd->pw_uid);
47 ASSERT_EQ(uid, pwd->pw_gid);
Calin Juravlec7688742014-05-09 21:50:53 +010048 ASSERT_EQ(NULL, pwd->pw_passwd);
49#ifdef __LP64__
50 ASSERT_EQ(NULL, pwd->pw_gecos);
51#endif
Kenny Root2a54e5e2012-09-13 10:52:52 -070052
53 if (uid_type == TYPE_SYSTEM) {
Yabin Cuia04c79b2014-11-18 16:14:54 -080054 ASSERT_STREQ("/", pwd->pw_dir);
55 } else {
56 ASSERT_STREQ("/data", pwd->pw_dir);
Kenny Root2a54e5e2012-09-13 10:52:52 -070057 }
Yabin Cuia04c79b2014-11-18 16:14:54 -080058 ASSERT_STREQ("/system/bin/sh", pwd->pw_shell);
Kenny Root2a54e5e2012-09-13 10:52:52 -070059}
Yabin Cuia04c79b2014-11-18 16:14:54 -080060
61static void check_getpwuid(const char* username, uid_t uid, uid_type_t uid_type) {
62 errno = 0;
63 passwd* pwd = getpwuid(uid);
64 ASSERT_EQ(0, errno);
65 SCOPED_TRACE("getpwuid");
66 check_passwd(pwd, username, uid, uid_type);
67}
68
69static void check_getpwnam(const char* username, uid_t uid, uid_type_t uid_type) {
70 errno = 0;
71 passwd* pwd = getpwnam(username);
72 ASSERT_EQ(0, errno);
73 SCOPED_TRACE("getpwnam");
74 check_passwd(pwd, username, uid, uid_type);
75}
76
77static void check_getpwuid_r(const char* username, uid_t uid, uid_type_t uid_type) {
78 passwd pwd_storage;
79 char buf[512];
80 int result;
81
82 errno = 0;
83 passwd* pwd = NULL;
84 result = getpwuid_r(uid, &pwd_storage, buf, sizeof(buf), &pwd);
85 ASSERT_EQ(0, result);
86 ASSERT_EQ(0, errno);
87 SCOPED_TRACE("getpwuid_r");
88 check_passwd(pwd, username, uid, uid_type);
89}
90
91static void check_getpwnam_r(const char* username, uid_t uid, uid_type_t uid_type) {
92 passwd pwd_storage;
93 char buf[512];
94 int result;
95
96 errno = 0;
97 passwd* pwd = NULL;
98 result = getpwnam_r(username, &pwd_storage, buf, sizeof(buf), &pwd);
99 ASSERT_EQ(0, result);
100 ASSERT_EQ(0, errno);
101 SCOPED_TRACE("getpwnam_r");
102 check_passwd(pwd, username, uid, uid_type);
103}
104
105static void check_get_passwd(const char* username, uid_t uid, uid_type_t uid_type) {
106 check_getpwuid(username, uid, uid_type);
107 check_getpwnam(username, uid, uid_type);
108 check_getpwuid_r(username, uid, uid_type);
109 check_getpwnam_r(username, uid, uid_type);
110}
111
112#else // !defined(__BIONIC__)
113
114static void check_get_passwd(const char* /* username */, uid_t /* uid */, uid_type_t /* uid_type */) {
115 GTEST_LOG_(INFO) << "This test is about uid/username translation for Android, which does nothing on libc other than bionic.\n";
116}
117
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800118#endif
Kenny Root2a54e5e2012-09-13 10:52:52 -0700119
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800120TEST(pwd, getpwnam_system_id_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800121 check_get_passwd("root", 0, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700122}
123
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800124TEST(pwd, getpwnam_system_id_system) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800125 check_get_passwd("system", 1000, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700126}
127
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800128TEST(pwd, getpwnam_app_id_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800129 check_get_passwd("radio", 1001, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700130}
131
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800132TEST(pwd, getpwnam_oem_id_5000) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700133 check_get_passwd("oem_5000", 5000, TYPE_SYSTEM);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700134}
135
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800136TEST(pwd, getpwnam_oem_id_5999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700137 check_get_passwd("oem_5999", 5999, TYPE_SYSTEM);
138}
139
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800140TEST(pwd, getpwnam_oem_id_2900) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700141 check_get_passwd("oem_2900", 2900, TYPE_SYSTEM);
142}
143
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800144TEST(pwd, getpwnam_oem_id_2999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700145 check_get_passwd("oem_2999", 2999, TYPE_SYSTEM);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700146}
147
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800148TEST(pwd, getpwnam_app_id_nobody) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800149 check_get_passwd("nobody", 9999, TYPE_SYSTEM);
Kenny Root8a05a012012-09-13 14:31:50 -0700150}
151
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800152TEST(pwd, getpwnam_app_id_u0_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800153 check_get_passwd("u0_a0", 10000, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700154}
155
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800156TEST(pwd, getpwnam_app_id_u0_a1234) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800157 check_get_passwd("u0_a1234", 11234, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700158}
159
Yabin Cuia04c79b2014-11-18 16:14:54 -0800160// Test the difference between uid and shared gid.
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800161TEST(pwd, getpwnam_app_id_u0_a49999) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800162 check_get_passwd("u0_a49999", 59999, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700163}
164
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800165TEST(pwd, getpwnam_app_id_u0_i1) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800166 check_get_passwd("u0_i1", 99001, TYPE_APP);
167}
168
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800169TEST(pwd, getpwnam_app_id_u1_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800170 check_get_passwd("u1_root", 100000, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700171}
172
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800173TEST(pwd, getpwnam_app_id_u1_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800174 check_get_passwd("u1_radio", 101001, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700175}
176
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800177TEST(pwd, getpwnam_app_id_u1_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800178 check_get_passwd("u1_a0", 110000, TYPE_APP);
179}
180
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800181TEST(pwd, getpwnam_app_id_u1_a40000) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800182 check_get_passwd("u1_a40000", 150000, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700183}
184
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800185TEST(pwd, getpwnam_app_id_u1_i0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800186 check_get_passwd("u1_i0", 199000, TYPE_APP);
187}
188
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800189TEST(pwd, getpwent_iterate) {
Mark Salyzyn722ab052016-04-06 10:35:48 -0700190 passwd* pwd;
191 std::bitset<10000> exist;
192 bool application = false;
193
194 exist.reset();
195
196 setpwent();
197 while ((pwd = getpwent()) != NULL) {
198 ASSERT_TRUE(NULL != pwd->pw_name);
199 ASSERT_EQ(pwd->pw_gid, pwd->pw_uid);
200 ASSERT_EQ(NULL, pwd->pw_passwd);
201#ifdef __LP64__
202 ASSERT_TRUE(NULL == pwd->pw_gecos);
203#endif
204 ASSERT_TRUE(NULL != pwd->pw_shell);
205 if (pwd->pw_uid >= exist.size()) {
206 ASSERT_STREQ("/data", pwd->pw_dir);
207 application = true;
208 } else {
209 ASSERT_STREQ("/", pwd->pw_dir);
210 ASSERT_FALSE(exist[pwd->pw_uid]);
211 exist[pwd->pw_uid] = true;
212 }
213 }
214 endpwent();
215
216 // Required content
217 for (size_t n = 0; n < android_id_count; ++n) {
218 ASSERT_TRUE(exist[android_ids[n].aid]);
219 }
220 for (size_t n = 2900; n < 2999; ++n) {
221 ASSERT_TRUE(exist[n]);
222 }
223 for (size_t n = 5000; n < 5999; ++n) {
224 ASSERT_TRUE(exist[n]);
225 }
226 ASSERT_TRUE(application);
227}
228
Yabin Cuia04c79b2014-11-18 16:14:54 -0800229static void check_group(const group* grp, const char* group_name, gid_t gid) {
230 ASSERT_TRUE(grp != NULL);
231 ASSERT_STREQ(group_name, grp->gr_name);
232 ASSERT_EQ(gid, grp->gr_gid);
233 ASSERT_TRUE(grp->gr_mem != NULL);
234 ASSERT_STREQ(group_name, grp->gr_mem[0]);
235 ASSERT_TRUE(grp->gr_mem[1] == NULL);
236}
237
Yabin Cuic4786d32015-07-20 19:46:26 -0700238#if defined(__BIONIC__)
239
Yabin Cuia04c79b2014-11-18 16:14:54 -0800240static void check_getgrgid(const char* group_name, gid_t gid) {
241 errno = 0;
242 group* grp = getgrgid(gid);
243 ASSERT_EQ(0, errno);
244 SCOPED_TRACE("getgrgid");
245 check_group(grp, group_name, gid);
246}
247
248static void check_getgrnam(const char* group_name, gid_t gid) {
249 errno = 0;
250 group* grp = getgrnam(group_name);
251 ASSERT_EQ(0, errno);
252 SCOPED_TRACE("getgrnam");
253 check_group(grp, group_name, gid);
254}
255
Yabin Cuic4786d32015-07-20 19:46:26 -0700256static void check_getgrgid_r(const char* group_name, gid_t gid) {
257 group grp_storage;
258 char buf[512];
259 group* grp;
260
261 errno = 0;
262 int result = getgrgid_r(gid, &grp_storage, buf, sizeof(buf), &grp);
263 ASSERT_EQ(0, result);
264 ASSERT_EQ(0, errno);
265 SCOPED_TRACE("getgrgid_r");
266 check_group(grp, group_name, gid);
267}
268
269static void check_getgrnam_r(const char* group_name, gid_t gid) {
270 group grp_storage;
271 char buf[512];
272 group* grp;
273
274 errno = 0;
275 int result = getgrnam_r(group_name, &grp_storage, buf, sizeof(buf), &grp);
276 ASSERT_EQ(0, result);
277 ASSERT_EQ(0, errno);
278 SCOPED_TRACE("getgrnam_r");
279 check_group(grp, group_name, gid);
280}
281
Yabin Cuia04c79b2014-11-18 16:14:54 -0800282static void check_get_group(const char* group_name, gid_t gid) {
283 check_getgrgid(group_name, gid);
284 check_getgrnam(group_name, gid);
Yabin Cuic4786d32015-07-20 19:46:26 -0700285 check_getgrgid_r(group_name, gid);
286 check_getgrnam_r(group_name, gid);
Yabin Cuia04c79b2014-11-18 16:14:54 -0800287}
288
289#else // !defined(__BIONIC__)
290
Yabin Cuic4786d32015-07-20 19:46:26 -0700291static void print_no_getgrnam_test_info() {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800292 GTEST_LOG_(INFO) << "This test is about gid/group_name translation for Android, which does nothing on libc other than bionic.\n";
293}
294
Yabin Cuic4786d32015-07-20 19:46:26 -0700295static void check_get_group(const char*, gid_t) {
296 print_no_getgrnam_test_info();
297}
298
Yabin Cuia04c79b2014-11-18 16:14:54 -0800299#endif
300
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800301TEST(grp, getgrnam_system_id_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800302 check_get_group("root", 0);
303}
304
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800305TEST(grp, getgrnam_system_id_system) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800306 check_get_group("system", 1000);
307}
308
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800309TEST(grp, getgrnam_app_id_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800310 check_get_group("radio", 1001);
311}
312
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800313TEST(grp, getgrnam_oem_id_5000) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700314 check_get_group("oem_5000", 5000);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700315}
316
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800317TEST(grp, getgrnam_oem_id_5999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700318 check_get_group("oem_5999", 5999);
319}
320
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800321TEST(grp, getgrnam_oem_id_2900) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700322 check_get_group("oem_2900", 2900);
323}
324
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800325TEST(grp, getgrnam_oem_id_2999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700326 check_get_group("oem_2999", 2999);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700327}
328
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800329TEST(grp, getgrnam_app_id_nobody) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800330 check_get_group("nobody", 9999);
331}
332
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800333TEST(grp, getgrnam_app_id_u0_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800334 check_get_group("u0_a0", 10000);
335}
336
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800337TEST(grp, getgrnam_app_id_u0_a1234) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800338 check_get_group("u0_a1234", 11234);
339}
340
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800341TEST(grp, getgrnam_app_id_u0_a9999) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800342 check_get_group("u0_a9999", 19999);
343}
344
345// Test the difference between uid and shared gid.
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800346TEST(grp, getgrnam_app_id_all_a9999) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800347 check_get_group("all_a9999", 59999);
348}
349
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800350TEST(grp, getgrnam_app_id_u0_i1) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800351 check_get_group("u0_i1", 99001);
352}
353
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800354TEST(grp, getgrnam_app_id_u1_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800355 check_get_group("u1_root", 100000);
356}
357
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800358TEST(grp, getgrnam_app_id_u1_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800359 check_get_group("u1_radio", 101001);
360}
361
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800362TEST(grp, getgrnam_app_id_u1_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800363 check_get_group("u1_a0", 110000);
364}
365
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800366TEST(grp, getgrnam_app_id_u1_a40000) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800367 check_get_group("u1_a40000", 150000);
368}
369
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800370TEST(grp, getgrnam_app_id_u1_i0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800371 check_get_group("u1_i0", 199000);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700372}
Yabin Cuic4786d32015-07-20 19:46:26 -0700373
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800374TEST(grp, getgrnam_r_reentrancy) {
Yabin Cuic4786d32015-07-20 19:46:26 -0700375#if defined(__BIONIC__)
376 group grp_storage[2];
377 char buf[2][512];
378 group* grp[3];
379 int result = getgrnam_r("root", &grp_storage[0], buf[0], sizeof(buf[0]), &grp[0]);
380 ASSERT_EQ(0, result);
381 check_group(grp[0], "root", 0);
382 grp[1] = getgrnam("system");
383 check_group(grp[1], "system", 1000);
384 result = getgrnam_r("radio", &grp_storage[1], buf[1], sizeof(buf[1]), &grp[2]);
385 ASSERT_EQ(0, result);
386 check_group(grp[2], "radio", 1001);
387 check_group(grp[0], "root", 0);
388 check_group(grp[1], "system", 1000);
389#else
390 print_no_getgrnam_test_info();
391#endif
392}
393
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800394TEST(grp, getgrgid_r_reentrancy) {
Yabin Cuic4786d32015-07-20 19:46:26 -0700395#if defined(__BIONIC__)
396 group grp_storage[2];
397 char buf[2][512];
398 group* grp[3];
399 int result = getgrgid_r(0, &grp_storage[0], buf[0], sizeof(buf[0]), &grp[0]);
400 ASSERT_EQ(0, result);
401 check_group(grp[0], "root", 0);
402 grp[1] = getgrgid(1000);
403 check_group(grp[1], "system", 1000);
404 result = getgrgid_r(1001, &grp_storage[1], buf[1], sizeof(buf[1]), &grp[2]);
405 ASSERT_EQ(0, result);
406 check_group(grp[2], "radio", 1001);
407 check_group(grp[0], "root", 0);
408 check_group(grp[1], "system", 1000);
409#else
410 print_no_getgrnam_test_info();
411#endif
412}
413
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800414TEST(grp, getgrnam_r_large_enough_suggested_buffer_size) {
Yabin Cuic4786d32015-07-20 19:46:26 -0700415 long size = sysconf(_SC_GETGR_R_SIZE_MAX);
416 ASSERT_GT(size, 0);
417 char buf[size];
418 group grp_storage;
419 group* grp;
420 ASSERT_EQ(0, getgrnam_r("root", &grp_storage, buf, size, &grp));
421 check_group(grp, "root", 0);
422}
Mark Salyzyn722ab052016-04-06 10:35:48 -0700423
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800424TEST(grp, getgrent_iterate) {
Mark Salyzyn722ab052016-04-06 10:35:48 -0700425 group* grp;
426 std::bitset<10000> exist;
427 bool application = false;
428
429 exist.reset();
430
431 setgrent();
432 while ((grp = getgrent()) != NULL) {
433 ASSERT_TRUE(grp->gr_name != NULL);
434 ASSERT_TRUE(grp->gr_mem != NULL);
435 ASSERT_STREQ(grp->gr_name, grp->gr_mem[0]);
436 ASSERT_TRUE(grp->gr_mem[1] == NULL);
437 if (grp->gr_gid >= exist.size()) {
438 application = true;
439 } else {
440 ASSERT_FALSE(exist[grp->gr_gid]);
441 exist[grp->gr_gid] = true;
442 }
443 }
444 endgrent();
445
446 // Required content
447 for (size_t n = 0; n < android_id_count; ++n) {
448 ASSERT_TRUE(exist[android_ids[n].aid]);
449 }
450 for (size_t n = 2900; n < 2999; ++n) {
451 ASSERT_TRUE(exist[n]);
452 }
453 for (size_t n = 5000; n < 5999; ++n) {
454 ASSERT_TRUE(exist[n]);
455 }
456 ASSERT_TRUE(application);
457}