From 550d580d5e02bf0a901131f79b38c59f45df4e90 Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Thu, 10 Dec 2020 12:15:17 +0000 Subject: [PATCH] [vm/ffi] Fuchsia FFI testing package This does not include enabling the FFI on Fuchsia. So these tests will fail without the dependent CL. This CL adds an `all_positive.dart` test file to be packaged in the .far file, such that it is easier to run all FFI tests in one go. We don't run tests on the bots, but we do build this test package on the bots. To build the .far files locally: ``` tools/build.py --os=fuchsia -m debug fuchsia_ffi_test_package tools/build.py --os=fuchsia -m debug -a arm64 fuchsia_ffi_test_package ``` Issue: https://github.com/dart-lang/sdk/issues/44434 Change-Id: Iec418e0c10d77afbf811fb83151664bcc2710b99 Cq-Include-Trybots: luci.dart.try:vm-fuchsia-release-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175484 Reviewed-by: Liam Appelbe --- BUILD.gn | 112 +++++++++++++----- runtime/tests/vm/dart/dylib_utils.dart | 2 +- runtime/tests/vm/dart_2/dylib_utils.dart | 2 +- samples/ffi/dylib_utils.dart | 2 +- .../ffi/sqlite/lib/src/ffi/dylib_utils.dart | 2 +- samples_2/ffi/dylib_utils.dart | 2 +- .../ffi/sqlite/lib/src/ffi/dylib_utils.dart | 2 +- tests/ffi/all_positive.dart | 96 +++++++++++++++ tests/ffi/dylib_utils.dart | 2 +- tests/ffi_2/all_positive.dart | 102 ++++++++++++++++ tests/ffi_2/dylib_utils.dart | 2 +- tools/bots/test_matrix.json | 3 +- 12 files changed, 289 insertions(+), 40 deletions(-) create mode 100644 tests/ffi/all_positive.dart create mode 100644 tests/ffi_2/all_positive.dart 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" ] } ]