#!/usr/bin/python # Copyright (c) 2017 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Helper to update the "net_unittests_bundle_data" section of //net/BUILD.gn so that it lists all of the current files (based on simpler globbing rules). """ import glob import os import re import sys # ------------------------------------------ # test_support_bundle_data # ------------------------------------------ # This is a bit more expansive than it needs to be (includes README). Meh. test_support_bundle_data_globs = [ "data/quic_http_response_cache_data_with_push/test.example.com/*", "data/ssl/certificates/*", ] # This regular expression identifies the "sources" section of # test_support_bundle_data. test_support_bundle_data_regex = re.compile(r""" bundle_data\("test_support_bundle_data"\) \{ visibility = \[ ":test_support" \] testonly = true sources = \[ (.+?) \] outputs = \[""", re.MULTILINE | re.DOTALL) # ------------------------------------------ # net_unittest_bundle_data # ------------------------------------------ net_unittest_bundle_data_globs = [ "data/cert_issuer_source_aia_unittest/*.pem", "data/cert_issuer_source_static_unittest/*.pem", "data/certificate_policies_unittest/*.pem", "data/embedded_test_server/*", "data/filter_unittests/*", "data/name_constraints_unittest/*.pem", "data/ocsp_unittest/*.pem", "data/parse_certificate_unittest/*.pem", "data/parse_certificate_unittest/*.pk8", "data/test.html", "data/url_request_unittest/*", "data/verify_certificate_chain_unittest/**/*.pem", "data/verify_certificate_chain_unittest/**/*.test", "data/verify_certificate_chain_unittest/pkits_errors/*.txt", "data/verify_name_match_unittest/names/*.pem", "data/verify_signed_data_unittest/*.pem", "third_party/nist-pkits/certs/*.crt", "third_party/nist-pkits/crls/*.crl", ] # This regular expression identifies the "sources" section of # net_unittests_bundle_data net_unittest_bundle_data_regex = re.compile(r""" bundle_data\("net_unittests_bundle_data"\) \{ testonly = true sources = \[ (.+?) \] outputs = \[""", re.MULTILINE | re.DOTALL) # ------------------------------------------ def get_net_path(): """Returns the path to //net""" return os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir)) def do_file_glob(rule): # Do the globbing relative to //net prefix = get_net_path() matches = glob.glob(prefix + os.sep + rule) # Strip off the prefix. return [f[len(prefix) + 1:] for f in matches] def resolve_file_globs(rules): paths = [] for rule in rules: paths.extend(do_file_glob(rule)) return paths def read_file_to_string(path): with open(path, 'r') as f: return f.read() def write_string_to_file(data, path): with open(path, 'w') as f: f.write(data) def fatal(message): print "FATAL: " + message sys.exit(1) def format_file_list(files): # Keep the file list in sorted order. files = sorted(files) # Format to a string for GN (assume the filepaths don't contain # characters that need escaping). return ",\n".join(' "%s"' % f for f in files) + "," def replace_sources(data, sources_regex, globs): m = sources_regex.search(data) if not m: fatal("Couldn't find the sources section: %s" % sources_regex.pattern) formatted_files = format_file_list(resolve_file_globs(globs)) return data[0:m.start(1)] + formatted_files + data[m.end(1):] def main(): # Read in //net/BUILD.gn path = os.path.join(get_net_path(), "BUILD.gn") data = read_file_to_string(path) # Replace the sources part of "net_unittests_bundle_data" with # the current results of file globbing. data = replace_sources(data, test_support_bundle_data_regex, test_support_bundle_data_globs) # Replace the sources part of "net_unittests_bundle_data" with # the current results of file globbing. data = replace_sources(data, net_unittest_bundle_data_regex, net_unittest_bundle_data_globs) write_string_to_file(data, path) print "Wrote %s" % path if __name__ == '__main__': sys.exit(main())