1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*90c8c64dSAndroid Build Coastguard Worker 3*90c8c64dSAndroid Build Coastguard Workerimport os 4*90c8c64dSAndroid Build Coastguard Workerimport shutil 5*90c8c64dSAndroid Build Coastguard Workerimport stat 6*90c8c64dSAndroid Build Coastguard Workerimport subprocess 7*90c8c64dSAndroid Build Coastguard Workerimport sys 8*90c8c64dSAndroid Build Coastguard Workerimport tempfile 9*90c8c64dSAndroid Build Coastguard Workerimport unittest 10*90c8c64dSAndroid Build Coastguard Worker 11*90c8c64dSAndroid Build Coastguard Workerimport_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 12*90c8c64dSAndroid Build Coastguard Workerimport_path = os.path.abspath(os.path.join(import_path, 'utils')) 13*90c8c64dSAndroid Build Coastguard Workersys.path.insert(1, import_path) 14*90c8c64dSAndroid Build Coastguard Worker 15*90c8c64dSAndroid Build Coastguard Workerfrom utils import (run_abi_diff, run_and_read_abi_diff, run_header_abi_dumper, 16*90c8c64dSAndroid Build Coastguard Worker run_header_abi_linker) 17*90c8c64dSAndroid Build Coastguard Workerfrom module import Module 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker 20*90c8c64dSAndroid Build Coastguard WorkerSCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) 21*90c8c64dSAndroid Build Coastguard WorkerINPUT_DIR = os.path.join(SCRIPT_DIR, 'input') 22*90c8c64dSAndroid Build Coastguard WorkerEXPECTED_DIR = os.path.join(SCRIPT_DIR, 'expected') 23*90c8c64dSAndroid Build Coastguard WorkerEXPORTED_HEADER_DIRS = (INPUT_DIR,) 24*90c8c64dSAndroid Build Coastguard WorkerREF_DUMP_DIR = os.path.join(SCRIPT_DIR, 'reference_dumps') 25*90c8c64dSAndroid Build Coastguard Worker 26*90c8c64dSAndroid Build Coastguard Worker 27*90c8c64dSAndroid Build Coastguard Workerdef make_and_copy_dump(module, dump_dir): 28*90c8c64dSAndroid Build Coastguard Worker dump_dir = os.path.join(dump_dir, module.arch) 29*90c8c64dSAndroid Build Coastguard Worker os.makedirs(dump_dir, exist_ok=True) 30*90c8c64dSAndroid Build Coastguard Worker dump_path = os.path.join(dump_dir, module.get_dump_name()) 31*90c8c64dSAndroid Build Coastguard Worker module.make_dump(dump_path) 32*90c8c64dSAndroid Build Coastguard Worker return dump_path 33*90c8c64dSAndroid Build Coastguard Worker 34*90c8c64dSAndroid Build Coastguard Worker 35*90c8c64dSAndroid Build Coastguard Workerdef _read_output_content(dump_path): 36*90c8c64dSAndroid Build Coastguard Worker with open(dump_path, 'r') as f: 37*90c8c64dSAndroid Build Coastguard Worker return f.read() 38*90c8c64dSAndroid Build Coastguard Worker 39*90c8c64dSAndroid Build Coastguard Worker 40*90c8c64dSAndroid Build Coastguard Workerclass HeaderCheckerTest(unittest.TestCase): 41*90c8c64dSAndroid Build Coastguard Worker @classmethod 42*90c8c64dSAndroid Build Coastguard Worker def setUpClass(cls): 43*90c8c64dSAndroid Build Coastguard Worker cls.maxDiff = None 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Worker def setUp(self): 46*90c8c64dSAndroid Build Coastguard Worker self.tmp_dir = None 47*90c8c64dSAndroid Build Coastguard Worker 48*90c8c64dSAndroid Build Coastguard Worker def tearDown(self): 49*90c8c64dSAndroid Build Coastguard Worker if self.tmp_dir: 50*90c8c64dSAndroid Build Coastguard Worker self.tmp_dir.cleanup() 51*90c8c64dSAndroid Build Coastguard Worker self.tmp_dir = None 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Worker def get_tmp_dir(self): 54*90c8c64dSAndroid Build Coastguard Worker if not self.tmp_dir: 55*90c8c64dSAndroid Build Coastguard Worker self.tmp_dir = tempfile.TemporaryDirectory() 56*90c8c64dSAndroid Build Coastguard Worker return self.tmp_dir.name 57*90c8c64dSAndroid Build Coastguard Worker 58*90c8c64dSAndroid Build Coastguard Worker def run_and_compare(self, input_path, expected_path, cflags=[]): 59*90c8c64dSAndroid Build Coastguard Worker with open(expected_path, 'r') as f: 60*90c8c64dSAndroid Build Coastguard Worker expected_output = f.read() 61*90c8c64dSAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile(dir=self.get_tmp_dir(), 62*90c8c64dSAndroid Build Coastguard Worker delete=False) as f: 63*90c8c64dSAndroid Build Coastguard Worker output_path = f.name 64*90c8c64dSAndroid Build Coastguard Worker run_header_abi_dumper(input_path, output_path, cflags, 65*90c8c64dSAndroid Build Coastguard Worker EXPORTED_HEADER_DIRS) 66*90c8c64dSAndroid Build Coastguard Worker actual_output = _read_output_content(output_path) 67*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(actual_output, expected_output) 68*90c8c64dSAndroid Build Coastguard Worker 69*90c8c64dSAndroid Build Coastguard Worker def run_and_compare_name(self, name, cflags=[]): 70*90c8c64dSAndroid Build Coastguard Worker input_path = os.path.join(INPUT_DIR, name) 71*90c8c64dSAndroid Build Coastguard Worker expected_path = os.path.join(EXPECTED_DIR, name) 72*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare(input_path, expected_path, cflags) 73*90c8c64dSAndroid Build Coastguard Worker 74*90c8c64dSAndroid Build Coastguard Worker def run_and_compare_name_cpp(self, name, cflags=[]): 75*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name(name, cflags + ['-x', 'c++', '-std=c++11']) 76*90c8c64dSAndroid Build Coastguard Worker 77*90c8c64dSAndroid Build Coastguard Worker def run_and_compare_name_c_cpp(self, name, cflags=[]): 78*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name(name, cflags) 79*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name_cpp(name, cflags) 80*90c8c64dSAndroid Build Coastguard Worker 81*90c8c64dSAndroid Build Coastguard Worker def run_and_compare_abi_diff(self, old_dump, new_dump, lib, arch, 82*90c8c64dSAndroid Build Coastguard Worker expected_return_code, flags=[]): 83*90c8c64dSAndroid Build Coastguard Worker return_code, output = run_and_read_abi_diff( 84*90c8c64dSAndroid Build Coastguard Worker old_dump, new_dump, arch, lib, flags) 85*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(return_code, expected_return_code) 86*90c8c64dSAndroid Build Coastguard Worker return output 87*90c8c64dSAndroid Build Coastguard Worker 88*90c8c64dSAndroid Build Coastguard Worker def prepare_and_run_abi_diff(self, old_ref_dump_path, new_ref_dump_path, 89*90c8c64dSAndroid Build Coastguard Worker target_arch, expected_return_code, flags=[]): 90*90c8c64dSAndroid Build Coastguard Worker return self.run_and_compare_abi_diff( 91*90c8c64dSAndroid Build Coastguard Worker old_ref_dump_path, new_ref_dump_path, 'test', target_arch, 92*90c8c64dSAndroid Build Coastguard Worker expected_return_code, flags) 93*90c8c64dSAndroid Build Coastguard Worker 94*90c8c64dSAndroid Build Coastguard Worker def get_or_create_dump(self, module, create): 95*90c8c64dSAndroid Build Coastguard Worker if create: 96*90c8c64dSAndroid Build Coastguard Worker return make_and_copy_dump(module, self.get_tmp_dir()) 97*90c8c64dSAndroid Build Coastguard Worker self.assertTrue(module.has_reference_dump, 98*90c8c64dSAndroid Build Coastguard Worker f'Module {module.name} is not configured to generate ' 99*90c8c64dSAndroid Build Coastguard Worker f'reference dump.') 100*90c8c64dSAndroid Build Coastguard Worker return os.path.join(REF_DUMP_DIR, module.arch, module.get_dump_name()) 101*90c8c64dSAndroid Build Coastguard Worker 102*90c8c64dSAndroid Build Coastguard Worker def prepare_and_run_abi_diff_all_archs(self, old_lib, new_lib, 103*90c8c64dSAndroid Build Coastguard Worker expected_return_code, flags=[], 104*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=True): 105*90c8c64dSAndroid Build Coastguard Worker old_modules = Module.get_test_modules_by_name(old_lib) 106*90c8c64dSAndroid Build Coastguard Worker new_modules = Module.get_test_modules_by_name(new_lib) 107*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(len(old_modules), len(new_modules)) 108*90c8c64dSAndroid Build Coastguard Worker self.assertTrue(len(old_modules)) 109*90c8c64dSAndroid Build Coastguard Worker 110*90c8c64dSAndroid Build Coastguard Worker for old_module, new_module in zip(old_modules, new_modules): 111*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(old_module.arch, new_module.arch) 112*90c8c64dSAndroid Build Coastguard Worker old_dump_path = self.get_or_create_dump(old_module, create_old) 113*90c8c64dSAndroid Build Coastguard Worker new_dump_path = self.get_or_create_dump(new_module, create_new) 114*90c8c64dSAndroid Build Coastguard Worker output = self.prepare_and_run_abi_diff( 115*90c8c64dSAndroid Build Coastguard Worker old_dump_path, new_dump_path, new_module.arch, 116*90c8c64dSAndroid Build Coastguard Worker expected_return_code, flags) 117*90c8c64dSAndroid Build Coastguard Worker # Since most test cases are independent of architecture, verifying one 118*90c8c64dSAndroid Build Coastguard Worker # of the reports is sufficient. 119*90c8c64dSAndroid Build Coastguard Worker return output 120*90c8c64dSAndroid Build Coastguard Worker 121*90c8c64dSAndroid Build Coastguard Worker def prepare_and_absolute_diff_all_archs(self, old_lib, new_lib): 122*90c8c64dSAndroid Build Coastguard Worker old_modules = Module.get_test_modules_by_name(old_lib) 123*90c8c64dSAndroid Build Coastguard Worker new_modules = Module.get_test_modules_by_name(new_lib) 124*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(len(old_modules), len(new_modules)) 125*90c8c64dSAndroid Build Coastguard Worker 126*90c8c64dSAndroid Build Coastguard Worker for old_module, new_module in zip(old_modules, new_modules): 127*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(old_module.arch, new_module.arch) 128*90c8c64dSAndroid Build Coastguard Worker old_dump_path = self.get_or_create_dump(old_module, False) 129*90c8c64dSAndroid Build Coastguard Worker new_dump_path = self.get_or_create_dump(new_module, True) 130*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(_read_output_content(old_dump_path), 131*90c8c64dSAndroid Build Coastguard Worker _read_output_content(new_dump_path)) 132*90c8c64dSAndroid Build Coastguard Worker 133*90c8c64dSAndroid Build Coastguard Worker def test_example1_cpp(self): 134*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name_cpp('example1.cpp') 135*90c8c64dSAndroid Build Coastguard Worker 136*90c8c64dSAndroid Build Coastguard Worker def test_example1_h(self): 137*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name_cpp('example1.h') 138*90c8c64dSAndroid Build Coastguard Worker 139*90c8c64dSAndroid Build Coastguard Worker def test_example2_h(self): 140*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name_cpp('example2.h') 141*90c8c64dSAndroid Build Coastguard Worker 142*90c8c64dSAndroid Build Coastguard Worker def test_example3_h(self): 143*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_name_cpp('example3.h') 144*90c8c64dSAndroid Build Coastguard Worker 145*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp(self): 146*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 147*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp", "libc_and_cpp", 0) 148*90c8c64dSAndroid Build Coastguard Worker 149*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_and_libc_and_cpp_with_unused_struct(self): 150*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 151*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp", "libc_and_cpp_with_unused_struct", 0) 152*90c8c64dSAndroid Build Coastguard Worker 153*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_and_libc_and_cpp_with_unused_struct_allow(self): 154*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 155*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp", "libc_and_cpp_with_unused_struct", 0, 156*90c8c64dSAndroid Build Coastguard Worker ["-allow-unreferenced-changes"]) 157*90c8c64dSAndroid Build Coastguard Worker 158*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_and_libc_and_cpp_with_unused_struct_check_all(self): 159*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 160*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp", "libc_and_cpp_with_unused_struct", 1, 161*90c8c64dSAndroid Build Coastguard Worker ["-check-all-apis"]) 162*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 163*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp", "libc_and_cpp_with_unused_struct", 0, 164*90c8c64dSAndroid Build Coastguard Worker ["-check-all-apis", 165*90c8c64dSAndroid Build Coastguard Worker "-ignore-linker-set-key", "_ZTI12UnusedStruct"]) 166*90c8c64dSAndroid Build Coastguard Worker 167*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_with_unused_struct_and_libc_and_cpp_with_unused_cstruct( 168*90c8c64dSAndroid Build Coastguard Worker self): 169*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 170*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp_with_unused_struct", 171*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp_with_unused_cstruct", 0, 172*90c8c64dSAndroid Build Coastguard Worker ['-check-all-apis', '-allow-unreferenced-changes']) 173*90c8c64dSAndroid Build Coastguard Worker 174*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_and_libc_and_cpp_with_unused_struct_check_all_advice( 175*90c8c64dSAndroid Build Coastguard Worker self): 176*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 177*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp", "libc_and_cpp_with_unused_struct", 0, 178*90c8c64dSAndroid Build Coastguard Worker ['-check-all-apis', '-advice-only']) 179*90c8c64dSAndroid Build Coastguard Worker 180*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_opaque_pointer_diff(self): 181*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 182*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp_with_opaque_ptr_a", 183*90c8c64dSAndroid Build Coastguard Worker "libc_and_cpp_with_opaque_ptr_b", 8, 184*90c8c64dSAndroid Build Coastguard Worker ['-consider-opaque-types-different'], True, True) 185*90c8c64dSAndroid Build Coastguard Worker 186*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_return_type_diff(self): 187*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 188*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_return_type_diff", 8) 189*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 190*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_return_type_diff", 0, 191*90c8c64dSAndroid Build Coastguard Worker ["-ignore-linker-set-key", "_ZN17HighVolumeSpeaker6ListenEv", 192*90c8c64dSAndroid Build Coastguard Worker "-ignore-linker-set-key", "_ZN16LowVolumeSpeaker6ListenEv"]) 193*90c8c64dSAndroid Build Coastguard Worker 194*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_add_odr(self): 195*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 196*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_odr", 0, 197*90c8c64dSAndroid Build Coastguard Worker ['-check-all-apis', '-allow-unreferenced-changes']) 198*90c8c64dSAndroid Build Coastguard Worker 199*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_add_function(self): 200*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 201*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_add_function", 6) 202*90c8c64dSAndroid Build Coastguard Worker 203*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_add_function_allow_extension(self): 204*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 205*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_add_function", 0, 206*90c8c64dSAndroid Build Coastguard Worker ['-allow-extensions']) 207*90c8c64dSAndroid Build Coastguard Worker 208*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_add_function_and_elf_symbol(self): 209*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 210*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_add_function_and_unexported_elf", 211*90c8c64dSAndroid Build Coastguard Worker 6) 212*90c8c64dSAndroid Build Coastguard Worker 213*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_fabricated_function_ast_removed_diff(self): 214*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 215*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_add_function_sybmol_only", 216*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_add_function", 0, [], False, False) 217*90c8c64dSAndroid Build Coastguard Worker 218*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_change_function_access(self): 219*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 220*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_change_function_access", 8) 221*90c8c64dSAndroid Build Coastguard Worker 222*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_add_global_variable(self): 223*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 224*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_add_global_variable", 6) 225*90c8c64dSAndroid Build Coastguard Worker 226*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_change_global_var_access(self): 227*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 228*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_add_global_variable", 229*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_add_global_variable_private", 8) 230*90c8c64dSAndroid Build Coastguard Worker 231*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_parameter_type_diff(self): 232*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 233*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_parameter_type_diff", 8) 234*90c8c64dSAndroid Build Coastguard Worker 235*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_with_vtable_diff(self): 236*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 237*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_vtable_diff", 8) 238*90c8c64dSAndroid Build Coastguard Worker 239*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_diff_advice_only(self): 240*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 241*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_diff", 0, ['-advice-only']) 242*90c8c64dSAndroid Build Coastguard Worker 243*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_diff(self): 244*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 245*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_diff", 8) 246*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 247*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_diff", 0, 248*90c8c64dSAndroid Build Coastguard Worker ["-ignore-linker-set-key", "_ZTI16LowVolumeSpeaker"]) 249*90c8c64dSAndroid Build Coastguard Worker 250*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_change_member_access(self): 251*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 252*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_change_member_access", 8) 253*90c8c64dSAndroid Build Coastguard Worker 254*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_enum_extended(self): 255*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 256*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_enum_extended", 4) 257*90c8c64dSAndroid Build Coastguard Worker 258*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_enum_diff(self): 259*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 260*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_enum_diff", 8) 261*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 262*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_enum_diff", 0, 263*90c8c64dSAndroid Build Coastguard Worker ["-ignore-linker-set-key", "_ZTIN12SuperSpeaker6VolumeE"]) 264*90c8c64dSAndroid Build Coastguard Worker 265*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_fake_diff(self): 266*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 267*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_fake_diff", 0) 268*90c8c64dSAndroid Build Coastguard Worker 269*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_integral_type_diff(self): 270*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 271*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_integral_type_diff", 8) 272*90c8c64dSAndroid Build Coastguard Worker 273*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_cv_diff(self): 274*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 275*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_cv_diff", 8) 276*90c8c64dSAndroid Build Coastguard Worker 277*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_unreferenced_elf_symbol_removed(self): 278*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 279*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_unreferenced_elf_symbol_removed", 280*90c8c64dSAndroid Build Coastguard Worker 16) 281*90c8c64dSAndroid Build Coastguard Worker 282*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_unreferenced_elf_symbol_added(self): 283*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 284*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_unreferenced_elf_symbol_removed", "libgolden_cpp", 285*90c8c64dSAndroid Build Coastguard Worker 2, create_old=True, create_new=False) 286*90c8c64dSAndroid Build Coastguard Worker 287*90c8c64dSAndroid Build Coastguard Worker def test_libreproducability(self): 288*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 289*90c8c64dSAndroid Build Coastguard Worker "libreproducability", "libreproducability") 290*90c8c64dSAndroid Build Coastguard Worker 291*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_name_changed(self): 292*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 293*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_member_name_changed", 0) 294*90c8c64dSAndroid Build Coastguard Worker 295*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_member_function_pointer_changed(self): 296*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 297*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_function_pointer", 298*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_function_pointer_parameter_added", 8, [], 299*90c8c64dSAndroid Build Coastguard Worker True, True) 300*90c8c64dSAndroid Build Coastguard Worker 301*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_internal_struct_access_upgraded(self): 302*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 303*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_internal_private_struct", 304*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_internal_public_struct", 4, [], True, True) 305*90c8c64dSAndroid Build Coastguard Worker 306*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_internal_struct_access_downgraded(self): 307*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 308*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_internal_public_struct", 309*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_internal_private_struct", 8, [], True, True) 310*90c8c64dSAndroid Build Coastguard Worker 311*90c8c64dSAndroid Build Coastguard Worker def test_libgolden_cpp_inheritance_type_changed(self): 312*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 313*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_inheritance_type_changed", 8, [], 314*90c8c64dSAndroid Build Coastguard Worker True, True) 315*90c8c64dSAndroid Build Coastguard Worker 316*90c8c64dSAndroid Build Coastguard Worker def test_libpure_virtual_function(self): 317*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 318*90c8c64dSAndroid Build Coastguard Worker "libpure_virtual_function", "libpure_virtual_function") 319*90c8c64dSAndroid Build Coastguard Worker 320*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_in_json(self): 321*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 322*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp_json", "libgolden_cpp_json") 323*90c8c64dSAndroid Build Coastguard Worker 324*90c8c64dSAndroid Build Coastguard Worker def test_libc_and_cpp_in_protobuf_and_json(self): 325*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 326*90c8c64dSAndroid Build Coastguard Worker "libgolden_cpp", "libgolden_cpp_json", 0, 327*90c8c64dSAndroid Build Coastguard Worker ["-input-format-old", "ProtobufTextFormat", 328*90c8c64dSAndroid Build Coastguard Worker "-input-format-new", "Json"]) 329*90c8c64dSAndroid Build Coastguard Worker 330*90c8c64dSAndroid Build Coastguard Worker def test_opaque_type_self_diff(self): 331*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 332*90c8c64dSAndroid Build Coastguard Worker "libopaque_type", "libopaque_type", 0, 333*90c8c64dSAndroid Build Coastguard Worker ["-input-format-old", "Json", "-input-format-new", "Json", 334*90c8c64dSAndroid Build Coastguard Worker "-consider-opaque-types-different"], 335*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 336*90c8c64dSAndroid Build Coastguard Worker 337*90c8c64dSAndroid Build Coastguard Worker def test_allow_adding_removing_weak_symbols(self): 338*90c8c64dSAndroid Build Coastguard Worker module_old = Module.get_test_modules_by_name("libweak_symbols_old")[0] 339*90c8c64dSAndroid Build Coastguard Worker module_new = Module.get_test_modules_by_name("libweak_symbols_new")[0] 340*90c8c64dSAndroid Build Coastguard Worker lsdump_old = self.get_or_create_dump(module_old, False) 341*90c8c64dSAndroid Build Coastguard Worker lsdump_new = self.get_or_create_dump(module_new, False) 342*90c8c64dSAndroid Build Coastguard Worker 343*90c8c64dSAndroid Build Coastguard Worker options = ["-input-format-old", "Json", "-input-format-new", "Json"] 344*90c8c64dSAndroid Build Coastguard Worker 345*90c8c64dSAndroid Build Coastguard Worker # If `-allow-adding-removing-weak-symbols` is not specified, removing a 346*90c8c64dSAndroid Build Coastguard Worker # weak symbol must be treated as an incompatible change. 347*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_abi_diff( 348*90c8c64dSAndroid Build Coastguard Worker lsdump_old, lsdump_new, "libweak_symbols", "arm64", 8, options) 349*90c8c64dSAndroid Build Coastguard Worker 350*90c8c64dSAndroid Build Coastguard Worker # If `-allow-adding-removing-weak-symbols` is specified, removing a 351*90c8c64dSAndroid Build Coastguard Worker # weak symbol must be fine and mustn't be a fatal error. 352*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_abi_diff( 353*90c8c64dSAndroid Build Coastguard Worker lsdump_old, lsdump_new, "libweak_symbols", "arm64", 0, 354*90c8c64dSAndroid Build Coastguard Worker options + ["-allow-adding-removing-weak-symbols"]) 355*90c8c64dSAndroid Build Coastguard Worker 356*90c8c64dSAndroid Build Coastguard Worker def test_linker_shared_object_file_and_version_script(self): 357*90c8c64dSAndroid Build Coastguard Worker base_dir = os.path.join( 358*90c8c64dSAndroid Build Coastguard Worker SCRIPT_DIR, 'integration', 'version_script_example') 359*90c8c64dSAndroid Build Coastguard Worker 360*90c8c64dSAndroid Build Coastguard Worker cases = [ 361*90c8c64dSAndroid Build Coastguard Worker 'libversion_script_example', 362*90c8c64dSAndroid Build Coastguard Worker 'libversion_script_example_no_mytag', 363*90c8c64dSAndroid Build Coastguard Worker 'libversion_script_example_no_private', 364*90c8c64dSAndroid Build Coastguard Worker 'libversion_script_example_api_level', 365*90c8c64dSAndroid Build Coastguard Worker ] 366*90c8c64dSAndroid Build Coastguard Worker 367*90c8c64dSAndroid Build Coastguard Worker for module_name in cases: 368*90c8c64dSAndroid Build Coastguard Worker module = Module.get_test_modules_by_name(module_name)[0] 369*90c8c64dSAndroid Build Coastguard Worker example_lsdump_old = self.get_or_create_dump(module, False) 370*90c8c64dSAndroid Build Coastguard Worker example_lsdump_new = self.get_or_create_dump(module, True) 371*90c8c64dSAndroid Build Coastguard Worker self.run_and_compare_abi_diff( 372*90c8c64dSAndroid Build Coastguard Worker example_lsdump_old, example_lsdump_new, 373*90c8c64dSAndroid Build Coastguard Worker module_name, "arm64", 0, 374*90c8c64dSAndroid Build Coastguard Worker ["-input-format-old", "Json", "-input-format-new", "Json"]) 375*90c8c64dSAndroid Build Coastguard Worker 376*90c8c64dSAndroid Build Coastguard Worker def test_no_source(self): 377*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 378*90c8c64dSAndroid Build Coastguard Worker "libempty", "libempty", 0, 379*90c8c64dSAndroid Build Coastguard Worker ["-input-format-old", "Json", "-input-format-new", "Json"]) 380*90c8c64dSAndroid Build Coastguard Worker 381*90c8c64dSAndroid Build Coastguard Worker def test_golden_anonymous_enum(self): 382*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 383*90c8c64dSAndroid Build Coastguard Worker "libgolden_anonymous_enum", "libgolden_anonymous_enum") 384*90c8c64dSAndroid Build Coastguard Worker 385*90c8c64dSAndroid Build Coastguard Worker def test_swap_anonymous_enum(self): 386*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 387*90c8c64dSAndroid Build Coastguard Worker "libgolden_anonymous_enum", "libswap_anonymous_enum", 0, 388*90c8c64dSAndroid Build Coastguard Worker ["-input-format-old", "Json", "-input-format-new", "Json", 389*90c8c64dSAndroid Build Coastguard Worker "-check-all-apis"]) 390*90c8c64dSAndroid Build Coastguard Worker 391*90c8c64dSAndroid Build Coastguard Worker def test_swap_anonymous_enum_field(self): 392*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 393*90c8c64dSAndroid Build Coastguard Worker "libgolden_anonymous_enum", "libswap_anonymous_enum_field", 0, 394*90c8c64dSAndroid Build Coastguard Worker ["-input-format-old", "Json", "-input-format-new", "Json", 395*90c8c64dSAndroid Build Coastguard Worker "-check-all-apis"]) 396*90c8c64dSAndroid Build Coastguard Worker 397*90c8c64dSAndroid Build Coastguard Worker def test_anonymous_enum_odr(self): 398*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 399*90c8c64dSAndroid Build Coastguard Worker "libanonymous_enum_odr", "libanonymous_enum_odr") 400*90c8c64dSAndroid Build Coastguard Worker 401*90c8c64dSAndroid Build Coastguard Worker def test_libifunc(self): 402*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 403*90c8c64dSAndroid Build Coastguard Worker "libifunc", "libifunc") 404*90c8c64dSAndroid Build Coastguard Worker 405*90c8c64dSAndroid Build Coastguard Worker def test_merge_multi_definitions(self): 406*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 407*90c8c64dSAndroid Build Coastguard Worker "libmerge_multi_definitions", "libmerge_multi_definitions") 408*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 409*90c8c64dSAndroid Build Coastguard Worker "libmerge_multi_definitions", "libdiff_multi_definitions", 0, 410*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json", 411*90c8c64dSAndroid Build Coastguard Worker "-consider-opaque-types-different"], 412*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 413*90c8c64dSAndroid Build Coastguard Worker 414*90c8c64dSAndroid Build Coastguard Worker def test_print_resource_dir(self): 415*90c8c64dSAndroid Build Coastguard Worker dumper_path = shutil.which("header-abi-dumper") 416*90c8c64dSAndroid Build Coastguard Worker self.assertIsNotNone(dumper_path) 417*90c8c64dSAndroid Build Coastguard Worker dumper_path = os.path.realpath(dumper_path) 418*90c8c64dSAndroid Build Coastguard Worker common_dir = os.path.dirname(os.path.dirname(dumper_path)) 419*90c8c64dSAndroid Build Coastguard Worker resource_dir = subprocess.check_output( 420*90c8c64dSAndroid Build Coastguard Worker ["header-abi-dumper", "-print-resource-dir"], text=True, 421*90c8c64dSAndroid Build Coastguard Worker stderr=subprocess.DEVNULL).strip() 422*90c8c64dSAndroid Build Coastguard Worker self.assertIn(os.path.dirname(resource_dir), 423*90c8c64dSAndroid Build Coastguard Worker (os.path.join(common_dir, "lib64", "clang"), 424*90c8c64dSAndroid Build Coastguard Worker os.path.join(common_dir, "lib", "clang"))) 425*90c8c64dSAndroid Build Coastguard Worker self.assertRegex(os.path.basename(resource_dir), r"^[\d.]+$") 426*90c8c64dSAndroid Build Coastguard Worker 427*90c8c64dSAndroid Build Coastguard Worker def test_struct_extensions(self): 428*90c8c64dSAndroid Build Coastguard Worker output = self.prepare_and_run_abi_diff_all_archs( 429*90c8c64dSAndroid Build Coastguard Worker "libstruct_extensions", "liballowed_struct_extensions", 4, 430*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 431*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 432*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(output.count("record_type_extension_diffs"), 6) 433*90c8c64dSAndroid Build Coastguard Worker 434*90c8c64dSAndroid Build Coastguard Worker output = self.prepare_and_run_abi_diff_all_archs( 435*90c8c64dSAndroid Build Coastguard Worker "liballowed_struct_extensions", "libstruct_extensions", 8, 436*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 437*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 438*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(output.count("record_type_diffs"), 6) 439*90c8c64dSAndroid Build Coastguard Worker 440*90c8c64dSAndroid Build Coastguard Worker def test_param_size_diff(self): 441*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 442*90c8c64dSAndroid Build Coastguard Worker "libpass_by_value", "libparam_size_diff", 8, 443*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 444*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 445*90c8c64dSAndroid Build Coastguard Worker 446*90c8c64dSAndroid Build Coastguard Worker def test_return_size_diff(self): 447*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 448*90c8c64dSAndroid Build Coastguard Worker "libpass_by_value", "libreturn_size_diff", 8, 449*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 450*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 451*90c8c64dSAndroid Build Coastguard Worker 452*90c8c64dSAndroid Build Coastguard Worker def test_function_extensions(self): 453*90c8c64dSAndroid Build Coastguard Worker diff = self.prepare_and_run_abi_diff_all_archs( 454*90c8c64dSAndroid Build Coastguard Worker "libfunction_extensions", "liballowed_function_extensions", 4, 455*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 456*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 457*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(6, diff.count('function_extension_diffs')) 458*90c8c64dSAndroid Build Coastguard Worker 459*90c8c64dSAndroid Build Coastguard Worker diff = self.prepare_and_run_abi_diff_all_archs( 460*90c8c64dSAndroid Build Coastguard Worker "liballowed_function_extensions", "libfunction_extensions", 8, 461*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 462*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 463*90c8c64dSAndroid Build Coastguard Worker # Adding and removing __restrict__ at the first level are extensions. 464*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(1, diff.count('function_extension_diffs')) 465*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(5, diff.count('function_diffs')) 466*90c8c64dSAndroid Build Coastguard Worker 467*90c8c64dSAndroid Build Coastguard Worker def test_array_diff(self): 468*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs("libarray", "libarray") 469*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 470*90c8c64dSAndroid Build Coastguard Worker "libarray_diff", "libarray_diff") 471*90c8c64dSAndroid Build Coastguard Worker diff = self.prepare_and_run_abi_diff_all_archs( 472*90c8c64dSAndroid Build Coastguard Worker "libarray", "libarray_diff", 8, 473*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 474*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=False) 475*90c8c64dSAndroid Build Coastguard Worker 476*90c8c64dSAndroid Build Coastguard Worker for type_id in ["StructMember", "Pointer", "DoublePointer"]: 477*90c8c64dSAndroid Build Coastguard Worker self.assertNotIn(f'"{type_id}"', diff, 478*90c8c64dSAndroid Build Coastguard Worker f'"{type_id}" should not be in the diff report.') 479*90c8c64dSAndroid Build Coastguard Worker 480*90c8c64dSAndroid Build Coastguard Worker for type_id in ["Struct", "PointerToArray", "PointerTo2DArray", 481*90c8c64dSAndroid Build Coastguard Worker "Reference", "Element"]: 482*90c8c64dSAndroid Build Coastguard Worker self.assertIn(f'"{type_id}"', diff, 483*90c8c64dSAndroid Build Coastguard Worker f'"{type_id}" should be in the diff report.') 484*90c8c64dSAndroid Build Coastguard Worker 485*90c8c64dSAndroid Build Coastguard Worker def test_union_diff(self): 486*90c8c64dSAndroid Build Coastguard Worker diff = self.prepare_and_run_abi_diff_all_archs( 487*90c8c64dSAndroid Build Coastguard Worker "libunion", "libunion_diff", 8, 488*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 489*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=True) 490*90c8c64dSAndroid Build Coastguard Worker self.assertIn('"ChangeType"', diff) 491*90c8c64dSAndroid Build Coastguard Worker self.assertIn('"ChangeTypeInStruct"', diff) 492*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(2, diff.count("fields_diff")) 493*90c8c64dSAndroid Build Coastguard Worker self.assertNotIn("fields_added", diff) 494*90c8c64dSAndroid Build Coastguard Worker self.assertNotIn("fields_removed", diff) 495*90c8c64dSAndroid Build Coastguard Worker 496*90c8c64dSAndroid Build Coastguard Worker def test_enum_diff(self): 497*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs("libenum", "libenum") 498*90c8c64dSAndroid Build Coastguard Worker 499*90c8c64dSAndroid Build Coastguard Worker def test_io_error(self): 500*90c8c64dSAndroid Build Coastguard Worker cpp_path = os.path.join(self.get_tmp_dir(), "test.cpp") 501*90c8c64dSAndroid Build Coastguard Worker sdump_path = os.path.join(self.get_tmp_dir(), "test.sdump") 502*90c8c64dSAndroid Build Coastguard Worker version_script_path = os.path.join(self.get_tmp_dir(), "map.txt") 503*90c8c64dSAndroid Build Coastguard Worker lsdump_path = os.path.join(self.get_tmp_dir(), "test.lsdump") 504*90c8c64dSAndroid Build Coastguard Worker abidiff_path = os.path.join(self.get_tmp_dir(), "test.abidiff") 505*90c8c64dSAndroid Build Coastguard Worker read_only_path = os.path.join(self.get_tmp_dir(), "read_only.txt") 506*90c8c64dSAndroid Build Coastguard Worker 507*90c8c64dSAndroid Build Coastguard Worker with open(cpp_path, "w") as cpp_file: 508*90c8c64dSAndroid Build Coastguard Worker cpp_file.write("void func(int) {}") 509*90c8c64dSAndroid Build Coastguard Worker with open(version_script_path, "w") as version_script_file: 510*90c8c64dSAndroid Build Coastguard Worker pass 511*90c8c64dSAndroid Build Coastguard Worker fd = os.open(read_only_path, flags=(os.O_CREAT | os.O_EXCL), 512*90c8c64dSAndroid Build Coastguard Worker mode=(stat.S_IROTH | stat.S_IRGRP | stat.S_IRUSR)) 513*90c8c64dSAndroid Build Coastguard Worker self.assertGreaterEqual(fd, 0) 514*90c8c64dSAndroid Build Coastguard Worker os.close(fd) 515*90c8c64dSAndroid Build Coastguard Worker 516*90c8c64dSAndroid Build Coastguard Worker # Make sure that the commands are valid. 517*90c8c64dSAndroid Build Coastguard Worker dumper_flags = ('-output-format', 'Json') 518*90c8c64dSAndroid Build Coastguard Worker run_header_abi_dumper(cpp_path, sdump_path, flags=dumper_flags) 519*90c8c64dSAndroid Build Coastguard Worker self.assertGreater(os.stat(sdump_path).st_size, 0) 520*90c8c64dSAndroid Build Coastguard Worker linker_flags = ('-input-format', 'Json', 521*90c8c64dSAndroid Build Coastguard Worker '-output-format', 'ProtobufTextFormat') 522*90c8c64dSAndroid Build Coastguard Worker run_header_abi_linker([sdump_path], lsdump_path, version_script_path, 523*90c8c64dSAndroid Build Coastguard Worker "current", "x86_64", linker_flags) 524*90c8c64dSAndroid Build Coastguard Worker self.assertGreater(os.stat(lsdump_path).st_size, 0) 525*90c8c64dSAndroid Build Coastguard Worker diff_flags = ('-input-format-old', 'ProtobufTextFormat', 526*90c8c64dSAndroid Build Coastguard Worker '-input-format-new', 'ProtobufTextFormat') 527*90c8c64dSAndroid Build Coastguard Worker return_code = run_abi_diff(lsdump_path, lsdump_path, abidiff_path, 528*90c8c64dSAndroid Build Coastguard Worker 'x86_64', 'libtest', diff_flags) 529*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(return_code, 0) 530*90c8c64dSAndroid Build Coastguard Worker self.assertGreater(os.stat(abidiff_path).st_size, 0) 531*90c8c64dSAndroid Build Coastguard Worker 532*90c8c64dSAndroid Build Coastguard Worker # Test with output error. 533*90c8c64dSAndroid Build Coastguard Worker with self.assertRaises(subprocess.CalledProcessError) as assertion: 534*90c8c64dSAndroid Build Coastguard Worker run_header_abi_dumper(cpp_path, read_only_path, flags=dumper_flags) 535*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(assertion.exception.returncode, 1) 536*90c8c64dSAndroid Build Coastguard Worker 537*90c8c64dSAndroid Build Coastguard Worker with self.assertRaises(subprocess.CalledProcessError) as assertion: 538*90c8c64dSAndroid Build Coastguard Worker run_header_abi_linker([sdump_path], read_only_path, 539*90c8c64dSAndroid Build Coastguard Worker version_script_path, "current", "x86_64", 540*90c8c64dSAndroid Build Coastguard Worker linker_flags) 541*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(assertion.exception.returncode, 255) 542*90c8c64dSAndroid Build Coastguard Worker 543*90c8c64dSAndroid Build Coastguard Worker return_code = run_abi_diff(lsdump_path, lsdump_path, read_only_path, 544*90c8c64dSAndroid Build Coastguard Worker 'x86_64', 'libtest', diff_flags) 545*90c8c64dSAndroid Build Coastguard Worker self.assertEqual(return_code, 1) 546*90c8c64dSAndroid Build Coastguard Worker 547*90c8c64dSAndroid Build Coastguard Worker def test_bit_field_diff(self): 548*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 549*90c8c64dSAndroid Build Coastguard Worker "libbit_field", "libbit_field") 550*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_run_abi_diff_all_archs( 551*90c8c64dSAndroid Build Coastguard Worker "libbit_field", "libbit_field_diff", 8, 552*90c8c64dSAndroid Build Coastguard Worker flags=["-input-format-new", "Json", "-input-format-old", "Json"], 553*90c8c64dSAndroid Build Coastguard Worker create_old=False, create_new=True) 554*90c8c64dSAndroid Build Coastguard Worker 555*90c8c64dSAndroid Build Coastguard Worker def test_availability(self): 556*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 557*90c8c64dSAndroid Build Coastguard Worker "libavailability", "libavailability") 558*90c8c64dSAndroid Build Coastguard Worker self.prepare_and_absolute_diff_all_archs( 559*90c8c64dSAndroid Build Coastguard Worker "libavailability_35", "libavailability_35") 560*90c8c64dSAndroid Build Coastguard Worker 561*90c8c64dSAndroid Build Coastguard Worker 562*90c8c64dSAndroid Build Coastguard Workerif __name__ == '__main__': 563*90c8c64dSAndroid Build Coastguard Worker unittest.main() 564