diff options
author | DJ Delorie <dj@delorie.com> | 2017-07-17 15:50:43 -0400 |
---|---|---|
committer | DJ Delorie <dj@delorie.com> | 2017-07-17 15:52:44 -0400 |
commit | ae5c498d93d049d9574d3f8f18e62cac64cbdf5c (patch) | |
tree | 986e51e120bd42c02fe2ee5a4b04ca13951600e3 /nss/tst-nss-test4.c | |
parent | hppa: Fix clone exit syscall argument passing (BZ#21512) (diff) | |
download | glibc-ae5c498d93d049d9574d3f8f18e62cac64cbdf5c.tar.gz glibc-ae5c498d93d049d9574d3f8f18e62cac64cbdf5c.tar.bz2 glibc-ae5c498d93d049d9574d3f8f18e62cac64cbdf5c.zip |
Extend NSS test suite
* nss/nss_test.h: New.
* nss/nss_test1.h: Rewrite to use test-provided data. Add group
tests. Parameterize to allow multiple instances.
* nss/nss_test2.h: New. Second instance.
* nss/nss_test.ver: New.
* nss/nss_test1.c: Update to use new framework.
* nss/nss_test2.c: New.
* nss/nss_test3.c: New.
* nss/nss_test4.c: New.
* nss/nss_test5.c: New.
* nss/Makefile: Build new tests.
* shlib-versions: Add libnss_test2.
Diffstat (limited to 'nss/tst-nss-test4.c')
-rw-r--r-- | nss/tst-nss-test4.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/nss/tst-nss-test4.c b/nss/tst-nss-test4.c new file mode 100644 index 0000000000..731e0ed10a --- /dev/null +++ b/nss/tst-nss-test4.c @@ -0,0 +1,137 @@ +/* Test group merging. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <nss.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/signal.h> + +#include "nss_test.h" + +/* The name choices here are arbitrary, aside from the merge_1 list + needing to be an expected merge of group_1 and group_2. */ + +static const char *group_1[] = { + "foo", "bar", NULL +}; + +static const char *group_2[] = { + "foo", "dick", "harry", NULL +}; + +/* Note that deduplication is NOT supposed to happen. */ +static const char *merge_1[] = { + "foo", "bar", "foo", "dick", "harry", NULL +}; + +static const char *group_4[] = { + "fred", "wilma", NULL +}; + +/* This is the data we're giving the service. */ +static struct group group_table_data1[] = { + GRP_N(1, "name1", group_1), + GRP(2), + GRP_LAST () +}; + +/* This is the data we're giving the service. */ +static struct group group_table_data2[] = { + GRP_N(1, "name1", group_2), + GRP(4), + GRP_LAST () +}; + +/* This is the data we compare against. */ +static struct group group_table[] = { + GRP_N(1, "name1", merge_1), + GRP(2), + GRP(4), + GRP_LAST () +}; + +void +_nss_test1_init_hook(test_tables *t) +{ + t->grp_table = group_table_data1; +} + +void +_nss_test2_init_hook(test_tables *t) +{ + t->grp_table = group_table_data2; +} + +static int +do_test (void) +{ + int retval = 0; + int i; + struct group *g = NULL; + uintptr_t align_mask; + + __nss_configure_lookup ("group", "test1 [SUCCESS=merge] test2"); + + align_mask = __alignof__ (struct group *) - 1; + + setgrent (); + + for (i = 0; group_table[i].gr_gid; ++i) + { + g = getgrgid (group_table[i].gr_gid); + if (g) + { + retval += compare_groups (i, g, & group_table[i]); + if ((uintptr_t)g & align_mask) + { + printf("FAIL: [%d] unaligned group %p\n", i, g); + ++retval; + } + if ((uintptr_t)(g->gr_mem) & align_mask) + { + printf("FAIL: [%d] unaligned member list %p\n", i, g->gr_mem); + ++retval; + } + } + else + { + printf ("FAIL: [%d] group %u.%s not found\n", i, + group_table[i].gr_gid, group_table[i].gr_name); + ++retval; + } + } + + endgrent (); + +#define EXPECTED 0 + if (retval == EXPECTED) + { + if (retval > 0) + printf ("PASS: Found %d expected errors\n", retval); + return 0; + } + else + { + printf ("FAIL: Found %d errors, expected %d\n", retval, EXPECTED); + return 1; + } +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |