diff --git a/BUILD.gn b/BUILD.gn index 3962d404d06..1140b668601 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -159,16 +159,64 @@ if (is_fuchsia) { import("third_party/fuchsia/sdk/linux/build/component.gni") import("third_party/fuchsia/sdk/linux/build/package.gni") - fuchsia_component("fuchsia_test_component") { - testonly = true - data_deps = [ "runtime/bin:dart" ] - manifest = "build/fuchsia/dart.cmx" + template("dart_fuchsia_test_package") { + fuchsia_package(target_name) { + package_name = invoker.package_name + if (is_debug) { + package_name += "_debug" + } else if (is_release) { + package_name += "_release" + } else if (is_product) { + package_name += "_product" + } + testonly = true + deps = invoker.deps + } + } - resource_files = [ - ".dart_tool/package_config.json", - "pkg/testing/test/hello_test.dart", - "tools/addlatexhash.dart", - ] + template("dart_fuchsia_test_component") { + fuchsia_component(target_name) { + testonly = true + data_deps = [ "runtime/bin:dart" ] + if (defined(invoker.data_deps)) { + data_deps += invoker.data_deps + } + manifest = "build/fuchsia/dart.cmx" + + library_files = [] + if (defined(invoker.library_files)) { + library_files += invoker.library_files + } + resource_files = [ + ".dart_tool/package_config.json", + "pkg/testing/test/hello_test.dart", + "tools/addlatexhash.dart", + ] + resource_dirs = invoker.resource_dirs + + resources = [] + foreach(file, library_files) { + resources += [ + { + path = root_out_dir + "/" + file + dest = "lib/" + file + }, + ] + } + foreach(file, resource_files) { + resources += [ + { + path = file + dest = "data/" + file + }, + ] + } + resources += + exec_script("tools/fuchsia/find_resources.py", resource_dirs, "json") + } + } + + dart_fuchsia_test_component("fuchsia_test_component") { resource_dirs = [ "tests/standalone_2", "pkg/async_helper", @@ -190,30 +238,32 @@ if (is_fuchsia) { "third_party/pkg/string_scanner", "third_party/pkg/typed_data", ] - - resources = [] - foreach(file, resource_files) { - resources += [ - { - path = file - dest = "data/" + file - }, - ] - } - resources += - exec_script("tools/fuchsia/find_resources.py", resource_dirs, "json") } - fuchsia_package("fuchsia_test_package") { - package_name = "dart_test_" - if (is_debug) { - package_name += "debug" - } else if (is_release) { - package_name += "release" - } else if (is_product) { - package_name += "product" - } - testonly = true + dart_fuchsia_test_package("fuchsia_test_package") { + package_name = "dart_test" deps = [ ":fuchsia_test_component" ] } + + dart_fuchsia_test_component("fuchsia_ffi_test_component") { + data_deps = [ + "runtime/bin:ffi_test_dynamic_library", + "runtime/bin:ffi_test_functions", + ] + library_files = [ + "libffi_test_dynamic_library.so", + "libffi_test_functions.so", + ] + resource_dirs = [ + "pkg/expect", + "pkg/meta", + "tests/ffi", + "third_party/pkg/ffi", + ] + } + + dart_fuchsia_test_package("fuchsia_ffi_test_package") { + package_name = "dart_ffi_test" + deps = [ ":fuchsia_ffi_test_component" ] + } } diff --git a/runtime/tests/vm/dart/dylib_utils.dart b/runtime/tests/vm/dart/dylib_utils.dart index 3ac9c3f5005..a805b6cabf3 100644 --- a/runtime/tests/vm/dart/dylib_utils.dart +++ b/runtime/tests/vm/dart/dylib_utils.dart @@ -6,7 +6,7 @@ import 'dart:ffi' as ffi; import 'dart:io' show Platform; String _platformPath(String name, {String path = ""}) { - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/runtime/tests/vm/dart_2/dylib_utils.dart b/runtime/tests/vm/dart_2/dylib_utils.dart index 75ba33bf312..083e941756b 100644 --- a/runtime/tests/vm/dart_2/dylib_utils.dart +++ b/runtime/tests/vm/dart_2/dylib_utils.dart @@ -7,7 +7,7 @@ import 'dart:io' show Platform; String _platformPath(String name, {String path}) { if (path == null) path = ""; - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/samples/ffi/dylib_utils.dart b/samples/ffi/dylib_utils.dart index 220c0fcf315..77faa885399 100644 --- a/samples/ffi/dylib_utils.dart +++ b/samples/ffi/dylib_utils.dart @@ -6,7 +6,7 @@ import 'dart:ffi'; import 'dart:io' show Platform; String _platformPath(String name, String path) { - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart b/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart index 220c0fcf315..77faa885399 100644 --- a/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart +++ b/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart @@ -6,7 +6,7 @@ import 'dart:ffi'; import 'dart:io' show Platform; String _platformPath(String name, String path) { - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/samples_2/ffi/dylib_utils.dart b/samples_2/ffi/dylib_utils.dart index 39653faa7c6..b783ad8667f 100644 --- a/samples_2/ffi/dylib_utils.dart +++ b/samples_2/ffi/dylib_utils.dart @@ -9,7 +9,7 @@ import 'dart:io' show Platform; String _platformPath(String name, {String path}) { if (path == null) path = ""; - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/samples_2/ffi/sqlite/lib/src/ffi/dylib_utils.dart b/samples_2/ffi/sqlite/lib/src/ffi/dylib_utils.dart index 39653faa7c6..b783ad8667f 100644 --- a/samples_2/ffi/sqlite/lib/src/ffi/dylib_utils.dart +++ b/samples_2/ffi/sqlite/lib/src/ffi/dylib_utils.dart @@ -9,7 +9,7 @@ import 'dart:io' show Platform; String _platformPath(String name, {String path}) { if (path == null) path = ""; - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/tests/ffi/all_positive.dart b/tests/ffi/all_positive.dart new file mode 100644 index 00000000000..d3d1db3c1c0 --- /dev/null +++ b/tests/ffi/all_positive.dart @@ -0,0 +1,96 @@ +// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Generated by prepare_flutter_bundle.dart and not ignoring vmspecific. +// Used in fuchsia_test_component. +// +// Note that we are not using any VM flags here, so we are not exercising GC +// corner cases etc. However, we are mainly interested in exercising the +// calling convention on Fuchsia. + +import "dart:async"; + +import "aliasing_test.dart" as main0; +import "data_not_asan_test.dart" as main1; +import "data_test.dart" as main2; +import "dylib_isolates_test.dart" as main3; +import "extension_methods_test.dart" as main4; +import "external_typed_data_test.dart" as main5; +import "function_callbacks_many_test.dart" as main6; +import "function_callbacks_test.dart" as main7; +import "function_callbacks_very_many_test.dart" as main8; +import "function_structs_test.dart" as main9; +import "function_test.dart" as main10; +import "function_very_many_test.dart" as main11; +import "hardfp_test.dart" as main12; +import "negative_function_test.dart" as main13; +import "regress_37254_test.dart" as main16; +import "regress_39044_test.dart" as main17; +import "regress_39063_test.dart" as main18; +import "regress_39885_test.dart" as main19; +import "regress_40537_test.dart" as main20; +import "regress_43016_test.dart" as main21; +import "regress_43693_test.dart" as main22; +import "regress_jump_to_frame_test.dart" as main23; +import "sizeof_test.dart" as main24; +import "snapshot_test.dart" as main25; +import "stacktrace_regress_37910_test.dart" as main26; +import "structs_test.dart" as main27; +import "variance_function_test.dart" as main28; +import "vmspecific_function_callbacks_exit_test.dart" as main29; +import "vmspecific_function_test.dart" as main30; +import "vmspecific_handle_dynamically_linked_test.dart" as main31; +import "vmspecific_handle_test.dart" as main32; +import "vmspecific_object_gc_test.dart" as main34; +import "vmspecific_regress_37100_test.dart" as main35; +import "vmspecific_regress_37511_callbacks_test.dart" as main36; +import "vmspecific_regress_37511_test.dart" as main37; +import "vmspecific_regress_37780_test.dart" as main38; + +Future invoke(dynamic fun) async { + if (fun is void Function() || fun is Future Function()) { + return await fun(); + } else { + return await fun([]); + } +} + +dynamic main() async { + await invoke(main0.main); + await invoke(main1.main); + await invoke(main2.main); + await invoke(main3.main); + await invoke(main4.main); + await invoke(main5.main); + await invoke(main6.main); + await invoke(main7.main); + await invoke(main8.main); + await invoke(main9.main); + await invoke(main10.main); + await invoke(main11.main); + await invoke(main12.main); + await invoke(main13.main); + await invoke(main16.main); + await invoke(main17.main); + await invoke(main18.main); + await invoke(main19.main); + await invoke(main20.main); + await invoke(main21.main); + await invoke(main22.main); + await invoke(main23.main); + await invoke(main24.main); + await invoke(main25.main); + await invoke(main26.main); + await invoke(main27.main); + await invoke(main28.main); + await invoke(main29.main); + await invoke(main30.main); + await invoke(main31.main); + await invoke(main32.main); + await invoke(main34.main); + await invoke(main35.main); + await invoke(main36.main); + await invoke(main37.main); + await invoke(main38.main); +} diff --git a/tests/ffi/dylib_utils.dart b/tests/ffi/dylib_utils.dart index 2b7ac27fb0c..c2c8db8dcc9 100644 --- a/tests/ffi/dylib_utils.dart +++ b/tests/ffi/dylib_utils.dart @@ -7,7 +7,7 @@ import 'dart:io' show Platform; String _platformPath(String name, {String? path}) { if (path == null) path = ""; - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/tests/ffi_2/all_positive.dart b/tests/ffi_2/all_positive.dart new file mode 100644 index 00000000000..699add9b8cb --- /dev/null +++ b/tests/ffi_2/all_positive.dart @@ -0,0 +1,102 @@ +// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Generated by prepare_flutter_bundle.dart and not ignoring vmspecific. +// Used in fuchsia_test_component. +// +// Note that we are not using any VM flags here, so we are not exercising GC +// corner cases etc. However, we are mainly interested in exercising the +// calling convention on Fuchsia. + +import "dart:async"; + +import "aliasing_test.dart" as main0; +import "data_not_asan_test.dart" as main1; +import "data_test.dart" as main2; +import "dylib_isolates_test.dart" as main3; +import "extension_methods_test.dart" as main4; +import "external_typed_data_test.dart" as main5; +import "function_callbacks_many_test.dart" as main6; +import "function_callbacks_test.dart" as main7; +import "function_callbacks_very_many_test.dart" as main8; +import "function_structs_test.dart" as main9; +import "function_test.dart" as main10; +import "function_very_many_test.dart" as main11; +import "hardfp_test.dart" as main12; +import "negative_function_test.dart" as main13; +import "null_regress_39068_test.dart" as main14; +import "null_test.dart" as main15; +import "regress_37254_test.dart" as main16; +import "regress_39044_test.dart" as main17; +import "regress_39063_test.dart" as main18; +import "regress_39885_test.dart" as main19; +import "regress_40537_test.dart" as main20; +import "regress_43016_test.dart" as main21; +import "regress_43693_test.dart" as main22; +import "regress_jump_to_frame_test.dart" as main23; +import "sizeof_test.dart" as main24; +import "snapshot_test.dart" as main25; +import "stacktrace_regress_37910_test.dart" as main26; +import "structs_test.dart" as main27; +import "variance_function_test.dart" as main28; +import "vmspecific_function_callbacks_exit_test.dart" as main29; +import "vmspecific_function_test.dart" as main30; +import "vmspecific_handle_dynamically_linked_test.dart" as main31; +import "vmspecific_handle_test.dart" as main32; +import "vmspecific_null_test.dart" as main33; +import "vmspecific_object_gc_test.dart" as main34; +import "vmspecific_regress_37100_test.dart" as main35; +import "vmspecific_regress_37511_callbacks_test.dart" as main36; +import "vmspecific_regress_37511_test.dart" as main37; +import "vmspecific_regress_37780_test.dart" as main38; + +Future invoke(dynamic fun) async { + if (fun is void Function() || fun is Future Function()) { + return await fun(); + } else { + return await fun([]); + } +} + +dynamic main() async { + await invoke(main0.main); + await invoke(main1.main); + await invoke(main2.main); + await invoke(main3.main); + await invoke(main4.main); + await invoke(main5.main); + await invoke(main6.main); + await invoke(main7.main); + await invoke(main8.main); + await invoke(main9.main); + await invoke(main10.main); + await invoke(main11.main); + await invoke(main12.main); + await invoke(main13.main); + await invoke(main14.main); + await invoke(main15.main); + await invoke(main16.main); + await invoke(main17.main); + await invoke(main18.main); + await invoke(main19.main); + await invoke(main20.main); + await invoke(main21.main); + await invoke(main22.main); + await invoke(main23.main); + await invoke(main24.main); + await invoke(main25.main); + await invoke(main26.main); + await invoke(main27.main); + await invoke(main28.main); + await invoke(main29.main); + await invoke(main30.main); + await invoke(main31.main); + await invoke(main32.main); + await invoke(main33.main); + await invoke(main34.main); + await invoke(main35.main); + await invoke(main36.main); + await invoke(main37.main); + await invoke(main38.main); +} diff --git a/tests/ffi_2/dylib_utils.dart b/tests/ffi_2/dylib_utils.dart index fb8153af995..c6f91273a35 100644 --- a/tests/ffi_2/dylib_utils.dart +++ b/tests/ffi_2/dylib_utils.dart @@ -7,7 +7,7 @@ import 'dart:io' show Platform; String _platformPath(String name, {String path}) { if (path == null) path = ""; - if (Platform.isLinux || Platform.isAndroid) + if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) return path + "lib" + name + ".so"; if (Platform.isMacOS) return path + "lib" + name + ".dylib"; if (Platform.isWindows) return path + name + ".dll"; diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json index be6ffda2550..2bf93261add 100644 --- a/tools/bots/test_matrix.json +++ b/tools/bots/test_matrix.json @@ -1745,7 +1745,8 @@ "--arch=x64,arm64", "runtime", "create_sdk", - "fuchsia_test_package" + "fuchsia_test_package", + "fuchsia_ffi_test_package" ] } ]