1#!/usr/bin/env python3 2# 3# Copyright 2020, The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16 17"""Unittests for XMLGenerator.""" 18 19import os 20import shutil 21import tempfile 22import unittest 23from unittest import mock 24 25from xml.etree import ElementTree 26 27from aidegen.lib import common_util 28from aidegen.idea import xml_gen 29 30 31# pylint: disable=protected-access 32class XMLGenUnittests(unittest.TestCase): 33 """Unit tests for XMLGenerator class.""" 34 35 _TEST_DIR = None 36 _XML_NAME = 'test.xml' 37 _DEFAULT_XML = """<?xml version="1.0" encoding="UTF-8"?> 38<project version="4"></project> 39""" 40 _IGNORE_GIT_XML = """<?xml version="1.0" encoding="UTF-8"?> 41<project version="4"> 42 <component name="VcsManagerConfiguration"> 43 <ignored-roots><path value="/b" /></ignored-roots> 44 </component> 45</project> 46""" 47 48 def setUp(self): 49 """Prepare the testdata related path.""" 50 XMLGenUnittests._TEST_DIR = tempfile.mkdtemp() 51 self.xml = xml_gen.XMLGenerator(self._TEST_DIR, self._XML_NAME) 52 common_util.file_generate(self.xml.xml_path, self._DEFAULT_XML) 53 self.xml.parse() 54 55 def tearDown(self): 56 """Clear the testdata related path.""" 57 shutil.rmtree(self._TEST_DIR) 58 59 def test_find_elements_by_name(self): 60 """Test find_elements_by_name.""" 61 node = self.xml.xml_obj.getroot() 62 ElementTree.SubElement(node, 'a', attrib={'name': 'b'}) 63 elements = self.xml.find_elements_by_name('a', 'b') 64 self.assertEqual(len(elements), 1) 65 66 def test_append_node(self): 67 """Test append_node.""" 68 node = self.xml.xml_obj.getroot() 69 self.xml.append_node(node, '<a />') 70 self.assertEqual(len(node.findall('a')), 1) 71 72 @mock.patch.object(common_util, 'to_pretty_xml') 73 @mock.patch.object(common_util, 'file_generate') 74 def test_create_xml(self, mock_file_gen, mock_pretty_xml): 75 """Test create_xml.""" 76 self.xml.create_xml() 77 self.assertTrue(mock_file_gen.called) 78 self.assertTrue(mock_pretty_xml.called) 79 80 @mock.patch.object(common_util, 'file_generate') 81 @mock.patch.object(common_util, 'get_android_root_dir') 82 @mock.patch.object(xml_gen, 'XMLGenerator') 83 def test_gen_vcs_xml(self, mock_xml_gen, mock_root_dir, mock_file_gen): 84 """Test gen_vcs_xml.""" 85 mock_gen_xml = mock.Mock() 86 mock_xml_gen.return_value = mock_gen_xml 87 mock_xml_gen.xml_obj = None 88 mock_root_dir.return_value = self._TEST_DIR 89 xml_gen.gen_vcs_xml(self._TEST_DIR, []) 90 self.assertFalse(mock_file_gen.called) 91 mock_root_dir.return_value = '/a' 92 xml_gen.gen_vcs_xml(self._TEST_DIR, ['/a']) 93 self.assertTrue(mock_file_gen.called) 94 95 @mock.patch.object(os.path, 'exists') 96 @mock.patch.object(common_util, 'file_generate') 97 @mock.patch.object(xml_gen.XMLGenerator, 'create_xml') 98 @mock.patch.object(xml_gen, 'XMLGenerator') 99 def test_write_ignore_git_dirs_file(self, mock_xml_gen, mock_create_xml, 100 mock_file_gen, mock_exists): 101 """Test write_ignore_git_dirs_file.""" 102 mock_gen_xml = mock.Mock() 103 mock_xml_gen.return_value = mock_gen_xml 104 mock_gen_xml.xml_obj = False 105 mock_exists.return_value = False 106 xml_gen.write_ignore_git_dirs_file(self._TEST_DIR, ['/a']) 107 self.assertTrue(mock_file_gen.called) 108 mock_exists.return_value = True 109 mock_xml_gen.return_value = self.xml 110 xml_gen.write_ignore_git_dirs_file(self._TEST_DIR, ['/a']) 111 ignore_root = self.xml.xml_obj.find('component').find('ignored-roots') 112 self.assertEqual(ignore_root.find('path').attrib['value'], '/a') 113 common_util.file_generate(os.path.join(self._TEST_DIR, 'workspace.xml'), 114 self._IGNORE_GIT_XML) 115 self.xml = xml_gen.XMLGenerator(self._TEST_DIR, 'workspace.xml') 116 mock_xml_gen.return_value = self.xml 117 xml_gen.write_ignore_git_dirs_file(self._TEST_DIR, ['/a/b']) 118 ignore_root = self.xml.xml_obj.find('component').find('ignored-roots') 119 self.assertEqual(ignore_root.find('path').attrib['value'], '/a/b') 120 self.assertTrue(mock_create_xml.called) 121 122 123if __name__ == '__main__': 124 unittest.main() 125