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();
 }

Reply via email to