#!/usr/bin/python3
"""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()
