#include <sys/un.h>
#include "libqtest.h"
+#include "qapi/qmp/qdict.h"
+#include "qapi/qmp/qlist.h"
typedef struct {
char *test_dir;
}
static void
-fixture_setup(TestFixture *fixture, gconstpointer data)
+fixture_setup(TestFixture *fixture, gconstpointer data, gchar **envp)
{
const gchar *extra_arg = data;
GError *error = NULL;
g_shell_parse_argv(cmd, NULL, &argv, &error);
g_assert_no_error(error);
- g_spawn_async(fixture->test_dir, argv, NULL,
+ g_spawn_async(fixture->test_dir, argv, envp,
G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL, &fixture->pid, &error);
g_assert_no_error(error);
guint32 v, r = g_random_int();
unsigned char c;
QDict *ret;
- gchar *cmd;
- cmd = g_strdup_printf("\xff{'execute': 'guest-sync-delimited',"
- " 'arguments': {'id': %u } }", r);
- qmp_fd_send(fixture->fd, cmd);
- g_free(cmd);
+ qmp_fd_send_raw(fixture->fd, "\xff");
+ qmp_fd_send(fixture->fd,
+ "{'execute': 'guest-sync-delimited',"
+ " 'arguments': {'id': %u } }",
+ r);
/*
* Read and ignore garbage until resynchronized.
v = qdict_get_int(ret, "return");
g_assert_cmpint(r, ==, v);
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_sync(gconstpointer fix)
const TestFixture *fixture = fix;
guint32 v, r = g_random_int();
QDict *ret;
- gchar *cmd;
/*
* TODO guest-sync is inherently limited: we cannot distinguish
* invalid JSON. Testing of '\xff' handling is done in
* guest-sync-delimited instead.
*/
- cmd = g_strdup_printf("{'execute': 'guest-sync',"
- " 'arguments': {'id': %u } }", r);
- ret = qmp_fd(fixture->fd, cmd);
- g_free(cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-sync', 'arguments': {'id': %u } }",
+ r);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
v = qdict_get_int(ret, "return");
g_assert_cmpint(r, ==, v);
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_ping(gconstpointer fix)
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
- QDECREF(ret);
+ qobject_unref(ret);
+}
+
+static void test_qga_id(gconstpointer fix)
+{
+ const TestFixture *fixture = fix;
+ QDict *ret;
+
+ ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping', 'id': 1}");
+ g_assert_nonnull(ret);
+ qmp_assert_no_error(ret);
+ g_assert_cmpint(qdict_get_int(ret, "id"), ==, 1);
+
+ qobject_unref(ret);
+}
+
+static void test_qga_invalid_oob(gconstpointer fix)
+{
+ const TestFixture *fixture = fix;
+ QDict *ret;
+
+ ret = qmp_fd(fixture->fd, "{'exec-oob': 'guest-ping'}");
+ g_assert_nonnull(ret);
+
+ qmp_assert_error_class(ret, "GenericError");
}
static void test_qga_invalid_args(gconstpointer fix)
g_assert_cmpstr(class, ==, "GenericError");
g_assert_cmpstr(desc, ==, "Parameter 'foo' is unexpected");
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_invalid_cmd(gconstpointer fix)
g_assert_cmpstr(class, ==, "CommandNotFound");
g_assert_cmpint(strlen(desc), >, 0);
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_info(gconstpointer fix)
version = qdict_get_try_str(val, "version");
g_assert_cmpstr(version, ==, QEMU_VERSION);
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_get_vcpus(gconstpointer fix)
/* check there is at least a cpu */
list = qdict_get_qlist(ret, "return");
entry = qlist_first(list);
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "online"));
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "logical-id"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "online"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "logical-id"));
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_get_fsinfo(gconstpointer fix)
list = qdict_get_qlist(ret, "return");
entry = qlist_first(list);
if (entry) {
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "name"));
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "mountpoint"));
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "type"));
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "disk"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "name"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "mountpoint"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "type"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "disk"));
}
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_get_memory_block_info(gconstpointer fix)
g_assert_cmpint(size, >, 0);
}
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_get_memory_blocks(gconstpointer fix)
entry = qlist_first(list);
/* newer versions of qga may return empty list without error */
if (entry) {
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "phys-index"));
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "online"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value),
+ "phys-index"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "online"));
}
}
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_network_get_interfaces(gconstpointer fix)
/* check there is at least an interface */
list = qdict_get_qlist(ret, "return");
entry = qlist_first(list);
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "name"));
+ g_assert(qdict_haskey(qobject_to(QDict, entry->value), "name"));
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_file_ops(gconstpointer fix)
const TestFixture *fixture = fix;
const unsigned char helloworld[] = "Hello World!\n";
const char *b64;
- gchar *cmd, *path, *enc;
+ gchar *path, *enc;
unsigned char *dec;
QDict *ret, *val;
int64_t id, eof;
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
id = qdict_get_int(ret, "return");
- QDECREF(ret);
+ qobject_unref(ret);
enc = g_base64_encode(helloworld, sizeof(helloworld));
/* write */
- cmd = g_strdup_printf("{'execute': 'guest-file-write',"
- " 'arguments': { 'handle': %" PRId64 ","
- " 'buf-b64': '%s' } }", id, enc);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-write',"
+ " 'arguments': { 'handle': %" PRId64 ", 'buf-b64': %s } }",
+ id, enc);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, sizeof(helloworld));
g_assert_cmpint(eof, ==, 0);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* flush */
- cmd = g_strdup_printf("{'execute': 'guest-file-flush',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
- QDECREF(ret);
- g_free(cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-flush',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
+ qobject_unref(ret);
/* close */
- cmd = g_strdup_printf("{'execute': 'guest-file-close',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
- QDECREF(ret);
- g_free(cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-close',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
+ qobject_unref(ret);
/* check content */
path = g_build_filename(fixture->test_dir, "foo", NULL);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
id = qdict_get_int(ret, "return");
- QDECREF(ret);
+ qobject_unref(ret);
/* read */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
g_assert(eof);
g_assert_cmpstr(b64, ==, enc);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
g_free(enc);
/* read eof */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, 0);
g_assert(eof);
g_assert_cmpstr(b64, ==, "");
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* seek */
- cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
- " 'arguments': { 'handle': %" PRId64 ", "
- " 'offset': %d, 'whence': '%s' } }",
- id, 6, "set");
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-seek',"
+ " 'arguments': { 'handle': %" PRId64 ", "
+ " 'offset': %d, 'whence': %s } }",
+ id, 6, "set");
qmp_assert_no_error(ret);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "position");
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, 6);
g_assert(!eof);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* partial read */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
g_assert_cmpmem(dec, count, helloworld + 6, sizeof(helloworld) - 6);
g_free(dec);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* close */
- cmd = g_strdup_printf("{'execute': 'guest-file-close',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
- QDECREF(ret);
- g_free(cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-close',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
+ qobject_unref(ret);
}
static void test_qga_file_write_read(gconstpointer fix)
const TestFixture *fixture = fix;
const unsigned char helloworld[] = "Hello World!\n";
const char *b64;
- gchar *cmd, *enc;
+ gchar *enc;
QDict *ret, *val;
int64_t id, eof;
gsize count;
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
id = qdict_get_int(ret, "return");
- QDECREF(ret);
+ qobject_unref(ret);
enc = g_base64_encode(helloworld, sizeof(helloworld));
/* write */
- cmd = g_strdup_printf("{'execute': 'guest-file-write',"
- " 'arguments': { 'handle': %" PRId64 ","
- " 'buf-b64': '%s' } }", id, enc);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-write',"
+ " 'arguments': { 'handle': %" PRId64 ","
+ " 'buf-b64': %s } }", id, enc);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, sizeof(helloworld));
g_assert_cmpint(eof, ==, 0);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* read (check implicit flush) */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, 0);
g_assert(eof);
g_assert_cmpstr(b64, ==, "");
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* seek to 0 */
- cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
- " 'arguments': { 'handle': %" PRId64 ", "
- " 'offset': %d, 'whence': '%s' } }",
- id, 0, "set");
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-seek',"
+ " 'arguments': { 'handle': %" PRId64 ", "
+ " 'offset': %d, 'whence': %s } }",
+ id, 0, "set");
qmp_assert_no_error(ret);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "position");
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, 0);
g_assert(!eof);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
/* read */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
g_assert_cmpint(count, ==, sizeof(helloworld));
g_assert(eof);
g_assert_cmpstr(b64, ==, enc);
- QDECREF(ret);
- g_free(cmd);
+ qobject_unref(ret);
g_free(enc);
/* close */
- cmd = g_strdup_printf("{'execute': 'guest-file-close',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
- QDECREF(ret);
- g_free(cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-close',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
+ qobject_unref(ret);
}
static void test_qga_get_time(gconstpointer fix)
time = qdict_get_int(ret, "return");
g_assert_cmpint(time, >, 0);
- QDECREF(ret);
-}
-
-static void test_qga_set_time(gconstpointer fix)
-{
- const TestFixture *fixture = fix;
- QDict *ret;
- int64_t current, time;
- gchar *cmd;
-
- /* get current time */
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-time'}");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- current = qdict_get_int(ret, "return");
- g_assert_cmpint(current, >, 0);
- QDECREF(ret);
-
- /* set some old time */
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-set-time',"
- " 'arguments': { 'time': 1000 } }");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- QDECREF(ret);
-
- /* check old time */
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-time'}");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- time = qdict_get_int(ret, "return");
- g_assert_cmpint(time / 1000, <, G_USEC_PER_SEC * 10);
- QDECREF(ret);
-
- /* set back current time */
- cmd = g_strdup_printf("{'execute': 'guest-set-time',"
- " 'arguments': { 'time': %" PRId64 " } }",
- current + time * 1000);
- ret = qmp_fd(fixture->fd, cmd);
- g_free(cmd);
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- QDECREF(ret);
-}
-
-static void test_qga_fstrim(gconstpointer fix)
-{
- const TestFixture *fixture = fix;
- QDict *ret;
- QList *list;
- const QListEntry *entry;
-
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-fstrim',"
- " arguments: { minimum: 4194304 } }");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- list = qdict_get_qlist(ret, "return");
- entry = qlist_first(list);
- g_assert(qdict_haskey(qobject_to_qdict(entry->value), "paths"));
-
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_blacklist(gconstpointer data)
QDict *ret, *error;
const gchar *class, *desc;
- fixture_setup(&fix, "-b guest-ping,guest-get-time");
+ fixture_setup(&fix, "-b guest-ping,guest-get-time", NULL);
/* check blacklist */
ret = qmp_fd(fix.fd, "{'execute': 'guest-ping'}");
desc = qdict_get_try_str(error, "desc");
g_assert_cmpstr(class, ==, "GenericError");
g_assert_nonnull(g_strstr_len(desc, -1, "has been disabled"));
- QDECREF(ret);
+ qobject_unref(ret);
ret = qmp_fd(fix.fd, "{'execute': 'guest-get-time'}");
g_assert_nonnull(ret);
desc = qdict_get_try_str(error, "desc");
g_assert_cmpstr(class, ==, "GenericError");
g_assert_nonnull(g_strstr_len(desc, -1, "has been disabled"));
- QDECREF(ret);
+ qobject_unref(ret);
/* check something work */
ret = qmp_fd(fix.fd, "{'execute': 'guest-get-fsinfo'}");
qmp_assert_no_error(ret);
- QDECREF(ret);
+ qobject_unref(ret);
fixture_tear_down(&fix, NULL);
}
strv = g_key_file_get_string_list(kf, "general", "blacklist", &n, &error);
g_assert_cmpint(n, ==, 2);
-#if GLIB_CHECK_VERSION(2, 44, 0)
g_assert_true(g_strv_contains((const char * const *)strv,
"guest-ping"));
g_assert_true(g_strv_contains((const char * const *)strv,
"guest-get-time"));
-#endif
g_assert_no_error(error);
g_strfreev(strv);
status = qdict_get_try_str(ret, "return");
g_assert_cmpstr(status, ==, "thawed");
- QDECREF(ret);
-}
-
-static void test_qga_fsfreeze_and_thaw(gconstpointer fix)
-{
- const TestFixture *fixture = fix;
- QDict *ret;
- const gchar *status;
-
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-fsfreeze-freeze'}");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- QDECREF(ret);
-
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-fsfreeze-status'}");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- status = qdict_get_try_str(ret, "return");
- g_assert_cmpstr(status, ==, "frozen");
- QDECREF(ret);
-
- ret = qmp_fd(fixture->fd, "{'execute': 'guest-fsfreeze-thaw'}");
- g_assert_nonnull(ret);
- qmp_assert_no_error(ret);
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_guest_exec(gconstpointer fix)
int64_t pid, now, exitcode;
gsize len;
bool exited;
- char *cmd;
/* exec 'echo foo bar' */
ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
val = qdict_get_qdict(ret, "return");
pid = qdict_get_int(val, "pid");
g_assert_cmpint(pid, >, 0);
- QDECREF(ret);
+ qobject_unref(ret);
/* wait for completion */
now = g_get_monotonic_time();
- cmd = g_strdup_printf("{'execute': 'guest-exec-status',"
- " 'arguments': { 'pid': %" PRId64 " } }", pid);
do {
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-exec-status',"
+ " 'arguments': { 'pid': %" PRId64 " } }", pid);
g_assert_nonnull(ret);
val = qdict_get_qdict(ret, "return");
exited = qdict_get_bool(val, "exited");
if (!exited) {
- QDECREF(ret);
+ qobject_unref(ret);
}
} while (!exited &&
g_get_monotonic_time() < now + 5 * G_TIME_SPAN_SECOND);
g_assert(exited);
- g_free(cmd);
/* check stdout */
exitcode = qdict_get_int(val, "exitcode");
g_assert_cmpint(len, ==, 12);
g_assert_cmpstr((char *)decoded, ==, "\" test_str \"");
g_free(decoded);
- QDECREF(ret);
+ qobject_unref(ret);
}
static void test_qga_guest_exec_invalid(gconstpointer fix)
desc = qdict_get_str(error, "desc");
g_assert_cmpstr(class, ==, "GenericError");
g_assert_cmpint(strlen(desc), >, 0);
- QDECREF(ret);
+ qobject_unref(ret);
/* invalid pid */
ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec-status',"
desc = qdict_get_str(error, "desc");
g_assert_cmpstr(class, ==, "GenericError");
g_assert_cmpint(strlen(desc), >, 0);
- QDECREF(ret);
+ qobject_unref(ret);
+}
+
+static void test_qga_guest_get_host_name(gconstpointer fix)
+{
+ const TestFixture *fixture = fix;
+ QDict *ret, *val;
+
+ ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-host-name'}");
+ g_assert_nonnull(ret);
+ qmp_assert_no_error(ret);
+
+ val = qdict_get_qdict(ret, "return");
+ g_assert(qdict_haskey(val, "host-name"));
+
+ qobject_unref(ret);
+}
+
+static void test_qga_guest_get_timezone(gconstpointer fix)
+{
+ const TestFixture *fixture = fix;
+ QDict *ret, *val;
+
+ ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-timezone'}");
+ g_assert_nonnull(ret);
+ qmp_assert_no_error(ret);
+
+ /* Make sure there's at least offset */
+ val = qdict_get_qdict(ret, "return");
+ g_assert(qdict_haskey(val, "offset"));
+
+ qobject_unref(ret);
+}
+
+static void test_qga_guest_get_users(gconstpointer fix)
+{
+ const TestFixture *fixture = fix;
+ QDict *ret;
+ QList *val;
+
+ ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-users'}");
+ g_assert_nonnull(ret);
+ qmp_assert_no_error(ret);
+
+ /* There is not much to test here */
+ val = qdict_get_qlist(ret, "return");
+ g_assert_nonnull(val);
+
+ qobject_unref(ret);
+}
+
+static void test_qga_guest_get_osinfo(gconstpointer data)
+{
+ TestFixture fixture;
+ const gchar *str;
+ gchar *cwd, *env[2];
+ QDict *ret, *val;
+
+ cwd = g_get_current_dir();
+ env[0] = g_strdup_printf(
+ "QGA_OS_RELEASE=%s%ctests%cdata%ctest-qga-os-release",
+ cwd, G_DIR_SEPARATOR, G_DIR_SEPARATOR, G_DIR_SEPARATOR);
+ env[1] = NULL;
+ g_free(cwd);
+ fixture_setup(&fixture, NULL, env);
+
+ ret = qmp_fd(fixture.fd, "{'execute': 'guest-get-osinfo'}");
+ g_assert_nonnull(ret);
+ qmp_assert_no_error(ret);
+
+ val = qdict_get_qdict(ret, "return");
+
+ str = qdict_get_try_str(val, "id");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "qemu-ga-test");
+
+ str = qdict_get_try_str(val, "name");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "QEMU-GA");
+
+ str = qdict_get_try_str(val, "pretty-name");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "QEMU Guest Agent test");
+
+ str = qdict_get_try_str(val, "version");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "Test 1");
+
+ str = qdict_get_try_str(val, "version-id");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "1");
+
+ str = qdict_get_try_str(val, "variant");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "Unit test \"'$`\\ and \\\\ etc.");
+
+ str = qdict_get_try_str(val, "variant-id");
+ g_assert_nonnull(str);
+ g_assert_cmpstr(str, ==, "unit-test");
+
+ qobject_unref(ret);
+ g_free(env[0]);
+ fixture_tear_down(&fixture, NULL);
}
int main(int argc, char **argv)
setlocale (LC_ALL, "");
g_test_init(&argc, &argv, NULL);
- fixture_setup(&fix, NULL);
+ fixture_setup(&fix, NULL, NULL);
g_test_add_data_func("/qga/sync-delimited", &fix, test_qga_sync_delimited);
g_test_add_data_func("/qga/sync", &fix, test_qga_sync);
g_test_add_data_func("/qga/file-ops", &fix, test_qga_file_ops);
g_test_add_data_func("/qga/file-write-read", &fix, test_qga_file_write_read);
g_test_add_data_func("/qga/get-time", &fix, test_qga_get_time);
+ g_test_add_data_func("/qga/id", &fix, test_qga_id);
+ g_test_add_data_func("/qga/invalid-oob", &fix, test_qga_invalid_oob);
g_test_add_data_func("/qga/invalid-cmd", &fix, test_qga_invalid_cmd);
g_test_add_data_func("/qga/invalid-args", &fix, test_qga_invalid_args);
g_test_add_data_func("/qga/fsfreeze-status", &fix,
g_test_add_data_func("/qga/guest-exec", &fix, test_qga_guest_exec);
g_test_add_data_func("/qga/guest-exec-invalid", &fix,
test_qga_guest_exec_invalid);
-
- if (g_getenv("QGA_TEST_SIDE_EFFECTING")) {
- g_test_add_data_func("/qga/fsfreeze-and-thaw", &fix,
- test_qga_fsfreeze_and_thaw);
- g_test_add_data_func("/qga/set-time", &fix, test_qga_set_time);
- g_test_add_data_func("/qga/fstrim", &fix, test_qga_fstrim);
- }
+ g_test_add_data_func("/qga/guest-get-osinfo", &fix,
+ test_qga_guest_get_osinfo);
+ g_test_add_data_func("/qga/guest-get-host-name", &fix,
+ test_qga_guest_get_host_name);
+ g_test_add_data_func("/qga/guest-get-timezone", &fix,
+ test_qga_guest_get_timezone);
+ g_test_add_data_func("/qga/guest-get-users", &fix,
+ test_qga_guest_get_users);
ret = g_test_run();