pthreadpool: Add a small test for pthreadpool_tevent
authorVolker Lendecke <vl@samba.org>
Fri, 9 Sep 2016 14:42:05 +0000 (16:42 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 4 Oct 2016 22:06:22 +0000 (00:06 +0200)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/lib/pthreadpool/tests.c

index 933808e1777e25eb6216b2ce169040ad041ac2a2..4d211f2d03b81c60872d019fcd00960893301610 100644 (file)
@@ -8,6 +8,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include "pthreadpool_pipe.h"
+#include "pthreadpool_tevent.h"
 
 static int test_init(void)
 {
@@ -189,10 +190,91 @@ static int test_fork(void)
        return 0;
 }
 
+static void test_tevent_wait(void *private_data)
+{
+       int *timeout = private_data;
+       poll(NULL, 0, *timeout);
+}
+
+static int test_tevent_1(void)
+{
+       struct tevent_context *ev;
+       struct pthreadpool_tevent *pool;
+       struct tevent_req *req1, *req2;
+       int timeout10 = 10;
+       int timeout100 = 100;
+       int ret;
+       bool ok;
+
+       ev = tevent_context_init(NULL);
+       if (ev == NULL) {
+               ret = errno;
+               fprintf(stderr, "tevent_context_init failed: %s\n",
+                       strerror(ret));
+               return ret;
+       }
+       ret = pthreadpool_tevent_init(ev, 0, &pool);
+       if (ret != 0) {
+               fprintf(stderr, "pthreadpool_tevent_init failed: %s\n",
+                       strerror(ret));
+               TALLOC_FREE(ev);
+               return ret;
+       }
+       req1 = pthreadpool_tevent_job_send(
+               ev, ev, pool, test_tevent_wait, &timeout10);
+       if (req1 == NULL) {
+               fprintf(stderr, "pthreadpool_tevent_job_send failed\n");
+               TALLOC_FREE(ev);
+               return ENOMEM;
+       }
+       req2 = pthreadpool_tevent_job_send(
+               ev, ev, pool, test_tevent_wait, &timeout100);
+       if (req2 == NULL) {
+               fprintf(stderr, "pthreadpool_tevent_job_send failed\n");
+               TALLOC_FREE(ev);
+               return ENOMEM;
+       }
+       ok = tevent_req_poll(req2, ev);
+       if (!ok) {
+               ret = errno;
+               fprintf(stderr, "tevent_req_poll failed: %s\n",
+                       strerror(ret));
+               TALLOC_FREE(ev);
+               return ret;
+       }
+       ret = pthreadpool_tevent_job_recv(req1);
+       TALLOC_FREE(req1);
+       if (ret != 0) {
+               fprintf(stderr, "tevent_req_poll failed: %s\n",
+                       strerror(ret));
+               TALLOC_FREE(ev);
+               return ret;
+       }
+
+       TALLOC_FREE(req2);
+
+       ret = tevent_loop_wait(ev);
+       if (ret != 0) {
+               fprintf(stderr, "tevent_loop_wait failed\n");
+               return ret;
+       }
+
+       TALLOC_FREE(pool);
+       TALLOC_FREE(ev);
+       return 0;
+}
+
 int main(void)
 {
        int ret;
 
+       ret = test_tevent_1();
+       if (ret != 0) {
+               fprintf(stderr, "test_event_1 failed: %s\n",
+                       strerror(ret));
+               return 1;
+       }
+
        ret = test_init();
        if (ret != 0) {
                fprintf(stderr, "test_init failed\n");