pam_start_confdir opens the way for "make distcheck" coverage. Let's start with return value tests for a few simple modules.
I've also rebased ldv/pam_localuser branch on top of this series.
Dmitry V. Levin (4): Introduce test_assert.h pam_deny: add a test for return values pam_permit: add a test for return values pam_debug: add a test for return values
libpam/Makefile.am | 2 +- libpam/include/test_assert.h | 56 +++++++++++++++++++ modules/pam_debug/Makefile.am | 7 ++- modules/pam_debug/tst-pam_debug-retval.c | 65 ++++++++++++++++++++++ modules/pam_deny/Makefile.am | 5 +- modules/pam_deny/tst-pam_deny-retval.c | 58 +++++++++++++++++++ modules/pam_permit/Makefile.am | 5 +- modules/pam_permit/tst-pam_permit-retval.c | 58 +++++++++++++++++++ 8 files changed, 251 insertions(+), 5 deletions(-) create mode 100644 libpam/include/test_assert.h create mode 100644 modules/pam_debug/tst-pam_debug-retval.c create mode 100644 modules/pam_deny/tst-pam_deny-retval.c create mode 100644 modules/pam_permit/tst-pam_permit-retval.c
Introduce a new internal header file for definitions of handy macros providing convenient assertion testing functionality.
* libpam/include/test_assert.h: New file. * libpam/Makefile.am (noinst_HEADERS): Add include/test_assert.h. --- libpam/Makefile.am | 2 +- libpam/include/test_assert.h | 56 ++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 libpam/include/test_assert.h
diff --git a/libpam/Makefile.am b/libpam/Makefile.am index 41ac9845..9252a837 100644 --- a/libpam/Makefile.am +++ b/libpam/Makefile.am @@ -18,7 +18,7 @@ include_HEADERS = include/security/_pam_compat.h \
noinst_HEADERS = pam_prelude.h pam_private.h pam_tokens.h \ pam_modutil_private.h include/pam_cc_compat.h \ - include/pam_inline.h + include/pam_inline.h include/test_assert.h
libpam_la_LDFLAGS = -no-undefined -version-info 85:1:85 libpam_la_LIBADD = @LIBAUDIT@ $(LIBPRELUDE_LIBS) $(ECONF_LIBS) @LIBDL@ diff --git a/libpam/include/test_assert.h b/libpam/include/test_assert.h new file mode 100644 index 00000000..d4afa9ad --- /dev/null +++ b/libpam/include/test_assert.h @@ -0,0 +1,56 @@ +/* + * Assert definitions for tests. + * + * Copyright (c) 2020 Dmitry V. Levin ldv@altlinux.org + */ + +#ifndef TEST_ASSERT_H +# define TEST_ASSERT_H + +# ifdef HAVE_CONFIG_H +# include <config.h> +# endif + +# include <assert.h> +# include <stdio.h> +# include <stdlib.h> + +# define ASSERT_(expected_, expected_str_, op_, seen_, seen_str_) \ + do { \ + __typeof__(expected_) e_ = (expected_); \ + __typeof__(seen_) s_ = (seen_); \ + if (e_ op_ s_) break; \ + fprintf(stderr, \ + "%s:%d: Assertion failed: %s (%#lx) %s %s (%#lx)\n", \ + __FILE__, __LINE__, \ + (expected_str_), (unsigned long) e_, #op_, \ + (seen_str_), (unsigned long) s_); \ + abort(); \ + } while (0) \ +/* End of ASSERT_ definition. */ + +# define ASSERT_EQ(expected_, seen_) \ + ASSERT_((expected_), #expected_, ==, (seen_), #seen_) \ +/* End of ASSERT_EQ definition. */ + +# define ASSERT_NE(expected_, seen_) \ + ASSERT_((expected_), #expected_, !=, (seen_), #seen_) \ +/* End of ASSERT_NE definition. */ + +# define ASSERT_LT(expected_, seen_) \ + ASSERT_((expected_), #expected_, <, (seen_), #seen_) \ +/* End of ASSERT_LT definition. */ + +# define ASSERT_LE(expected_, seen_) \ + ASSERT_((expected_), #expected_, <=, (seen_), #seen_) \ +/* End of ASSERT_LT definition. */ + +# define ASSERT_GT(expected_, seen_) \ + ASSERT_((expected_), #expected_, >, (seen_), #seen_) \ +/* End of ASSERT_LT definition. */ + +# define ASSERT_GE(expected_, seen_) \ + ASSERT_((expected_), #expected_, >=, (seen_), #seen_) \ +/* End of ASSERT_LT definition. */ + +#endif /* TEST_ASSERT_H */
* modules/pam_deny/tst-pam_deny-retval.c: New file. * modules/pam_deny/Makefile.am (TESTS): Add $(check_PROGRAMS). (check_PROGRAMS, tst_pam_deny_retval_LDADD): New variables. --- modules/pam_deny/Makefile.am | 5 ++- modules/pam_deny/tst-pam_deny-retval.c | 58 ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 modules/pam_deny/tst-pam_deny-retval.c
diff --git a/modules/pam_deny/Makefile.am b/modules/pam_deny/Makefile.am index 7b188485..fa9b9c8b 100644 --- a/modules/pam_deny/Makefile.am +++ b/modules/pam_deny/Makefile.am @@ -12,7 +12,7 @@ dist_man_MANS = pam_deny.8 endif XMLS = README.xml pam_deny.8.xml dist_check_SCRIPTS = tst-pam_deny -TESTS = $(dist_check_SCRIPTS) +TESTS = $(dist_check_SCRIPTS) $(check_PROGRAMS)
securelibdir = $(SECUREDIR) secureconfdir = $(SCONFIGDIR) @@ -27,6 +27,9 @@ endif securelib_LTLIBRARIES = pam_deny.la pam_deny_la_LIBADD = $(top_builddir)/libpam/libpam.la
+check_PROGRAMS = tst-pam_deny-retval +tst_pam_deny_retval_LDADD = $(top_builddir)/libpam/libpam.la + if ENABLE_REGENERATE_MAN dist_noinst_DATA = README -include $(top_srcdir)/Make.xml.rules diff --git a/modules/pam_deny/tst-pam_deny-retval.c b/modules/pam_deny/tst-pam_deny-retval.c new file mode 100644 index 00000000..356ca1f1 --- /dev/null +++ b/modules/pam_deny/tst-pam_deny-retval.c @@ -0,0 +1,58 @@ +/* + * Check pam_deny return values. + * + * Copyright (c) 2020 Dmitry V. Levin ldv@altlinux.org + */ + +#include "test_assert.h" + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <security/pam_appl.h> + +#define MODULE_NAME "pam_deny" +#define TEST_NAME "tst-" MODULE_NAME "-retval" + +static const char service_file[] = TEST_NAME ".service"; +static const char user_name[] = ""; +static struct pam_conv conv; + +int +main(void) +{ + pam_handle_t *pamh = NULL; + FILE *fp; + char cwd[PATH_MAX]; + + ASSERT_NE(NULL, getcwd(cwd, sizeof(cwd))); + + ASSERT_NE(NULL, fp = fopen(service_file, "w")); + ASSERT_LT(0, fprintf(fp, "#%%PAM-1.0\n" + "auth required %s/.libs/%s.so\n" + "account required %s/.libs/%s.so\n" + "password required %s/.libs/%s.so\n" + "session required %s/.libs/%s.so\n", + cwd, MODULE_NAME, + cwd, MODULE_NAME, + cwd, MODULE_NAME, + cwd, MODULE_NAME)); + ASSERT_EQ(0, fclose(fp)); + + ASSERT_EQ(PAM_SUCCESS, + pam_start_confdir(service_file, user_name, &conv, ".", &pamh)); + ASSERT_NE(NULL, pamh); + ASSERT_EQ(PAM_AUTH_ERR, pam_authenticate(pamh, 0)); + ASSERT_EQ(PAM_CRED_ERR, pam_setcred(pamh, 0)); + ASSERT_EQ(PAM_AUTH_ERR, pam_acct_mgmt(pamh, 0)); + ASSERT_EQ(PAM_AUTHTOK_ERR, pam_chauthtok(pamh, 0)); + ASSERT_EQ(PAM_SESSION_ERR, pam_open_session(pamh, 0)); + ASSERT_EQ(PAM_SESSION_ERR, pam_close_session(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_end(pamh, 0)); + pamh = NULL; + + ASSERT_EQ(0, unlink(service_file)); + + return 0; +}
* modules/pam_permit/tst-pam_permit-retval.c: New file. * modules/pam_permit/Makefile.am (TESTS): Add $(check_PROGRAMS). (check_PROGRAMS, tst_pam_permit_retval_LDADD): New variables. --- modules/pam_permit/Makefile.am | 5 +- modules/pam_permit/tst-pam_permit-retval.c | 58 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 modules/pam_permit/tst-pam_permit-retval.c
diff --git a/modules/pam_permit/Makefile.am b/modules/pam_permit/Makefile.am index cd35ecc8..3fb4792c 100644 --- a/modules/pam_permit/Makefile.am +++ b/modules/pam_permit/Makefile.am @@ -12,7 +12,7 @@ dist_man_MANS = pam_permit.8 endif XMLS = README.xml pam_permit.8.xml dist_check_SCRIPTS = tst-pam_permit -TESTS = $(dist_check_SCRIPTS) +TESTS = $(dist_check_SCRIPTS) $(check_PROGRAMS)
securelibdir = $(SECUREDIR) secureconfdir = $(SCONFIGDIR) @@ -27,6 +27,9 @@ endif securelib_LTLIBRARIES = pam_permit.la pam_permit_la_LIBADD = $(top_builddir)/libpam/libpam.la
+check_PROGRAMS = tst-pam_permit-retval +tst_pam_permit_retval_LDADD = $(top_builddir)/libpam/libpam.la + if ENABLE_REGENERATE_MAN dist_noinst_DATA = README -include $(top_srcdir)/Make.xml.rules diff --git a/modules/pam_permit/tst-pam_permit-retval.c b/modules/pam_permit/tst-pam_permit-retval.c new file mode 100644 index 00000000..33a789fe --- /dev/null +++ b/modules/pam_permit/tst-pam_permit-retval.c @@ -0,0 +1,58 @@ +/* + * Check pam_permit return values. + * + * Copyright (c) 2020 Dmitry V. Levin ldv@altlinux.org + */ + +#include "test_assert.h" + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <security/pam_appl.h> + +#define MODULE_NAME "pam_permit" +#define TEST_NAME "tst-" MODULE_NAME "-retval" + +static const char service_file[] = TEST_NAME ".service"; +static const char user_name[] = ""; +static struct pam_conv conv; + +int +main(void) +{ + pam_handle_t *pamh = NULL; + FILE *fp; + char cwd[PATH_MAX]; + + ASSERT_NE(NULL, getcwd(cwd, sizeof(cwd))); + + ASSERT_NE(NULL, fp = fopen(service_file, "w")); + ASSERT_LT(0, fprintf(fp, "#%%PAM-1.0\n" + "auth required %s/.libs/%s.so\n" + "account required %s/.libs/%s.so\n" + "password required %s/.libs/%s.so\n" + "session required %s/.libs/%s.so\n", + cwd, MODULE_NAME, + cwd, MODULE_NAME, + cwd, MODULE_NAME, + cwd, MODULE_NAME)); + ASSERT_EQ(0, fclose(fp)); + + ASSERT_EQ(PAM_SUCCESS, + pam_start_confdir(service_file, user_name, &conv, ".", &pamh)); + ASSERT_NE(NULL, pamh); + ASSERT_EQ(PAM_SUCCESS, pam_authenticate(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_setcred(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_acct_mgmt(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_chauthtok(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_open_session(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_close_session(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_end(pamh, 0)); + pamh = NULL; + + ASSERT_EQ(0, unlink(service_file)); + + return 0; +}
* modules/pam_debug/tst-pam_debug-retval.c: New file. * modules/pam_debug/Makefile.am (TESTS): Add $(check_PROGRAMS). (check_PROGRAMS, tst_pam_debug_retval_LDADD): New variables. --- modules/pam_debug/Makefile.am | 7 ++- modules/pam_debug/tst-pam_debug-retval.c | 65 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 modules/pam_debug/tst-pam_debug-retval.c
diff --git a/modules/pam_debug/Makefile.am b/modules/pam_debug/Makefile.am index 2b3d8613..8aa63056 100644 --- a/modules/pam_debug/Makefile.am +++ b/modules/pam_debug/Makefile.am @@ -12,14 +12,14 @@ dist_man_MANS = pam_debug.8 endif XMLS = README.xml pam_debug.8.xml dist_check_SCRIPTS = tst-pam_debug -TESTS = $(dist_check_SCRIPTS) +TESTS = $(dist_check_SCRIPTS) $(check_PROGRAMS)
securelibdir = $(SECUREDIR) secureconfdir = $(SCONFIGDIR)
AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ $(WARN_CFLAGS) -AM_LDFLAGS = -no-undefined -avoid-version -module +AM_LDFLAGS = -no-undefined -avoid-version -module if HAVE_VERSIONING AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map endif @@ -27,6 +27,9 @@ endif securelib_LTLIBRARIES = pam_debug.la pam_debug_la_LIBADD = $(top_builddir)/libpam/libpam.la
+check_PROGRAMS = tst-pam_debug-retval +tst_pam_debug_retval_LDADD = $(top_builddir)/libpam/libpam.la + if ENABLE_REGENERATE_MAN dist_noinst_DATA = README -include $(top_srcdir)/Make.xml.rules diff --git a/modules/pam_debug/tst-pam_debug-retval.c b/modules/pam_debug/tst-pam_debug-retval.c new file mode 100644 index 00000000..6d3edf8f --- /dev/null +++ b/modules/pam_debug/tst-pam_debug-retval.c @@ -0,0 +1,65 @@ +/* + * Check pam_debug return values. + * + * Copyright (c) 2020 Dmitry V. Levin ldv@altlinux.org + */ + +#include "test_assert.h" + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <security/pam_appl.h> + +#define MODULE_NAME "pam_debug" +#define TEST_NAME "tst-" MODULE_NAME "-retval" + +static const char service_file[] = TEST_NAME ".service"; +static const char user_name[] = ""; +static const char args[] = " auth=perm_denied" + " cred=cred_unavail" + " acct=acct_expired" + " prechauthtok=success" + " chauthtok=service_err" + " open_session=buf_err" + " close_session=system_err"; +static struct pam_conv conv; + +int +main(void) +{ + pam_handle_t *pamh = NULL; + FILE *fp; + char cwd[PATH_MAX]; + + ASSERT_NE(NULL, getcwd(cwd, sizeof(cwd))); + + ASSERT_NE(NULL, fp = fopen(service_file, "w")); + ASSERT_LT(0, fprintf(fp, "#%%PAM-1.0\n" + "auth required %s/.libs/%s.so %s\n" + "account required %s/.libs/%s.so %s\n" + "password required %s/.libs/%s.so %s\n" + "session required %s/.libs/%s.so %s\n", + cwd, MODULE_NAME, args, + cwd, MODULE_NAME, args, + cwd, MODULE_NAME, args, + cwd, MODULE_NAME, args)); + ASSERT_EQ(0, fclose(fp)); + + ASSERT_EQ(PAM_SUCCESS, + pam_start_confdir(service_file, user_name, &conv, ".", &pamh)); + ASSERT_NE(NULL, pamh); + ASSERT_EQ(PAM_PERM_DENIED, pam_authenticate(pamh, 0)); + ASSERT_EQ(PAM_CRED_UNAVAIL, pam_setcred(pamh, 0)); + ASSERT_EQ(PAM_ACCT_EXPIRED, pam_acct_mgmt(pamh, 0)); + ASSERT_EQ(PAM_SERVICE_ERR, pam_chauthtok(pamh, 0)); + ASSERT_EQ(PAM_BUF_ERR, pam_open_session(pamh, 0)); + ASSERT_EQ(PAM_SYSTEM_ERR, pam_close_session(pamh, 0)); + ASSERT_EQ(PAM_SUCCESS, pam_end(pamh, 0)); + pamh = NULL; + + ASSERT_EQ(0, unlink(service_file)); + + return 0; +}
On Thu, May 07, 2020 at 03:47:15AM +0300, Dmitry V. Levin wrote:
pam_start_confdir opens the way for "make distcheck" coverage. Let's start with return value tests for a few simple modules.
I've also rebased ldv/pam_localuser branch on top of this series.
I've also rebased and pushed the series to ldv/tests branch.
Any comments so far?
On Thu, May 14, 2020 at 12:56:56PM +0300, Dmitry V. Levin wrote:
On Thu, May 07, 2020 at 03:47:15AM +0300, Dmitry V. Levin wrote:
pam_start_confdir opens the way for "make distcheck" coverage. Let's start with return value tests for a few simple modules.
I've also rebased ldv/pam_localuser branch on top of this series.
I've also rebased and pushed the series to ldv/tests branch.
Any comments so far?
OK, if there are no comments, I'll push these changes as is.
On Thu, 2020-05-21 at 21:33 +0300, Dmitry V. Levin wrote:
On Thu, May 14, 2020 at 12:56:56PM +0300, Dmitry V. Levin wrote:
On Thu, May 07, 2020 at 03:47:15AM +0300, Dmitry V. Levin wrote:
pam_start_confdir opens the way for "make distcheck" coverage. Let's start with return value tests for a few simple modules.
I've also rebased ldv/pam_localuser branch on top of this series.
I've also rebased and pushed the series to ldv/tests branch.
Any comments so far?
OK, if there are no comments, I'll push these changes as is.
It is OK. I am very busy recently with my other duties so I just had a cursory look over it but as this is about adding tests it should be sufficient.
Thank you, Dmitry, for all this recent improvements.
pam-developers@lists.fedorahosted.org