# Lint as: python3 # # Copyright (C) 2021 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for incremental_deqp.""" import incremental_deqp import os import unittest from unittest.mock import MagicMock from unittest.mock import patch @patch('incremental_deqp.AdbHelper', MagicMock()) class IncrementalDeqpTest(unittest.TestCase): def setUp(self): testfile_dir = os.path.dirname(os.path.abspath(__file__)) self.testdata_dir = testfile_dir +'/testdata' self.dependency_collector = incremental_deqp.DeqpDependencyCollector(None, None, None) self.parser = incremental_deqp._get_parser() def test_update_dependency(self): """Test update_dependency gets correct dEQP dependency from dump file.""" dump_file = 'testdata/perf_dump.txt' deps = set() self.dependency_collector.update_dependency(deps, dump_file) self.assertEqual(len(deps),2) self.assertIn('file_2', deps) self.assertIn('file_3', deps) def test_check_test_log_all_test_executed(self): """Test check_test_log returns true if all tests are executed.""" test_file = 'testdata/test_list.txt' log_file = 'testdata/log_1.qpa' self.assertTrue(self.dependency_collector.check_test_log(test_file, log_file)) def test_check_test_log_test_crashed(self): """Test check_test_log returns false if tests are crashed.""" test_file = 'testdata/test_list.txt' log_file = 'testdata/log_2.qpa' self.assertFalse(self.dependency_collector.check_test_log(test_file, log_file)) def test_get_test_binary_name(self): """Test get_test_binary_name gets dEQP binary name based on test name.""" self.assertEqual(self.dependency_collector.get_test_binary_name('vk-32'), 'deqp-binary') self.assertEqual(self.dependency_collector.get_test_binary_name('vk-64'), 'deqp-binary64') with self.assertRaises(incremental_deqp.TestError): self.dependency_collector.get_test_binary_name('test') def test_get_test_log_name(self): """Test get_test_log_name gets correct test log name based on test name.""" self.assertEqual(self.dependency_collector.get_test_log_name('test'), 'test.qpa') def test_get_perf_name(self): """Test get_perf_name gets correct perf file name based on test name.""" self.assertEqual(self.dependency_collector.get_test_perf_name('test'), 'test.data') def test_get_perf_dump_name(self): """Test get_perf_dump_name gets correct perf dump file name based on test name.""" self.assertEqual(self.dependency_collector.get_perf_dump_name('test'), 'test-perf-dump.txt') def test_get_test_list_name(self): """Test get_test_list_name gets test list name based on test name.""" self.assertEqual(self.dependency_collector.get_test_list_name('vk-32'), 'vk-master-subset.txt') self.assertEqual(self.dependency_collector.get_test_list_name('gles3-32'), 'gles3-master-subset.txt') with self.assertRaises(incremental_deqp.TestError): self.dependency_collector.get_test_list_name('test') def test_valid_dependency(self): """Test if dependency is valid.""" self.assertTrue(incremental_deqp._is_deqp_dependency('/file/a.so')) self.assertFalse(incremental_deqp._is_deqp_dependency('/apex/a.so')) def test_build_helper_compare_build_with_device_files_true(self): """Test BuildHelper.compare_base_build_with_device_files returns true.""" build_helper = incremental_deqp.BuildHelper() deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so'] base_build_file = './testdata/base_build_target-files.zip' def side_effect(command): if 'file_a.so' in command: return b'placeholder\nplaceholder\n' if 'file_b.so' in command: return b'placeholder\nplaceholder\nplaceholder\n\n' adb = incremental_deqp.AdbHelper() adb.run_shell_command = MagicMock(side_effect=side_effect) self.assertTrue(build_helper.compare_base_build_with_device_files( deqp_deps, adb, base_build_file)[0]) def test_compare_build_with_device_files_false(self): """Test BuildHelper.compare_base_build_with_device_files returns false.""" deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so'] build_helper = incremental_deqp.BuildHelper() base_build_file = './testdata/base_build_target-files.zip' def side_effect(command): if 'file_a.so' in command: return b'different text' if 'file_b.so' in command: return b'placeholder\nplaceholder\nplaceholder\n\n' adb = incremental_deqp.AdbHelper() adb.run_shell_command = MagicMock(side_effect=side_effect) self.assertFalse(build_helper.compare_base_build_with_device_files( deqp_deps, adb, base_build_file)[0]) def test_build_helper_compare_build_with_current_build_true(self): """Test BuildHelper.compare_base_build_with_current_build returns true.""" build_helper = incremental_deqp.BuildHelper() deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so'] base_build_file = './testdata/base_build_target-files.zip' self.assertTrue(build_helper.compare_base_build_with_current_build( deqp_deps, base_build_file, base_build_file)[0]) def test_build_helper_compare_build_with_current_build_false(self): """Test BuildHelper.compare_base_build_with_current_build returns false.""" build_helper = incremental_deqp.BuildHelper() deqp_deps = ['/system/deqp_dependency_file_a.so', '/vendor/deqp_dependency_file_b.so'] base_build_file = './testdata/base_build_target-files.zip' current_build_file = './testdata/current_build_target-files.zip' self.assertFalse(build_helper.compare_base_build_with_current_build( deqp_deps, current_build_file, base_build_file)[0]) def test_build_helper_get_system_fingerprint(self): """Test BuildHelper gets system fingerprint.""" build_helper = incremental_deqp.BuildHelper() build_file = './testdata/base_build_target-files.zip' self.assertEqual(('generic/aosp_cf_x86_64_phone/vsoc_x86_64:S/AOSP.MASTER/7363308:' 'userdebug/test-keys'), build_helper.get_system_fingerprint(build_file)) @patch('incremental_deqp.BuildHelper', autospec=True) @patch('incremental_deqp._save_deqp_deps', autospec=True) @patch('incremental_deqp.DeqpDependencyCollector', autospec=True) @patch('incremental_deqp.AdbHelper', autospec=True) def test_local_run_generate_deps_only(self, adb_helper_mock, dependency_collector_mock, save_deps_mock, build_helper_mock): """Test generate_deps_only option in local_run.""" dependency_collector_mock.return_value.get_deqp_dependency.return_value = {'a.so'} args = self.parser.parse_args(['--generate_deps_only']) incremental_deqp._local_run(args, '') save_deps_mock.assert_called_once_with({'a.so'}, 'dEQP-dependency.txt') build_helper_mock.assert_not_called() def test_local_run_missing_extra_deps(self): """Test local_run throws exception if extra_deqp_dependency.txt is missing.""" args = self.parser.parse_args(['-t ./testdata']) with self.assertRaises(incremental_deqp.TestResourceError): incremental_deqp._local_run(args, '') @patch('incremental_deqp._generate_report', autospec=True) @patch('incremental_deqp.BuildHelper', autospec=True) @patch('incremental_deqp._save_deqp_deps', autospec=True) @patch('incremental_deqp.DeqpDependencyCollector', autospec=True) @patch('incremental_deqp.AdbHelper', autospec=True) def test_local_run_compare_build(self, adb_helper_mock, dependency_collector_mock, save_deps_mock, build_helper_mock, generate_report_mock): """Test local_run could compare build based on dependency.""" dependency_collector_mock.return_value.get_deqp_dependency.return_value = {'a.so'} build_helper_mock.return_value.compare_base_build_with_device_files.return_value = [False, {}] args = self.parser.parse_args(['-b', 'base_build', '-t', self.testdata_dir]) incremental_deqp._local_run(args, '') save_deps_mock.assert_called_once_with({'a.so', 'extra_a.so'}, 'dEQP-dependency.txt') build_helper_mock.assert_called_once_with(False) if __name__ == '__main__': unittest.main()