import os import infra.basetest class TestLess(infra.basetest.BRTest): config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \ """ BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_LESS=y BR2_TARGET_ROOTFS_CPIO=y # BR2_TARGET_ROOTFS_TAR is not set """ 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() # Check the program can execute. This command also checks that # the "less" program is from the actual "less" package, rather # than the Busybox implementation (the Busybox "less" applet # does not recognize the "--version" option and would fail). self.assertRunOk("less --version") # We create a test file. ref_txt = "Hello Buildroot!" input_fname = "input.txt" self.assertRunOk(f"echo \'{ref_txt}\' > {input_fname}") # "less" is mainly an interactive user program and uses # terminal control characters. This test checks a basic "less" # invocation in which there is no user interaction. The # program is expected to give back the input data. output, exit_code = self.emulator.run(f"less -F {input_fname}") self.assertEqual(exit_code, 0) # "less" might insert a carriage-return ^M control character, # which will be converted to a new-line (by the # str.splitlines() in Emulator.run()). We check that our # reference text line is in the output (rather than only # testing output[0]). self.assertIn(ref_txt, output) # We redo about the same test, with "less" reading stdin this # time. We also use the "less -o log" option to log the output # into a file. We expect to see our reference text on stdout. output_fname = "output.txt" cmd = f"cat {input_fname} | less -F -o {output_fname}" output, exit_code = self.emulator.run(cmd) self.assertEqual(exit_code, 0) self.assertIn(ref_txt, output) # The output file content which logged the output is also # expected to be the same as the input. self.assertRunOk(f"cmp {input_fname} {output_fname}")