[rtems commit] termios09: Test output post processing

Sebastian Huber sebh at rtems.org
Tue Feb 28 08:43:35 UTC 2017


Module:    rtems
Branch:    master
Commit:    06d14667f7cb7a03f8e9fa8a6c97b78fbed30d6a
Changeset: http://git.rtems.org/rtems/commit/?id=06d14667f7cb7a03f8e9fa8a6c97b78fbed30d6a

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Feb 24 11:46:26 2017 +0100

termios09: Test output post processing

---

 testsuites/libtests/termios09/init.c | 358 +++++++++++++++++++++++++++++++++++
 1 file changed, 358 insertions(+)

diff --git a/testsuites/libtests/termios09/init.c b/testsuites/libtests/termios09/init.c
index 980a6ea..2e40ebf 100644
--- a/testsuites/libtests/termios09/init.c
+++ b/testsuites/libtests/termios09/init.c
@@ -221,6 +221,18 @@ static void clear_set_lflag(
   set_term(ctx, i);
 }
 
+static void clear_set_oflag(
+  test_context *ctx,
+  size_t i,
+  tcflag_t clear,
+  tcflag_t set
+)
+{
+  ctx->term[i].c_oflag &= ~clear;
+  ctx->term[i].c_oflag |= set;
+  set_term(ctx, i);
+}
+
 static void set_vmin_vtime(
   test_context *ctx,
   size_t i,
@@ -559,6 +571,344 @@ static void test_rx_callback_icanon(test_context *ctx)
   clear_set_lflag(ctx, i, ICANON, 0);
 }
 
+static void flush_output(test_context *ctx, size_t i)
+{
+  if (i == INTERRUPT) {
+    device_context *dev = &ctx->devices[i];
+
+    while (dev->output_pending != 0) {
+      rtems_termios_dequeue_characters(dev->tty, dev->output_pending);
+    }
+  }
+}
+
+static void clear_output(test_context *ctx, size_t i)
+{
+  device_context *dev = &ctx->devices[i];
+
+  dev->output_pending = 0;
+  dev->output_count = 0;
+  memset(&dev->output_buf, 0, OUTPUT_BUFFER_SIZE);
+}
+
+static void test_onlret(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | ONLRET;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'a');
+
+    c = '\n';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 2);
+    rtems_test_assert(dev->output_buf[1] == '\n');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_onlcr(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | ONLCR;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'a');
+
+    c = '\n';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 3);
+    rtems_test_assert(dev->output_buf[1] == '\r');
+    rtems_test_assert(dev->output_buf[2] == '\n');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_onocr(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | ONOCR;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = '\r';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 0);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'a');
+
+    c = '\r';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 2);
+    rtems_test_assert(dev->output_buf[1] == '\r');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_ocrnl(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | OCRNL;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = '\r';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == '\n');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_ocrnl_onlret(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | OCRNL | ONLRET;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'a');
+
+    c = '\r';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 2);
+    rtems_test_assert(dev->output_buf[1] == '\n');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_opost(test_context *ctx)
+{
+  tcflag_t oflags = OPOST;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'a');
+
+    c = '\33';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 2);
+    rtems_test_assert(dev->output_buf[1] == '\33');
+
+    c = '\t';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 8);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 3);
+    rtems_test_assert(dev->output_buf[2] == '\t');
+
+    c = '\b';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 7);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 4);
+    rtems_test_assert(dev->output_buf[3] == '\b');
+
+    c = '\r';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 0);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 5);
+    rtems_test_assert(dev->output_buf[4] == '\r');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_xtabs(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | XTABS;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'a');
+
+    c = '\t';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 8);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 8);
+    rtems_test_assert(dev->output_buf[1] == ' ');
+    rtems_test_assert(dev->output_buf[2] == ' ');
+    rtems_test_assert(dev->output_buf[3] == ' ');
+    rtems_test_assert(dev->output_buf[4] == ' ');
+    rtems_test_assert(dev->output_buf[5] == ' ');
+    rtems_test_assert(dev->output_buf[6] == ' ');
+    rtems_test_assert(dev->output_buf[7] == ' ');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
+static void test_olcuc(test_context *ctx)
+{
+  tcflag_t oflags = OPOST | OLCUC;
+  size_t i;
+
+  for (i = 0; i < DEVICE_COUNT; ++i) {
+    device_context *dev = &ctx->devices[i];
+    char c;
+    ssize_t n;
+
+    dev->tty->column = 0;
+    clear_output(ctx, i);
+
+    clear_set_oflag(ctx, i, 0, oflags);
+
+    c = 'a';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 1);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 1);
+    rtems_test_assert(dev->output_buf[0] == 'A');
+
+    c = 'B';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 2);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 2);
+    rtems_test_assert(dev->output_buf[1] == 'B');
+
+    c = '9';
+    n = write(ctx->fds[i], &c, sizeof(c));
+    rtems_test_assert(n == 1);
+    rtems_test_assert(dev->tty->column == 3);
+    flush_output(ctx, i);
+    rtems_test_assert(dev->output_count == 3);
+    rtems_test_assert(dev->output_buf[2] == '9');
+
+    clear_set_oflag(ctx, i, oflags, 0);
+  }
+}
+
 static void Init(rtems_task_argument arg)
 {
   test_context *ctx = &test_instance;
@@ -573,6 +923,14 @@ static void Init(rtems_task_argument arg)
   test_inlcr(ctx);
   test_rx_callback(ctx);
   test_rx_callback_icanon(ctx);
+  test_onlret(ctx);
+  test_onlcr(ctx);
+  test_onocr(ctx);
+  test_ocrnl(ctx);
+  test_ocrnl_onlret(ctx);
+  test_opost(ctx);
+  test_xtabs(ctx);
+  test_olcuc(ctx);
 
   TEST_END();
   rtems_test_exit(0);



More information about the vc mailing list