qtest: implement QTEST_STOP

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>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Paolo Bonzini 2012-10-01 14:18:07 +02:00 committed by Anthony Liguori
parent 610b823ef6
commit e0fea6b1e4
1 changed files with 25 additions and 13 deletions

View File

@ -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];
int status;
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);
}
fclose(f);
pid_t pid = qtest_qemu_pid(s);
if (pid != -1) {
kill(pid, SIGTERM);
waitpid(pid, &status, 0);
}
unlink(s->pid_file);