Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/kernel/tty Add two simple testcases to exercise pty/tt...



details:   https://anonhg.NetBSD.org/src/rev/9ee088d2e226
branches:  trunk
changeset: 763973:9ee088d2e226
user:      martin <martin%NetBSD.org@localhost>
date:      Sat Apr 09 11:55:59 2011 +0000

description:
Add two simple testcases to exercise pty/tty communication.

diffstat:

 tests/kernel/tty/t_pr.c |  132 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 129 insertions(+), 3 deletions(-)

diffs (173 lines):

diff -r 53c0bdb7ca75 -r 9ee088d2e226 tests/kernel/tty/t_pr.c
--- a/tests/kernel/tty/t_pr.c   Sat Apr 09 07:02:57 2011 +0000
+++ b/tests/kernel/tty/t_pr.c   Sat Apr 09 11:55:59 2011 +0000
@@ -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();
 }



Home | Main Index | Thread Index | Old Index