git: f8b88be850a5 - main - tests/sys/acl: Add ATF C test for newly added acl_* functions.
Gleb Popov
arrowd at FreeBSD.org
Fri Aug 27 08:52:48 UTC 2021
The branch main has been updated by arrowd (ports committer):
URL: https://cgit.FreeBSD.org/src/commit/?id=f8b88be850a51eb982a476b27b74686a445e9a38
commit f8b88be850a51eb982a476b27b74686a445e9a38
Author: Gleb Popov <arrowd at FreeBSD.org>
AuthorDate: 2021-01-23 10:00:47 +0000
Commit: Gleb Popov <arrowd at FreeBSD.org>
CommitDate: 2021-08-27 08:52:21 +0000
tests/sys/acl: Add ATF C test for newly added acl_* functions.
Reviewed by: kib, debdrup, gbe
Approved by: kib
Differential Revision: https://reviews.freebsd.org/D28255
---
tests/sys/acl/Makefile | 2 +
tests/sys/acl/acl-api-test.c | 194 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 196 insertions(+)
diff --git a/tests/sys/acl/Makefile b/tests/sys/acl/Makefile
index bd548f06951e..abc505efe90b 100644
--- a/tests/sys/acl/Makefile
+++ b/tests/sys/acl/Makefile
@@ -14,6 +14,8 @@ ${PACKAGE}FILES+= tools-posix.test
SCRIPTS+= run
+ATF_TESTS_C+= acl-api-test
+
TAP_TESTS_SH+= 00
TAP_TESTS_SH+= 01
TAP_TESTS_SH+= 02
diff --git a/tests/sys/acl/acl-api-test.c b/tests/sys/acl/acl-api-test.c
new file mode 100644
index 000000000000..3bd288313fed
--- /dev/null
+++ b/tests/sys/acl/acl-api-test.c
@@ -0,0 +1,194 @@
+/*-
+ * Copyright (c) 2021 Gleb Popov
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/acl.h>
+#include <sys/stat.h>
+
+#include <stdlib.h>
+#include <errno.h>
+
+#include <atf-c.h>
+
+/* Compatibility shim to make it possible to run this test on Linux
+ * gcc -I/path/to/atf/include -L/path/to/atf/lib -latf-c -lacl acl-api-test.c
+ */
+#ifdef __linux__
+#include <acl/libacl.h>
+#define acl_from_mode_np acl_from_mode
+#define acl_equiv_mode_np acl_equiv_mode
+#define acl_cmp_np acl_cmp
+#endif
+
+static const mode_t all_modes[] = {
+ S_IRUSR,
+ S_IWUSR,
+ S_IXUSR,
+ S_IRGRP,
+ S_IWGRP,
+ S_IXGRP,
+ S_IROTH,
+ S_IWOTH,
+ S_IXOTH
+};
+
+static mode_t gen_random_mode(void)
+{
+ mode_t mode = 0;
+
+ for (unsigned i = 0; i < sizeof(all_modes) / sizeof(mode_t); i++) {
+ if (rand() % 2)
+ mode |= all_modes[i];
+ }
+
+ return (mode);
+}
+
+/* Generate a random mode_t, produce an acl_t from it,
+ * then use acl_equiv_mode_np to produce a mode_t again.
+ * The call should succeed and mode_t's should be equal
+ */
+ATF_TC_WITHOUT_HEAD(acl_mode_roundup);
+ATF_TC_BODY(acl_mode_roundup, tc)
+{
+ int num_tests = 100;
+
+ while (num_tests--) {
+ mode_t src_mode, equiv_mode;
+ acl_t acl;
+
+ src_mode = gen_random_mode();
+
+ acl = acl_from_mode_np(src_mode);
+ ATF_REQUIRE(acl != NULL);
+
+ ATF_CHECK_EQ(0, acl_equiv_mode_np(acl, &equiv_mode));
+ ATF_CHECK_EQ(src_mode, equiv_mode);
+
+ acl_free(acl);
+ }
+}
+
+/* Successfull acl_equiv_mode_np calls are tested in acl_mode_roundup.
+ * Here some specific cases are tested.
+ */
+ATF_TC_WITHOUT_HEAD(acl_equiv_mode_test);
+ATF_TC_BODY(acl_equiv_mode_test, tc)
+{
+ acl_t acl;
+ acl_entry_t entry;
+ mode_t mode;
+ int uid = 0;
+
+ acl = acl_init(1);
+ ATF_REQUIRE(acl != NULL);
+
+ /* empty acl maps to 0000 UNIX mode */
+ ATF_CHECK_EQ(0, acl_equiv_mode_np(acl, &mode));
+ ATF_CHECK_EQ(0, mode);
+
+#ifndef __linux__
+ /* NFS-branded acl's can't be converted to UNIX mode */
+ ATF_REQUIRE_EQ(0, acl_create_entry(&acl, &entry));
+ ATF_REQUIRE_EQ(0, acl_set_tag_type(entry, ACL_EVERYONE));
+ ATF_CHECK_EQ(1, acl_equiv_mode_np(acl, &mode));
+#endif
+
+ /* acl's with qualified user entries can't be converted to UNIX mode */
+ acl_free(acl);
+ acl = acl_init(1);
+ ATF_REQUIRE(acl != NULL);
+ ATF_REQUIRE_EQ(0, acl_create_entry(&acl, &entry));
+ ATF_REQUIRE_EQ(0, acl_set_tag_type(entry, ACL_USER));
+ ATF_REQUIRE_EQ(0, acl_set_qualifier(entry, &uid));
+ ATF_CHECK_EQ(1, acl_equiv_mode_np(acl, &mode));
+
+ /* passing NULL causes EINVAL */
+ ATF_CHECK_ERRNO(EINVAL, acl_equiv_mode_np(NULL, &mode));
+}
+
+ATF_TC_WITHOUT_HEAD(acl_cmp_test);
+ATF_TC_BODY(acl_cmp_test, tc)
+{
+ acl_t empty_acl, acl1, acl2;
+ acl_entry_t entry;
+ acl_permset_t perms;
+
+ empty_acl = acl_init(1);
+ ATF_REQUIRE(empty_acl != NULL);
+
+ acl1 = acl_init(3);
+ ATF_REQUIRE(acl1 != NULL);
+
+ /* first, check that two empty acls are equal */
+ ATF_CHECK_EQ(0, acl_cmp_np(acl1, empty_acl));
+
+ /* now create an entry and compare against empty acl */
+ ATF_REQUIRE_EQ(0, acl_create_entry(&acl1, &entry));
+ ATF_REQUIRE_EQ(0, acl_set_tag_type(entry, ACL_USER_OBJ));
+ ATF_REQUIRE_EQ(0, acl_get_permset(entry, &perms));
+ ATF_REQUIRE_EQ(0, acl_clear_perms(perms));
+ ATF_REQUIRE_EQ(0, acl_add_perm(perms, ACL_READ));
+ ATF_CHECK_EQ(1, acl_cmp_np(empty_acl, acl1));
+
+ /* make a dup of non-empty acl and check that they are equal */
+ acl2 = acl_dup(acl1);
+ ATF_REQUIRE(acl2 != NULL);
+ ATF_CHECK_EQ(0, acl_cmp_np(acl1, acl2));
+
+ /* change the tag type and compare */
+ ATF_REQUIRE_EQ(1, acl_get_entry(acl1, ACL_FIRST_ENTRY, &entry));
+ ATF_REQUIRE_EQ(0, acl_set_tag_type(entry, ACL_GROUP_OBJ));
+ ATF_CHECK_EQ(1, acl_cmp_np(acl1, acl2));
+
+ /* change the permset and compare */
+ acl_free(acl2);
+ acl2 = acl_dup(acl1);
+ ATF_REQUIRE(acl2 != NULL);
+ ATF_REQUIRE_EQ(1, acl_get_entry(acl1, ACL_FIRST_ENTRY, &entry));
+ ATF_REQUIRE_EQ(0, acl_get_permset(entry, &perms));
+ ATF_REQUIRE_EQ(0, acl_clear_perms(perms));
+ ATF_CHECK_EQ(1, acl_cmp_np(acl1, acl2));
+
+ /* check that passing NULL yields EINVAL */
+ ATF_CHECK_ERRNO(EINVAL, acl_cmp_np(NULL, NULL));
+ ATF_CHECK_ERRNO(EINVAL, acl_cmp_np(acl1, NULL));
+ ATF_CHECK_ERRNO(EINVAL, acl_cmp_np(NULL, acl1));
+
+ acl_free(empty_acl);
+ acl_free(acl1);
+ acl_free(acl2);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, acl_mode_roundup);
+ ATF_TP_ADD_TC(tp, acl_equiv_mode_test);
+ ATF_TP_ADD_TC(tp, acl_cmp_test);
+
+ return (atf_no_error());
+}
More information about the dev-commits-src-all
mailing list