blob: f0f14bc08d79534e8932dc6624fe4bbae067410a [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 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 argparse
import os
import stat
import string
import sys
def main():
parser = argparse.ArgumentParser(
description="Generates a grouped dart test file from individual tests"
)
parser.add_argument(
"--out", help="Path to the invocation file to generate", required=True
)
parser.add_argument(
"--source",
help="Path to a dart source file. Will be ignored if the file does not end in _test.dart",
action="append",
required=True,
)
args = parser.parse_args()
grouped_test = args.out
grouped_test_dir = os.path.dirname(grouped_test)
if not os.path.exists(grouped_test_dir):
os.makedirs(grouped_test_dir)
tests = [src for src in args.source if src.endswith("_test.dart")]
assert (
len(tests) > 0
), "a least one *_test.dart file must be passed in under |sources|"
imports = ["import 'package:test/test.dart';"]
invocations = []
for test in tests:
filename = os.path.splitext(os.path.basename(test))[0]
imports.append("import '%s' as %s;" % (test, filename))
invocations.append(
"group('%s', () => _delegate(%s.main, args));"
% (filename, filename)
)
contents = """// DO NOT EDIT
// This script is generated by:
// //build/dart/group_tests.py
%s
typedef ZeroArgFunction = void Function();
/// Wraps main invocations to support both main(List<String> args) and main().
void _delegate(Function f, List<String> args) {
if (f is ZeroArgFunction) {
f();
} else {
f(args);
}
}
void main(List<String> args) {
%s
}""" % (
"\n".join(imports),
"\n ".join(invocations),
)
with open(grouped_test, "w") as file:
file.write(contents)
permissions = (
stat.S_IRUSR
| stat.S_IWUSR
| stat.S_IXUSR
| stat.S_IRGRP
| stat.S_IWGRP
| stat.S_IXGRP
| stat.S_IROTH
)
os.chmod(grouped_test, permissions)
if __name__ == "__main__":
sys.exit(main())