aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test-char.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/test-char.c b/tests/test-char.c
index 2b155ffcb7..87a4e2986d 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -277,6 +277,76 @@ static void char_pipe_test(void)
}
#endif
+static void char_file_test(void)
+{
+ char *tmp_path = g_dir_make_tmp("qemu-test-char.XXXXXX", NULL);
+ char *out = g_build_filename(tmp_path, "out", NULL);
+ char *contents = NULL;
+ ChardevFile file = { .out = out };
+ ChardevBackend backend = { .type = CHARDEV_BACKEND_KIND_FILE,
+ .u.file.data = &file };
+ Chardev *chr;
+ gsize length;
+ int ret;
+
+ chr = qemu_chardev_new(NULL, TYPE_CHARDEV_FILE, &backend,
+ &error_abort);
+ ret = qemu_chr_write_all(chr, (uint8_t *)"hello!", 6);
+ g_assert_cmpint(ret, ==, 6);
+ object_unref(OBJECT(chr));
+
+ ret = g_file_get_contents(out, &contents, &length, NULL);
+ g_assert(ret == TRUE);
+ g_assert_cmpint(length, ==, 6);
+ g_assert(strncmp(contents, "hello!", 6) == 0);
+ g_free(contents);
+
+#ifndef _WIN32
+ {
+ CharBackend be;
+ FeHandler fe = { 0, };
+ char *fifo = g_build_filename(tmp_path, "fifo", NULL);
+ int fd;
+
+ if (mkfifo(fifo, 0600) < 0) {
+ abort();
+ }
+
+ fd = open(fifo, O_RDWR);
+ ret = write(fd, "fifo-in", 8);
+ g_assert_cmpint(ret, ==, 8);
+
+ file.in = fifo;
+ file.has_in = true;
+ chr = qemu_chardev_new(NULL, TYPE_CHARDEV_FILE, &backend,
+ &error_abort);
+
+ qemu_chr_fe_init(&be, chr, &error_abort);
+ qemu_chr_fe_set_handlers(&be,
+ fe_can_read,
+ fe_read,
+ fe_event,
+ &fe, NULL, true);
+
+ main_loop();
+
+ close(fd);
+
+ g_assert_cmpint(fe.read_count, ==, 8);
+ g_assert_cmpstr(fe.read_buf, ==, "fifo-in");
+ qemu_chr_fe_deinit(&be);
+ object_unref(OBJECT(chr));
+ g_unlink(fifo);
+ g_free(fifo);
+ }
+#endif
+
+ g_unlink(out);
+ g_rmdir(tmp_path);
+ g_free(tmp_path);
+ g_free(out);
+}
+
static void char_null_test(void)
{
Error *err = NULL;
@@ -348,6 +418,7 @@ int main(int argc, char **argv)
#ifndef _WIN32
g_test_add_func("/char/pipe", char_pipe_test);
#endif
+ g_test_add_func("/char/file", char_file_test);
return g_test_run();
}