#!/usr/bin/env python3
|
#
|
# Copyright 2018 - The Android Open Source Project
|
#
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
# you may not use this file except in compliance with the License.
|
# You may obtain a copy of the License at
|
#
|
# http://www.apache.org/licenses/LICENSE-2.0
|
#
|
# Unless required by applicable law or agreed to in writing, software
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# See the License for the specific language governing permissions and
|
# limitations under the License.
|
|
|
"""Unittests for ide_util."""
|
|
import os
|
import unittest
|
from unittest import mock
|
from unittest.mock import patch
|
|
from subprocess import CalledProcessError as cmd_err
|
|
from aidegen.lib.android_dev_os import AndroidDevOS
|
from aidegen.lib import ide_util
|
from aidegen.lib.ide_util import IdeBase
|
from aidegen.lib.ide_util import IdeIntelliJ
|
from aidegen.lib.ide_util import IdeLinuxEclipse
|
from aidegen.lib.ide_util import IdeLinuxIntelliJ
|
from aidegen.lib.ide_util import IdeLinuxStudio
|
from aidegen.lib.ide_util import IdeMacEclipse
|
from aidegen.lib.ide_util import IdeMacIntelliJ
|
from aidegen.lib.ide_util import IdeMacStudio
|
from aidegen.lib.ide_util import IdeUtil
|
|
|
import aidegen.unittest_constants as uc
|
|
|
#pylint: disable=protected-access
|
class IdeUtilUnittests(unittest.TestCase):
|
"""Unit tests for ide_util.py."""
|
|
_TEST_PRJ_PATH1 = ''
|
_TEST_PRJ_PATH2 = ''
|
_TEST_PRJ_PATH3 = ''
|
_TEST_PRJ_PATH4 = ''
|
|
|
def setUp(self):
|
"""Prepare the testdata related path."""
|
IdeUtilUnittests._TEST_PRJ_PATH1 = os.path.join(uc.TEST_DATA_PATH,
|
'android_facet.iml')
|
IdeUtilUnittests._TEST_PRJ_PATH2 = os.path.join(uc.TEST_DATA_PATH,
|
'project/test.java')
|
IdeUtilUnittests._TEST_PRJ_PATH3 = uc.TEST_DATA_PATH
|
IdeUtilUnittests._TEST_PRJ_PATH4 = os.path.join(uc.TEST_DATA_PATH,
|
'.idea')
|
|
|
def tearDown(self):
|
"""Clear the testdata related path."""
|
IdeUtilUnittests._TEST_PRJ_PATH1 = ''
|
IdeUtilUnittests._TEST_PRJ_PATH2 = ''
|
IdeUtilUnittests._TEST_PRJ_PATH3 = ''
|
IdeUtilUnittests._TEST_PRJ_PATH4 = ''
|
|
def test_is_intellij_project(self):
|
"""Test _is_intellij_project."""
|
self.assertFalse(
|
ide_util._is_intellij_project(IdeUtilUnittests._TEST_PRJ_PATH2))
|
self.assertTrue(
|
ide_util._is_intellij_project(IdeUtilUnittests._TEST_PRJ_PATH1))
|
self.assertTrue(
|
ide_util._is_intellij_project(IdeUtilUnittests._TEST_PRJ_PATH3))
|
self.assertFalse(
|
ide_util._is_intellij_project(IdeUtilUnittests._TEST_PRJ_PATH4))
|
|
@mock.patch('glob.glob', return_value=uc.IDEA_SH_FIND_NONE)
|
def test_get_intellij_sh_none(self, mock_glob):
|
"""Test with the cmd return none, test result should be None."""
|
mock_glob.return_value = uc.IDEA_SH_FIND_NONE
|
self.assertEqual(
|
None,
|
ide_util._get_intellij_version_path(IdeLinuxIntelliJ()._ls_ce_path))
|
self.assertEqual(
|
None,
|
ide_util._get_intellij_version_path(IdeLinuxIntelliJ()._ls_ue_path))
|
|
@mock.patch('builtins.input')
|
@mock.patch('glob.glob', return_value=uc.IDEA_SH_FIND)
|
def test_ask_preference(self, mock_glob, mock_input):
|
"""Ask users' preference, the result should be equal to test data."""
|
mock_glob.return_value = uc.IDEA_SH_FIND
|
mock_input.return_value = '1'
|
self.assertEqual(
|
ide_util._ask_preference(uc.IDEA_SH_FIND), uc.IDEA_SH_FIND[0])
|
mock_input.return_value = '2'
|
self.assertEqual(
|
ide_util._ask_preference(uc.IDEA_SH_FIND), uc.IDEA_SH_FIND[1])
|
|
@unittest.skip('Skip to use real command to launch IDEA.')
|
def test_run_intellij_sh_in_linux(self):
|
"""Follow the target behavior, with sh to show UI, else raise err."""
|
sh_path = IdeLinuxIntelliJ()._get_script_from_system()
|
if sh_path:
|
ide_util_obj = IdeUtil()
|
ide_util_obj.launch_ide(IdeUtilUnittests._TEST_PRJ_PATH1)
|
else:
|
self.assertRaises(cmd_err)
|
|
@mock.patch.object(ide_util, '_get_linux_ide')
|
@mock.patch.object(ide_util, '_get_mac_ide')
|
def test_get_ide(self, mock_mac, mock_linux):
|
"""Test if _get_ide calls the correct respective functions."""
|
ide_util._get_ide(None, 'j', False, is_mac=True)
|
self.assertTrue(mock_mac.called)
|
ide_util._get_ide(None, 'j', False, is_mac=False)
|
self.assertTrue(mock_linux.called)
|
|
def test_get_mac_and_linux_ide(self):
|
"""Test if _get_mac_ide and _get_linux_ide return correct IDE class."""
|
self.assertIsInstance(ide_util._get_mac_ide(), IdeMacIntelliJ)
|
self.assertIsInstance(ide_util._get_mac_ide(None, 's'), IdeMacStudio)
|
self.assertIsInstance(ide_util._get_mac_ide(None, 'e'), IdeMacEclipse)
|
self.assertIsInstance(ide_util._get_linux_ide(), IdeLinuxIntelliJ)
|
self.assertIsInstance(
|
ide_util._get_linux_ide(None, 's'), IdeLinuxStudio)
|
self.assertIsInstance(
|
ide_util._get_linux_ide(None, 'e'), IdeLinuxEclipse)
|
|
@mock.patch.object(ide_util, '_get_script_from_input_path')
|
@mock.patch.object(IdeIntelliJ, '_get_script_from_system')
|
def test_init_ideintellij(self, mock_sys, mock_input):
|
"""Test IdeIntelliJ's __init__ method."""
|
IdeLinuxIntelliJ()
|
self.assertTrue(mock_sys.called)
|
IdeMacIntelliJ()
|
self.assertTrue(mock_sys.called)
|
IdeLinuxIntelliJ('some_path')
|
self.assertTrue(mock_input.called)
|
IdeMacIntelliJ('some_path')
|
self.assertTrue(mock_input.called)
|
|
@mock.patch.object(IdeIntelliJ, '_get_config_root_paths')
|
@mock.patch.object(IdeBase, 'apply_optional_config')
|
def test_config_ide(self, mock_config, mock_paths):
|
"""Test IDEA, IdeUtil.config_ide won't call base none implement api."""
|
util_obj = IdeUtil()
|
util_obj.config_ide()
|
self.assertFalse(mock_config.called)
|
self.assertFalse(mock_paths.called)
|
|
@patch.object(ide_util, '_get_script_from_input_path')
|
@patch.object(ide_util, '_get_script_from_internal_path')
|
def test_get_linux_config_1(self, mock_path, mock_path_2):
|
"""Test to get unique config path for linux IDEA case."""
|
if not AndroidDevOS.MAC == AndroidDevOS.get_os_type():
|
mock_path.return_value = '/opt/intelliJ-ce-2018.3/bin/idea.sh'
|
mock_path_2.return_value = '/opt/intelliJ-ce-2018.3/bin/idea.sh'
|
ide_obj = IdeLinuxIntelliJ()
|
self.assertEqual(1, len(ide_obj._get_config_root_paths()))
|
else:
|
self.assertTrue(AndroidDevOS.MAC == AndroidDevOS.get_os_type())
|
|
@patch('glob.glob')
|
@patch.object(ide_util, '_get_script_from_input_path')
|
@patch.object(ide_util, '_get_script_from_internal_path')
|
def test_get_linux_config_2(self, mock_path, mock_path_2, mock_filter):
|
"""Test to get unique config path for linux IDEA case."""
|
if not AndroidDevOS.MAC == AndroidDevOS.get_os_type():
|
mock_path.return_value = '/opt/intelliJ-ce-2018.3/bin/idea.sh'
|
mock_path_2.return_value = '/opt/intelliJ-ce-2018.3/bin/idea.sh'
|
ide_obj = IdeLinuxIntelliJ()
|
mock_filter.called = False
|
ide_obj._get_config_root_paths()
|
self.assertFalse(mock_filter.called)
|
else:
|
self.assertTrue(AndroidDevOS.MAC == AndroidDevOS.get_os_type())
|
|
def test_get_mac_config_root_paths(self):
|
"""Return None if there's no install path."""
|
if AndroidDevOS.MAC == AndroidDevOS.get_os_type():
|
mac_ide = IdeMacIntelliJ()
|
mac_ide._installed_path = None
|
self.assertIsNone(mac_ide._get_config_root_paths())
|
else:
|
self.assertFalse(AndroidDevOS.MAC == AndroidDevOS.get_os_type())
|
|
@patch('glob.glob')
|
@patch.object(ide_util, '_get_script_from_input_path')
|
@patch.object(ide_util, '_get_script_from_internal_path')
|
def test_get_linux_config_root(self, mock_path_1, mock_path_2, mock_filter):
|
"""Test to go filter logic for self download case."""
|
mock_path_1.return_value = '/usr/tester/IDEA/IC2018.3.3/bin'
|
mock_path_2.return_value = '/usr/tester/IDEA/IC2018.3.3/bin'
|
ide_obj = IdeLinuxIntelliJ()
|
mock_filter.reset()
|
ide_obj._get_config_root_paths()
|
self.assertTrue(mock_filter.called)
|
|
@patch('os.path.join')
|
def test_get_code_style_config(self, mock_join_path):
|
"""Test return None, when no config source case existed."""
|
mock_join_path.return_value = '/usr/tester/no_file.test'
|
self.assertIsNone(ide_util.IdeIntelliJ._get_code_style_config())
|
|
@patch('shutil.copy2')
|
@patch.object(IdeIntelliJ, '_get_code_style_config')
|
def test_apply_optional_config(self, mock_config_path, mock_copy):
|
"""Test copy logic should not work if there's no config source."""
|
mock_config_path.return_value = None
|
ide_obj = IdeIntelliJ()
|
ide_obj.apply_optional_config()
|
self.assertFalse(mock_copy.called)
|
|
|
if __name__ == '__main__':
|
unittest.main()
|