1#!/usr/bin/env python3
2#
3# Copyright 2018, 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 test_finder_handler."""
18
19# pylint: disable=protected-access
20import unittest
21from unittest import mock
22
23from atest import atest_error
24from atest import test_finder_handler
25from atest.test_finder_handler import FinderMethod as REF_TYPE
26from atest.test_finders import test_finder_base
27from atest.test_finders import test_info
28
29
30_EXAMPLE_FINDER_A = 'EXAMPLE_A'
31
32
33@test_finder_base.find_method_register
34class ExampleFinderA(test_finder_base.TestFinderBase):
35  """Example finder class A."""
36
37  NAME = _EXAMPLE_FINDER_A
38  _TEST_RUNNER = 'TEST_RUNNER'
39
40  @test_finder_base.register()
41  def registered_find_method_from_example_finder(self, test):
42    """Registered Example find method."""
43    if test == 'ExampleFinderATrigger':
44      return test_info.TestInfo(
45          test_name=test, test_runner=self._TEST_RUNNER, build_targets=set()
46      )
47    return None
48
49  def unregistered_find_method_from_example_finder(self, _test):
50    """Unregistered Example find method, should never be called."""
51    raise atest_error.ShouldNeverBeCalledError()
52
53
54_TEST_FINDERS_PATCH = {
55    ExampleFinderA,
56}
57
58
59_FINDER_INSTANCES = {
60    _EXAMPLE_FINDER_A: ExampleFinderA(),
61}
62
63
64class TestFinderHandlerUnittests(unittest.TestCase):
65  """Unit tests for test_finder_handler.py"""
66
67  def setUp(self):
68    """Set up for testing."""
69    # pylint: disable=invalid-name
70    # This is so we can see the full diffs when there are mismatches.
71    self.maxDiff = None
72    self.empty_mod_info = None
73    # We want to control the finders we return.
74    mock.patch(
75        'atest.test_finder_handler._get_test_finders',
76        lambda: _TEST_FINDERS_PATCH,
77    ).start()
78    # Since we're going to be comparing instance objects, we'll need to keep
79    # track of the objects so they align.
80    mock.patch(
81        'atest.test_finder_handler._get_finder_instance_dict',
82        lambda x: _FINDER_INSTANCES,
83    ).start()
84    # We want to mock out the default find methods to make sure we got all
85    # the methods we expect.
86    mock.patch(
87        'atest.test_finder_handler._get_default_find_methods',
88        lambda x, y: [
89            test_finder_base.Finder(
90                _FINDER_INSTANCES[_EXAMPLE_FINDER_A],
91                ExampleFinderA.unregistered_find_method_from_example_finder,
92                _EXAMPLE_FINDER_A,
93            )
94        ],
95    ).start()
96
97  def tearDown(self):
98    """Tear down."""
99    mock.patch.stopall()
100
101  def test_get_test_reference_types(self):
102    """Test _get_test_reference_types parses reference types correctly."""
103    self.assertEqual(
104        test_finder_handler._get_test_reference_types('ModuleOrClassName'),
105        [
106            REF_TYPE.CACHE,
107            REF_TYPE.MODULE,
108            REF_TYPE.INTEGRATION,
109            REF_TYPE.CONFIG,
110            REF_TYPE.SUITE_PLAN,
111            REF_TYPE.CLASS,
112            REF_TYPE.CC_CLASS,
113        ],
114    )
115    self.assertEqual(
116        test_finder_handler._get_test_reference_types('Module_or_Class_name'),
117        [
118            REF_TYPE.CACHE,
119            REF_TYPE.MODULE,
120            REF_TYPE.INTEGRATION,
121            REF_TYPE.CONFIG,
122            REF_TYPE.SUITE_PLAN,
123            REF_TYPE.CLASS,
124            REF_TYPE.CC_CLASS,
125        ],
126    )
127    self.assertEqual(
128        test_finder_handler._get_test_reference_types('SuiteName'),
129        [
130            REF_TYPE.CACHE,
131            REF_TYPE.MODULE,
132            REF_TYPE.INTEGRATION,
133            REF_TYPE.CONFIG,
134            REF_TYPE.SUITE_PLAN,
135            REF_TYPE.CLASS,
136            REF_TYPE.CC_CLASS,
137        ],
138    )
139    self.assertEqual(
140        test_finder_handler._get_test_reference_types('Suite-Name'),
141        [
142            REF_TYPE.CACHE,
143            REF_TYPE.MODULE,
144            REF_TYPE.INTEGRATION,
145            REF_TYPE.CONFIG,
146            REF_TYPE.SUITE_PLAN,
147            REF_TYPE.CLASS,
148            REF_TYPE.CC_CLASS,
149        ],
150    )
151    self.assertEqual(
152        test_finder_handler._get_test_reference_types('some.package'),
153        [
154            REF_TYPE.CACHE,
155            REF_TYPE.MODULE,
156            REF_TYPE.QUALIFIED_CLASS,
157            REF_TYPE.PACKAGE,
158        ],
159    )
160    self.assertEqual(
161        test_finder_handler._get_test_reference_types('fully.q.Class'),
162        [
163            REF_TYPE.CACHE,
164            REF_TYPE.MODULE,
165            REF_TYPE.QUALIFIED_CLASS,
166            REF_TYPE.PACKAGE,
167        ],
168    )
169    self.assertEqual(
170        test_finder_handler._get_test_reference_types('Integration.xml'),
171        [
172            REF_TYPE.CACHE,
173            REF_TYPE.INTEGRATION_FILE_PATH,
174            REF_TYPE.SUITE_PLAN_FILE_PATH,
175        ],
176    )
177    self.assertEqual(
178        test_finder_handler._get_test_reference_types('SomeClass.java'),
179        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
180    )
181    self.assertEqual(
182        test_finder_handler._get_test_reference_types('SomeClass.kt'),
183        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
184    )
185    self.assertEqual(
186        test_finder_handler._get_test_reference_types('Android.mk'),
187        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
188    )
189    self.assertEqual(
190        test_finder_handler._get_test_reference_types('Android.bp'),
191        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
192    )
193    self.assertEqual(
194        test_finder_handler._get_test_reference_types('SomeTest.cc'),
195        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
196    )
197    self.assertEqual(
198        test_finder_handler._get_test_reference_types('SomeTest.cpp'),
199        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
200    )
201    self.assertEqual(
202        test_finder_handler._get_test_reference_types('SomeTest.cc#method'),
203        [REF_TYPE.CACHE, REF_TYPE.MODULE_FILE_PATH],
204    )
205    self.assertEqual(
206        test_finder_handler._get_test_reference_types('module:Class'),
207        [REF_TYPE.CACHE, REF_TYPE.MODULE_CLASS, REF_TYPE.INTEGRATION],
208    )
209    self.assertEqual(
210        test_finder_handler._get_test_reference_types('module:f.q.Class'),
211        [
212            REF_TYPE.CACHE,
213            REF_TYPE.MODULE_CLASS,
214            REF_TYPE.MODULE_PACKAGE,
215            REF_TYPE.INTEGRATION,
216        ],
217    )
218    self.assertEqual(
219        test_finder_handler._get_test_reference_types('module:a.package'),
220        [REF_TYPE.CACHE, REF_TYPE.MODULE_PACKAGE, REF_TYPE.MODULE_CLASS],
221    )
222    self.assertEqual(
223        test_finder_handler._get_test_reference_types('.'),
224        [
225            REF_TYPE.CACHE,
226            REF_TYPE.MODULE_FILE_PATH,
227            REF_TYPE.INTEGRATION_FILE_PATH,
228            REF_TYPE.SUITE_PLAN_FILE_PATH,
229        ],
230    )
231    self.assertEqual(
232        test_finder_handler._get_test_reference_types('..'),
233        [
234            REF_TYPE.CACHE,
235            REF_TYPE.MODULE_FILE_PATH,
236            REF_TYPE.INTEGRATION_FILE_PATH,
237            REF_TYPE.SUITE_PLAN_FILE_PATH,
238        ],
239    )
240    self.assertEqual(
241        test_finder_handler._get_test_reference_types('./rel/path/to/test'),
242        [
243            REF_TYPE.CACHE,
244            REF_TYPE.MODULE_FILE_PATH,
245            REF_TYPE.INTEGRATION_FILE_PATH,
246            REF_TYPE.SUITE_PLAN_FILE_PATH,
247        ],
248    )
249    self.assertEqual(
250        test_finder_handler._get_test_reference_types('rel/path/to/test'),
251        [
252            REF_TYPE.CACHE,
253            REF_TYPE.MODULE_FILE_PATH,
254            REF_TYPE.INTEGRATION_FILE_PATH,
255            REF_TYPE.INTEGRATION,
256            REF_TYPE.SUITE_PLAN_FILE_PATH,
257            REF_TYPE.CC_CLASS,
258        ],
259    )
260    self.assertEqual(
261        test_finder_handler._get_test_reference_types('/abs/path/to/test'),
262        [
263            REF_TYPE.CACHE,
264            REF_TYPE.MODULE_FILE_PATH,
265            REF_TYPE.INTEGRATION_FILE_PATH,
266            REF_TYPE.SUITE_PLAN_FILE_PATH,
267        ],
268    )
269    self.assertEqual(
270        test_finder_handler._get_test_reference_types('int/test'),
271        [
272            REF_TYPE.CACHE,
273            REF_TYPE.MODULE_FILE_PATH,
274            REF_TYPE.INTEGRATION_FILE_PATH,
275            REF_TYPE.INTEGRATION,
276            REF_TYPE.SUITE_PLAN_FILE_PATH,
277            REF_TYPE.CC_CLASS,
278        ],
279    )
280    self.assertEqual(
281        test_finder_handler._get_test_reference_types(
282            'int/test:fully.qual.Class#m'
283        ),
284        [
285            REF_TYPE.CACHE,
286            REF_TYPE.MODULE_FILE_PATH,
287            REF_TYPE.INTEGRATION_FILE_PATH,
288            REF_TYPE.INTEGRATION,
289            REF_TYPE.SUITE_PLAN_FILE_PATH,
290            REF_TYPE.MODULE_CLASS,
291        ],
292    )
293    self.assertEqual(
294        test_finder_handler._get_test_reference_types('int/test:Class#method'),
295        [
296            REF_TYPE.CACHE,
297            REF_TYPE.MODULE_FILE_PATH,
298            REF_TYPE.INTEGRATION_FILE_PATH,
299            REF_TYPE.INTEGRATION,
300            REF_TYPE.SUITE_PLAN_FILE_PATH,
301            REF_TYPE.MODULE_CLASS,
302        ],
303    )
304    self.assertEqual(
305        test_finder_handler._get_test_reference_types(
306            'int_name_no_slash:Class#m'
307        ),
308        [REF_TYPE.CACHE, REF_TYPE.MODULE_CLASS, REF_TYPE.INTEGRATION],
309    )
310    self.assertEqual(
311        test_finder_handler._get_test_reference_types(
312            'gtest_module:Class_Prefix/Class#Method/Method_Suffix'
313        ),
314        [
315            REF_TYPE.CACHE,
316            REF_TYPE.MODULE_FILE_PATH,
317            REF_TYPE.INTEGRATION_FILE_PATH,
318            REF_TYPE.INTEGRATION,
319            REF_TYPE.SUITE_PLAN_FILE_PATH,
320            REF_TYPE.MODULE_CLASS,
321        ],
322    )
323    self.assertEqual(
324        test_finder_handler._get_test_reference_types(
325            'Class_Prefix/Class#Method/Method_Suffix'
326        ),
327        [
328            REF_TYPE.CACHE,
329            REF_TYPE.MODULE_FILE_PATH,
330            REF_TYPE.INTEGRATION_FILE_PATH,
331            REF_TYPE.INTEGRATION,
332            REF_TYPE.SUITE_PLAN_FILE_PATH,
333            REF_TYPE.CC_CLASS,
334        ],
335    )
336
337  def test_get_registered_find_methods(self):
338    """Test that we get the registered find methods."""
339    empty_mod_info = None
340    example_finder_a_instance = test_finder_handler._get_finder_instance_dict(
341        empty_mod_info
342    )[_EXAMPLE_FINDER_A]
343    should_equal = [
344        test_finder_base.Finder(
345            example_finder_a_instance,
346            ExampleFinderA.registered_find_method_from_example_finder,
347            _EXAMPLE_FINDER_A,
348        )
349    ]
350    should_not_equal = [
351        test_finder_base.Finder(
352            example_finder_a_instance,
353            ExampleFinderA.unregistered_find_method_from_example_finder,
354            _EXAMPLE_FINDER_A,
355        )
356    ]
357    # Let's make sure we see the registered method.
358    self.assertEqual(
359        should_equal,
360        test_finder_handler._get_registered_find_methods(empty_mod_info),
361    )
362    # Make sure we don't see the unregistered method here.
363    self.assertNotEqual(
364        should_not_equal,
365        test_finder_handler._get_registered_find_methods(empty_mod_info),
366    )
367
368  def test_get_find_methods_for_test(self):
369    """Test that we get the find methods we expect."""
370    # Let's see that we get the unregistered and registered find methods in
371    # the order we expect.
372    test = ''
373    registered_find_methods = [
374        test_finder_base.Finder(
375            _FINDER_INSTANCES[_EXAMPLE_FINDER_A],
376            ExampleFinderA.registered_find_method_from_example_finder,
377            _EXAMPLE_FINDER_A,
378        )
379    ]
380    default_find_methods = [
381        test_finder_base.Finder(
382            _FINDER_INSTANCES[_EXAMPLE_FINDER_A],
383            ExampleFinderA.unregistered_find_method_from_example_finder,
384            _EXAMPLE_FINDER_A,
385        )
386    ]
387    should_equal = registered_find_methods + default_find_methods
388    self.assertEqual(
389        should_equal,
390        test_finder_handler.get_find_methods_for_test(
391            self.empty_mod_info, test
392        ),
393    )
394
395
396if __name__ == '__main__':
397  unittest.main()
398