Module Name: src Committed By: martin Date: Sat Apr 9 11:55:59 UTC 2011
Modified Files: src/tests/kernel/tty: t_pr.c Log Message: Add two simple testcases to exercise pty/tty communication. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/tests/kernel/tty/t_pr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/kernel/tty/t_pr.c diff -u src/tests/kernel/tty/t_pr.c:1.4 src/tests/kernel/tty/t_pr.c:1.5 --- src/tests/kernel/tty/t_pr.c:1.4 Sat Apr 9 06:36:03 2011 +++ src/tests/kernel/tty/t_pr.c Sat Apr 9 11:55:59 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: t_pr.c,v 1.4 2011/04/09 06:36:03 martin Exp $ */ +/* $NetBSD: t_pr.c,v 1.5 2011/04/09 11:55:59 martin Exp $ */ #include <sys/types.h> #include <sys/ioctl.h> @@ -7,14 +7,136 @@ #include <atf-c.h> #include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> #include <rump/rump.h> #include <rump/rump_syscalls.h> +static bool init_done = false; + +static void +init(void) +{ + if (init_done) + return; + rump_init(); + init_done = true; +} + +static int +sendsome(int from, int to) +{ + size_t i; + ssize_t cnt; + static const char msg[] = "hello world\n"; + char buf[sizeof(msg)+10]; + + memset(buf, 0, sizeof(buf)); + rump_sys_write(from, msg, strlen(msg)); + cnt = rump_sys_read(to, buf, sizeof(buf)); + if (cnt < (ssize_t)strlen(msg)) { + printf("short message read: %zd chars: \"%s\"\n", cnt, buf); + return 1; + } + for (i = 0; i < sizeof(buf); i++) { + if (buf[i] == '\r' || buf[i] == '\n') { + buf[i] = '\n'; + buf[i+1] = '\0'; + break; + } + } + + return strcmp(buf, msg) != 0; +} + +static int +exercise_ptytty(int master, int slave) +{ + int error, flags; + + /* + * send a few bytes from master to slave and read them back + */ + error = sendsome(master, slave); + if (error) + return error; + + flags = FREAD|FWRITE; + rump_sys_ioctl(master, TIOCFLUSH, &flags); + + /* + * and the same in the other direction + */ + error = sendsome(slave, master); + if (error) + return error; + + flags = FREAD|FWRITE; + rump_sys_ioctl(master, TIOCFLUSH, &flags); + return 0; +} + +ATF_TC(client_first); +ATF_TC_HEAD(client_first, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "test basic tty/pty operation when opening client side first"); +} + +ATF_TC_BODY(client_first, tc) +{ + int master, slave, error, v; + + init(); + slave = rump_sys_open("/dev/ttyp1", O_RDWR|O_NONBLOCK); + ATF_CHECK(slave != -1); + + master = rump_sys_open("/dev/ptyp1", O_RDWR); + ATF_CHECK(master != -1); + + v = 0; + rump_sys_ioctl(slave, FIOASYNC, &v); + error = exercise_ptytty(master, slave); + ATF_CHECK(error == 0); + + rump_sys_close(master); + rump_sys_close(slave); +} + +ATF_TC(master_first); +ATF_TC_HEAD(master_first, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "test basic tty/pty operation when opening master side first"); +} + +ATF_TC_BODY(master_first, tc) +{ + int master, slave, error; + + init(); + master = rump_sys_open("/dev/ptyp1", O_RDWR); + ATF_CHECK(master != -1); + + slave = rump_sys_open("/dev/ttyp1", O_RDWR); + ATF_CHECK(slave != -1); + + error = exercise_ptytty(master, slave); + ATF_CHECK(error == 0); + + rump_sys_close(master); + rump_sys_close(slave); +} + ATF_TC(ptyioctl); ATF_TC_HEAD(ptyioctl, tc) { - atf_tc_set_md_var(tc, "descr", "ioctl on pty"); + atf_tc_set_md_var(tc, "descr", + "ioctl on pty with client side not open"); } ATF_TC_BODY(ptyioctl, tc) @@ -22,7 +144,7 @@ struct termios tio; int fd; - rump_init(); + init(); fd = rump_sys_open("/dev/ptyp1", O_RDWR); ATF_CHECK(fd != -1); @@ -31,12 +153,16 @@ * atf_tc_expect_signal(-1, "PR kern/40688"); */ rump_sys_ioctl(fd, TIOCGETA, &tio); + + rump_sys_close(fd); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, ptyioctl); + ATF_TP_ADD_TC(tp, client_first); + ATF_TP_ADD_TC(tp, master_first); return atf_no_error(); }