xref: /aosp_15_r20/bionic/tests/termios_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #include <termios.h>
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
32*8d67ca89SAndroid Build Coastguard Worker #include <fcntl.h>
33*8d67ca89SAndroid Build Coastguard Worker #include <pty.h>
34*8d67ca89SAndroid Build Coastguard Worker 
35*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker // TODO:
40*8d67ca89SAndroid Build Coastguard Worker // tcdrain
41*8d67ca89SAndroid Build Coastguard Worker // tcflow
42*8d67ca89SAndroid Build Coastguard Worker // tcflush
43*8d67ca89SAndroid Build Coastguard Worker // tcgetattr
44*8d67ca89SAndroid Build Coastguard Worker // tcgetsid
45*8d67ca89SAndroid Build Coastguard Worker // tcsendbreak
46*8d67ca89SAndroid Build Coastguard Worker // tcsetattr
47*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfgetispeed_cfsetispeed)48*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfgetispeed_cfsetispeed) {
49*8d67ca89SAndroid Build Coastguard Worker   termios t = {};
50*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, cfsetispeed(&t, B1200));
51*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<speed_t>(B1200), cfgetispeed(&t));
52*8d67ca89SAndroid Build Coastguard Worker }
53*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfsetispeed_EINVAL)54*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfsetispeed_EINVAL) {
55*8d67ca89SAndroid Build Coastguard Worker   termios t = {};
56*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
57*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, cfsetispeed(&t, 1200));
58*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
59*8d67ca89SAndroid Build Coastguard Worker }
60*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfgetospeed_cfsetospeed)61*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfgetospeed_cfsetospeed) {
62*8d67ca89SAndroid Build Coastguard Worker   termios t = {};
63*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, cfsetospeed(&t, B1200));
64*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<speed_t>(B1200), cfgetospeed(&t));
65*8d67ca89SAndroid Build Coastguard Worker }
66*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfsetospeed_EINVAL)67*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfsetospeed_EINVAL) {
68*8d67ca89SAndroid Build Coastguard Worker   termios t = {};
69*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
70*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, cfsetospeed(&t, 1200));
71*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
72*8d67ca89SAndroid Build Coastguard Worker }
73*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfsetspeed)74*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfsetspeed) {
75*8d67ca89SAndroid Build Coastguard Worker   termios t = {};
76*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, cfsetspeed(&t, B1200));
77*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<speed_t>(B1200), cfgetispeed(&t));
78*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<speed_t>(B1200), cfgetospeed(&t));
79*8d67ca89SAndroid Build Coastguard Worker }
80*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfsetspeed_EINVAL)81*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfsetspeed_EINVAL) {
82*8d67ca89SAndroid Build Coastguard Worker   termios t = {};
83*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
84*8d67ca89SAndroid Build Coastguard Worker   // glibc seems to allow 1200 as well as B1200 here, presumably for
85*8d67ca89SAndroid Build Coastguard Worker   // BSD compatibility (where Bxxx == xxx, unlike Linux).
86*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, cfsetspeed(&t, 123));
87*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
88*8d67ca89SAndroid Build Coastguard Worker }
89*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,cfmakeraw)90*8d67ca89SAndroid Build Coastguard Worker TEST(termios, cfmakeraw) {
91*8d67ca89SAndroid Build Coastguard Worker   termios t;
92*8d67ca89SAndroid Build Coastguard Worker   memset(&t, 0xff, sizeof(t));
93*8d67ca89SAndroid Build Coastguard Worker   cfmakeraw(&t);
94*8d67ca89SAndroid Build Coastguard Worker 
95*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(0U, (t.c_iflag & (IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON)));
96*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(0U, (t.c_oflag & OPOST));
97*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(0U, (t.c_lflag & (ECHO|ECHONL|ICANON|ISIG|IEXTEN)));
98*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(0U, (t.c_cflag & PARENB));
99*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<unsigned>(CS8), (t.c_cflag & CSIZE));
100*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(1, t.c_cc[VMIN]);
101*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(0, t.c_cc[VTIME]);
102*8d67ca89SAndroid Build Coastguard Worker }
103*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,tcgetwinsize_tcsetwinsize_invalid)104*8d67ca89SAndroid Build Coastguard Worker TEST(termios, tcgetwinsize_tcsetwinsize_invalid) {
105*8d67ca89SAndroid Build Coastguard Worker #if !defined(__GLIBC__)
106*8d67ca89SAndroid Build Coastguard Worker   winsize ws = {};
107*8d67ca89SAndroid Build Coastguard Worker 
108*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
109*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, tcgetwinsize(-1, &ws));
110*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EBADF);
111*8d67ca89SAndroid Build Coastguard Worker 
112*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
113*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, tcsetwinsize(-1, &ws));
114*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EBADF);
115*8d67ca89SAndroid Build Coastguard Worker #else
116*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "glibc too old";
117*8d67ca89SAndroid Build Coastguard Worker #endif
118*8d67ca89SAndroid Build Coastguard Worker }
119*8d67ca89SAndroid Build Coastguard Worker 
TEST(termios,tcgetwinsize_tcsetwinsize)120*8d67ca89SAndroid Build Coastguard Worker TEST(termios, tcgetwinsize_tcsetwinsize) {
121*8d67ca89SAndroid Build Coastguard Worker #if !defined(__GLIBC__)
122*8d67ca89SAndroid Build Coastguard Worker   int pty, tty;
123*8d67ca89SAndroid Build Coastguard Worker   winsize ws = {123, 456, 9999, 9999};
124*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, openpty(&pty, &tty, nullptr, nullptr, &ws));
125*8d67ca89SAndroid Build Coastguard Worker 
126*8d67ca89SAndroid Build Coastguard Worker   winsize actual = {};
127*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, tcgetwinsize(tty, &actual));
128*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_xpixel, actual.ws_xpixel);
129*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_ypixel, actual.ws_ypixel);
130*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_row, actual.ws_row);
131*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_col, actual.ws_col);
132*8d67ca89SAndroid Build Coastguard Worker 
133*8d67ca89SAndroid Build Coastguard Worker   ws = {1, 2, 3, 4};
134*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, tcsetwinsize(tty, &ws));
135*8d67ca89SAndroid Build Coastguard Worker 
136*8d67ca89SAndroid Build Coastguard Worker   actual = {};
137*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, tcgetwinsize(tty, &actual));
138*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_xpixel, actual.ws_xpixel);
139*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_ypixel, actual.ws_ypixel);
140*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_row, actual.ws_row);
141*8d67ca89SAndroid Build Coastguard Worker   EXPECT_EQ(ws.ws_col, actual.ws_col);
142*8d67ca89SAndroid Build Coastguard Worker 
143*8d67ca89SAndroid Build Coastguard Worker   close(pty);
144*8d67ca89SAndroid Build Coastguard Worker   close(tty);
145*8d67ca89SAndroid Build Coastguard Worker #else
146*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "glibc too old";
147*8d67ca89SAndroid Build Coastguard Worker #endif
148*8d67ca89SAndroid Build Coastguard Worker }
149