|
@@ -352,10 +352,10 @@ static void test_qga_network_get_interfaces(gconstpointer fix)
|
|
|
static void test_qga_file_ops(gconstpointer fix)
|
|
|
{
|
|
|
const TestFixture *fixture = fix;
|
|
|
- const guchar helloworld[] = "Hello World!\n";
|
|
|
+ const unsigned char helloworld[] = "Hello World!\n";
|
|
|
const char *b64;
|
|
|
gchar *cmd, *path, *enc;
|
|
|
- guchar *dec;
|
|
|
+ unsigned char *dec;
|
|
|
QDict *ret, *val;
|
|
|
int64_t id, eof;
|
|
|
gsize count;
|
|
@@ -496,6 +496,96 @@ static void test_qga_file_ops(gconstpointer fix)
|
|
|
g_free(cmd);
|
|
|
}
|
|
|
|
|
|
+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;
|
|
|
+ QDict *ret, *val;
|
|
|
+ int64_t id, eof;
|
|
|
+ gsize count;
|
|
|
+
|
|
|
+ /* open */
|
|
|
+ ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
|
|
|
+ " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
|
|
|
+ g_assert_nonnull(ret);
|
|
|
+ qmp_assert_no_error(ret);
|
|
|
+ id = qdict_get_int(ret, "return");
|
|
|
+ QDECREF(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);
|
|
|
+ g_assert_nonnull(ret);
|
|
|
+ qmp_assert_no_error(ret);
|
|
|
+
|
|
|
+ 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_cmpint(eof, ==, 0);
|
|
|
+ QDECREF(ret);
|
|
|
+ g_free(cmd);
|
|
|
+
|
|
|
+ /* read (check implicit flush) */
|
|
|
+ cmd = g_strdup_printf("{'execute': 'guest-file-read',"
|
|
|
+ " 'arguments': { 'handle': %" PRId64 "} }",
|
|
|
+ id);
|
|
|
+ ret = qmp_fd(fixture->fd, cmd);
|
|
|
+ val = qdict_get_qdict(ret, "return");
|
|
|
+ count = qdict_get_int(val, "count");
|
|
|
+ eof = qdict_get_bool(val, "eof");
|
|
|
+ b64 = qdict_get_str(val, "buf-b64");
|
|
|
+ g_assert_cmpint(count, ==, 0);
|
|
|
+ g_assert(eof);
|
|
|
+ g_assert_cmpstr(b64, ==, "");
|
|
|
+ QDECREF(ret);
|
|
|
+ g_free(cmd);
|
|
|
+
|
|
|
+ /* seek to 0 */
|
|
|
+ cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
|
|
|
+ " 'arguments': { 'handle': %" PRId64 ", "
|
|
|
+ " 'offset': %d, 'whence': %d } }",
|
|
|
+ id, 0, SEEK_SET);
|
|
|
+ ret = qmp_fd(fixture->fd, cmd);
|
|
|
+ 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);
|
|
|
+
|
|
|
+ /* read */
|
|
|
+ cmd = g_strdup_printf("{'execute': 'guest-file-read',"
|
|
|
+ " 'arguments': { 'handle': %" PRId64 "} }",
|
|
|
+ id);
|
|
|
+ ret = qmp_fd(fixture->fd, cmd);
|
|
|
+ val = qdict_get_qdict(ret, "return");
|
|
|
+ count = qdict_get_int(val, "count");
|
|
|
+ eof = qdict_get_bool(val, "eof");
|
|
|
+ b64 = qdict_get_str(val, "buf-b64");
|
|
|
+ g_assert_cmpint(count, ==, sizeof(helloworld));
|
|
|
+ g_assert(eof);
|
|
|
+ g_assert_cmpstr(b64, ==, enc);
|
|
|
+ QDECREF(ret);
|
|
|
+ g_free(cmd);
|
|
|
+ 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);
|
|
|
+}
|
|
|
+
|
|
|
static void test_qga_get_time(gconstpointer fix)
|
|
|
{
|
|
|
const TestFixture *fixture = fix;
|
|
@@ -762,6 +852,7 @@ int main(int argc, char **argv)
|
|
|
g_test_add_data_func("/qga/get-memory-blocks", &fix,
|
|
|
test_qga_get_memory_blocks);
|
|
|
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/invalid-cmd", &fix, test_qga_invalid_cmd);
|
|
|
g_test_add_data_func("/qga/fsfreeze-status", &fix,
|