xref: /aosp_15_r20/cts/tools/incremental-cts/incremental_deqp_test.py (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker# Lint as: python3
2*b7c941bbSAndroid Build Coastguard Worker#
3*b7c941bbSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
4*b7c941bbSAndroid Build Coastguard Worker#
5*b7c941bbSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the 'License');
6*b7c941bbSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*b7c941bbSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*b7c941bbSAndroid Build Coastguard Worker#
9*b7c941bbSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*b7c941bbSAndroid Build Coastguard Worker#
11*b7c941bbSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*b7c941bbSAndroid Build Coastguard Worker# distributed under the License is distributed on an 'AS IS' BASIS,
13*b7c941bbSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*b7c941bbSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*b7c941bbSAndroid Build Coastguard Worker# limitations under the License.
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Worker"""Tests for incremental_deqp."""
18*b7c941bbSAndroid Build Coastguard Worker
19*b7c941bbSAndroid Build Coastguard Workerimport incremental_deqp
20*b7c941bbSAndroid Build Coastguard Workerimport os
21*b7c941bbSAndroid Build Coastguard Workerimport unittest
22*b7c941bbSAndroid Build Coastguard Workerfrom unittest.mock import MagicMock
23*b7c941bbSAndroid Build Coastguard Workerfrom unittest.mock import patch
24*b7c941bbSAndroid Build Coastguard Worker
25*b7c941bbSAndroid Build Coastguard Worker@patch('incremental_deqp.AdbHelper', MagicMock())
26*b7c941bbSAndroid Build Coastguard Workerclass IncrementalDeqpTest(unittest.TestCase):
27*b7c941bbSAndroid Build Coastguard Worker
28*b7c941bbSAndroid Build Coastguard Worker  def setUp(self):
29*b7c941bbSAndroid Build Coastguard Worker    testfile_dir = os.path.dirname(os.path.abspath(__file__))
30*b7c941bbSAndroid Build Coastguard Worker    self.testdata_dir = testfile_dir +'/testdata'
31*b7c941bbSAndroid Build Coastguard Worker    self.dependency_collector = incremental_deqp.DeqpDependencyCollector(None, None, None)
32*b7c941bbSAndroid Build Coastguard Worker    self.parser = incremental_deqp._get_parser()
33*b7c941bbSAndroid Build Coastguard Worker
34*b7c941bbSAndroid Build Coastguard Worker  def test_update_dependency(self):
35*b7c941bbSAndroid Build Coastguard Worker    """Test update_dependency gets correct dEQP dependency from dump file."""
36*b7c941bbSAndroid Build Coastguard Worker    dump_file = 'testdata/perf_dump.txt'
37*b7c941bbSAndroid Build Coastguard Worker    deps = set()
38*b7c941bbSAndroid Build Coastguard Worker    self.dependency_collector.update_dependency(deps, dump_file)
39*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(len(deps),2)
40*b7c941bbSAndroid Build Coastguard Worker    self.assertIn('file_2', deps)
41*b7c941bbSAndroid Build Coastguard Worker    self.assertIn('file_3', deps)
42*b7c941bbSAndroid Build Coastguard Worker
43*b7c941bbSAndroid Build Coastguard Worker  def test_check_test_log_all_test_executed(self):
44*b7c941bbSAndroid Build Coastguard Worker    """Test check_test_log returns true if all tests are executed."""
45*b7c941bbSAndroid Build Coastguard Worker    test_file = 'testdata/test_list.txt'
46*b7c941bbSAndroid Build Coastguard Worker    log_file = 'testdata/log_1.qpa'
47*b7c941bbSAndroid Build Coastguard Worker    self.assertTrue(self.dependency_collector.check_test_log(test_file, log_file))
48*b7c941bbSAndroid Build Coastguard Worker
49*b7c941bbSAndroid Build Coastguard Worker  def test_check_test_log_test_crashed(self):
50*b7c941bbSAndroid Build Coastguard Worker    """Test check_test_log returns false if tests are crashed."""
51*b7c941bbSAndroid Build Coastguard Worker    test_file = 'testdata/test_list.txt'
52*b7c941bbSAndroid Build Coastguard Worker    log_file = 'testdata/log_2.qpa'
53*b7c941bbSAndroid Build Coastguard Worker    self.assertFalse(self.dependency_collector.check_test_log(test_file, log_file))
54*b7c941bbSAndroid Build Coastguard Worker
55*b7c941bbSAndroid Build Coastguard Worker  def test_get_test_binary_name(self):
56*b7c941bbSAndroid Build Coastguard Worker    """Test get_test_binary_name gets dEQP binary name based on test name."""
57*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_test_binary_name('vk-32'), 'deqp-binary')
58*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_test_binary_name('vk-64'), 'deqp-binary64')
59*b7c941bbSAndroid Build Coastguard Worker    with self.assertRaises(incremental_deqp.TestError):
60*b7c941bbSAndroid Build Coastguard Worker      self.dependency_collector.get_test_binary_name('test')
61*b7c941bbSAndroid Build Coastguard Worker
62*b7c941bbSAndroid Build Coastguard Worker  def test_get_test_log_name(self):
63*b7c941bbSAndroid Build Coastguard Worker    """Test get_test_log_name gets correct test log name based on test name."""
64*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_test_log_name('test'), 'test.qpa')
65*b7c941bbSAndroid Build Coastguard Worker
66*b7c941bbSAndroid Build Coastguard Worker  def test_get_perf_name(self):
67*b7c941bbSAndroid Build Coastguard Worker    """Test get_perf_name gets correct perf file name based on test name."""
68*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_test_perf_name('test'), 'test.data')
69*b7c941bbSAndroid Build Coastguard Worker
70*b7c941bbSAndroid Build Coastguard Worker  def test_get_perf_dump_name(self):
71*b7c941bbSAndroid Build Coastguard Worker    """Test get_perf_dump_name gets correct perf dump file name based on test name."""
72*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_perf_dump_name('test'), 'test-perf-dump.txt')
73*b7c941bbSAndroid Build Coastguard Worker
74*b7c941bbSAndroid Build Coastguard Worker  def test_get_test_list_name(self):
75*b7c941bbSAndroid Build Coastguard Worker    """Test get_test_list_name gets test list name based on test name."""
76*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_test_list_name('vk-32'), 'vk-master-subset.txt')
77*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(self.dependency_collector.get_test_list_name('gles3-32'),
78*b7c941bbSAndroid Build Coastguard Worker                     'gles3-master-subset.txt')
79*b7c941bbSAndroid Build Coastguard Worker    with self.assertRaises(incremental_deqp.TestError):
80*b7c941bbSAndroid Build Coastguard Worker      self.dependency_collector.get_test_list_name('test')
81*b7c941bbSAndroid Build Coastguard Worker
82*b7c941bbSAndroid Build Coastguard Worker  def test_valid_dependency(self):
83*b7c941bbSAndroid Build Coastguard Worker    """Test if dependency is valid."""
84*b7c941bbSAndroid Build Coastguard Worker    self.assertTrue(incremental_deqp._is_deqp_dependency('/file/a.so'))
85*b7c941bbSAndroid Build Coastguard Worker    self.assertFalse(incremental_deqp._is_deqp_dependency('/apex/a.so'))
86*b7c941bbSAndroid Build Coastguard Worker
87*b7c941bbSAndroid Build Coastguard Worker  def test_build_helper_compare_build_with_device_files_true(self):
88*b7c941bbSAndroid Build Coastguard Worker    """Test BuildHelper.compare_base_build_with_device_files returns true."""
89*b7c941bbSAndroid Build Coastguard Worker    build_helper = incremental_deqp.BuildHelper()
90*b7c941bbSAndroid Build Coastguard Worker    deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so']
91*b7c941bbSAndroid Build Coastguard Worker    base_build_file = './testdata/base_build_target-files.zip'
92*b7c941bbSAndroid Build Coastguard Worker
93*b7c941bbSAndroid Build Coastguard Worker    def side_effect(command):
94*b7c941bbSAndroid Build Coastguard Worker      if 'file_a.so' in command:
95*b7c941bbSAndroid Build Coastguard Worker        return b'placeholder\nplaceholder\n'
96*b7c941bbSAndroid Build Coastguard Worker      if 'file_b.so' in command:
97*b7c941bbSAndroid Build Coastguard Worker        return b'placeholder\nplaceholder\nplaceholder\n\n'
98*b7c941bbSAndroid Build Coastguard Worker
99*b7c941bbSAndroid Build Coastguard Worker    adb = incremental_deqp.AdbHelper()
100*b7c941bbSAndroid Build Coastguard Worker    adb.run_shell_command = MagicMock(side_effect=side_effect)
101*b7c941bbSAndroid Build Coastguard Worker    self.assertTrue(build_helper.compare_base_build_with_device_files(
102*b7c941bbSAndroid Build Coastguard Worker        deqp_deps, adb, base_build_file)[0])
103*b7c941bbSAndroid Build Coastguard Worker
104*b7c941bbSAndroid Build Coastguard Worker  def test_compare_build_with_device_files_false(self):
105*b7c941bbSAndroid Build Coastguard Worker    """Test BuildHelper.compare_base_build_with_device_files returns false."""
106*b7c941bbSAndroid Build Coastguard Worker    deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so']
107*b7c941bbSAndroid Build Coastguard Worker    build_helper = incremental_deqp.BuildHelper()
108*b7c941bbSAndroid Build Coastguard Worker    base_build_file = './testdata/base_build_target-files.zip'
109*b7c941bbSAndroid Build Coastguard Worker    def side_effect(command):
110*b7c941bbSAndroid Build Coastguard Worker      if 'file_a.so' in command:
111*b7c941bbSAndroid Build Coastguard Worker        return b'different text'
112*b7c941bbSAndroid Build Coastguard Worker      if 'file_b.so' in command:
113*b7c941bbSAndroid Build Coastguard Worker        return b'placeholder\nplaceholder\nplaceholder\n\n'
114*b7c941bbSAndroid Build Coastguard Worker
115*b7c941bbSAndroid Build Coastguard Worker    adb = incremental_deqp.AdbHelper()
116*b7c941bbSAndroid Build Coastguard Worker    adb.run_shell_command = MagicMock(side_effect=side_effect)
117*b7c941bbSAndroid Build Coastguard Worker    self.assertFalse(build_helper.compare_base_build_with_device_files(
118*b7c941bbSAndroid Build Coastguard Worker        deqp_deps, adb, base_build_file)[0])
119*b7c941bbSAndroid Build Coastguard Worker
120*b7c941bbSAndroid Build Coastguard Worker  def test_build_helper_compare_build_with_current_build_true(self):
121*b7c941bbSAndroid Build Coastguard Worker    """Test BuildHelper.compare_base_build_with_current_build returns true."""
122*b7c941bbSAndroid Build Coastguard Worker    build_helper = incremental_deqp.BuildHelper()
123*b7c941bbSAndroid Build Coastguard Worker    deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so']
124*b7c941bbSAndroid Build Coastguard Worker    base_build_file = './testdata/base_build_target-files.zip'
125*b7c941bbSAndroid Build Coastguard Worker
126*b7c941bbSAndroid Build Coastguard Worker    self.assertTrue(build_helper.compare_base_build_with_current_build(
127*b7c941bbSAndroid Build Coastguard Worker        deqp_deps, base_build_file, base_build_file)[0])
128*b7c941bbSAndroid Build Coastguard Worker
129*b7c941bbSAndroid Build Coastguard Worker  def test_build_helper_compare_build_with_current_build_false(self):
130*b7c941bbSAndroid Build Coastguard Worker    """Test BuildHelper.compare_base_build_with_current_build returns false."""
131*b7c941bbSAndroid Build Coastguard Worker    build_helper = incremental_deqp.BuildHelper()
132*b7c941bbSAndroid Build Coastguard Worker    deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so']
133*b7c941bbSAndroid Build Coastguard Worker    base_build_file = './testdata/base_build_target-files.zip'
134*b7c941bbSAndroid Build Coastguard Worker    current_build_file = './testdata/current_build_target-files.zip'
135*b7c941bbSAndroid Build Coastguard Worker
136*b7c941bbSAndroid Build Coastguard Worker    self.assertFalse(build_helper.compare_base_build_with_current_build(
137*b7c941bbSAndroid Build Coastguard Worker        deqp_deps, current_build_file, base_build_file)[0])
138*b7c941bbSAndroid Build Coastguard Worker
139*b7c941bbSAndroid Build Coastguard Worker  def test_build_helper_get_system_fingerprint(self):
140*b7c941bbSAndroid Build Coastguard Worker    """Test BuildHelper gets system fingerprint."""
141*b7c941bbSAndroid Build Coastguard Worker    build_helper = incremental_deqp.BuildHelper()
142*b7c941bbSAndroid Build Coastguard Worker    build_file = './testdata/base_build_target-files.zip'
143*b7c941bbSAndroid Build Coastguard Worker
144*b7c941bbSAndroid Build Coastguard Worker    self.assertEqual(('generic/aosp_cf_x86_64_phone/vsoc_x86_64:S/AOSP.MASTER/7363308:'
145*b7c941bbSAndroid Build Coastguard Worker                      'userdebug/test-keys'), build_helper.get_system_fingerprint(build_file))
146*b7c941bbSAndroid Build Coastguard Worker
147*b7c941bbSAndroid Build Coastguard Worker
148*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp.BuildHelper', autospec=True)
149*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp._save_deqp_deps', autospec=True)
150*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp.DeqpDependencyCollector', autospec=True)
151*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp.AdbHelper', autospec=True)
152*b7c941bbSAndroid Build Coastguard Worker  def test_local_run_generate_deps_only(self, adb_helper_mock, dependency_collector_mock,
153*b7c941bbSAndroid Build Coastguard Worker                                        save_deps_mock, build_helper_mock):
154*b7c941bbSAndroid Build Coastguard Worker    """Test generate_deps_only option in local_run."""
155*b7c941bbSAndroid Build Coastguard Worker    dependency_collector_mock.return_value.get_deqp_dependency.return_value = {'a.so'}
156*b7c941bbSAndroid Build Coastguard Worker    args = self.parser.parse_args(['--generate_deps_only'])
157*b7c941bbSAndroid Build Coastguard Worker    incremental_deqp._local_run(args, '')
158*b7c941bbSAndroid Build Coastguard Worker    save_deps_mock.assert_called_once_with({'a.so'}, 'dEQP-dependency.txt')
159*b7c941bbSAndroid Build Coastguard Worker    build_helper_mock.assert_not_called()
160*b7c941bbSAndroid Build Coastguard Worker
161*b7c941bbSAndroid Build Coastguard Worker  def test_local_run_missing_extra_deps(self):
162*b7c941bbSAndroid Build Coastguard Worker    """Test local_run throws exception if extra_deqp_dependency.txt is missing."""
163*b7c941bbSAndroid Build Coastguard Worker    args = self.parser.parse_args(['-t ./testdata'])
164*b7c941bbSAndroid Build Coastguard Worker    with self.assertRaises(incremental_deqp.TestResourceError):
165*b7c941bbSAndroid Build Coastguard Worker      incremental_deqp._local_run(args, '')
166*b7c941bbSAndroid Build Coastguard Worker
167*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp._generate_report', autospec=True)
168*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp.BuildHelper', autospec=True)
169*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp._save_deqp_deps', autospec=True)
170*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp.DeqpDependencyCollector', autospec=True)
171*b7c941bbSAndroid Build Coastguard Worker  @patch('incremental_deqp.AdbHelper', autospec=True)
172*b7c941bbSAndroid Build Coastguard Worker  def test_local_run_compare_build(self, adb_helper_mock, dependency_collector_mock,
173*b7c941bbSAndroid Build Coastguard Worker                                   save_deps_mock, build_helper_mock, generate_report_mock):
174*b7c941bbSAndroid Build Coastguard Worker    """Test local_run could compare build based on dependency."""
175*b7c941bbSAndroid Build Coastguard Worker    dependency_collector_mock.return_value.get_deqp_dependency.return_value = {'a.so'}
176*b7c941bbSAndroid Build Coastguard Worker    build_helper_mock.return_value.compare_base_build_with_device_files.return_value = [False, {}]
177*b7c941bbSAndroid Build Coastguard Worker    args = self.parser.parse_args(['-b', 'base_build', '-t', self.testdata_dir])
178*b7c941bbSAndroid Build Coastguard Worker
179*b7c941bbSAndroid Build Coastguard Worker    incremental_deqp._local_run(args, '')
180*b7c941bbSAndroid Build Coastguard Worker
181*b7c941bbSAndroid Build Coastguard Worker    save_deps_mock.assert_called_once_with({'a.so', 'extra_a.so'}, 'dEQP-dependency.txt')
182*b7c941bbSAndroid Build Coastguard Worker    build_helper_mock.assert_called_once_with(False)
183*b7c941bbSAndroid Build Coastguard Worker
184*b7c941bbSAndroid Build Coastguard Workerif __name__ == '__main__':
185*b7c941bbSAndroid Build Coastguard Worker  unittest.main()
186