Merge "AIDEGen: fix module_info_util_unittest failed."
diff --git a/aidegen/lib/sdk_config_unittest.py b/aidegen/lib/sdk_config_unittest.py
index 80ae3ff..29a0f3d 100644
--- a/aidegen/lib/sdk_config_unittest.py
+++ b/aidegen/lib/sdk_config_unittest.py
@@ -20,15 +20,18 @@
 import shutil
 import tempfile
 import unittest
-from unittest.mock import patch
+from unittest import mock
+import xml
 
 from aidegen import unittest_constants
 from aidegen.lib import common_util
+from aidegen.lib import errors
 from aidegen.lib import sdk_config
 
 
 # pylint: disable=protected-access
 # pylint: disable=invalid-name
+# pylint: disable=too-many-arguments
 class SDKConfigUnittests(unittest.TestCase):
     """Unit tests for sdk_config.py"""
     _JDK_FILE_NAME = 'jdk.table.xml'
@@ -59,6 +62,7 @@
                                              'Android/Sdk')
     _CUSTOM_ANDROID_SDK_PATH = os.path.join(unittest_constants.TEST_DATA_PATH,
                                             'Android/custom/sdk')
+    _TEMP = 'temp'
 
     def test_generate_jdk_config(self):
         """Test generating jdk config."""
@@ -176,7 +180,7 @@
         sdk_config.SDKConfig.max_api_level = 0
         expected_path = self._CUSTOM_ANDROID_SDK_PATH
         try:
-            with patch('builtins.input', side_effect=user_input):
+            with mock.patch('builtins.input', side_effect=user_input):
                 jdk = sdk_config.SDKConfig(self._JDK_SAMPLE4,
                                            self._JDK_TEMPLATE,
                                            self._JDK_PATH,
@@ -221,12 +225,30 @@
                                        self._JDK_PATH,
                                        self._NONEXISTENT_ANDROID_SDK_PATH)
             user_input = [self._DEFAULT_ANDROID_SDK_PATH]
-            with patch('builtins.input', side_effect=user_input):
+            with mock.patch('builtins.input', side_effect=user_input):
                 jdk.generate_sdk_config_string()
                 self.assertEqual(jdk.config_string, expected_content)
         finally:
             shutil.rmtree(tmp_folder)
 
+    @mock.patch.object(xml.dom.minidom, 'parseString')
+    def test_parse_xml_failed(self, mock_parse):
+        """Test _parse_xml failed."""
+        tmp_folder = self._TEMP
+        config_file = os.path.join(tmp_folder, self._JDK_FILE_NAME)
+        mock_parse.side_effect = TypeError()
+        with self.assertRaises(errors.InvalidXMLError):
+            sdk_config.SDKConfig(config_file,
+                                 self._JDK_TEMPLATE,
+                                 self._JDK_PATH,
+                                 self._NONEXISTENT_ANDROID_SDK_PATH)
+        mock_parse.side_effect = AttributeError()
+        with self.assertRaises(errors.InvalidXMLError):
+            sdk_config.SDKConfig(config_file,
+                                 self._JDK_TEMPLATE,
+                                 self._JDK_PATH,
+                                 self._NONEXISTENT_ANDROID_SDK_PATH)
+
     def test_get_platforms_dir_path(self):
         """Test _get_platforms_dir_path."""
         expected_path = '/a/b/platforms'
@@ -238,6 +260,75 @@
         test_path = sdk_config.SDKConfig._get_platforms_dir_path()
         self.assertEqual(test_path, expected_path)
 
+    @mock.patch.object(sdk_config.SDKConfig, '_write_jdk_config_file')
+    @mock.patch.object(sdk_config.SDKConfig, 'generate_sdk_config_string')
+    @mock.patch.object(sdk_config.SDKConfig, 'generate_jdk_config_string')
+    @mock.patch.object(sdk_config.SDKConfig, '_android_sdk_exists')
+    @mock.patch.object(sdk_config.SDKConfig, '_target_jdk_exists')
+    def test_config_jdk_file_do_nothing(self, mock_jdk_exist, mock_sdk_exist,
+                                        mock_gen_jdk, mock_gen_sdk, mock_write):
+        """Test config_jdk_file check and return."""
+        mock_jdk_exist.return_value = True
+        mock_sdk_exist.return_value = True
+        tmp_folder = self._TEMP
+        config_file = os.path.join(tmp_folder, self._JDK_FILE_NAME)
+        jdk = sdk_config.SDKConfig(config_file,
+                                   self._JDK_TEMPLATE,
+                                   self._JDK_PATH,
+                                   self._NONEXISTENT_ANDROID_SDK_PATH)
+        jdk.config_jdk_file()
+        self.assertFalse(mock_gen_jdk.called)
+        self.assertFalse(mock_gen_sdk.called)
+        self.assertFalse(mock_write.called)
+
+    @mock.patch.object(sdk_config.SDKConfig, '_parse_xml')
+    @mock.patch.object(sdk_config.SDKConfig, '_write_jdk_config_file')
+    @mock.patch.object(sdk_config.SDKConfig, 'generate_sdk_config_string')
+    @mock.patch.object(sdk_config.SDKConfig, 'generate_jdk_config_string')
+    @mock.patch.object(sdk_config.SDKConfig, '_android_sdk_exists')
+    @mock.patch.object(sdk_config.SDKConfig, '_target_jdk_exists')
+    def test_config_jdk_file_do_something(self, mock_jdk_exist, mock_sdk_exist,
+                                          mock_gen_jdk, mock_gen_sdk,
+                                          mock_write, mock_parse):
+        """Test config_jdk_file config jdk file."""
+        mock_jdk_exist.return_value = True
+        mock_sdk_exist.return_value = False
+        tmp_folder = self._TEMP
+        config_file = os.path.join(tmp_folder, self._JDK_FILE_NAME)
+        jdk = sdk_config.SDKConfig(config_file,
+                                   self._JDK_TEMPLATE,
+                                   self._JDK_PATH,
+                                   self._NONEXISTENT_ANDROID_SDK_PATH)
+        jdk.config_jdk_file()
+        self.assertTrue(mock_gen_jdk.called)
+        self.assertTrue(mock_gen_sdk.called)
+        self.assertTrue(mock_write.called)
+        self.assertTrue(mock_parse.called)
+        mock_jdk_exist.return_value = False
+        mock_sdk_exist.return_value = True
+        jdk = sdk_config.SDKConfig(config_file,
+                                   self._JDK_TEMPLATE,
+                                   self._JDK_PATH,
+                                   self._NONEXISTENT_ANDROID_SDK_PATH)
+        jdk.config_jdk_file()
+        self.assertTrue(mock_gen_jdk.called)
+        self.assertTrue(mock_gen_sdk.called)
+        self.assertTrue(mock_write.called)
+        self.assertTrue(mock_parse.called)
+
+    @mock.patch.object(os.path, 'isfile')
+    def test_get_default_config_content(self, mock_isfile):
+        """Test _get_default_config_content."""
+        mock_isfile.return_value = False
+        tmp_folder = self._TEMP
+        config_file = os.path.join(tmp_folder, self._JDK_FILE_NAME)
+        jdk = sdk_config.SDKConfig(config_file,
+                                   self._JDK_TEMPLATE,
+                                   self._JDK_PATH,
+                                   self._NONEXISTENT_ANDROID_SDK_PATH)
+        self.assertEqual(sdk_config.SDKConfig._XML_CONTENT,
+                         jdk._get_default_config_content())
+
 
 if __name__ == '__main__':
     unittest.main()