blob: 27d97e35358496705e3a2fd8aa3d894f6f0152db [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# 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)