xref: /aosp_15_r20/development/vndk/tools/header-checker/tests/test.py (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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