diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-02-24 11:46:26 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-02-28 09:05:47 +0100 |
commit | 06d14667f7cb7a03f8e9fa8a6c97b78fbed30d6a (patch) | |
tree | ac8623addb6880e9388b72ae70674374eeb3eea6 | |
parent | termios: Fix infinite loop in receive path (diff) | |
download | rtems-06d14667f7cb7a03f8e9fa8a6c97b78fbed30d6a.tar.bz2 |
termios09: Test output post processing
-rw-r--r-- | testsuites/libtests/termios09/init.c | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/testsuites/libtests/termios09/init.c b/testsuites/libtests/termios09/init.c index 980a6ea9ec..2e40ebf5e3 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); |