qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] qtest: implement QTEST_STOP
@ 2012-10-01 12:18 Paolo Bonzini
  2012-10-01 21:19 ` Anthony Liguori
  2012-10-05 21:20 ` Anthony Liguori
  0 siblings, 2 replies; 4+ messages in thread
From: Paolo Bonzini @ 2012-10-01 12:18 UTC (permalink / raw)
  To: qemu-devel

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);
+    }
+
     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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] qtest: implement QTEST_STOP
  2012-10-01 12:18 [Qemu-devel] [PATCH] qtest: implement QTEST_STOP Paolo Bonzini
@ 2012-10-01 21:19 ` Anthony Liguori
  2012-10-02  6:07   ` Paolo Bonzini
  2012-10-05 21:20 ` Anthony Liguori
  1 sibling, 1 reply; 4+ messages in thread
From: Anthony Liguori @ 2012-10-01 21:19 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] qtest: implement QTEST_STOP
  2012-10-01 21:19 ` Anthony Liguori
@ 2012-10-02  6:07   ` Paolo Bonzini
  0 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2012-10-02  6:07 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: qemu-devel

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] qtest: implement QTEST_STOP
  2012-10-01 12:18 [Qemu-devel] [PATCH] qtest: implement QTEST_STOP Paolo Bonzini
  2012-10-01 21:19 ` Anthony Liguori
@ 2012-10-05 21:20 ` Anthony Liguori
  1 sibling, 0 replies; 4+ messages in thread
From: Anthony Liguori @ 2012-10-05 21:20 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-10-05 21:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-01 12:18 [Qemu-devel] [PATCH] qtest: implement QTEST_STOP Paolo Bonzini
2012-10-01 21:19 ` Anthony Liguori
2012-10-02  6:07   ` Paolo Bonzini
2012-10-05 21:20 ` Anthony Liguori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).