#!/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()
