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