• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2#
3# Copyright (C) 2018 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16"""
17Verify that one set of hidden API flags is a subset of another.
18"""
19
20import argparse
21import csv
22
23args_parser = argparse.ArgumentParser(description='Verify that one set of hidden API flags is a subset of another.')
24args_parser.add_argument('all', help='All the flags')
25args_parser.add_argument('subsets', nargs=argparse.REMAINDER, help='Subsets of the flags')
26args = args_parser.parse_args()
27
28
29def dict_reader(input):
30    return csv.DictReader(input, delimiter=',', quotechar='|', fieldnames=['signature'])
31
32# Read in all the flags into a dict indexed by signature
33allFlagsBySignature = {}
34with open(args.all, 'r') as allFlagsFile:
35    allFlagsReader = dict_reader(allFlagsFile)
36    for row in allFlagsReader:
37        signature = row['signature']
38        allFlagsBySignature[signature]=row
39
40failed = False
41for subsetPath in args.subsets:
42    mismatchingSignatures = []
43    with open(subsetPath, 'r') as subsetFlagsFile:
44        subsetReader = dict_reader(subsetFlagsFile)
45        for row in subsetReader:
46            signature = row['signature']
47            if signature in allFlagsBySignature:
48                allFlags = allFlagsBySignature.get(signature)
49                if allFlags != row:
50                    mismatchingSignatures.append((signature, row.get(None, []), allFlags.get(None, [])))
51            else:
52                mismatchingSignatures.append((signature, row.get(None, []), []))
53
54
55    if mismatchingSignatures:
56        failed = True
57        print("ERROR: Hidden API flags are inconsistent:")
58        print("< " + subsetPath)
59        print("> " + args.all)
60        for mismatch in mismatchingSignatures:
61            print()
62            print("< " + mismatch[0] + "," + ",".join(mismatch[1]))
63            if mismatch[2] != []:
64                print("> " + mismatch[0] + "," + ",".join(mismatch[2]))
65            else:
66                print("> " + mismatch[0] + " - missing")
67
68if failed:
69    sys.exit(1)
70