xref: /aosp_15_r20/tools/asuite/atest/test_finders/cache_finder_unittest.py (revision c2e18aaa1096c836b086f94603d04f4eb9cf37f5)
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