import os import time import infra.basetest class TestTio(infra.basetest.BRTest): config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \ """ BR2_PACKAGE_LUA=y BR2_PACKAGE_SOCAT=y BR2_PACKAGE_TIO=y BR2_TARGET_ROOTFS_CPIO=y # BR2_TARGET_ROOTFS_TAR is not set """ def get_tty_name(self): out, ret = self.emulator.run("tty") self.assertEqual(ret, 0) return out[0] def test_run(self): cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio") self.emulator.boot(arch="armv5", kernel="builtin", options=["-initrd", cpio_file]) self.emulator.login() # We check the program can run self.assertRunOk("tio --version") # We save our tty name for later. initial_tty = self.get_tty_name() # We define two arbitrary pseudo-terminals, for our test. pty1 = "pty1_getty" pty2 = "pty2_tio" # We create our 2 PTYs with socat and connect them together. cmd = "( socat" for pty in [pty1, pty2]: cmd += f" PTY,link=/dev/{pty},rawer,b115200" cmd += " &> /dev/null & )" self.assertRunOk(cmd) # We wait for socat to be ready... for attempt in range(3 * self.timeout_multiplier): time.sleep(1) cmd = f"test -e /dev/{pty1} -a -e /dev/{pty2}" _, ret = self.emulator.run(cmd) if ret == 0: break else: self.fail("Timeout while waiting for socat.") # We start getty on our first PTY. self.assertRunOk(f"setsid getty {pty1} 115200 vt100") # We start tio on our second PTY and send a new line. # We wait for tio to be ready then send a new line. # After that, we expect to see a new login. self.emulator.qemu.sendline(f"tio /dev/{pty2}") self.emulator.qemu.expect(f"Connected to /dev/{pty2}") self.emulator.qemu.sendline() # We try to re-login, in tio this time. self.emulator.login() # We get again our tty name. tio_tty = self.get_tty_name() # We check our second login TTY name is different from the one # in the first login. self.assertNotEqual(initial_tty, tio_tty)