1#!/usr/bin/env python3 2# 3# Copyright 2019, 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 cache_finder.""" 18 19import os 20import unittest 21from unittest import mock 22from atest import atest_utils 23from atest import constants 24from atest import module_info 25from atest import unittest_constants as uc 26from atest.test_finders import cache_finder 27from atest.test_finders import test_info 28from pyfakefs import fake_filesystem_unittest 29 30 31# pylint: disable=protected-access 32class CacheFinderUnittests(unittest.TestCase): 33 """Unit tests for cache_finder.py""" 34 35 def setUp(self): 36 """Set up stuff for testing.""" 37 self.cache_finder = cache_finder.CacheFinder() 38 self.cache_finder.module_info = mock.Mock(spec=module_info.ModuleInfo) 39 40 @mock.patch.object(atest_utils, 'get_cache_root') 41 def test_find_test_by_cache_cache_not_exist(self, mock_get_cache_root): 42 """Test find_test_by_cache input not cached test.""" 43 not_cached_test = 'mytest1' 44 mock_get_cache_root.return_value = os.path.join( 45 uc.TEST_DATA_DIR, 'cache_root' 46 ) 47 48 self.assertIsNone(self.cache_finder.find_test_by_cache(not_cached_test)) 49 50 @mock.patch.object( 51 cache_finder.CacheFinder, '_is_test_infos_valid', return_value=True 52 ) 53 @mock.patch.object(atest_utils, 'get_cache_root') 54 def test_find_test_by_cache_cache_exist_and_valid( 55 self, mock_get_cache_root, _mock_is_info_valid 56 ): 57 """Test find_test_by_cache input valid cached test.""" 58 cached_test = 'hello_world_test' 59 mock_get_cache_root.return_value = os.path.join( 60 uc.TEST_DATA_DIR, 'cache_root' 61 ) 62 63 self.assertIsNotNone(self.cache_finder.find_test_by_cache(cached_test)) 64 65 @mock.patch.object( 66 cache_finder.CacheFinder, '_is_test_filter_valid', return_value=True 67 ) 68 @mock.patch.object( 69 cache_finder.CacheFinder, '_is_test_build_target_valid', return_value=True 70 ) 71 @mock.patch.object( 72 cache_finder.CacheFinder, '_is_test_path_valid', return_value=True 73 ) 74 @mock.patch.object(atest_utils, 'load_test_info_cache') 75 def test_find_test_by_cache_wo_latest_info( 76 self, 77 mock_load_cache, 78 _mock_path_valid, 79 _mock_build_target_valid, 80 _mock_filer_valid, 81 ): 82 """Test find_test_by_cache cached not valid path.""" 83 cached_test = 'hello_world_test' 84 latest_test_info = test_info.TestInfo(None, None, None) 85 # Add a new attribute to make it different with current one. 86 latest_test_info.__setattr__('new_key', 1) 87 mock_load_cache.return_value = {latest_test_info} 88 89 self.assertIsNone(self.cache_finder.find_test_by_cache(cached_test)) 90 91 @mock.patch.object( 92 cache_finder.CacheFinder, '_is_test_build_target_valid', return_value=True 93 ) 94 @mock.patch.object(atest_utils, 'get_cache_root') 95 def test_find_test_by_cache_wo_valid_path( 96 self, mock_get_cache_root, _mock_build_target_valid 97 ): 98 """Test find_test_by_cache cached not valid path.""" 99 cached_test = 'hello_world_test' 100 mock_get_cache_root.return_value = os.path.join( 101 uc.TEST_DATA_DIR, 'cache_root' 102 ) 103 # Mock the path to make it not the same as the sample cache. 104 self.cache_finder.module_info.get_paths.return_value = [ 105 'not/matched/test/path' 106 ] 107 108 self.assertIsNone(self.cache_finder.find_test_by_cache(cached_test)) 109 110 @mock.patch.object( 111 cache_finder.CacheFinder, '_is_test_path_valid', return_value=True 112 ) 113 @mock.patch.object(atest_utils, 'get_cache_root') 114 def test_find_test_by_cache_wo_valid_build_target( 115 self, mock_get_cache_root, _mock_path_valid 116 ): 117 """Test find_test_by_cache method cached not valid build targets.""" 118 cached_test = 'hello_world_test' 119 mock_get_cache_root.return_value = os.path.join( 120 uc.TEST_DATA_DIR, 'cache_root' 121 ) 122 # Always return None for is_module function to simulate checking valid 123 # build target. 124 self.cache_finder.module_info.is_module.return_value = None 125 126 self.assertIsNone(self.cache_finder.find_test_by_cache(cached_test)) 127 128 @mock.patch.object( 129 cache_finder.CacheFinder, '_is_test_filter_valid', return_value=False 130 ) 131 @mock.patch.object( 132 cache_finder.CacheFinder, '_is_test_build_target_valid', return_value=True 133 ) 134 @mock.patch.object( 135 cache_finder.CacheFinder, '_is_test_path_valid', return_value=True 136 ) 137 @mock.patch.object(atest_utils, 'get_cache_root') 138 def test_find_test_by_cache_wo_valid_java_filter( 139 self, 140 mock_get_cache_root, 141 _mock_path_valid, 142 _mock_build_target_valid, 143 _mock_filer_valid, 144 ): 145 """Test _is_test_filter_valid method cached not valid java filter.""" 146 cached_test = 'hello_world_test' 147 mock_get_cache_root.return_value = os.path.join( 148 uc.TEST_DATA_DIR, 'cache_root' 149 ) 150 151 self.assertIsNone(self.cache_finder.find_test_by_cache(cached_test)) 152 153 def test_is_test_build_target_valid_module_in(self): 154 """Test _is_test_build_target_valid method if target has MODULES-IN.""" 155 t_info = test_info.TestInfo( 156 'mock_name', 'mock_runner', {'MODULES-IN-my-test-dir'} 157 ) 158 self.cache_finder.module_info.is_module.return_value = False 159 self.assertTrue(self.cache_finder._is_test_build_target_valid(t_info)) 160 161 def test_is_test_build_target_valid(self): 162 """Test _is_test_build_target_valid method.""" 163 t_info = test_info.TestInfo('mock_name', 'mock_runner', {'my-test-target'}) 164 self.cache_finder.module_info.is_module.return_value = False 165 self.assertFalse(self.cache_finder._is_test_build_target_valid(t_info)) 166 167 168class CacheFinderTestFilterUnittests(fake_filesystem_unittest.TestCase): 169 """Unit tests for cache_finder.py""" 170 171 def setUp(self): 172 """Set up stuff for testing.""" 173 self.setUpPyfakefs() 174 self.cache_finder = cache_finder.CacheFinder() 175 self.cache_finder.module_info = mock.Mock(spec=module_info.ModuleInfo) 176 177 def test_is_class_in_module_for_java_class(self): 178 """Test _is_class_in_module method if input is java class.""" 179 self.fs.create_file( 180 'src/a/b/c/MyTestClass.java', 181 contents='package android.test;\npublic class MyTestClass {\n', 182 ) 183 mock_mod = {constants.MODULE_SRCS: ['src/a/b/c/MyTestClass.java']} 184 self.cache_finder.module_info.get_module_info.return_value = mock_mod 185 186 # Should not match if class name does not exist. 187 self.assertFalse( 188 self.cache_finder._is_class_in_module('MyModule', 'a.b.c.MyTestClass') 189 ) 190 # Should match if class name exist. 191 self.assertTrue( 192 self.cache_finder._is_class_in_module( 193 'MyModule', 'android.test.MyTestClass' 194 ) 195 ) 196 197 def test_is_class_in_module_for_java_package(self): 198 """Test _is_class_in_module method if input is java package.""" 199 self.fs.create_file( 200 'src/a/b/c/MyTestClass.java', 201 contents='package android.test;\npublic class MyTestClass {\n', 202 ) 203 mock_mod = {constants.MODULE_SRCS: ['src/a/b/c/MyTestClass.java']} 204 self.cache_finder.module_info.get_module_info.return_value = mock_mod 205 206 # Should not match if package name does not match the src. 207 self.assertFalse(self.cache_finder._is_class_in_module('MyModule', 'a.b.c')) 208 # Should match if package name matches the src. 209 self.assertTrue( 210 self.cache_finder._is_class_in_module('MyModule', 'android.test') 211 ) 212 213 214if __name__ == '__main__': 215 unittest.main() 216