Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Side by Side Diff: tools/checkbins/checkbins.py

Issue 1453293003: Add checkbins.py to Win builder on master.chromium. Implement JSON output. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sys.executable Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « testing/scripts/checkbins.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Makes sure that all EXE and DLL files in the provided directory were built 6 """Makes sure that all EXE and DLL files in the provided directory were built
7 correctly. 7 correctly.
8 8
9 In essense it runs a subset of BinScope tests ensuring that binaries have 9 In essense it runs a subset of BinScope tests ensuring that binaries have
10 /NXCOMPAT, /DYNAMICBASE and /SAFESEH. 10 /NXCOMPAT, /DYNAMICBASE and /SAFESEH.
11 """ 11 """
12 12
13 import json
13 import os 14 import os
14 import optparse 15 import optparse
15 import sys 16 import sys
16 17
17 # Find /third_party/pefile based on current directory and script path. 18 # Find /third_party/pefile based on current directory and script path.
18 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 19 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..',
19 'third_party', 'pefile')) 20 'third_party', 'pefile'))
20 import pefile 21 import pefile
21 22
22 PE_FILE_EXTENSIONS = ['.exe', '.dll'] 23 PE_FILE_EXTENSIONS = ['.exe', '.dll']
(...skipping 14 matching lines...) Expand all
37 def IsPEFile(path): 38 def IsPEFile(path):
38 return (os.path.isfile(path) and 39 return (os.path.isfile(path) and
39 os.path.splitext(path)[1].lower() in PE_FILE_EXTENSIONS and 40 os.path.splitext(path)[1].lower() in PE_FILE_EXTENSIONS and
40 os.path.basename(path) not in EXCLUDED_FILES) 41 os.path.basename(path) not in EXCLUDED_FILES)
41 42
42 def main(options, args): 43 def main(options, args):
43 directory = args[0] 44 directory = args[0]
44 pe_total = 0 45 pe_total = 0
45 pe_passed = 0 46 pe_passed = 0
46 47
48 failures = []
49
47 for file in os.listdir(directory): 50 for file in os.listdir(directory):
48 path = os.path.abspath(os.path.join(directory, file)) 51 path = os.path.abspath(os.path.join(directory, file))
49 if not IsPEFile(path): 52 if not IsPEFile(path):
50 continue 53 continue
51 pe = pefile.PE(path, fast_load=True) 54 pe = pefile.PE(path, fast_load=True)
52 pe.parse_data_directories(directories=[ 55 pe.parse_data_directories(directories=[
53 pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG']]) 56 pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG']])
54 pe_total = pe_total + 1 57 pe_total = pe_total + 1
55 success = True 58 success = True
56 59
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 print("Checking %s ImageBase (0x%X < 4GB)... FAIL" % 99 print("Checking %s ImageBase (0x%X < 4GB)... FAIL" %
97 (path, pe.OPTIONAL_HEADER.ImageBase)) 100 (path, pe.OPTIONAL_HEADER.ImageBase))
98 success = False 101 success = False
99 elif options.verbose: 102 elif options.verbose:
100 print("Checking %s ImageBase (0x%X > 4GB)... PASS" % 103 print("Checking %s ImageBase (0x%X > 4GB)... PASS" %
101 (path, pe.OPTIONAL_HEADER.ImageBase)) 104 (path, pe.OPTIONAL_HEADER.ImageBase))
102 105
103 # Update tally. 106 # Update tally.
104 if success: 107 if success:
105 pe_passed = pe_passed + 1 108 pe_passed = pe_passed + 1
109 else:
110 failures.append(path)
106 111
107 print "Result: %d files found, %d files passed" % (pe_total, pe_passed) 112 print "Result: %d files found, %d files passed" % (pe_total, pe_passed)
113
114 if options.json:
115 with open(options.json, 'w') as f:
116 json.dump(failures, f)
scottmg 2015/11/18 21:45:05 Is it useful to have something that's not an array
Paweł Hajdan Jr. 2015/11/19 11:27:29 Good question. The consumer of that is in the sam
117
108 if pe_passed != pe_total: 118 if pe_passed != pe_total:
109 sys.exit(1) 119 sys.exit(1)
110 120
111 if __name__ == '__main__': 121 if __name__ == '__main__':
112 usage = "Usage: %prog [options] DIRECTORY" 122 usage = "Usage: %prog [options] DIRECTORY"
113 option_parser = optparse.OptionParser(usage=usage) 123 option_parser = optparse.OptionParser(usage=usage)
114 option_parser.add_option("-v", "--verbose", action="store_true", 124 option_parser.add_option("-v", "--verbose", action="store_true",
115 default=False, help="Print debug logging") 125 default=False, help="Print debug logging")
126 option_parser.add_option("--json", help="Path to JSON output file")
116 options, args = option_parser.parse_args() 127 options, args = option_parser.parse_args()
117 if not args: 128 if not args:
118 option_parser.print_help() 129 option_parser.print_help()
119 sys.exit(0) 130 sys.exit(0)
120 main(options, args) 131 main(options, args)
OLDNEW
« no previous file with comments | « testing/scripts/checkbins.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698