blob: f3a2e1ce3e549731d3ca96a1d20009b9935232a0 [file] [log] [blame]
#!/usr/bin/env python3.8
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file
import os
import re
import subprocess
import tempfile
FUCHSIA_DIR = os.environ['FUCHSIA_DIR']
TEST_DIR = 'tools/fidl/fidlc/tests'
EXPERIMENTAL_FLAG_INIT = ' fidl::ExperimentalFlags experimental_flags;\n experimental_flags.SetFlag(fidl::ExperimentalFlags::Flag::kAllowNewSyntax);\n'
EXPERIMENTAL_FLAG_ARG = ',\n experimental_flags'
def convert_fidl(old: str) -> str:
with tempfile.NamedTemporaryFile(mode='w', suffix='.fidl') as input_f:
input_f.write(old)
input_f.flush()
with tempfile.TemporaryDirectory() as out_dir_name:
args = [
'out/default/host_x64-asan/exe.unstripped/fidlc',
'--experimental', 'old_syntax_only', '--convert-syntax',
out_dir_name, '--files', input_f.name
]
subprocess.run(args)
files = os.listdir(out_dir_name)
assert len(files) == 1
return open(os.path.join(out_dir_name, files[0]), 'r').read()
def convert_file(test_file: str):
contents = open(os.path.join(FUCHSIA_DIR, TEST_DIR, test_file), 'r').read()
errors = []
for test in get_test_bodies(contents):
test = test[test.find('{'):]
if 'ASSERT_COMPILED_AND_CONVERT' in test:
converted_test = test.replace(
'ASSERT_COMPILED_AND_CONVERT', 'ASSERT_COMPILED')
for match in re.findall(r'(?s)(?<=R\"FIDL\().*?(?=\)FIDL\")', test):
try:
converted = convert_fidl(match)
except:
errors.append(match)
else:
converted_test = converted_test.replace(match, converted)
contents = contents.replace(test, converted_test)
else:
updated_test = test.replace(EXPERIMENTAL_FLAG_INIT,
'').replace(EXPERIMENTAL_FLAG_ARG, '')
contents = contents.replace(test, updated_test)
open(os.path.join(FUCHSIA_DIR, TEST_DIR, test_file), 'w').write(contents)
if errors:
print(f'errors for {test_file}:')
for e in errors:
print(f'\t{e}')
def remove_old_only_tests(test_file: str):
contents = open(os.path.join(FUCHSIA_DIR, TEST_DIR, test_file), 'r').read()
for test in get_test_bodies(contents):
if 'Old)' in test:
contents = contents.replace(f'\n{test}\n', '')
open(os.path.join(FUCHSIA_DIR, TEST_DIR, test_file), 'w').write(contents)
def get_test_bodies(test_file: str):
lines = test_file.split('\n')
next_test = []
in_test = False
for line in lines:
if line.startswith('TEST('):
in_test = True
if in_test:
next_test.append(line)
if line == '}':
yield '\n'.join(next_test)
in_test = False
next_test = []
continue
if __name__ == '__main__':
# print(convert_fidl('library test;\nstruct Foo {};\n'))
all_tests = [
'declaration_order_tests.cc',
'recoverable_parsing_tests.cc',
'span_tests.cc',
'coded_types_generator_tests.cc',
'recursion_detector_tests.cc',
# 'new_syntax_tests.cc',
'resource_tests.cc',
'consts_tests.cc',
'service_tests.cc',
'array_tests.cc',
'alias_tests.cc',
'flexible_tests.cc',
'virtual_source_tests.cc',
'lint_findings_tests.cc',
'handle_tests.cc',
'strictness_tests.cc',
'parsing_tests.cc',
'protocol_tests.cc',
'c_generator_tests.cc',
'types_tests.cc',
'structs_tests.cc',
'direct_dependencies_tests.cc',
# 'new_syntax_converter_tests.cc',
'json_diagnostics_tests.cc',
'utils_tests.cc',
'resourceness_tests.cc',
'errors_tests.cc',
'union_tests.cc',
'enums_tests.cc',
'json_findings_tests.cc',
'canonical_names_tests.cc',
'lint_tests.cc',
'table_tests.cc',
'reporter_tests.cc',
'visitor_unittests.cc',
'recoverable_compilation_tests.cc',
'bits_tests.cc',
'flat_ast_tests.cc',
'using_tests.cc',
'typeshape_tests.cc',
'attributes_tests.cc',
'ordinals_tests.cc',
'new_formatter_tests.cc'
]
convert_file('new_syntax_tests.cc')
# remove_old_only_tests('alias_tests.cc')
# for test in all_tests:
# convert_file(test)
# remove_old_only_tests(test)