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