"""Unit tests for shell_wrapper.py."""

import mock
import unittest

from autotest_lib.client.cros.faft.utils import shell_wrapper


class TestLocalShell(unittest.TestCase):
    """Tests for shell_wrapper.LocalShell()."""

    @mock.patch('subprocess.Popen')
    def testSuccessTokenAbsent(self, mock_subproc_popen):
        cmd = 'foo'
        success_token = 'unexpected'
        mock_process = mock.Mock()
        mock_subproc_popen.return_value = mock_process
        attrs = {'communicate.return_value': ('sucessfully executed foo', '')}
        mock_process.configure_mock(**attrs)
        os_if = mock.Mock()
        local_shell = shell_wrapper.LocalShell(os_if)
        self.assertFalse(
                local_shell.run_command_check_output(cmd, success_token))

    @mock.patch('subprocess.Popen')
    def testSuccessTokenPresent(self, mock_subproc_popen):
        cmd = 'bar'
        success_token = 'expected'
        mock_process = mock.Mock()
        mock_subproc_popen.return_value = mock_process
        attrs = {
                'communicate.return_value':
                ('successfully executed bar. expected is expected.', '')
        }
        mock_process.configure_mock(**attrs)
        os_if = mock.Mock()
        local_shell = shell_wrapper.LocalShell(os_if)
        self.assertTrue(
                local_shell.run_command_check_output(cmd, success_token))

    @mock.patch('subprocess.Popen')
    def testSuccessTokenMalformed(self, mock_subproc_popen):
        cmd = 'baz'
        success_token = 'malformed token \n'
        mock_process = mock.Mock()
        mock_subproc_popen.return_value = mock_process
        attrs = {'communicate.return_value': ('successfully executed baz', '')}
        mock_process.configure_mock(**attrs)
        os_if = mock.Mock()
        local_shell = shell_wrapper.LocalShell(os_if)
        self.assertRaises(shell_wrapper.UnsupportedSuccessToken,
                          local_shell.run_command_check_output, cmd,
                          success_token)


if __name__ == '__main__':
    unittest.main()
