#!/usr/bin/env python3 # # Copyright 2020, 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 JDKTableXML class.""" import os import shutil import tempfile import unittest from unittest import mock from xml.etree import ElementTree from aidegen.lib import aidegen_metrics from aidegen.lib import common_util from aidegen.lib import xml_util from aidegen.sdk import android_sdk from aidegen.sdk import jdk_table # pylint: disable=protected-access # pylint: disable=too-many-arguments class JDKTableXMLUnittests(unittest.TestCase): """Unit tests for JDKTableXML class.""" _JDK_TABLE_XML = 'jdk.table.xml' _CONFIG_FILE = '/path/to/jdk.table.xml' _JDK_CONTENT = '' _JDK_PATH = '/path/to/JDK' _DEFULAT_ANDROID_SDK_PATH = '/path/to/Android/SDK' def setUp(self): """Prepare the JDKTableXML class.""" JDKTableXMLUnittests._TEST_DIR = tempfile.mkdtemp() self.jdk_table_xml = jdk_table.JDKTableXML( self._CONFIG_FILE, self._JDK_CONTENT, self._JDK_PATH, self._DEFULAT_ANDROID_SDK_PATH) def tearDown(self): """Clear the JDKTableXML class.""" self.jdk_table_xml = None shutil.rmtree(JDKTableXMLUnittests._TEST_DIR) @mock.patch.object(common_util, 'file_generate') @mock.patch('os.path.exists') @mock.patch.object(ElementTree, 'parse') def test_init(self, mock_parse, mock_exists, mock_gen_file): """Test initialize the attributes.""" self.assertEqual(self.jdk_table_xml._platform_version, None) self.assertEqual(self.jdk_table_xml._android_sdk_version, None) self.assertEqual(self.jdk_table_xml._modify_config, False) mock_exists.return_value = True mock_parse.return_value = None jdk_table.JDKTableXML(None, None, None, None) self.assertTrue(mock_parse.called) mock_exists.return_value = False jdk_table.JDKTableXML(None, None, None, None) self.assertTrue(mock_parse.called) self.assertTrue(mock_gen_file.called) def test_android_sdk_version(self): """Test android_sdk_version.""" self.assertEqual(self.jdk_table_xml.android_sdk_version, None) def test_check_structure(self): """Test _check_structure.""" tmp_file = os.path.join(self._TEST_DIR, self._JDK_TABLE_XML) xml_str = ('\n') with open(tmp_file, 'w') as tmp_jdk_xml: tmp_jdk_xml.write(xml_str) self.jdk_table_xml._xml = ElementTree.parse(tmp_file) self.assertFalse(self.jdk_table_xml._check_structure()) xml_str = ('\n' ' \n' ' \n' '') with open(tmp_file, 'w') as tmp_jdk_xml: tmp_jdk_xml.write(xml_str) self.jdk_table_xml._xml = ElementTree.parse(tmp_file) self.assertFalse(self.jdk_table_xml._check_structure()) xml_str = ('\n' ' \n' ' \n' '') with open(tmp_file, 'w') as tmp_jdk_xml: tmp_jdk_xml.write(xml_str) self.jdk_table_xml._xml = ElementTree.parse(tmp_file) self.assertTrue(self.jdk_table_xml._check_structure()) @mock.patch.object(jdk_table.JDKTableXML, '_check_jdk18_in_xml') def test_generate_jdk_config_string(self, mock_jdk_exists): """Test _generate_jdk_config_string.""" mock_jdk_exists.return_value = True self.jdk_table_xml._generate_jdk_config_string() self.assertFalse(self.jdk_table_xml._modify_config) mock_jdk_exists.return_value = False expected_result = (b'\n' b' \n' b' \n' b' \n' b'') self.jdk_table_xml._generate_jdk_config_string() test_result = ElementTree.tostring(self.jdk_table_xml._xml.getroot()) self.assertTrue(self.jdk_table_xml._modify_config) self.assertEqual(test_result, expected_result) xml_str = ('\n' ' \n' ' \n' ' \n' ' \n' ' \n' ' \n' '') expected_result = (b'\n' b' \n' b' \n' b' \n' b' \n' b' \n' b' \n' b' \n' b'') tmp_file = os.path.join(self._TEST_DIR, self._JDK_TABLE_XML) with open(tmp_file, 'w') as tmp_jdk_xml: tmp_jdk_xml.write(xml_str) self.jdk_table_xml._xml = ElementTree.parse(tmp_file) self.jdk_table_xml._generate_jdk_config_string() test_result = ElementTree.tostring(self.jdk_table_xml._xml.getroot()) self.assertEqual(test_result, expected_result) @mock.patch.object(jdk_table.JDKTableXML, '_override_xml') @mock.patch.object(ElementTree.ElementTree, 'write') @mock.patch('os.path.exists') @mock.patch.object(jdk_table.JDKTableXML, '_generate_sdk_config_string') @mock.patch.object(jdk_table.JDKTableXML, '_generate_jdk_config_string') @mock.patch.object(jdk_table.JDKTableXML, '_check_structure') def test_config_jdk_table_xml(self, mock_check_structure, mock_gen_jdk, mock_gen_sdk, mock_exist, mock_xml_write, mock_override): """Test config_jdk_table_xml.""" mock_check_structure.return_value = True mock_exist.return_value = True self.jdk_table_xml.config_jdk_table_xml() self.assertTrue(mock_gen_jdk.called) self.assertTrue(mock_gen_sdk.called) self.jdk_table_xml._modify_config = False self.jdk_table_xml.config_jdk_table_xml() self.assertFalse(mock_xml_write.called) self.jdk_table_xml._modify_config = True self.jdk_table_xml._android_sdk_version = 'test' self.jdk_table_xml.config_jdk_table_xml() self.assertTrue(mock_xml_write.called) mock_check_structure.return_value = False mock_override.return_value = False self.assertFalse(self.jdk_table_xml.config_jdk_table_xml()) mock_check_structure.return_value = False mock_override.return_value = True self.assertTrue(mock_gen_jdk.called) def test_check_jdk18_in_xml(self): """Test _check_jdk18_in_xml.""" xml_str = ('' '') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertTrue(self.jdk_table_xml._check_jdk18_in_xml()) xml_str = ('' '') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertFalse(self.jdk_table_xml._check_jdk18_in_xml()) xml_str = ('') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertFalse(self.jdk_table_xml._check_jdk18_in_xml()) @mock.patch.object(android_sdk.AndroidSDK, 'is_android_sdk_path') def test_check_android_sdk_in_xml(self, mock_is_android_sdk): """Test _check_android_sdk_in_xml.""" self.jdk_table_xml._sdk._platform_mapping = { 'android-29': { 'api_level': 29, 'code_name': '29', }, } mock_is_android_sdk.return_value = True xml_str = ('' '') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertFalse(self.jdk_table_xml._check_android_sdk_in_xml()) xml_str = ('' '' '' '') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertFalse(self.jdk_table_xml._check_android_sdk_in_xml()) xml_str = ('' '' '' '' '') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertFalse(self.jdk_table_xml._check_android_sdk_in_xml()) xml_str = ('' '' '' '' '') self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertTrue(self.jdk_table_xml._check_android_sdk_in_xml()) mock_is_android_sdk.return_value = False self.jdk_table_xml._xml = ElementTree.fromstring(xml_str) self.assertFalse(self.jdk_table_xml._check_android_sdk_in_xml()) @mock.patch.object(aidegen_metrics, 'send_exception_metrics') @mock.patch.object(android_sdk.AndroidSDK, 'path_analysis') @mock.patch.object(common_util, 'read_file_content') @mock.patch.object(jdk_table.JDKTableXML, '_check_android_sdk_in_xml') def test_generate_sdk_config_string(self, mock_sdk_in_xml, mock_read_file, mock_path_analysis, mock_metrics): """Test _generate_sdk_config_string.""" mock_sdk_in_xml.return_value = True self.jdk_table_xml._generate_sdk_config_string() self.assertFalse(self.jdk_table_xml._modify_config) mock_sdk_in_xml.return_value = False mock_path_analysis.return_value = False self.jdk_table_xml._generate_sdk_config_string() self.assertTrue(mock_metrics.called) mock_path_analysis.return_value = True mock_read_file.return_value = '' self.jdk_table_xml._generate_sdk_config_string() self.assertTrue(self.jdk_table_xml._modify_config) @mock.patch.object(aidegen_metrics, 'send_exception_metrics') @mock.patch('builtins.input') def test_override_xml(self, mock_input, mock_metrics): """Test _override_xml.""" mock_input.side_effect = ['1', 'n'] self.assertFalse(self.jdk_table_xml._override_xml()) self.assertEqual(mock_input.call_count, 2) mock_input.side_effect = ['n'] result = self.jdk_table_xml._override_xml() self.assertFalse(result) mock_input.side_effect = ['y'] expected_result = (b'\n' b' \n' b' \n' b'') self.jdk_table_xml._override_xml() test_result = ElementTree.tostring(self.jdk_table_xml._xml.getroot()) self.assertEqual(test_result, expected_result) self.assertTrue(mock_metrics.called) @mock.patch.object(xml_util, 'parse_xml') @mock.patch.object(aidegen_metrics, 'send_exception_metrics') @mock.patch('builtins.input') def test_skip_send_metrics(self, mock_input, mock_metrics, mock_parse): """Test _override_xml.""" mock_input.side_effect = ['y'] self.jdk_table_xml._xml = None self.jdk_table_xml._override_xml() self.assertFalse(mock_metrics.called) self.assertTrue(mock_parse.called) if __name__ == '__main__': unittest.main()