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