blob: d92d1c345fa3f8889d6c742109c1eb8841ebb53c [file] [log] [blame]
# Copyright 2014 Google Inc. All Rights Reserved.
# 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
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# See the License for the specific language governing permissions and
# limitations under the License.
"""Run bindings pipeline on test files and compare results with reference files.
Please execute the script whenever changes are made to the compiler
(this is automatically done as a presubmit script),
and submit changes to the test results in the same patch.
This makes it easier to track and review changes in generated code.
--reset-results: Overwrites reference files with the generated results.
--verbose: Show output on success and logging messages (not just failure)
import argparse
import os
import sys
module_path, module_filename = os.path.split(os.path.realpath(__file__))
cobalt_src_root = os.path.normpath(os.path.join(module_path, os.pardir,
# Add blink's python tools to the path.
blink_tools_scripts_dir = os.path.normpath(os.path.join(
cobalt_src_root, 'third_party', 'blink', 'Tools', 'Scripts'))
cobalt_bindings_dir = os.path.normpath(os.path.join(cobalt_src_root, 'cobalt',
# Add cobalt's bindings generation scripts to the path.
from idl_compiler_cobalt import IdlCompilerCobalt # pylint: disable=g-import-not-at-top
from javascriptcore.code_generator import CodeGeneratorJsc
from mozjs.code_generator import CodeGeneratorMozjs
from webkitpy.bindings.main import run_bindings_tests
extended_attributes_path = os.path.join(cobalt_src_root, 'cobalt', 'bindings',
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-r', '--reset-results', action='store_true')
parser.add_argument('-v', '--verbose', action='store_true')
args = parser.parse_args(argv[1:])
if args.engine.lower() == 'jsc':
generator = CodeGeneratorJsc
elif args.engine.lower() == 'mozjs':
generator = CodeGeneratorMozjs
raise RuntimeError('Unsupported JavaScript engine: ' + args.engine)
test_input_directory = os.path.join(cobalt_bindings_dir)
reference_directory = os.path.join(cobalt_bindings_dir, 'generated',
test_args = {
'idl_compiler_constructor': IdlCompilerCobalt,
'code_generator_constructor': generator,
# Directory that contains IDL files for the bindings tests
'test_input_directory': test_input_directory,
# Directory that contains reference generated files
'reference_directory': reference_directory,
# Top-level directories containing IDL files. In blink, there are 'core'
# and 'modules'. These correspond to the subdirectories under Source/core
# and Source/modules in the blink repository. These are separated to
# enforce dependency restrictions. For example, for interface X and
# partial interface Y that extends X, the following are valid:
# X and Y are both in core
# X and Y are both in modules
# X is in core and Y is in modules
# The following is invalid
# X is in modules and Y is in core
# TODO: Evaluate the usefulness of this distinction in Cobalt.
# This promotes modularity, but necessarily introduces complexity.
'component_directories': frozenset(['testing']),
# These are IDL files that aren't built directly, but are used by their
# dependent IDLs. In blink this includes:
# interfaces with the NoInterfaceObject extended attributes
# partial interfaces
# This should be kept in sync with the list of dependency IDLS in
# testing.gyp.
'dependency_idl_files': frozenset([
# UnsupportedInterface is not actually a dependency IDL, but this will
# prevent code from being generated for it.
# .idl files that are not valid blink IDLs
'ignore_idl_files': frozenset([]),
# Use as the base for constructing relative paths for includes, etc.
'root_directory': cobalt_src_root,
# Text file containing whitelisted extended attributes.
'extended_attributes_path': extended_attributes_path,
# We implement union types differently than blink, so don't generate
# Blink union classes.
'generate_union_containers': False,
return run_bindings_tests(args.reset_results, args.verbose, test_args)
if __name__ == '__main__':