tests: Add test_uwrap_setresgid().
[obnox/cwrap/uid_wrapper.git] / tests / testsuite.c
index 3d376ea77cee350f816b05257659a1e378b63cce..3cde2739b3c116990627ff0be8ab4ebd5106f23c 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
 #include <unistd.h>
 
+#include <grp.h>
+
 #ifdef HAVE_SYS_SYSCALL_H
 #include <sys/syscall.h>
 #endif
 #include <syscall.h>
 #endif
 
+#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
+#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
+
 static void test_uwrap_seteuid(void **state)
 {
        int rc;
        uid_t u;
-       char *env;
-
-       env = getenv("UID_WRAPPER");
-       if (env == NULL) {
-               printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
-               return;
-       }
 
        (void) state; /* unused */
 
+       rc = seteuid(-1);
+       assert_int_equal(rc, -1);
+
        rc = seteuid(0);
        assert_int_equal(rc, 0);
 
        u = geteuid();
-       assert_int_equal(u, 0);
+#ifdef SYS_geteuid /* not available on Solaris */
+       assert_int_equal(u, syscall(SYS_geteuid));
+#endif
 
-       rc = seteuid(42);
+       rc = setuid(42);
        assert_int_equal(rc, 0);
 
-       u = geteuid();
+       u = getuid();
        assert_int_equal(u, 42);
 }
 
-static void test_uwrap_setegid(void **state)
+static void test_uwrap_setuid(void **state)
 {
        int rc;
        uid_t u;
-       char *env;
 
-       env = getenv("UID_WRAPPER");
-       if (env == NULL) {
-               printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
-               return;
-       }
+       (void) state; /* unused */
+
+       rc = setuid(-1);
+       assert_int_equal(rc, -1);
+
+       rc = setuid(42);
+       assert_int_equal(rc, 0);
+
+       u = getuid();
+       assert_int_equal(u, 42);
+}
+
+static void test_uwrap_setegid(void **state)
+{
+       int rc;
+       uid_t u;
 
        (void) state; /* unused */
 
@@ -64,7 +79,9 @@ static void test_uwrap_setegid(void **state)
        assert_int_equal(rc, 0);
 
        u = getegid();
-       assert_int_equal(u, 0);
+#ifdef SYS_getegid /* Not available on Solaris */
+       assert_int_equal(u, syscall(SYS_getegid));
+#endif
 
        rc = setegid(42);
        assert_int_equal(rc, 0);
@@ -73,41 +90,98 @@ static void test_uwrap_setegid(void **state)
        assert_int_equal(u, 42);
 }
 
-/* FIXME */
+#ifdef HAVE_SETREGID
+static void test_uwrap_setregid(void **state)
+{
+       int rc;
+       uid_t u;
+
+       (void) state; /* unused */
+
+       rc = setregid(1, 2);
+       assert_int_equal(rc, 0);
+
+       u = getgid();
+       assert_int_equal(u, 1);
+
+       u = getegid();
+       assert_int_equal(u, 2);
+}
+#endif
+
+#ifdef HAVE_SETRESGID
+static void test_uwrap_setresgid(void **state)
+{
+       int rc;
+       uid_t u;
+
+       (void) state; /* unused */
+
+       rc = setresgid(1, 2, -1);
+       assert_int_equal(rc, 0);
+
+       u = getgid();
+       assert_int_equal(u, 1);
+
+       u = getegid();
+       assert_int_equal(u, 2);
+}
+#endif
+
+static void test_uwrap_setgid(void **state)
+{
+       int rc;
+       gid_t u;
+
+       (void) state; /* unused */
+
+       rc = setgid(-1);
+       assert_int_equal(rc, -1);
+
+       rc = setgid(42);
+       assert_int_equal(rc, 0);
+
+       u = getgid();
+       assert_int_equal(u, 42);
+}
+
 static void test_uwrap_syscall(void **state)
 {
        long int rc;
-       char *env;
-
-       env = getenv("UID_WRAPPER");
-       if (env == NULL) {
-               printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
-               return;
-       }
+       struct timeval tv1, tv2;
+       struct timezone tz1, tz2;
 
        (void) state; /* unused */
 
+       rc = syscall(SYS_getpid);
+       assert_int_equal(rc, getpid());
+
        rc = access(".", R_OK);
        assert_int_equal(rc, 0);
 
        rc = syscall(SYS_access, ".", R_OK);
-       if (rc == -1) {
-               printf("access() errno: %s\n", strerror(errno));
-       }
        assert_int_equal(rc, 0);
+
+       ZERO_STRUCT(tv1);
+       ZERO_STRUCT(tv2);
+       ZERO_STRUCT(tz1);
+       ZERO_STRUCT(tz2);
+
+       rc = gettimeofday(&tv1, &tz1);
+       assert_int_equal(rc, 0);
+
+       rc = syscall(SYS_gettimeofday, &tv2, &tz2);
+       assert_int_equal(rc, 0);
+
+       assert_int_equal(tv1.tv_sec, tv2.tv_sec);
+       assert_int_equal(tz2.tz_dsttime, tz2.tz_dsttime);
+       assert_int_equal(tz2.tz_minuteswest, tz2.tz_minuteswest);
 }
 
 static void test_uwrap_syscall_setreuid(void **state)
 {
        long int rc;
        uid_t u;
-       char *env;
-
-       env = getenv("UID_WRAPPER");
-       if (env == NULL) {
-               printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
-               return;
-       }
 
        (void) state; /* unused */
 
@@ -115,7 +189,9 @@ static void test_uwrap_syscall_setreuid(void **state)
        assert_int_equal(rc, 0);
 
        u = geteuid();
-       assert_int_equal(u, 0);
+#ifdef SYS_geteuid /* not available on Solaris */
+       assert_int_equal(u, syscall(SYS_geteuid));
+#endif
 
        rc = syscall(SYS_setreuid, -1, 42);
        assert_int_equal(rc, 0);
@@ -127,39 +203,74 @@ static void test_uwrap_syscall_setreuid(void **state)
 static void test_uwrap_syscall_setregid(void **state)
 {
        long int rc;
-       uid_t u;
-       char *env;
-
-       env = getenv("UID_WRAPPER");
-       if (env == NULL) {
-               printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
-               return;
-       }
+       gid_t g;
 
        (void) state; /* unused */
 
        rc = syscall(SYS_setregid, -1, 0);
        assert_int_equal(rc, 0);
 
-       u = getegid();
-       assert_int_equal(u, 0);
+       g = getegid();
+#ifdef SYS_getegid /* Not available on Solaris */
+       assert_int_equal(g, syscall(SYS_getegid));
+#endif
 
        rc = syscall(SYS_setregid, -1, 42);
        assert_int_equal(rc, 0);
 
-       u = getegid();
-       assert_int_equal(u, 42);
+       g = getegid();
+       assert_int_equal(g, 42);
+}
+
+static void test_uwrap_getgroups(void **state)
+{
+       gid_t rlist[16] = {0};
+       int rc;
+
+       (void) state; /* unused */
+
+       rc = getgroups(ARRAY_SIZE(rlist), rlist);
+       assert_int_equal(rc, 1);
+       assert_int_equal(rlist[0], getegid());
+}
+
+static void test_uwrap_setgroups(void **state)
+{
+       gid_t glist[] = { 100, 200, 300, 400, 500 };
+       gid_t rlist[16];
+       int rc;
+
+       (void) state; /* unused */
+
+       rc = setgroups(ARRAY_SIZE(glist), glist);
+       assert_int_equal(rc, 0);
+
+       rc = getgroups(ARRAY_SIZE(rlist), rlist);
+       assert_int_equal(rc, 5);
+
+       assert_memory_equal(glist, rlist, sizeof(glist));
 }
 
 int main(void) {
        int rc;
 
        const UnitTest tests[] = {
+               unit_test(test_uwrap_syscall),
+               unit_test(test_uwrap_getgroups),
+
                unit_test(test_uwrap_seteuid),
+               unit_test(test_uwrap_setuid),
                unit_test(test_uwrap_setegid),
-               unit_test(test_uwrap_syscall),
+#ifdef HAVE_SETREGID
+               unit_test(test_uwrap_setregid),
+#endif
+#ifdef HAVE_SETRESGID
+               unit_test(test_uwrap_setresgid),
+#endif
+               unit_test(test_uwrap_setgid),
                unit_test(test_uwrap_syscall_setreuid),
                unit_test(test_uwrap_syscall_setregid),
+               unit_test(test_uwrap_setgroups),
        };
 
        rc = run_tests(tests);