"""Test to ensure we're not touching /dev/ptmx when running commands."""

import os
import subprocess
import tempfile
import time
import unittest
from utils import command_executer


class NoPsuedoTerminalTest(unittest.TestCase):

  STRACE_TIMEOUT = 10

  def _AttachStraceToSelf(self, output_file):
    """Attaches strace to the current process."""
    args = ["strace", "-o", output_file, "-p", str(os.getpid())]
    print args
    self._strace_process = subprocess.Popen(args)
    # 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()."""
    self._strace_process.terminate()
    self._strace_process.wait()
    return True

  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()
