Patchwork qtest: implement QTEST_STOP

login
register
mail settings
Submitter Paolo Bonzini
Date Oct. 1, 2012, 12:18 p.m.
Message ID <1349093887-32142-1-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/188280/
State New
Headers show

Comments

Paolo Bonzini - Oct. 1, 2012, 12:18 p.m.
It is quite difficult to debug qtest test cases without extra wrapper
scripts for QEMU or similar.  This patch adds a simple environment
variable-based trigger that sends a STOP signal to the QEMU instance
under test, before attempting to connect to its QMP session.

This will block execution of the testcase and give time to attach a
debugger to the stopped QEMU process.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 tests/libqtest.c | 38 +++++++++++++++++++++++++-------------
 1 file modificato, 25 inserzioni(+), 13 rimozioni(-)
Anthony Liguori - Oct. 1, 2012, 9:19 p.m.
Paolo Bonzini <pbonzini@redhat.com> writes:

> It is quite difficult to debug qtest test cases without extra wrapper
> scripts for QEMU or similar.  This patch adds a simple environment
> variable-based trigger that sends a STOP signal to the QEMU instance
> under test, before attempting to connect to its QMP session.
>
> This will block execution of the testcase and give time to attach a
> debugger to the stopped QEMU process.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  tests/libqtest.c | 38 +++++++++++++++++++++++++-------------
>  1 file modificato, 25 inserzioni(+), 13 rimozioni(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 02d0392..71b84c1 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -85,6 +85,22 @@ static int socket_accept(int sock)
>      return ret;
>  }
>  
> +static pid_t qtest_qemu_pid(QTestState *s)
> +{
> +    FILE *f;
> +    char buffer[1024];
> +    pid_t pid = -1;
> +
> +    f = fopen(s->pid_file, "r");
> +    if (f) {
> +        if (fgets(buffer, sizeof(buffer), f)) {
> +            pid = atoi(buffer);
> +        }
> +    }
> +    fclose(f);
> +    return pid;
> +}
> +
>  QTestState *qtest_init(const char *extra_args)
>  {
>      QTestState *s;
> @@ -136,25 +152,21 @@ QTestState *qtest_init(const char *extra_args)
>      qtest_qmp(s, "");
>      qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
>  
> +    if (getenv("QTEST_STOP")) {
> +        kill(qtest_qemu_pid(s), SIGSTOP);
> +    }
> +

What about launching the guest with "-S" if that variable is set?
That's a bit nicer, right?

Regards,

Anthony Liguori

>      return s;
>  }
>  
>  void qtest_quit(QTestState *s)
>  {
> -    FILE *f;
> -    char buffer[1024];
> -
> -    f = fopen(s->pid_file, "r");
> -    if (f) {
> -        if (fgets(buffer, sizeof(buffer), f)) {
> -            pid_t pid = atoi(buffer);
> -            int status = 0;
> -
> -            kill(pid, SIGTERM);
> -            waitpid(pid, &status, 0);
> -        }
> +    int status;
>  
> -        fclose(f);
> +    pid_t pid = qtest_qemu_pid(s);
> +    if (pid != -1) {
> +        kill(pid, SIGTERM);
> +        waitpid(pid, &status, 0);
>      }
>  
>      unlink(s->pid_file);
> -- 
> 1.7.12
Paolo Bonzini - Oct. 2, 2012, 6:07 a.m.
Il 01/10/2012 23:19, Anthony Liguori ha scritto:
> What about launching the guest with "-S" if that variable is set?
> That's a bit nicer, right?

That also requires that -S block reads from the qtest socket, which is
not yet the case.

Paolo
Anthony Liguori - Oct. 5, 2012, 9:20 p.m.
Paolo Bonzini <pbonzini@redhat.com> writes:

> It is quite difficult to debug qtest test cases without extra wrapper
> scripts for QEMU or similar.  This patch adds a simple environment
> variable-based trigger that sends a STOP signal to the QEMU instance
> under test, before attempting to connect to its QMP session.
>
> This will block execution of the testcase and give time to attach a
> debugger to the stopped QEMU process.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Applied. Thanks.

Regards,

Anthony Liguori

> ---
>  tests/libqtest.c | 38 +++++++++++++++++++++++++-------------
>  1 file modificato, 25 inserzioni(+), 13 rimozioni(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 02d0392..71b84c1 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -85,6 +85,22 @@ static int socket_accept(int sock)
>      return ret;
>  }
>  
> +static pid_t qtest_qemu_pid(QTestState *s)
> +{
> +    FILE *f;
> +    char buffer[1024];
> +    pid_t pid = -1;
> +
> +    f = fopen(s->pid_file, "r");
> +    if (f) {
> +        if (fgets(buffer, sizeof(buffer), f)) {
> +            pid = atoi(buffer);
> +        }
> +    }
> +    fclose(f);
> +    return pid;
> +}
> +
>  QTestState *qtest_init(const char *extra_args)
>  {
>      QTestState *s;
> @@ -136,25 +152,21 @@ QTestState *qtest_init(const char *extra_args)
>      qtest_qmp(s, "");
>      qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
>  
> +    if (getenv("QTEST_STOP")) {
> +        kill(qtest_qemu_pid(s), SIGSTOP);
> +    }
> +
>      return s;
>  }
>  
>  void qtest_quit(QTestState *s)
>  {
> -    FILE *f;
> -    char buffer[1024];
> -
> -    f = fopen(s->pid_file, "r");
> -    if (f) {
> -        if (fgets(buffer, sizeof(buffer), f)) {
> -            pid_t pid = atoi(buffer);
> -            int status = 0;
> -
> -            kill(pid, SIGTERM);
> -            waitpid(pid, &status, 0);
> -        }
> +    int status;
>  
> -        fclose(f);
> +    pid_t pid = qtest_qemu_pid(s);
> +    if (pid != -1) {
> +        kill(pid, SIGTERM);
> +        waitpid(pid, &status, 0);
>      }
>  
>      unlink(s->pid_file);
> -- 
> 1.7.12

Patch

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 02d0392..71b84c1 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -85,6 +85,22 @@  static int socket_accept(int sock)
     return ret;
 }
 
+static pid_t qtest_qemu_pid(QTestState *s)
+{
+    FILE *f;
+    char buffer[1024];
+    pid_t pid = -1;
+
+    f = fopen(s->pid_file, "r");
+    if (f) {
+        if (fgets(buffer, sizeof(buffer), f)) {
+            pid = atoi(buffer);
+        }
+    }
+    fclose(f);
+    return pid;
+}
+
 QTestState *qtest_init(const char *extra_args)
 {
     QTestState *s;
@@ -136,25 +152,21 @@  QTestState *qtest_init(const char *extra_args)
     qtest_qmp(s, "");
     qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
 
+    if (getenv("QTEST_STOP")) {
+        kill(qtest_qemu_pid(s), SIGSTOP);
+    }
+
     return s;
 }
 
 void qtest_quit(QTestState *s)
 {
-    FILE *f;
-    char buffer[1024];
-
-    f = fopen(s->pid_file, "r");
-    if (f) {
-        if (fgets(buffer, sizeof(buffer), f)) {
-            pid_t pid = atoi(buffer);
-            int status = 0;
-
-            kill(pid, SIGTERM);
-            waitpid(pid, &status, 0);
-        }
+    int status;
 
-        fclose(f);
+    pid_t pid = qtest_qemu_pid(s);
+    if (pid != -1) {
+        kill(pid, SIGTERM);
+        waitpid(pid, &status, 0);
     }
 
     unlink(s->pid_file);