Files
build_soong/scripts/hiddenapi/verify_overlaps.py
Paul Duffin 2e88097152 Verify the modular stub flags are subsets of the monolithic stub flags
Bug: 179354495
Test: m out/soong/hiddenapi/hiddenapi-stub-flags.txt
      - check that an error is reported if a modular stub-flags.csv file,
        i.e. one created by a fragment is not a subset of the monolithic
        file, e.g. because a signature in the modular file has different
        flags than it does in the monolithic or is not present there.
Change-Id: I46ebb495cb093a5e3abe7571c49933c845318549
2021-06-25 14:49:10 +01:00

70 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
#
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Verify that one set of hidden API flags is a subset of another.
"""
import argparse
import csv
args_parser = argparse.ArgumentParser(description='Verify that one set of hidden API flags is a subset of another.')
args_parser.add_argument('all', help='All the flags')
args_parser.add_argument('subsets', nargs=argparse.REMAINDER, help='Subsets of the flags')
args = args_parser.parse_args()
def dict_reader(input):
return csv.DictReader(input, delimiter=',', quotechar='|', fieldnames=['signature'])
# Read in all the flags into a dict indexed by signature
allFlagsBySignature = {}
with open(args.all, 'r') as allFlagsFile:
allFlagsReader = dict_reader(allFlagsFile)
for row in allFlagsReader:
signature = row['signature']
allFlagsBySignature[signature]=row
failed = False
for subsetPath in args.subsets:
mismatchingSignatures = []
with open(subsetPath, 'r') as subsetFlagsFile:
subsetReader = dict_reader(subsetFlagsFile)
for row in subsetReader:
signature = row['signature']
if signature in allFlagsBySignature:
allFlags = allFlagsBySignature.get(signature)
if allFlags != row:
mismatchingSignatures.append((signature, row.get(None, []), allFlags.get(None, [])))
else:
mismatchingSignatures.append((signature, row.get(None, []), []))
if mismatchingSignatures:
failed = True
print("ERROR: Hidden API flags are inconsistent:")
print("< " + subsetPath)
print("> " + args.all)
for mismatch in mismatchingSignatures:
print()
print("< " + mismatch[0] + "," + ",".join(mismatch[1]))
if mismatch[2] != []:
print("> " + mismatch[0] + "," + ",".join(mismatch[2]))
else:
print("> " + mismatch[0] + " - missing")
if failed:
sys.exit(1)