#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Copyright 2019 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Test to ensure we're not touching /dev/ptmx when running commands.""" import os import subprocess import tempfile import time import unittest from cros_utils import command_executer class NoPsuedoTerminalTest(unittest.TestCase): """Test to ensure we're not touching /dev/ptmx when running commands.""" _strace_process = None STRACE_TIMEOUT = 10 def _AttachStraceToSelf(self, output_file): """Attaches strace to the current process.""" args = ["sudo", "strace", "-o", output_file, "-p", str(os.getpid())] print(args) # pylint: disable=bad-option-value, subprocess-popen-preexec-fn self._strace_process = subprocess.Popen(args, preexec_fn=os.setpgrp) # Wait until we see some activity. start_time = time.time() while time.time() - start_time < self.STRACE_TIMEOUT: if os.path.isfile(output_file) and open(output_file).read(1): return True time.sleep(1) return False def _KillStraceProcess(self): """Kills strace that was started by _AttachStraceToSelf().""" pgid = os.getpgid(self._strace_process.pid) args = ["sudo", "kill", str(pgid)] if subprocess.call(args) == 0: os.waitpid(pgid, 0) return True return False def testNoPseudoTerminalWhenRunningCommand(self): """Test to make sure we're not touching /dev/ptmx when running commands.""" temp_file = tempfile.mktemp() self.assertTrue(self._AttachStraceToSelf(temp_file)) ce = command_executer.GetCommandExecuter() ce.RunCommand("echo") self.assertTrue(self._KillStraceProcess()) strace_contents = open(temp_file).read() self.assertFalse("/dev/ptmx" in strace_contents) if __name__ == "__main__": unittest.main()