[libvirt PATCH v2 36/56] tests: remove event loop from command test

Daniel P. Berrangé berrange at redhat.com
Tue Jan 28 13:11:17 UTC 2020


This effectively reverts

  commit 39c77fe586baccd0a4a9862e8cf7c78ac7af3494
  Author: Michal Prívozník <mprivozn at redhat.com>
  Date:   Wed Jan 16 11:58:00 2013 +0100

    Introduce event loop to commandtest

because nothing in the current test suite needs this
event loop.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 tests/commanddata/test27.log |   6 +-
 tests/commanddata/test3.log  |   2 +-
 tests/commandtest.c          | 107 ++++++++---------------------------
 3 files changed, 28 insertions(+), 87 deletions(-)

diff --git a/tests/commanddata/test27.log b/tests/commanddata/test27.log
index 40b2627c07..bfc83b95e8 100644
--- a/tests/commanddata/test27.log
+++ b/tests/commanddata/test27.log
@@ -1,7 +1,7 @@
 ARG:--readfd
-ARG:5
+ARG:3
 ARG:--readfd
-ARG:7
+ARG:5
 ENV:DISPLAY=:0.0
 ENV:HOME=/home/test
 ENV:HOSTNAME=test
@@ -13,8 +13,8 @@ ENV:USER=test
 FD:0
 FD:1
 FD:2
+FD:3
 FD:5
-FD:7
 DAEMON:no
 CWD:/tmp
 UMASK:0022
diff --git a/tests/commanddata/test3.log b/tests/commanddata/test3.log
index cfa097963b..e5223f0c4e 100644
--- a/tests/commanddata/test3.log
+++ b/tests/commanddata/test3.log
@@ -9,8 +9,8 @@ ENV:USER=test
 FD:0
 FD:1
 FD:2
+FD:3
 FD:5
-FD:7
 DAEMON:no
 CWD:/tmp
 UMASK:0022
diff --git a/tests/commandtest.c b/tests/commandtest.c
index cc8676811e..e19ce62207 100644
--- a/tests/commandtest.c
+++ b/tests/commandtest.c
@@ -39,15 +39,6 @@
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-typedef struct _virCommandTestData virCommandTestData;
-typedef virCommandTestData *virCommandTestDataPtr;
-struct _virCommandTestData {
-    virMutex lock;
-    virThread thread;
-    bool quit;
-    bool running;
-};
-
 #ifdef WIN32
 
 int
@@ -204,8 +195,13 @@ static int test3(const void *unused G_GNUC_UNUSED)
     int newfd1 = dup(STDERR_FILENO);
     int newfd2 = dup(STDERR_FILENO);
     int newfd3 = dup(STDERR_FILENO);
+    struct stat before, after;
     int ret = -1;
 
+    if (fstat(newfd3, &before) < 0) {
+        perror("fstat");
+        goto cleanup;
+    }
     virCommandPassFD(cmd, newfd1, 0);
     virCommandPassFD(cmd, newfd3,
                      VIR_COMMAND_PASS_FD_CLOSE_PARENT);
@@ -216,12 +212,28 @@ static int test3(const void *unused G_GNUC_UNUSED)
     }
 
     if (fcntl(newfd1, F_GETFL) < 0 ||
-        fcntl(newfd2, F_GETFL) < 0 ||
-        fcntl(newfd3, F_GETFL) >= 0) {
-        puts("fds in wrong state");
+        fcntl(newfd2, F_GETFL) < 0) {
+        puts("fds 1/2 were not open");
         goto cleanup;
     }
 
+    /* We expect newfd3 to be closed, but the
+     * fd might have already been reused by
+     * the event loop. So if it is open, we
+     * check if it matches the stat info we
+     * got earlier
+     */
+    if (fcntl(newfd3, F_GETFL) >= 0 &&
+        fstat(newfd3, &after) >= 0) {
+
+        if (before.st_ino == after.st_ino &&
+            before.st_dev == after.st_dev &&
+            before.st_mode == after.st_mode) {
+            puts("fd 3 should not be open");
+            goto cleanup;
+        }
+    }
+
     ret = checkoutput("test3", NULL);
 
  cleanup:
@@ -1241,43 +1253,12 @@ static int test27(const void *unused G_GNUC_UNUSED)
     return ret;
 }
 
-static void virCommandThreadWorker(void *opaque)
-{
-    virCommandTestDataPtr test = opaque;
-
-    virMutexLock(&test->lock);
-
-    while (!test->quit) {
-        virMutexUnlock(&test->lock);
-
-        if (virEventRunDefaultImpl() < 0) {
-            test->quit = true;
-            break;
-        }
-
-        virMutexLock(&test->lock);
-    }
-
-    test->running = false;
-
-    virMutexUnlock(&test->lock);
-    return;
-}
-
-static void
-virCommandTestFreeTimer(int timer G_GNUC_UNUSED,
-                        void *opaque G_GNUC_UNUSED)
-{
-    /* nothing to be done here */
-}
 
 static int
 mymain(void)
 {
     int ret = 0;
     int fd;
-    virCommandTestDataPtr test = NULL;
-    int timer = -1;
     int virinitret;
 
     if (chdir("/tmp") < 0)
@@ -1336,28 +1317,6 @@ mymain(void)
     if (virinitret < 0)
         return EXIT_FAILURE;
 
-    virEventRegisterDefaultImpl();
-    if (VIR_ALLOC(test) < 0)
-        goto cleanup;
-
-    if (virMutexInit(&test->lock) < 0) {
-        printf("Unable to init mutex: %d\n", errno);
-        goto cleanup;
-    }
-
-    virMutexLock(&test->lock);
-
-    if (virThreadCreate(&test->thread,
-                        true,
-                        virCommandThreadWorker,
-                        test) < 0) {
-        virMutexUnlock(&test->lock);
-        goto cleanup;
-    }
-
-    test->running = true;
-    virMutexUnlock(&test->lock);
-
     environ = (char **)newenv;
 
 # define DO_TEST(NAME) \
@@ -1393,24 +1352,6 @@ mymain(void)
     DO_TEST(test26);
     DO_TEST(test27);
 
-    virMutexLock(&test->lock);
-    if (test->running) {
-        test->quit = true;
-        /* HACK: Add a dummy timeout to break event loop */
-        timer = virEventAddTimeout(0, virCommandTestFreeTimer, NULL, NULL);
-    }
-    virMutexUnlock(&test->lock);
-
- cleanup:
-    if (test->running)
-        virThreadJoin(&test->thread);
-
-    if (timer != -1)
-        virEventRemoveTimeout(timer);
-
-    virMutexDestroy(&test->lock);
-    VIR_FREE(test);
-
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
-- 
2.24.1




More information about the libvir-list mailing list