xref: /aosp_15_r20/tools/asuite/aidegen/lib/ide_util_unittest.py (revision c2e18aaa1096c836b086f94603d04f4eb9cf37f5)
1*c2e18aaaSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*c2e18aaaSAndroid Build Coastguard Worker#
3*c2e18aaaSAndroid Build Coastguard Worker# Copyright 2018 - The Android Open Source Project
4*c2e18aaaSAndroid Build Coastguard Worker#
5*c2e18aaaSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*c2e18aaaSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*c2e18aaaSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*c2e18aaaSAndroid Build Coastguard Worker#
9*c2e18aaaSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*c2e18aaaSAndroid Build Coastguard Worker#
11*c2e18aaaSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*c2e18aaaSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*c2e18aaaSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c2e18aaaSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*c2e18aaaSAndroid Build Coastguard Worker# limitations under the License.
16*c2e18aaaSAndroid Build Coastguard Worker
17*c2e18aaaSAndroid Build Coastguard Worker
18*c2e18aaaSAndroid Build Coastguard Worker"""Unittests for ide_util."""
19*c2e18aaaSAndroid Build Coastguard Worker
20*c2e18aaaSAndroid Build Coastguard Workerimport os
21*c2e18aaaSAndroid Build Coastguard Workerimport shutil
22*c2e18aaaSAndroid Build Coastguard Workerimport subprocess
23*c2e18aaaSAndroid Build Coastguard Workerimport tempfile
24*c2e18aaaSAndroid Build Coastguard Workerimport unittest
25*c2e18aaaSAndroid Build Coastguard Worker
26*c2e18aaaSAndroid Build Coastguard Workerfrom unittest import mock
27*c2e18aaaSAndroid Build Coastguard Workerfrom xml.etree import ElementTree
28*c2e18aaaSAndroid Build Coastguard Worker
29*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen import aidegen_main
30*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen import unittest_constants
31*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import android_dev_os
32*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import common_util
33*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import config
34*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import errors
35*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import ide_common_util
36*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import ide_util
37*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import project_config
38*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import project_file_gen
39*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.sdk import jdk_table
40*c2e18aaaSAndroid Build Coastguard Worker
41*c2e18aaaSAndroid Build Coastguard Worker
42*c2e18aaaSAndroid Build Coastguard Worker# pylint: disable=protected-access
43*c2e18aaaSAndroid Build Coastguard Worker# pylint: disable-msg=too-many-arguments
44*c2e18aaaSAndroid Build Coastguard Worker# pylint: disable-msg=unused-argument
45*c2e18aaaSAndroid Build Coastguard Workerclass IdeUtilUnittests(unittest.TestCase):
46*c2e18aaaSAndroid Build Coastguard Worker    """Unit tests for ide_util.py."""
47*c2e18aaaSAndroid Build Coastguard Worker
48*c2e18aaaSAndroid Build Coastguard Worker    _TEST_PRJ_PATH1 = ''
49*c2e18aaaSAndroid Build Coastguard Worker    _TEST_PRJ_PATH2 = ''
50*c2e18aaaSAndroid Build Coastguard Worker    _TEST_PRJ_PATH3 = ''
51*c2e18aaaSAndroid Build Coastguard Worker    _TEST_PRJ_PATH4 = ''
52*c2e18aaaSAndroid Build Coastguard Worker    _MODULE_XML_SAMPLE = ''
53*c2e18aaaSAndroid Build Coastguard Worker    _TEST_DIR = None
54*c2e18aaaSAndroid Build Coastguard Worker    _TEST_XML_CONTENT = """\
55*c2e18aaaSAndroid Build Coastguard Worker<application>
56*c2e18aaaSAndroid Build Coastguard Worker  <component name="FileTypeManager" version="17">
57*c2e18aaaSAndroid Build Coastguard Worker    <extensionMap>
58*c2e18aaaSAndroid Build Coastguard Worker      <mapping ext="pi" type="Python"/>
59*c2e18aaaSAndroid Build Coastguard Worker    </extensionMap>
60*c2e18aaaSAndroid Build Coastguard Worker  </component>
61*c2e18aaaSAndroid Build Coastguard Worker</application>"""
62*c2e18aaaSAndroid Build Coastguard Worker    _TEST_XML_CONTENT_2 = """\
63*c2e18aaaSAndroid Build Coastguard Worker<application>
64*c2e18aaaSAndroid Build Coastguard Worker  <component name="FileTypeManager" version="17">
65*c2e18aaaSAndroid Build Coastguard Worker    <extensionMap>
66*c2e18aaaSAndroid Build Coastguard Worker      <mapping ext="pi" type="Python"/>
67*c2e18aaaSAndroid Build Coastguard Worker      <mapping pattern="test" type="a"/>
68*c2e18aaaSAndroid Build Coastguard Worker      <mapping pattern="TEST_MAPPING" type="a"/>
69*c2e18aaaSAndroid Build Coastguard Worker    </extensionMap>
70*c2e18aaaSAndroid Build Coastguard Worker  </component>
71*c2e18aaaSAndroid Build Coastguard Worker</application>"""
72*c2e18aaaSAndroid Build Coastguard Worker
73*c2e18aaaSAndroid Build Coastguard Worker    def setUp(self):
74*c2e18aaaSAndroid Build Coastguard Worker        """Prepare the testdata related path."""
75*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH1 = os.path.join(
76*c2e18aaaSAndroid Build Coastguard Worker            unittest_constants.TEST_DATA_PATH, 'android_facet.iml')
77*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH2 = os.path.join(
78*c2e18aaaSAndroid Build Coastguard Worker            unittest_constants.TEST_DATA_PATH, 'project/test.java')
79*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH3 = unittest_constants.TEST_DATA_PATH
80*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH4 = os.path.join(
81*c2e18aaaSAndroid Build Coastguard Worker            unittest_constants.TEST_DATA_PATH, '.idea')
82*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._MODULE_XML_SAMPLE = os.path.join(
83*c2e18aaaSAndroid Build Coastguard Worker            unittest_constants.TEST_DATA_PATH, 'modules.xml')
84*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_DIR = tempfile.mkdtemp()
85*c2e18aaaSAndroid Build Coastguard Worker
86*c2e18aaaSAndroid Build Coastguard Worker    def tearDown(self):
87*c2e18aaaSAndroid Build Coastguard Worker        """Clear the testdata related path."""
88*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH1 = ''
89*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH2 = ''
90*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH3 = ''
91*c2e18aaaSAndroid Build Coastguard Worker        IdeUtilUnittests._TEST_PRJ_PATH4 = ''
92*c2e18aaaSAndroid Build Coastguard Worker        shutil.rmtree(IdeUtilUnittests._TEST_DIR)
93*c2e18aaaSAndroid Build Coastguard Worker
94*c2e18aaaSAndroid Build Coastguard Worker    @unittest.skip('Skip to use real command to launch IDEA.')
95*c2e18aaaSAndroid Build Coastguard Worker    def test_run_intellij_sh_in_linux(self):
96*c2e18aaaSAndroid Build Coastguard Worker        """Follow the target behavior, with sh to show UI, else raise err."""
97*c2e18aaaSAndroid Build Coastguard Worker        sh_path = ide_util.IdeLinuxIntelliJ()._get_script_from_system()
98*c2e18aaaSAndroid Build Coastguard Worker        if sh_path:
99*c2e18aaaSAndroid Build Coastguard Worker            ide_util_obj = ide_util.IdeUtil()
100*c2e18aaaSAndroid Build Coastguard Worker            ide_util_obj.config_ide(IdeUtilUnittests._TEST_PRJ_PATH1)
101*c2e18aaaSAndroid Build Coastguard Worker            ide_util_obj.launch_ide()
102*c2e18aaaSAndroid Build Coastguard Worker        else:
103*c2e18aaaSAndroid Build Coastguard Worker            self.assertRaises(subprocess.CalledProcessError)
104*c2e18aaaSAndroid Build Coastguard Worker
105*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util, '_get_linux_ide')
106*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util, '_get_mac_ide')
107*c2e18aaaSAndroid Build Coastguard Worker    def test_get_ide(self, mock_mac, mock_linux):
108*c2e18aaaSAndroid Build Coastguard Worker        """Test if _get_ide calls the correct respective functions."""
109*c2e18aaaSAndroid Build Coastguard Worker        ide_util._get_ide(None, 'j', False, is_mac=True)
110*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_mac.called)
111*c2e18aaaSAndroid Build Coastguard Worker        ide_util._get_ide(None, 'j', False, is_mac=False)
112*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_linux.called)
113*c2e18aaaSAndroid Build Coastguard Worker
114*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeBase, '_get_user_preference')
115*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
116*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeEclipse, '_get_script_from_system')
117*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_preferred_version')
118*c2e18aaaSAndroid Build Coastguard Worker    def test_get_mac_and_linux_ide(self, mock_preference, mock_path, mock_cfg,
119*c2e18aaaSAndroid Build Coastguard Worker                                   mock_version):
120*c2e18aaaSAndroid Build Coastguard Worker        """Test if _get_mac_ide and _get_linux_ide return correct IDE class."""
121*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.return_value = None
122*c2e18aaaSAndroid Build Coastguard Worker        mock_path.return_value = 'path'
123*c2e18aaaSAndroid Build Coastguard Worker        mock_cfg.return_value = None
124*c2e18aaaSAndroid Build Coastguard Worker        mock_version.return_value = 'default'
125*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(ide_util._get_mac_ide(), ide_util.IdeMacIntelliJ)
126*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(ide_util._get_mac_ide(None, 's'),
127*c2e18aaaSAndroid Build Coastguard Worker                              ide_util.IdeMacStudio)
128*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(ide_util._get_mac_ide(None, 'e'),
129*c2e18aaaSAndroid Build Coastguard Worker                              ide_util.IdeMacEclipse)
130*c2e18aaaSAndroid Build Coastguard Worker
131*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(ide_util._get_mac_ide(None, 'c'),
132*c2e18aaaSAndroid Build Coastguard Worker                              ide_util.IdeMacCLion)
133*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(ide_util._get_linux_ide(),
134*c2e18aaaSAndroid Build Coastguard Worker                              ide_util.IdeLinuxIntelliJ)
135*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(
136*c2e18aaaSAndroid Build Coastguard Worker            ide_util._get_linux_ide(None, 's'), ide_util.IdeLinuxStudio)
137*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(
138*c2e18aaaSAndroid Build Coastguard Worker            ide_util._get_linux_ide(None, 'e'), ide_util.IdeLinuxEclipse)
139*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(
140*c2e18aaaSAndroid Build Coastguard Worker            ide_util._get_linux_ide(None, 'c'), ide_util.IdeLinuxCLion)
141*c2e18aaaSAndroid Build Coastguard Worker
142*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_set_installed_path')
143*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_input_path')
144*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_script_from_system')
145*c2e18aaaSAndroid Build Coastguard Worker    def test_init_ideintellij(self, mock_sys, mock_input, mock_set):
146*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeIntelliJ's __init__ method."""
147*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeLinuxIntelliJ()
148*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_sys.called)
149*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeMacIntelliJ()
150*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_sys.called)
151*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeLinuxIntelliJ('some_path')
152*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_input.called)
153*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_set.called)
154*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeMacIntelliJ('some_path')
155*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_input.called)
156*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_set.called)
157*c2e18aaaSAndroid Build Coastguard Worker
158*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_preferred_version')
159*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_config_root_paths')
160*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeBase, 'apply_optional_config')
161*c2e18aaaSAndroid Build Coastguard Worker    def test_config_ide(self, mock_config, mock_paths, mock_preference):
162*c2e18aaaSAndroid Build Coastguard Worker        """Test IDEA, IdeUtil.config_ide won't call base none implement api."""
163*c2e18aaaSAndroid Build Coastguard Worker        # Mock SDkConfig flow to not generate real jdk config file.
164*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.return_value = None
165*c2e18aaaSAndroid Build Coastguard Worker        module_path = os.path.join(self._TEST_DIR, 'test')
166*c2e18aaaSAndroid Build Coastguard Worker        idea_path = os.path.join(module_path, '.idea')
167*c2e18aaaSAndroid Build Coastguard Worker        os.makedirs(idea_path)
168*c2e18aaaSAndroid Build Coastguard Worker        shutil.copy(IdeUtilUnittests._MODULE_XML_SAMPLE, idea_path)
169*c2e18aaaSAndroid Build Coastguard Worker        util_obj = ide_util.IdeUtil()
170*c2e18aaaSAndroid Build Coastguard Worker        util_obj.config_ide(module_path)
171*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_config.called)
172*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_paths.called)
173*c2e18aaaSAndroid Build Coastguard Worker
174*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_setup_ide')
175*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
176*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(os.path, 'isfile')
177*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(os.path, 'realpath')
178*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_input_path')
179*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_internal_path')
180*c2e18aaaSAndroid Build Coastguard Worker    def test_get_linux_config_1(self, mock_path, mock_path2, mock_path3,
181*c2e18aaaSAndroid Build Coastguard Worker                                mock_is_file, mock_cfg, mock_setup_ide):
182*c2e18aaaSAndroid Build Coastguard Worker        """Test to get unique config path for linux IDEA case."""
183*c2e18aaaSAndroid Build Coastguard Worker        if (not android_dev_os.AndroidDevOS.MAC ==
184*c2e18aaaSAndroid Build Coastguard Worker                android_dev_os.AndroidDevOS.get_os_type()):
185*c2e18aaaSAndroid Build Coastguard Worker            mock_path.return_value = ['/opt/intellij-ce-2018.3/bin/idea.sh']
186*c2e18aaaSAndroid Build Coastguard Worker            mock_path2.return_value = ['/opt/intellij-ce-2018.3/bin/idea.sh']
187*c2e18aaaSAndroid Build Coastguard Worker            mock_path3.return_value = '/opt/intellij-ce-2018.3/bin/idea.sh'
188*c2e18aaaSAndroid Build Coastguard Worker            mock_is_file.return_value = True
189*c2e18aaaSAndroid Build Coastguard Worker            mock_cfg.return_value = None
190*c2e18aaaSAndroid Build Coastguard Worker            mock_setup_ide.return_value = None
191*c2e18aaaSAndroid Build Coastguard Worker            ide_obj = ide_util.IdeLinuxIntelliJ('default_path')
192*c2e18aaaSAndroid Build Coastguard Worker            self.assertEqual(1, len(ide_obj._get_config_root_paths()))
193*c2e18aaaSAndroid Build Coastguard Worker        else:
194*c2e18aaaSAndroid Build Coastguard Worker            self.assertTrue((android_dev_os.AndroidDevOS.MAC ==
195*c2e18aaaSAndroid Build Coastguard Worker                             android_dev_os.AndroidDevOS.get_os_type()))
196*c2e18aaaSAndroid Build Coastguard Worker
197*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
198*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('glob.glob')
199*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_input_path')
200*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_internal_path')
201*c2e18aaaSAndroid Build Coastguard Worker    def test_get_linux_config_2(self, mock_path, mock_path_2, mock_filter,
202*c2e18aaaSAndroid Build Coastguard Worker                                mock_cfg):
203*c2e18aaaSAndroid Build Coastguard Worker        """Test to get unique config path for linux IDEA case."""
204*c2e18aaaSAndroid Build Coastguard Worker        if (not android_dev_os.AndroidDevOS.MAC ==
205*c2e18aaaSAndroid Build Coastguard Worker                android_dev_os.AndroidDevOS.get_os_type()):
206*c2e18aaaSAndroid Build Coastguard Worker            mock_path.return_value = ['/opt/intelliJ-ce-2018.3/bin/idea.sh']
207*c2e18aaaSAndroid Build Coastguard Worker            mock_path_2.return_value = ['/opt/intelliJ-ce-2018.3/bin/idea.sh']
208*c2e18aaaSAndroid Build Coastguard Worker            mock_cfg.return_value = None
209*c2e18aaaSAndroid Build Coastguard Worker            ide_obj = ide_util.IdeLinuxIntelliJ()
210*c2e18aaaSAndroid Build Coastguard Worker            mock_filter.called = False
211*c2e18aaaSAndroid Build Coastguard Worker            ide_obj._get_config_root_paths()
212*c2e18aaaSAndroid Build Coastguard Worker            self.assertFalse(mock_filter.called)
213*c2e18aaaSAndroid Build Coastguard Worker        else:
214*c2e18aaaSAndroid Build Coastguard Worker            self.assertTrue((android_dev_os.AndroidDevOS.MAC ==
215*c2e18aaaSAndroid Build Coastguard Worker                             android_dev_os.AndroidDevOS.get_os_type()))
216*c2e18aaaSAndroid Build Coastguard Worker
217*c2e18aaaSAndroid Build Coastguard Worker    def test_get_mac_config_root_paths(self):
218*c2e18aaaSAndroid Build Coastguard Worker        """Return None if there's no install path."""
219*c2e18aaaSAndroid Build Coastguard Worker        if (android_dev_os.AndroidDevOS.MAC ==
220*c2e18aaaSAndroid Build Coastguard Worker                android_dev_os.AndroidDevOS.get_os_type()):
221*c2e18aaaSAndroid Build Coastguard Worker            mac_ide = ide_util.IdeMacIntelliJ()
222*c2e18aaaSAndroid Build Coastguard Worker            mac_ide._installed_path = None
223*c2e18aaaSAndroid Build Coastguard Worker            self.assertIsNone(mac_ide._get_config_root_paths())
224*c2e18aaaSAndroid Build Coastguard Worker        else:
225*c2e18aaaSAndroid Build Coastguard Worker            self.assertFalse((android_dev_os.AndroidDevOS.MAC ==
226*c2e18aaaSAndroid Build Coastguard Worker                              android_dev_os.AndroidDevOS.get_os_type()))
227*c2e18aaaSAndroid Build Coastguard Worker
228*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
229*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('glob.glob')
230*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_input_path')
231*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_script_from_internal_path')
232*c2e18aaaSAndroid Build Coastguard Worker    def test_get_linux_config_root(self, mock_path_1, mock_path_2, mock_filter,
233*c2e18aaaSAndroid Build Coastguard Worker                                   mock_cfg):
234*c2e18aaaSAndroid Build Coastguard Worker        """Test to go filter logic for self download case."""
235*c2e18aaaSAndroid Build Coastguard Worker        mock_path_1.return_value = ['/usr/tester/IDEA/IC2018.3.3/bin']
236*c2e18aaaSAndroid Build Coastguard Worker        mock_path_2.return_value = ['/usr/tester/IDEA/IC2018.3.3/bin']
237*c2e18aaaSAndroid Build Coastguard Worker        mock_cfg.return_value = None
238*c2e18aaaSAndroid Build Coastguard Worker        ide_obj = ide_util.IdeLinuxIntelliJ()
239*c2e18aaaSAndroid Build Coastguard Worker        mock_filter.reset()
240*c2e18aaaSAndroid Build Coastguard Worker        ide_obj._get_config_root_paths()
241*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_filter.called)
242*c2e18aaaSAndroid Build Coastguard Worker
243*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeBase, '_add_test_mapping_file_type')
244*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.IdeaProperties, 'set_max_file_size')
245*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(project_file_gen, 'gen_enable_debugger_module')
246*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(jdk_table.JDKTableXML, 'config_jdk_table_xml')
247*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeBase, '_get_config_root_paths')
248*c2e18aaaSAndroid Build Coastguard Worker    def test_apply_optional_config(self, mock_path, mock_config_xml,
249*c2e18aaaSAndroid Build Coastguard Worker                                   mock_gen_debugger, mock_set_size,
250*c2e18aaaSAndroid Build Coastguard Worker                                   mock_test_mapping):
251*c2e18aaaSAndroid Build Coastguard Worker        """Test basic logic of apply_optional_config."""
252*c2e18aaaSAndroid Build Coastguard Worker        ide = ide_util.IdeBase()
253*c2e18aaaSAndroid Build Coastguard Worker        ide._installed_path = None
254*c2e18aaaSAndroid Build Coastguard Worker        ide.apply_optional_config()
255*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_path.called)
256*c2e18aaaSAndroid Build Coastguard Worker        ide._installed_path = 'default_path'
257*c2e18aaaSAndroid Build Coastguard Worker        ide.apply_optional_config()
258*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_path.called)
259*c2e18aaaSAndroid Build Coastguard Worker        mock_path.return_value = []
260*c2e18aaaSAndroid Build Coastguard Worker        ide.apply_optional_config()
261*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_config_xml.called)
262*c2e18aaaSAndroid Build Coastguard Worker        mock_path.return_value = ['a']
263*c2e18aaaSAndroid Build Coastguard Worker        mock_config_xml.return_value = False
264*c2e18aaaSAndroid Build Coastguard Worker        ide.apply_optional_config()
265*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_gen_debugger.called)
266*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_set_size.called)
267*c2e18aaaSAndroid Build Coastguard Worker        mock_config_xml.return_value = True
268*c2e18aaaSAndroid Build Coastguard Worker        ide.apply_optional_config()
269*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(ide.config_folders, ['a'])
270*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_gen_debugger.called)
271*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_set_size.called)
272*c2e18aaaSAndroid Build Coastguard Worker
273*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.path.isfile')
274*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ElementTree.ElementTree, 'write')
275*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(common_util, 'to_pretty_xml')
276*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(common_util, 'file_generate')
277*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ElementTree, 'parse')
278*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ElementTree.ElementTree, 'getroot')
279*c2e18aaaSAndroid Build Coastguard Worker    def test_add_test_mapping_file_type(self, mock_root, mock_parse,
280*c2e18aaaSAndroid Build Coastguard Worker                                        mock_file_gen, mock_pretty_xml,
281*c2e18aaaSAndroid Build Coastguard Worker                                        mock_write, mock_isfile):
282*c2e18aaaSAndroid Build Coastguard Worker        """Test basic logic of _add_test_mapping_file_type."""
283*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = False
284*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_file_gen.called)
285*c2e18aaaSAndroid Build Coastguard Worker
286*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = True
287*c2e18aaaSAndroid Build Coastguard Worker        mock_parse.return_value = None
288*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_file_gen.called)
289*c2e18aaaSAndroid Build Coastguard Worker
290*c2e18aaaSAndroid Build Coastguard Worker        mock_parse.return_value = ElementTree.ElementTree()
291*c2e18aaaSAndroid Build Coastguard Worker        mock_root.return_value = ElementTree.fromstring(
292*c2e18aaaSAndroid Build Coastguard Worker            self._TEST_XML_CONTENT_2)
293*c2e18aaaSAndroid Build Coastguard Worker        ide_obj = ide_util.IdeBase()
294*c2e18aaaSAndroid Build Coastguard Worker        ide_obj._add_test_mapping_file_type('')
295*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_file_gen.called)
296*c2e18aaaSAndroid Build Coastguard Worker        mock_root.return_value = ElementTree.fromstring(self._TEST_XML_CONTENT)
297*c2e18aaaSAndroid Build Coastguard Worker        ide_obj._add_test_mapping_file_type('')
298*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_pretty_xml.called)
299*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_file_gen.called)
300*c2e18aaaSAndroid Build Coastguard Worker
301*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.path.realpath')
302*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.path.isfile')
303*c2e18aaaSAndroid Build Coastguard Worker    def test_merge_symbolic_version(self, mock_isfile, mock_realpath):
304*c2e18aaaSAndroid Build Coastguard Worker        """Test _merge_symbolic_version and _get_real_path."""
305*c2e18aaaSAndroid Build Coastguard Worker        symbolic_path = ide_util.IdeLinuxIntelliJ._SYMBOLIC_VERSIONS[0]
306*c2e18aaaSAndroid Build Coastguard Worker        original_path = 'intellij-ce-2019.1/bin/idea.sh'
307*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = True
308*c2e18aaaSAndroid Build Coastguard Worker        mock_realpath.return_value = original_path
309*c2e18aaaSAndroid Build Coastguard Worker        ide_obj = ide_util.IdeLinuxIntelliJ('default_path')
310*c2e18aaaSAndroid Build Coastguard Worker        merged_version = ide_obj._merge_symbolic_version(
311*c2e18aaaSAndroid Build Coastguard Worker            [symbolic_path, original_path])
312*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(
313*c2e18aaaSAndroid Build Coastguard Worker            merged_version[0], symbolic_path + ' -> ' + original_path)
314*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(
315*c2e18aaaSAndroid Build Coastguard Worker            ide_obj._get_real_path(merged_version[0]), symbolic_path)
316*c2e18aaaSAndroid Build Coastguard Worker
317*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
318*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.path.isfile')
319*c2e18aaaSAndroid Build Coastguard Worker    def test_get_application_path(self, mock_isfile, mock_cfg):
320*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_application_path."""
321*c2e18aaaSAndroid Build Coastguard Worker        mock_cfg.return_value = None
322*c2e18aaaSAndroid Build Coastguard Worker        ide_obj = ide_util.IdeLinuxIntelliJ('default_path')
323*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = True
324*c2e18aaaSAndroid Build Coastguard Worker        test_path = None
325*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(None, ide_obj._get_application_path(test_path))
326*c2e18aaaSAndroid Build Coastguard Worker
327*c2e18aaaSAndroid Build Coastguard Worker        test_path = 'a/b/c/d-e/f-gh/foo'
328*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(None, ide_obj._get_application_path(test_path))
329*c2e18aaaSAndroid Build Coastguard Worker
330*c2e18aaaSAndroid Build Coastguard Worker        test_path = 'a/b/c/d/intellij/foo'
331*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(None, ide_obj._get_application_path(test_path))
332*c2e18aaaSAndroid Build Coastguard Worker
333*c2e18aaaSAndroid Build Coastguard Worker        test_path = 'a/b/c/d/intellij-efg/foo'
334*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(None, ide_obj._get_application_path(test_path))
335*c2e18aaaSAndroid Build Coastguard Worker
336*c2e18aaaSAndroid Build Coastguard Worker        test_path = 'a/b/c/d/intellij-efg-hi/foo'
337*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(None, ide_obj._get_application_path(test_path))
338*c2e18aaaSAndroid Build Coastguard Worker
339*c2e18aaaSAndroid Build Coastguard Worker        test_path = 'a/b/c/d/intellij-ce-303/foo'
340*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual('.IdeaIC303', ide_obj._get_application_path(test_path))
341*c2e18aaaSAndroid Build Coastguard Worker
342*c2e18aaaSAndroid Build Coastguard Worker        test_path = 'a/b/c/d/intellij-ue-303/foo'
343*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual('.IntelliJIdea303', ide_obj._get_application_path(
344*c2e18aaaSAndroid Build Coastguard Worker            test_path))
345*c2e18aaaSAndroid Build Coastguard Worker
346*c2e18aaaSAndroid Build Coastguard Worker    def test_get_ide_util_instance_with_no_launch(self):
347*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_ide_util_instance with no launch IDE."""
348*c2e18aaaSAndroid Build Coastguard Worker        args = aidegen_main._parse_args(['tradefed', '-n'])
349*c2e18aaaSAndroid Build Coastguard Worker        project_config.ProjectConfig(args)
350*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(ide_util.get_ide_util_instance(args), None)
351*c2e18aaaSAndroid Build Coastguard Worker
352*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
353*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_preferred_version')
354*c2e18aaaSAndroid Build Coastguard Worker    def test_get_ide_util_instance_with_success(self, mock_preference,
355*c2e18aaaSAndroid Build Coastguard Worker                                                mock_cfg_write):
356*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_ide_util_instance with success."""
357*c2e18aaaSAndroid Build Coastguard Worker        args = aidegen_main._parse_args(['tradefed'])
358*c2e18aaaSAndroid Build Coastguard Worker        project_config.ProjectConfig(args)
359*c2e18aaaSAndroid Build Coastguard Worker        mock_cfg_write.return_value = None
360*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.return_value = '1'
361*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsInstance(
362*c2e18aaaSAndroid Build Coastguard Worker            ide_util.get_ide_util_instance(), ide_util.IdeUtil)
363*c2e18aaaSAndroid Build Coastguard Worker
364*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
365*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_preferred_version')
366*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeUtil, 'is_ide_installed')
367*c2e18aaaSAndroid Build Coastguard Worker    def test_get_ide_util_instance_with_failure(
368*c2e18aaaSAndroid Build Coastguard Worker            self, mock_installed, mock_preference, mock_cfg_write):
369*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_ide_util_instance with failure."""
370*c2e18aaaSAndroid Build Coastguard Worker        args = aidegen_main._parse_args(['tradefed'])
371*c2e18aaaSAndroid Build Coastguard Worker        project_config.ProjectConfig(args)
372*c2e18aaaSAndroid Build Coastguard Worker        mock_installed.return_value = False
373*c2e18aaaSAndroid Build Coastguard Worker        mock_cfg_write.return_value = None
374*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.return_value = '1'
375*c2e18aaaSAndroid Build Coastguard Worker        with self.assertRaises(errors.IDENotExistError):
376*c2e18aaaSAndroid Build Coastguard Worker            ide_util.get_ide_util_instance()
377*c2e18aaaSAndroid Build Coastguard Worker
378*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'get_scripts_from_dir_path')
379*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, '_run_ide_sh')
380*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('logging.info')
381*c2e18aaaSAndroid Build Coastguard Worker    def test_ide_base(self, mock_log, mock_run_ide, mock_run_path):
382*c2e18aaaSAndroid Build Coastguard Worker        """Test ide_base class."""
383*c2e18aaaSAndroid Build Coastguard Worker        # Test raise NotImplementedError.
384*c2e18aaaSAndroid Build Coastguard Worker        ide_base = ide_util.IdeBase()
385*c2e18aaaSAndroid Build Coastguard Worker        with self.assertRaises(NotImplementedError):
386*c2e18aaaSAndroid Build Coastguard Worker            ide_base._get_config_root_paths()
387*c2e18aaaSAndroid Build Coastguard Worker
388*c2e18aaaSAndroid Build Coastguard Worker        # Test ide_name.
389*c2e18aaaSAndroid Build Coastguard Worker        ide_base._ide_name = 'a'
390*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(ide_base.ide_name, 'a')
391*c2e18aaaSAndroid Build Coastguard Worker
392*c2e18aaaSAndroid Build Coastguard Worker        # Test _get_ide_cmd.
393*c2e18aaaSAndroid Build Coastguard Worker        ide_base._installed_path = '/a/b'
394*c2e18aaaSAndroid Build Coastguard Worker        ide_base.project_abspath = '/x/y'
395*c2e18aaaSAndroid Build Coastguard Worker        expected_result = 'nohup /a/b /x/y 2>/dev/null >&2 &'
396*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(ide_base._get_ide_cmd(), expected_result)
397*c2e18aaaSAndroid Build Coastguard Worker
398*c2e18aaaSAndroid Build Coastguard Worker        # Test launch_ide.
399*c2e18aaaSAndroid Build Coastguard Worker        mock_run_ide.return_value = True
400*c2e18aaaSAndroid Build Coastguard Worker        ide_base.launch_ide()
401*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_log.called)
402*c2e18aaaSAndroid Build Coastguard Worker
403*c2e18aaaSAndroid Build Coastguard Worker        # Test _get_ide_from_environment_paths.
404*c2e18aaaSAndroid Build Coastguard Worker        mock_run_path.return_value = '/a/b/idea.sh'
405*c2e18aaaSAndroid Build Coastguard Worker        ide_base._bin_file_name = 'idea.sh'
406*c2e18aaaSAndroid Build Coastguard Worker        expected_path = '/a/b/idea.sh'
407*c2e18aaaSAndroid Build Coastguard Worker        ide_path = ide_base._get_ide_from_environment_paths()
408*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(ide_path, expected_path)
409*c2e18aaaSAndroid Build Coastguard Worker
410*c2e18aaaSAndroid Build Coastguard Worker    def test_ide_intellij(self):
411*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeIntelliJ class."""
412*c2e18aaaSAndroid Build Coastguard Worker        # Test raise NotImplementedError.
413*c2e18aaaSAndroid Build Coastguard Worker        ide_intellij = ide_util.IdeIntelliJ()
414*c2e18aaaSAndroid Build Coastguard Worker        with self.assertRaises(NotImplementedError):
415*c2e18aaaSAndroid Build Coastguard Worker            ide_intellij._get_config_root_paths()
416*c2e18aaaSAndroid Build Coastguard Worker
417*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'set_preferred_version')
418*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'preferred_version')
419*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'ask_preference')
420*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.AidegenConfig, 'deprecated_intellij_version')
421*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeIntelliJ, '_get_all_versions')
422*c2e18aaaSAndroid Build Coastguard Worker    def test_intellij_get_preferred_version(self,
423*c2e18aaaSAndroid Build Coastguard Worker                                            mock_all_versions,
424*c2e18aaaSAndroid Build Coastguard Worker                                            mock_deprecated_version,
425*c2e18aaaSAndroid Build Coastguard Worker                                            mock_ask_preference,
426*c2e18aaaSAndroid Build Coastguard Worker                                            mock_preference,
427*c2e18aaaSAndroid Build Coastguard Worker                                            mock_write_cfg):
428*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_preferred_version for IdeIntelliJ class."""
429*c2e18aaaSAndroid Build Coastguard Worker        mock_write_cfg.return_value = None
430*c2e18aaaSAndroid Build Coastguard Worker        ide_intellij = ide_util.IdeIntelliJ()
431*c2e18aaaSAndroid Build Coastguard Worker
432*c2e18aaaSAndroid Build Coastguard Worker        # No IntelliJ version is installed.
433*c2e18aaaSAndroid Build Coastguard Worker        mock_all_versions.return_value = ['/a/b', '/a/c']
434*c2e18aaaSAndroid Build Coastguard Worker        mock_deprecated_version.return_value = True
435*c2e18aaaSAndroid Build Coastguard Worker        version = ide_intellij._get_preferred_version()
436*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(version, None)
437*c2e18aaaSAndroid Build Coastguard Worker
438*c2e18aaaSAndroid Build Coastguard Worker        # Load default preferred version.
439*c2e18aaaSAndroid Build Coastguard Worker        mock_all_versions.return_value = ['/a/b', '/a/c']
440*c2e18aaaSAndroid Build Coastguard Worker        mock_deprecated_version.return_value = False
441*c2e18aaaSAndroid Build Coastguard Worker        ide_intellij._config_reset = False
442*c2e18aaaSAndroid Build Coastguard Worker        expected_result = '/a/b'
443*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.return_value = '/a/b'
444*c2e18aaaSAndroid Build Coastguard Worker        version = ide_intellij._get_preferred_version()
445*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(version, expected_result)
446*c2e18aaaSAndroid Build Coastguard Worker
447*c2e18aaaSAndroid Build Coastguard Worker        # Asking user the preferred version.
448*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.reset()
449*c2e18aaaSAndroid Build Coastguard Worker        mock_all_versions.return_value = ['/a/b', '/a/c']
450*c2e18aaaSAndroid Build Coastguard Worker        mock_deprecated_version.return_value = False
451*c2e18aaaSAndroid Build Coastguard Worker        ide_intellij._config_reset = True
452*c2e18aaaSAndroid Build Coastguard Worker        mock_ask_preference.return_value = '/a/b'
453*c2e18aaaSAndroid Build Coastguard Worker        version = ide_intellij._get_preferred_version()
454*c2e18aaaSAndroid Build Coastguard Worker        expected_result = '/a/b'
455*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(version, expected_result)
456*c2e18aaaSAndroid Build Coastguard Worker
457*c2e18aaaSAndroid Build Coastguard Worker        mock_all_versions.return_value = ['/a/b', '/a/c']
458*c2e18aaaSAndroid Build Coastguard Worker        mock_ask_preference.return_value = None
459*c2e18aaaSAndroid Build Coastguard Worker        expected_result = '/a/b'
460*c2e18aaaSAndroid Build Coastguard Worker        mock_preference.return_value = '/a/b'
461*c2e18aaaSAndroid Build Coastguard Worker        version = ide_intellij._get_preferred_version()
462*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(version, expected_result)
463*c2e18aaaSAndroid Build Coastguard Worker
464*c2e18aaaSAndroid Build Coastguard Worker        # The all_versions list has only one version.
465*c2e18aaaSAndroid Build Coastguard Worker        mock_all_versions.return_value = ['/a/b']
466*c2e18aaaSAndroid Build Coastguard Worker        mock_deprecated_version.return_value = False
467*c2e18aaaSAndroid Build Coastguard Worker        version = ide_intellij._get_preferred_version()
468*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(version, '/a/b')
469*c2e18aaaSAndroid Build Coastguard Worker
470*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeBase, '_add_test_mapping_file_type')
471*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'ask_preference')
472*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(config.IdeaProperties, 'set_max_file_size')
473*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(project_file_gen, 'gen_enable_debugger_module')
474*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeStudio, '_get_config_root_paths')
475*c2e18aaaSAndroid Build Coastguard Worker    def test_android_studio_class(self, mock_get_config_paths,
476*c2e18aaaSAndroid Build Coastguard Worker                                  mock_gen_debugger, mock_set_size, mock_ask,
477*c2e18aaaSAndroid Build Coastguard Worker                                  mock_add_file_type):
478*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeStudio."""
479*c2e18aaaSAndroid Build Coastguard Worker        mock_get_config_paths.return_value = ['path1', 'path2']
480*c2e18aaaSAndroid Build Coastguard Worker        mock_gen_debugger.return_value = True
481*c2e18aaaSAndroid Build Coastguard Worker        mock_set_size.return_value = True
482*c2e18aaaSAndroid Build Coastguard Worker        mock_ask.return_value = None
483*c2e18aaaSAndroid Build Coastguard Worker        obj = ide_util.IdeStudio()
484*c2e18aaaSAndroid Build Coastguard Worker        obj._installed_path = False
485*c2e18aaaSAndroid Build Coastguard Worker        # Test the native IDE case.
486*c2e18aaaSAndroid Build Coastguard Worker        obj.project_abspath = os.path.realpath(__file__)
487*c2e18aaaSAndroid Build Coastguard Worker        obj.apply_optional_config()
488*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(obj.config_folders, [])
489*c2e18aaaSAndroid Build Coastguard Worker
490*c2e18aaaSAndroid Build Coastguard Worker        # Test the java IDE case.
491*c2e18aaaSAndroid Build Coastguard Worker        obj.project_abspath = IdeUtilUnittests._TEST_DIR
492*c2e18aaaSAndroid Build Coastguard Worker        obj.apply_optional_config()
493*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(obj.config_folders, [])
494*c2e18aaaSAndroid Build Coastguard Worker
495*c2e18aaaSAndroid Build Coastguard Worker        mock_get_config_paths.return_value = []
496*c2e18aaaSAndroid Build Coastguard Worker        self.assertIsNone(obj.apply_optional_config())
497*c2e18aaaSAndroid Build Coastguard Worker
498*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'ask_preference')
499*c2e18aaaSAndroid Build Coastguard Worker    def test_studio_get_config_root_paths(self, mock_ask):
500*c2e18aaaSAndroid Build Coastguard Worker        """Test the method _get_config_root_paths of IdeStudio."""
501*c2e18aaaSAndroid Build Coastguard Worker        mock_ask.return_value = None
502*c2e18aaaSAndroid Build Coastguard Worker        obj = ide_util.IdeStudio()
503*c2e18aaaSAndroid Build Coastguard Worker        with self.assertRaises(NotImplementedError):
504*c2e18aaaSAndroid Build Coastguard Worker            obj._get_config_root_paths()
505*c2e18aaaSAndroid Build Coastguard Worker
506*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeBase, 'apply_optional_config')
507*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(os.path, 'isdir')
508*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(os.path, 'isfile')
509*c2e18aaaSAndroid Build Coastguard Worker    def test_studio_optional_config_apply(self, mock_isfile, mock_isdir,
510*c2e18aaaSAndroid Build Coastguard Worker                                          mock_base_implement):
511*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeStudio.apply_optional_config."""
512*c2e18aaaSAndroid Build Coastguard Worker        obj = ide_util.IdeStudio()
513*c2e18aaaSAndroid Build Coastguard Worker        obj.project_abspath = None
514*c2e18aaaSAndroid Build Coastguard Worker        # Test no project path case.
515*c2e18aaaSAndroid Build Coastguard Worker        obj.apply_optional_config()
516*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_isfile.called)
517*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_isdir.called)
518*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_base_implement.called)
519*c2e18aaaSAndroid Build Coastguard Worker        # Test the native IDE case.
520*c2e18aaaSAndroid Build Coastguard Worker        obj.project_abspath = '/'
521*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.reset_mock()
522*c2e18aaaSAndroid Build Coastguard Worker        mock_isdir.reset_mock()
523*c2e18aaaSAndroid Build Coastguard Worker        mock_base_implement.reset_mock()
524*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = True
525*c2e18aaaSAndroid Build Coastguard Worker        obj.apply_optional_config()
526*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_isfile.called)
527*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_isdir.called)
528*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_base_implement.called)
529*c2e18aaaSAndroid Build Coastguard Worker        # Test the java IDE case.
530*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.reset_mock()
531*c2e18aaaSAndroid Build Coastguard Worker        mock_isdir.reset_mock()
532*c2e18aaaSAndroid Build Coastguard Worker        mock_base_implement.reset_mock()
533*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = False
534*c2e18aaaSAndroid Build Coastguard Worker        mock_isdir.return_value = True
535*c2e18aaaSAndroid Build Coastguard Worker        obj.apply_optional_config()
536*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_base_implement.called)
537*c2e18aaaSAndroid Build Coastguard Worker        # Test neither case.
538*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.reset_mock()
539*c2e18aaaSAndroid Build Coastguard Worker        mock_isdir.reset_mock()
540*c2e18aaaSAndroid Build Coastguard Worker        mock_base_implement.reset_mock()
541*c2e18aaaSAndroid Build Coastguard Worker        mock_isfile.return_value = False
542*c2e18aaaSAndroid Build Coastguard Worker        mock_isdir.return_value = False
543*c2e18aaaSAndroid Build Coastguard Worker        obj.apply_optional_config()
544*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_base_implement.called)
545*c2e18aaaSAndroid Build Coastguard Worker
546*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_common_util, 'ask_preference')
547*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.getenv')
548*c2e18aaaSAndroid Build Coastguard Worker    def test_linux_android_studio_class(self, mock_get_home, mock_ask):
549*c2e18aaaSAndroid Build Coastguard Worker        """Test the method _get_config_root_paths of IdeLinuxStudio."""
550*c2e18aaaSAndroid Build Coastguard Worker        mock_get_home.return_value = self._TEST_DIR
551*c2e18aaaSAndroid Build Coastguard Worker        studio_config_dir1 = os.path.join(self._TEST_DIR, '.AndroidStudio3.0')
552*c2e18aaaSAndroid Build Coastguard Worker        studio_config_dir2 = os.path.join(self._TEST_DIR, '.AndroidStudio3.1')
553*c2e18aaaSAndroid Build Coastguard Worker        os.makedirs(studio_config_dir1)
554*c2e18aaaSAndroid Build Coastguard Worker        os.makedirs(studio_config_dir2)
555*c2e18aaaSAndroid Build Coastguard Worker        expected_result = [studio_config_dir1, studio_config_dir2]
556*c2e18aaaSAndroid Build Coastguard Worker        mock_ask.return_value = None
557*c2e18aaaSAndroid Build Coastguard Worker        obj = ide_util.IdeLinuxStudio()
558*c2e18aaaSAndroid Build Coastguard Worker        config_paths = obj._get_config_root_paths()
559*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(sorted(config_paths), sorted(expected_result))
560*c2e18aaaSAndroid Build Coastguard Worker
561*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.getenv')
562*c2e18aaaSAndroid Build Coastguard Worker    def test_mac_android_studio_class(self, mock_get_home):
563*c2e18aaaSAndroid Build Coastguard Worker        """Test the method _get_config_root_paths of IdeMacStudio."""
564*c2e18aaaSAndroid Build Coastguard Worker        mock_get_home.return_value = self._TEST_DIR
565*c2e18aaaSAndroid Build Coastguard Worker        studio_config_dir1 = os.path.join(self._TEST_DIR, 'Library',
566*c2e18aaaSAndroid Build Coastguard Worker                                          'Preferences', 'AndroidStudio3.0')
567*c2e18aaaSAndroid Build Coastguard Worker        studio_config_dir2 = os.path.join(self._TEST_DIR, 'Library',
568*c2e18aaaSAndroid Build Coastguard Worker                                          'Preferences', 'AndroidStudio3.1')
569*c2e18aaaSAndroid Build Coastguard Worker        os.makedirs(studio_config_dir1)
570*c2e18aaaSAndroid Build Coastguard Worker        os.makedirs(studio_config_dir2)
571*c2e18aaaSAndroid Build Coastguard Worker        expected_result = [studio_config_dir1, studio_config_dir2]
572*c2e18aaaSAndroid Build Coastguard Worker
573*c2e18aaaSAndroid Build Coastguard Worker        obj = ide_util.IdeMacStudio()
574*c2e18aaaSAndroid Build Coastguard Worker        config_paths = obj._get_config_root_paths()
575*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(sorted(config_paths), sorted(expected_result))
576*c2e18aaaSAndroid Build Coastguard Worker
577*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.access')
578*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('glob.glob')
579*c2e18aaaSAndroid Build Coastguard Worker    def test_eclipse_get_script_from_system(self, mock_glob, mock_file_access):
580*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeEclipse _get_script_from_system method."""
581*c2e18aaaSAndroid Build Coastguard Worker        eclipse = ide_util.IdeEclipse()
582*c2e18aaaSAndroid Build Coastguard Worker
583*c2e18aaaSAndroid Build Coastguard Worker        # Test no binary path in _get_script_from_system.
584*c2e18aaaSAndroid Build Coastguard Worker        eclipse._bin_paths = []
585*c2e18aaaSAndroid Build Coastguard Worker        expected_result = None
586*c2e18aaaSAndroid Build Coastguard Worker        test_result = eclipse._get_script_from_system()
587*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, expected_result)
588*c2e18aaaSAndroid Build Coastguard Worker
589*c2e18aaaSAndroid Build Coastguard Worker        # Test get the matched binary from _get_script_from_system.
590*c2e18aaaSAndroid Build Coastguard Worker        mock_glob.return_value = ['/a/b/eclipse']
591*c2e18aaaSAndroid Build Coastguard Worker        mock_file_access.return_value = True
592*c2e18aaaSAndroid Build Coastguard Worker        eclipse._bin_paths = ['/a/b/eclipse']
593*c2e18aaaSAndroid Build Coastguard Worker        expected_result = '/a/b/eclipse'
594*c2e18aaaSAndroid Build Coastguard Worker        test_result = eclipse._get_script_from_system()
595*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, expected_result)
596*c2e18aaaSAndroid Build Coastguard Worker
597*c2e18aaaSAndroid Build Coastguard Worker        # Test no matched binary from _get_script_from_system.
598*c2e18aaaSAndroid Build Coastguard Worker        mock_glob.return_value = []
599*c2e18aaaSAndroid Build Coastguard Worker        eclipse._bin_paths = ['/a/b/eclipse']
600*c2e18aaaSAndroid Build Coastguard Worker        expected_result = None
601*c2e18aaaSAndroid Build Coastguard Worker        test_result = eclipse._get_script_from_system()
602*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, expected_result)
603*c2e18aaaSAndroid Build Coastguard Worker
604*c2e18aaaSAndroid Build Coastguard Worker        # Test the matched binary cannot be executed.
605*c2e18aaaSAndroid Build Coastguard Worker        mock_glob.return_value = ['/a/b/eclipse']
606*c2e18aaaSAndroid Build Coastguard Worker        mock_file_access.return_value = False
607*c2e18aaaSAndroid Build Coastguard Worker        eclipse._bin_paths = ['/a/b/eclipse']
608*c2e18aaaSAndroid Build Coastguard Worker        expected_result = None
609*c2e18aaaSAndroid Build Coastguard Worker        test_result = eclipse._get_script_from_system()
610*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, expected_result)
611*c2e18aaaSAndroid Build Coastguard Worker
612*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('builtins.input')
613*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.path.exists')
614*c2e18aaaSAndroid Build Coastguard Worker    def test_eclipse_get_ide_cmd(self, mock_exists, mock_input):
615*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeEclipse _get_ide_cmd method."""
616*c2e18aaaSAndroid Build Coastguard Worker        # Test open the IDE with the default Eclipse workspace.
617*c2e18aaaSAndroid Build Coastguard Worker        eclipse = ide_util.IdeEclipse()
618*c2e18aaaSAndroid Build Coastguard Worker        eclipse.cmd = ['eclipse']
619*c2e18aaaSAndroid Build Coastguard Worker        mock_exists.return_value = True
620*c2e18aaaSAndroid Build Coastguard Worker        expected_result = ('eclipse -data '
621*c2e18aaaSAndroid Build Coastguard Worker                           '~/Documents/AIDEGen_Eclipse_workspace '
622*c2e18aaaSAndroid Build Coastguard Worker                           '2>/dev/null >&2 &')
623*c2e18aaaSAndroid Build Coastguard Worker        test_result = eclipse._get_ide_cmd()
624*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, expected_result)
625*c2e18aaaSAndroid Build Coastguard Worker
626*c2e18aaaSAndroid Build Coastguard Worker        # Test running command without the default workspace.
627*c2e18aaaSAndroid Build Coastguard Worker        eclipse.cmd = ['eclipse']
628*c2e18aaaSAndroid Build Coastguard Worker        mock_exists.return_value = False
629*c2e18aaaSAndroid Build Coastguard Worker        mock_input.return_value = 'n'
630*c2e18aaaSAndroid Build Coastguard Worker        expected_result = 'eclipse 2>/dev/null >&2 &'
631*c2e18aaaSAndroid Build Coastguard Worker        test_result = eclipse._get_ide_cmd()
632*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, expected_result)
633*c2e18aaaSAndroid Build Coastguard Worker
634*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeUtil, 'is_ide_installed')
635*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(project_config.ProjectConfig, 'get_instance')
636*c2e18aaaSAndroid Build Coastguard Worker    def test_get_ide_util_instance(self, mock_config, mock_ide_installed):
637*c2e18aaaSAndroid Build Coastguard Worker        """Test get_ide_util_instance."""
638*c2e18aaaSAndroid Build Coastguard Worker        # Test is_launch_ide conditions.
639*c2e18aaaSAndroid Build Coastguard Worker        mock_instance = mock_config.return_value
640*c2e18aaaSAndroid Build Coastguard Worker        mock_instance.is_launch_ide = False
641*c2e18aaaSAndroid Build Coastguard Worker        ide_util.get_ide_util_instance()
642*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_ide_installed.called)
643*c2e18aaaSAndroid Build Coastguard Worker        mock_instance.is_launch_ide = True
644*c2e18aaaSAndroid Build Coastguard Worker        ide_util.get_ide_util_instance()
645*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_ide_installed.called)
646*c2e18aaaSAndroid Build Coastguard Worker
647*c2e18aaaSAndroid Build Coastguard Worker        # Test ide is not installed.
648*c2e18aaaSAndroid Build Coastguard Worker        mock_ide_installed.return_value = False
649*c2e18aaaSAndroid Build Coastguard Worker        with self.assertRaises(errors.IDENotExistError):
650*c2e18aaaSAndroid Build Coastguard Worker            ide_util.get_ide_util_instance()
651*c2e18aaaSAndroid Build Coastguard Worker
652*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeLinuxVSCode, '_init_installed_path')
653*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeLinuxVSCode, '_get_possible_bin_paths')
654*c2e18aaaSAndroid Build Coastguard Worker    def test_ide_linux_vscode(self, mock_get_pos, mock_init_inst):
655*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeLinuxVSCode class."""
656*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeLinuxVSCode()
657*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_get_pos.called)
658*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_init_inst.called)
659*c2e18aaaSAndroid Build Coastguard Worker
660*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeMacVSCode, '_init_installed_path')
661*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch.object(ide_util.IdeMacVSCode, '_get_possible_bin_paths')
662*c2e18aaaSAndroid Build Coastguard Worker    def test_ide_mac_vscode(self, mock_get_pos, mock_init_inst):
663*c2e18aaaSAndroid Build Coastguard Worker        """Test IdeMacVSCode class."""
664*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeMacVSCode()
665*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_get_pos.called)
666*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_init_inst.called)
667*c2e18aaaSAndroid Build Coastguard Worker
668*c2e18aaaSAndroid Build Coastguard Worker    def test_get_all_versions(self):
669*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_all_versions."""
670*c2e18aaaSAndroid Build Coastguard Worker        ide = ide_util.IdeIntelliJ()
671*c2e18aaaSAndroid Build Coastguard Worker        test_result = ide._get_all_versions('a', 'b')
672*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(test_result, ['a', 'b'])
673*c2e18aaaSAndroid Build Coastguard Worker
674*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('logging.warning')
675*c2e18aaaSAndroid Build Coastguard Worker    def test_get_ide_version(self, mock_warn):
676*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_ide_version with conditions."""
677*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(
678*c2e18aaaSAndroid Build Coastguard Worker            None, ide_util.IdeIntelliJ._get_ide_version('intellij-efg-hi'))
679*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(mock_warn.called)
680*c2e18aaaSAndroid Build Coastguard Worker        mock_warn.reset_mock()
681*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(
682*c2e18aaaSAndroid Build Coastguard Worker            '2020.1',
683*c2e18aaaSAndroid Build Coastguard Worker            ide_util.IdeIntelliJ._get_ide_version('intellij-ue-2020.1'))
684*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_warn.called)
685*c2e18aaaSAndroid Build Coastguard Worker        mock_warn.reset_mock()
686*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(
687*c2e18aaaSAndroid Build Coastguard Worker            '303', ide_util.IdeIntelliJ._get_ide_version('intellij-ue-303'))
688*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_warn.called)
689*c2e18aaaSAndroid Build Coastguard Worker
690*c2e18aaaSAndroid Build Coastguard Worker    @mock.patch('os.path.join')
691*c2e18aaaSAndroid Build Coastguard Worker    def test_get_config_dir(self, mock_join):
692*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_config_dir with conditions."""
693*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'IntelliJ2020.1'
694*c2e18aaaSAndroid Build Coastguard Worker        ide_version = '2020.1'
695*c2e18aaaSAndroid Build Coastguard Worker        ide_util.IdeIntelliJ._get_config_dir(ide_version, config_folder_name)
696*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(
697*c2e18aaaSAndroid Build Coastguard Worker            mock_join.called_with(
698*c2e18aaaSAndroid Build Coastguard Worker                os.getenv('HOME'), '.config', 'JetBrains', config_folder_name))
699*c2e18aaaSAndroid Build Coastguard Worker        mock_join.reset_mock()
700*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'IntelliJ2019.3'
701*c2e18aaaSAndroid Build Coastguard Worker        ide_version = '2019.3'
702*c2e18aaaSAndroid Build Coastguard Worker        self.assertTrue(
703*c2e18aaaSAndroid Build Coastguard Worker            mock_join.called_with(
704*c2e18aaaSAndroid Build Coastguard Worker                os.getenv('HOME'), config_folder_name, 'config'))
705*c2e18aaaSAndroid Build Coastguard Worker        mock_join.reset_mock()
706*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(None, ide_util.IdeIntelliJ._get_config_dir(
707*c2e18aaaSAndroid Build Coastguard Worker            'Not-a-float', config_folder_name))
708*c2e18aaaSAndroid Build Coastguard Worker        self.assertFalse(mock_join.called)
709*c2e18aaaSAndroid Build Coastguard Worker
710*c2e18aaaSAndroid Build Coastguard Worker    def test_get_config_folder_name(self):
711*c2e18aaaSAndroid Build Coastguard Worker        """Test _get_config_folder_name with conditions."""
712*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-ce-2019.3'
713*c2e18aaaSAndroid Build Coastguard Worker        pre_folder = '.IdeaIC'
714*c2e18aaaSAndroid Build Coastguard Worker        ide_version = '2019.3'
715*c2e18aaaSAndroid Build Coastguard Worker        expected = ''.join([pre_folder, ide_version])
716*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
717*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
718*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-ue-2019.3'
719*c2e18aaaSAndroid Build Coastguard Worker        pre_folder = '.IntelliJIdea'
720*c2e18aaaSAndroid Build Coastguard Worker        expected = ''.join([pre_folder, ide_version])
721*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
722*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
723*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-ce-2020.1'
724*c2e18aaaSAndroid Build Coastguard Worker        pre_folder = 'IdeaIC'
725*c2e18aaaSAndroid Build Coastguard Worker        ide_version = '2020.1'
726*c2e18aaaSAndroid Build Coastguard Worker        expected = ''.join([pre_folder, ide_version])
727*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
728*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
729*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-ue-2020.1'
730*c2e18aaaSAndroid Build Coastguard Worker        pre_folder = 'IntelliJIdea'
731*c2e18aaaSAndroid Build Coastguard Worker        expected = ''.join([pre_folder, ide_version])
732*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
733*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
734*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-ue-2020.1.4'
735*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
736*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
737*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-unknown'
738*c2e18aaaSAndroid Build Coastguard Worker        expected = None
739*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
740*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
741*c2e18aaaSAndroid Build Coastguard Worker        config_folder_name = 'intellij-ue-NotAFloat'
742*c2e18aaaSAndroid Build Coastguard Worker        self.assertEqual(expected, ide_util.IdeIntelliJ._get_config_folder_name(
743*c2e18aaaSAndroid Build Coastguard Worker            config_folder_name))
744*c2e18aaaSAndroid Build Coastguard Worker
745*c2e18aaaSAndroid Build Coastguard Worker
746*c2e18aaaSAndroid Build Coastguard Workerif __name__ == '__main__':
747*c2e18aaaSAndroid Build Coastguard Worker    unittest.main()
748