diff --git a/engine/src/flutter/ci/licenses_golden/excluded_files b/engine/src/flutter/ci/licenses_golden/excluded_files index a45a7d3e26..d4f5414156 100644 --- a/engine/src/flutter/ci/licenses_golden/excluded_files +++ b/engine/src/flutter/ci/licenses_golden/excluded_files @@ -282,6 +282,7 @@ ../../../flutter/shell/platform/fuchsia/dart_runner/.gitignore ../../../flutter/shell/platform/fuchsia/dart_runner/README.md ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/pubspec.yaml +../../../flutter/shell/platform/fuchsia/dart_runner/fidl/meta.json ../../../flutter/shell/platform/fuchsia/dart_runner/kernel/libraries.json ../../../flutter/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml ../../../flutter/shell/platform/fuchsia/dart_runner/tests diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index fb09529041..e108372516 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -2886,6 +2886,7 @@ ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/shim.dart + ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.cc.tmpl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/fidl/echo.fidl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/logging.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/main.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/meta/common.shard.cml + ../../../flutter/LICENSE @@ -5588,6 +5589,7 @@ FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/shim.dart FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.cc.tmpl FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.dart FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.h +FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/fidl/echo.fidl FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/logging.h FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/main.cc FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/meta/common.shard.cml diff --git a/engine/src/flutter/shell/platform/fuchsia/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/BUILD.gn index 2565d40461..b231c31d20 100644 --- a/engine/src/flutter/shell/platform/fuchsia/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/BUILD.gn @@ -90,6 +90,7 @@ if (enable_unittests) { testonly = true deps = [ + "dart-pkg/zircon:tests", "dart_runner:tests", "flutter:tests", ] diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/BUILD.gn index ae8aa96b80..2a67cf6199 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/BUILD.gn @@ -4,6 +4,9 @@ import("//build/fuchsia/sdk.gni") import("//flutter/testing/testing.gni") +import("//flutter/tools/fuchsia/dart/dart_library.gni") +import("//flutter/tools/fuchsia/flutter/flutter_component.gni") +import("//flutter/tools/fuchsia/gn-sdk/package.gni") config("zircon_config") { include_dirs = [ "." ] @@ -37,9 +40,54 @@ source_set("zircon") { ] } +dart_library("zircon_lib") { + testonly = true + package_name = "zircon" + language_version = "2.12" + source_dir = "lib" + + sources = [ + "src/handle.dart", + "src/handle_disposition.dart", + "src/handle_waiter.dart", + "src/init.dart", + "src/system.dart", + "src/zd_channel.dart", + "src/zd_handle.dart", + "zircon.dart", + ] +} + +dart_library("zircon_tests_lib") { + testonly = true + package_name = "zircon_tests" + language_version = "2.12" + source_dir = "." + package_root = "test" + + sources = [ "zircon_tests.dart" ] + deps = [ "//flutter/shell/platform/fuchsia/dart:litetest" ] +} + +flutter_component("zircon_tests_component") { + testonly = true + main_package = "zircon_tests" + component_name = "zircon_tests" + main_dart = "zircon_tests.dart" + manifest = rebase_path("test/meta/zircon_tests.cml") + + deps = [ ":zircon_tests_lib" ] +} + +fuchsia_package("zircon_tests_package") { + testonly = true + package_name = "zircon_tests" + deps = [ ":zircon_tests_component" ] +} + if (enable_unittests) { - source_set("test") { + source_set("tests") { testonly = true - deps = [ "test" ] + deps = [ ":zircon_tests_package" ] } } diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/BUILD.gn deleted file mode 100644 index 6feebc1d45..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/BUILD.gn +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2013 The Flutter 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("//build/fuchsia/sdk.gni") -import("//flutter/tools/fuchsia/dart/dart_library.gni") -import("//flutter/tools/fuchsia/flutter/flutter_component.gni") -import("//flutter/tools/fuchsia/gn-sdk/package.gni") - -dart_library("dart_library") { - testonly = true - package_name = "channel_test" - - language_version = "2.12" - - source_dir = "." - - sources = [ - "channel_test.dart", - "eventpair_test.dart", - "handle_disposition_test.dart", - "handle_test.dart", - "socket_test.dart", - "vmo_test.dart", - ] - - deps = [ - "//flutter/shell/platform/fuchsia/dart:litetest", - "//flutter/tools/fuchsia/dart:zircon", - ] -} - -flutter_component("channel_test_flutter_component") { - testonly = true - - main_package = "channel_test" - component_name = "channel_test" - main_dart = "channel_test.dart" - manifest = rebase_path("meta/channel_test.cml") - deps = [ ":dart_library" ] -} - -# TODO(richkadel): The target name is set differently compared to fuchsia.git's flutter_app(). -# Unlike in fuchsia.git's version of fuchsia_component, the Fuchsia GN SDK -# version passes the component name to fuchsia_component via it's target_name only. -# GN SDK's fuchsia_component doesn't have a `component_name` argument! So I'm forced to set -# the component name via "target_name". This is a problem in fuchsia_package, which uses -# the target_name to name the fuchsia_pm_tool target, creating duplicate target IDs! -# So I have to change the fuchsia_package name to something that is NOT the component name, -# and then set the package_name (which fuchsia_package does support). -fuchsia_package("channel_test_package") { - testonly = true - package_name = "channel_test" - deps = [ ":channel_test_flutter_component" ] -} - -group("test") { - testonly = true - deps = [ ":channel_test_package" ] -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/channel_test.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/channel_test.dart deleted file mode 100644 index 564ccd8155..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/channel_test.dart +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2013 The Flutter 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 'dart:async'; -import 'dart:convert'; -import 'dart:typed_data'; - -import 'package:litetest/litetest.dart'; - -import 'package:zircon/zircon.dart'; - -/// Helper method to turn a [String] into a [ByteData] containing the -/// text of the string encoded as UTF-8. -ByteData utf8Bytes(final String text) { - return ByteData.view(Uint8List.fromList(utf8.encode(text)).buffer); -} - -void main() { - test('create channel', () { - final HandlePairResult pair = System.channelCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - }); - - test('[ffi] create channel', () { - final ZDChannel? channel = ZDChannel.create(); - expect(channel, isNotNull); - final ZDHandlePair pair = channel!.handlePair; - expect(pair.left.isValid(), isTrue); - expect(pair.right.isValid(), isTrue); - }); - - test('close channel', () { - final HandlePairResult pair = System.channelCreate(); - expect(pair.first.close(), equals(0)); - expect(pair.first.isValid, isFalse); - expect(pair.second.isValid, isTrue); - expect(System.channelWrite(pair.first, ByteData(1), []), - equals(ZX.ERR_BAD_HANDLE)); - expect(System.channelWrite(pair.second, ByteData(1), []), - equals(ZX.ERR_PEER_CLOSED)); - }); - - test('[ffi] close channel', () { - final ZDChannel? channel = ZDChannel.create(); - final ZDHandlePair pair = channel!.handlePair; - expect(pair.left.close(), isTrue); - expect(pair.left.isValid, isFalse); - expect(pair.right.isValid, isTrue); - expect(channel.writeLeft(ByteData(1), []), - equals(ZX.ERR_BAD_HANDLE)); - expect(channel.writeRight(ByteData(1), []), - equals(ZX.ERR_PEER_CLOSED)); - }); - - test('channel bytes', () { - final HandlePairResult pair = System.channelCreate(); - - // When no data is available, ZX.ERR_SHOULD_WAIT is returned. - expect(System.channelQueryAndRead(pair.second).status, - equals(ZX.ERR_SHOULD_WAIT)); - - // Write bytes. - final ByteData data = utf8Bytes('Hello, world'); - final int status = System.channelWrite(pair.first, data, []); - expect(status, equals(ZX.OK)); - - // Read bytes. - final ReadResult readResult = System.channelQueryAndRead(pair.second); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(data.lengthInBytes)); - expect(readResult.bytes.lengthInBytes, equals(data.lengthInBytes)); - expect(readResult.bytesAsUTF8String(), equals('Hello, world')); - expect(readResult.handles.length, equals(0)); - }); - - test('channel handles', () { - final HandlePairResult pair = System.channelCreate(); - final ByteData data = utf8Bytes(''); - final HandlePairResult eventPair = System.eventpairCreate(); - final int status = - System.channelWrite(pair.first, data, [eventPair.first]); - expect(status, equals(ZX.OK)); - expect(eventPair.first.isValid, isFalse); - - final ReadResult readResult = System.channelQueryAndRead(pair.second); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(0)); - expect(readResult.bytes.lengthInBytes, equals(0)); - expect(readResult.bytesAsUTF8String(), equals('')); - expect(readResult.handles.length, equals(1)); - expect(readResult.handles[0].isValid, isTrue); - }); - - group('etc functions', () { - test('moved handle', () { - final HandlePairResult pair = System.channelCreate(); - final ByteData data = utf8Bytes(''); - final HandlePairResult transferred = System.channelCreate(); - - final HandleDisposition disposition = HandleDisposition(ZX.HANDLE_OP_MOVE, - transferred.first, ZX.OBJ_TYPE_CHANNEL, ZX.RIGHTS_IO); - final int status = System.channelWriteEtc( - pair.first, data, [disposition]); - expect(status, equals(ZX.OK)); - expect(disposition.result, equals(ZX.OK)); - expect(transferred.first.isValid, isFalse); - - final ReadEtcResult readResult = - System.channelQueryAndReadEtc(pair.second); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(0)); - expect(readResult.bytes.lengthInBytes, equals(0)); - expect(readResult.bytesAsUTF8String(), equals('')); - expect(readResult.handleInfos.length, equals(1)); - final HandleInfo handleInfo = readResult.handleInfos[0]; - expect(handleInfo.handle.isValid, isTrue); - expect(handleInfo.type, equals(ZX.OBJ_TYPE_CHANNEL)); - expect(handleInfo.rights, equals(ZX.RIGHTS_IO)); - }); - - test('copied handle', () { - final HandlePairResult pair = System.channelCreate(); - final ByteData data = utf8Bytes(''); - final HandleResult vmo = System.vmoCreate(0); - - final HandleDisposition disposition = HandleDisposition( - ZX.HANDLE_OP_DUPLICATE, - vmo.handle, - ZX.OBJ_TYPE_VMO, - ZX.RIGHT_SAME_RIGHTS); - final int status = System.channelWriteEtc( - pair.first, data, [disposition]); - expect(status, equals(ZX.OK)); - expect(disposition.result, equals(ZX.OK)); - expect(vmo.handle.isValid, isTrue); - - final ReadEtcResult readResult = - System.channelQueryAndReadEtc(pair.second); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(0)); - expect(readResult.bytes.lengthInBytes, equals(0)); - expect(readResult.bytesAsUTF8String(), equals('')); - expect(readResult.handleInfos.length, equals(1)); - final HandleInfo handleInfo = readResult.handleInfos[0]; - expect(handleInfo.handle.isValid, isTrue); - expect(handleInfo.type, equals(ZX.OBJ_TYPE_VMO)); - expect(handleInfo.rights, equals(ZX.DEFAULT_VMO_RIGHTS)); - }); - - test('closed handle should error', () { - final HandlePairResult pair = System.channelCreate(); - final ByteData data = utf8Bytes(''); - final HandlePairResult closed = System.channelCreate(); - - final HandleDisposition disposition = HandleDisposition(ZX.HANDLE_OP_MOVE, - closed.first, ZX.OBJ_TYPE_CHANNEL, ZX.RIGHT_SAME_RIGHTS); - closed.first.close(); - final int status = System.channelWriteEtc( - pair.first, data, [disposition]); - expect(status, equals(ZX.ERR_BAD_HANDLE)); - expect(disposition.result, equals(ZX.ERR_BAD_HANDLE)); - expect(closed.first.isValid, isFalse); - - final ReadEtcResult readResult = - System.channelQueryAndReadEtc(pair.second); - expect(readResult.status, equals(ZX.ERR_SHOULD_WAIT)); - }); - - test('multiple handles', () { - final HandlePairResult pair = System.channelCreate(); - final ByteData data = utf8Bytes(''); - final HandlePairResult transferred = System.channelCreate(); - final HandleResult vmo = System.vmoCreate(0); - - final List dispositions = [ - HandleDisposition(ZX.HANDLE_OP_MOVE, transferred.first, - ZX.OBJ_TYPE_CHANNEL, ZX.RIGHTS_IO), - HandleDisposition(ZX.HANDLE_OP_DUPLICATE, vmo.handle, ZX.OBJ_TYPE_VMO, - ZX.RIGHT_SAME_RIGHTS) - ]; - final int status = System.channelWriteEtc(pair.first, data, dispositions); - expect(status, equals(ZX.OK)); - expect(dispositions[0].result, equals(ZX.OK)); - expect(dispositions[1].result, equals(ZX.OK)); - expect(transferred.first.isValid, isFalse); - expect(vmo.handle.isValid, isTrue); - - final ReadEtcResult readResult = - System.channelQueryAndReadEtc(pair.second); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(0)); - expect(readResult.bytes.lengthInBytes, equals(0)); - expect(readResult.bytesAsUTF8String(), equals('')); - - expect(readResult.handleInfos.length, equals(2)); - final HandleInfo handleInfo = readResult.handleInfos[0]; - expect(handleInfo.handle.isValid, isTrue); - expect(handleInfo.type, equals(ZX.OBJ_TYPE_CHANNEL)); - expect(handleInfo.rights, equals(ZX.RIGHTS_IO)); - final HandleInfo vmoInfo = readResult.handleInfos[1]; - expect(vmoInfo.handle.isValid, isTrue); - expect(vmoInfo.type, equals(ZX.OBJ_TYPE_VMO)); - expect(vmoInfo.rights, equals(ZX.DEFAULT_VMO_RIGHTS)); - }); - }); - - test('async wait channel read', () async { - final HandlePairResult pair = System.channelCreate(); - final Completer> completer = Completer>(); - pair.first.asyncWait(ZX.CHANNEL_READABLE, (int status, int pending) { - completer.complete([status, pending]); - }); - - expect(completer.isCompleted, isFalse); - - System.channelWrite(pair.second, utf8Bytes('Hi'), []); - - final List result = await completer.future; - expect(result[0], equals(ZX.OK)); // status - expect(result[1] & ZX.CHANNEL_READABLE, - equals(ZX.CHANNEL_READABLE)); // pending - }); - - test('async wait channel closed', () async { - final HandlePairResult pair = System.channelCreate(); - final Completer completer = Completer(); - pair.first.asyncWait(ZX.CHANNEL_PEER_CLOSED, (int status, int pending) { - completer.complete(status); - }); - - expect(completer.isCompleted, isFalse); - - pair.second.close(); - - final int status = await completer.future; - expect(status, equals(ZX.OK)); - }); -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/eventpair_test.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/eventpair_test.dart deleted file mode 100644 index aa133bb599..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/eventpair_test.dart +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2013 The Flutter 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 'dart:async'; - -import 'package:test/test.dart'; -import 'package:zircon/zircon.dart'; - -void main() { - group('eventpair: ', () { - test('create', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - }); - - test('duplicate', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - - expect(pair.first.duplicate(ZX.RIGHT_SAME_RIGHTS).isValid, isTrue); - expect(pair.second.duplicate(ZX.RIGHT_SAME_RIGHTS).isValid, isTrue); - }); - - test('close', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.first.close(), equals(0)); - expect(pair.first.isValid, isFalse); - expect(pair.second.isValid, isTrue); - - expect(pair.second.close(), equals(0)); - expect(pair.second.isValid, isFalse); - }); - - test('async wait peer closed', () async { - final HandlePairResult pair = System.eventpairCreate(); - final Completer completer = Completer(); - pair.first.asyncWait(EventPair.PEER_CLOSED, (int status, int pending) { - completer.complete(status); - }); - - expect(completer.isCompleted, isFalse); - pair.second.close(); - - final int status = await completer.future; - expect(status, equals(ZX.OK)); - }); - }); -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/handle_disposition_test.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/handle_disposition_test.dart deleted file mode 100644 index 9281910933..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/handle_disposition_test.dart +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 The Flutter 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 'package:test/test.dart'; -import 'package:zircon/zircon.dart'; - -void main() { - test('store the disposition arguments correctly', () { - final Handle handle = System.channelCreate().first; - final HandleDisposition disposition = HandleDisposition(1, handle, 2, 3); - expect(disposition.operation, equals(1)); - expect(disposition.handle, equals(handle)); - expect(disposition.type, equals(2)); - expect(disposition.rights, equals(3)); - expect(disposition.result, equals(ZX.OK)); - }); -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/handle_test.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/handle_test.dart deleted file mode 100644 index 79f9d25e81..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/handle_test.dart +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2013 The Flutter 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 'dart:convert'; -import 'dart:typed_data'; - -import 'package:test/test.dart'; -import 'package:zircon/zircon.dart'; - -/// Helper method to turn a [String] into a [ByteData] containing the -/// text of the string encoded as UTF-8. -ByteData utf8Bytes(final String text) { - return ByteData.view(Uint8List.fromList(utf8.encode(text)).buffer); -} - -void main() { - group('duplicated handle', () { - test('create and duplicate handles', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - - final Handle duplicate = pair.first.duplicate(ZX.RIGHT_SAME_RIGHTS); - expect(duplicate.isValid, isTrue); - - final Handle failedDuplicate = pair.first.duplicate(-1); - expect(failedDuplicate.isValid, isFalse); - }); - - test('failure invalid rights', () { - final HandleResult vmo = System.vmoCreate(0); - expect(vmo.status, equals(ZX.OK)); - final Handle failedDuplicate = vmo.handle.duplicate(-1); - expect(failedDuplicate.isValid, isFalse); - expect(vmo.handle.isValid, isTrue); - }); - - test('failure invalid handle', () { - final Handle handle = Handle.invalid(); - final Handle duplicate = handle.duplicate(ZX.RIGHT_SAME_RIGHTS); - expect(duplicate.isValid, isFalse); - }); - - test('duplicated handle should have same koid', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - - final Handle duplicate = pair.first.duplicate(ZX.RIGHT_SAME_RIGHTS); - expect(duplicate.isValid, isTrue); - - expect(pair.first.koid, duplicate.koid); - }); - - // TODO(fxbug.dev/77599): Simplify once zx_object_get_info is available. - test('reduced rights', () { - // Set up handle. - final HandleResult vmo = System.vmoCreate(2); - expect(vmo.status, equals(ZX.OK)); - - // Duplicate the first handle. - final Handle duplicate = vmo.handle.duplicate(ZX.RIGHTS_BASIC); - expect(duplicate.isValid, isTrue); - - // Write bytes to the original handle. - final ByteData data1 = utf8Bytes('a'); - final int status1 = System.vmoWrite(vmo.handle, 0, data1); - expect(status1, equals(ZX.OK)); - - // Write bytes to the duplicated handle. - final ByteData data2 = utf8Bytes('b'); - final int status2 = System.vmoWrite(duplicate, 1, data2); - expect(status2, equals(ZX.ERR_ACCESS_DENIED)); - - // Read bytes. - final ReadResult readResult = System.vmoRead(vmo.handle, 0, 2); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(2)); - expect(readResult.bytes.lengthInBytes, equals(2)); - expect(readResult.bytesAsUTF8String(), equals('a\x00')); - }); - }); - - group('replaced handle', () { - test('create and replace handles', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - - final Handle replaced = pair.first.replace(ZX.RIGHT_SAME_RIGHTS); - expect(replaced.isValid, isTrue); - expect(pair.first.isValid, isFalse); - }); - - test('failure invalid rights', () { - final HandleResult vmo = System.vmoCreate(0); - expect(vmo.status, equals(ZX.OK)); - final Handle failedDuplicate = vmo.handle.replace(-1); - expect(failedDuplicate.isValid, isFalse); - expect(vmo.handle.isValid, isFalse); - }); - - test('failure invalid handle', () { - final Handle handle = Handle.invalid(); - final Handle replaced = handle.replace(ZX.RIGHT_SAME_RIGHTS); - expect(handle.isValid, isFalse); - expect(replaced.isValid, isFalse); - }); - - test('transferred handle should have same koid', () { - final HandlePairResult pair = System.eventpairCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - - final int koid = pair.first.koid; - final Handle replaced = pair.first.replace(ZX.RIGHT_SAME_RIGHTS); - expect(replaced.isValid, isTrue); - - expect(koid, replaced.koid); - }); - - // TODO(fxbug.dev/77599): Simplify once zx_object_get_info is available. - test('reduced rights', () { - // Set up handle. - final HandleResult vmo = System.vmoCreate(2); - expect(vmo.status, equals(ZX.OK)); - - // Replace the first handle. - final Handle duplicate = - vmo.handle.replace(ZX.RIGHTS_BASIC | ZX.RIGHT_READ); - expect(duplicate.isValid, isTrue); - - // Write bytes to the original handle. - final ByteData data1 = utf8Bytes('a'); - final int status1 = System.vmoWrite(vmo.handle, 0, data1); - expect(status1, equals(ZX.ERR_BAD_HANDLE)); - - // Write bytes to the duplicated handle. - final ByteData data2 = utf8Bytes('b'); - final int status2 = System.vmoWrite(duplicate, 1, data2); - expect(status2, equals(ZX.ERR_ACCESS_DENIED)); - - // Read bytes. - final ReadResult readResult = System.vmoRead(duplicate, 0, 2); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(2)); - expect(readResult.bytes.lengthInBytes, equals(2)); - expect(readResult.bytesAsUTF8String(), equals('\x00\x00')); - }); - }); - - test('cache koid and invalidate', () { - final HandleResult vmo = System.vmoCreate(0); - expect(vmo.status, equals(ZX.OK)); - int originalKoid = vmo.handle.koid; - expect(originalKoid, isNot(equals(ZX.KOID_INVALID))); - // Cached koid should be same value. - expect(originalKoid, equals(vmo.handle.koid)); - vmo.handle.close(); - // koid should be invalidated. - expect(vmo.handle.koid, equals(ZX.KOID_INVALID)); - }); -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/meta/channel_test.cml b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/meta/channel_test.cml deleted file mode 100644 index d3c09451ea..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/meta/channel_test.cml +++ /dev/null @@ -1,5 +0,0 @@ -{ - program: { - data: "data/channel_test", - }, -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/meta/zircon_tests.cml b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/meta/zircon_tests.cml new file mode 100644 index 0000000000..e7faccaece --- /dev/null +++ b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/meta/zircon_tests.cml @@ -0,0 +1,6 @@ +{ + program: { + data: "data/zircon_tests", + runner: "dart_jit_runner", + }, +} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/socket_test.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/socket_test.dart deleted file mode 100644 index 8fbb728feb..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/socket_test.dart +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2013 The Flutter 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 'dart:async'; -import 'dart:convert'; -import 'dart:typed_data'; - -import 'package:test/test.dart'; -import 'package:zircon/zircon.dart'; - -/// Helper method to turn a [String] into a [ByteData] containing the -/// text of the string encoded as UTF-8. -ByteData utf8Bytes(final String text) { - return ByteData.view(Uint8List.fromList(utf8.encode(text)).buffer); -} - -void main() { - // NOTE: This only tests stream sockets. - // We should add tests for datagram sockets. - - test('create socket', () { - final HandlePairResult pair = System.socketCreate(); - expect(pair.status, equals(ZX.OK)); - expect(pair.first.isValid, isTrue); - expect(pair.second.isValid, isTrue); - }); - - test('close socket', () { - final HandlePairResult pair = System.socketCreate(); - expect(pair.first.close(), equals(0)); - expect(pair.first.isValid, isFalse); - expect(pair.second.isValid, isTrue); - final WriteResult firstResult = - System.socketWrite(pair.first, ByteData(1), 0); - expect(firstResult.status, equals(ZX.ERR_BAD_HANDLE)); - final WriteResult secondResult = - System.socketWrite(pair.second, ByteData(1), 0); - expect(secondResult.status, equals(ZX.ERR_PEER_CLOSED)); - }); - - test('read write socket', () { - final HandlePairResult pair = System.socketCreate(); - - // When no data is available, ZX.ERR_SHOULD_WAIT is returned. - expect( - System.socketRead(pair.second, 1).status, equals(ZX.ERR_SHOULD_WAIT)); - - final ByteData data = utf8Bytes('Hello, world'); - final WriteResult writeResult = System.socketWrite(pair.first, data, 0); - expect(writeResult.status, equals(ZX.OK)); - - final ReadResult readResult = - System.socketRead(pair.second, data.lengthInBytes); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals(data.lengthInBytes)); - expect(readResult.bytes.lengthInBytes, equals(data.lengthInBytes)); - expect(readResult.bytesAsUTF8String(), equals('Hello, world')); - }); - - test('partial read socket', () { - final HandlePairResult pair = System.socketCreate(); - final ByteData data = utf8Bytes('Hello, world'); - final WriteResult writeResult = System.socketWrite(pair.first, data, 0); - expect(writeResult.status, equals(ZX.OK)); - - const int shortLength = 'Hello'.length; - final ReadResult shortReadResult = - System.socketRead(pair.second, shortLength); - expect(shortReadResult.status, equals(ZX.OK)); - expect(shortReadResult.numBytes, equals(shortLength)); - expect(shortReadResult.bytes.lengthInBytes, equals(shortLength)); - expect(shortReadResult.bytesAsUTF8String(), equals('Hello')); - - final int longLength = data.lengthInBytes * 2; - final ReadResult longReadResult = - System.socketRead(pair.second, longLength); - expect(longReadResult.status, equals(ZX.OK)); - expect(longReadResult.numBytes, equals(data.lengthInBytes - shortLength)); - expect(longReadResult.bytes.lengthInBytes, equals(longLength)); - expect(longReadResult.bytesAsUTF8String(), equals(', world')); - }); - - test('partial write socket', () { - final HandlePairResult pair = System.socketCreate(); - final WriteResult writeResult1 = - System.socketWrite(pair.first, utf8Bytes('Hello, '), 0); - expect(writeResult1.status, equals(ZX.OK)); - final WriteResult writeResult2 = - System.socketWrite(pair.first, utf8Bytes('world'), 0); - expect(writeResult2.status, equals(ZX.OK)); - - final ReadResult readResult = System.socketRead(pair.second, 100); - expect(readResult.status, equals(ZX.OK)); - expect(readResult.numBytes, equals('Hello, world'.length)); - expect(readResult.bytes.lengthInBytes, equals(100)); - expect(readResult.bytesAsUTF8String(), equals('Hello, world')); - }); - - test('async wait socket read', () async { - final HandlePairResult pair = System.socketCreate(); - final Completer completer = Completer(); - pair.first.asyncWait(ZX.SOCKET_READABLE, (int status, int pending) { - completer.complete(status); - }); - - expect(completer.isCompleted, isFalse); - - System.socketWrite(pair.second, utf8Bytes('Hi'), 0); - - final int status = await completer.future; - expect(status, equals(ZX.OK)); - }); - - test('async wait socket closed', () async { - final HandlePairResult pair = System.socketCreate(); - final Completer completer = Completer(); - pair.first.asyncWait(ZX.SOCKET_PEER_CLOSED, (int status, int pending) { - completer.complete(status); - }); - - expect(completer.isCompleted, isFalse); - - pair.second.close(); - - final int status = await completer.future; - expect(status, equals(ZX.OK)); - }); -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/vmo_test.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/vmo_test.dart deleted file mode 100644 index ca72cd9f49..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/vmo_test.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2013 The Flutter 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 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:test/test.dart'; -import 'package:zircon/zircon.dart'; - -void main() { - group('test vmo', () { - test('fromFile', () { - const String fuchsia = 'Fuchsia'; - File f = File('tmp/testdata') - ..createSync() - ..writeAsStringSync(fuchsia); - String readFuchsia = f.readAsStringSync(); - expect(readFuchsia, equals(fuchsia)); - - SizedVmo fileVmo = SizedVmo.fromFile('tmp/testdata'); - Uint8List fileData = fileVmo.map(); - String fileString = utf8.decode(fileData.sublist(0, fileVmo.size)); - expect(fileString, equals(fuchsia)); - }); - - test('duplicate', () { - const String fuchsia = 'Fuchsia'; - Uint8List data = Uint8List.fromList(fuchsia.codeUnits); - SizedVmo vmo = SizedVmo.fromUint8List(data); - final Vmo duplicate = - vmo.duplicate(ZX.RIGHTS_BASIC | ZX.RIGHT_READ | ZX.RIGHT_MAP); - expect(duplicate.isValid, isTrue); - - // Read from the duplicate. - final duplicatedVmo = SizedVmo(duplicate.handle, fuchsia.length); - Uint8List vmoData = duplicatedVmo.map(); - String vmoString = utf8.decode(vmoData.sublist(0, vmo.size)); - expect(vmoString, equals(fuchsia)); - }); - }); -} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/zircon_tests.dart b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/zircon_tests.dart new file mode 100644 index 0000000000..b4314f6910 --- /dev/null +++ b/engine/src/flutter/shell/platform/fuchsia/dart-pkg/zircon/test/zircon_tests.dart @@ -0,0 +1,618 @@ +// Copyright 2013 The Flutter 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 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; +import 'dart:zircon'; + +import 'package:litetest/litetest.dart'; + +/// Helper method to turn a [String] into a [ByteData] containing the +/// text of the string encoded as UTF-8. +ByteData utf8Bytes(final String text) { + return ByteData.view(Uint8List.fromList(utf8.encode(text)).buffer); +} + +// Take from zircon constants in zircon/errors.h, zircon/rights.h, zircon/types.h +abstract class ZX { + ZX._(); + + static const int OK = 0; + static const int KOID_INVALID = 0; + static const int ERR_BAD_HANDLE = -11; + static const int ERR_SHOULD_WAIT = -22; + static const int ERR_PEER_CLOSED = -24; + static const int ERR_ACCESS_DENIED = -30; + static const int EVENTPAIR_PEER_CLOSED = __ZX_OBJECT_PEER_CLOSED; + static const int CHANNEL_READABLE = __ZX_OBJECT_READABLE; + static const int CHANNEL_PEER_CLOSED = __ZX_OBJECT_PEER_CLOSED; + static const int SOCKET_READABLE = __ZX_OBJECT_READABLE; + static const int SOCKET_PEER_CLOSED = __ZX_OBJECT_PEER_CLOSED; + static const int RIGHT_DUPLICATE = 1 << 0; + static const int RIGHT_TRANSFER = 1 << 1; + static const int RIGHT_READ = 1 << 2; + static const int RIGHT_WRITE = 1 << 3; + static const int RIGHT_GET_PROPERTY = 1 << 6; + static const int RIGHT_SET_PROPERTY = 1 << 7; + static const int RIGHT_MAP = 1 << 5; + static const int RIGHT_SIGNAL = 1 << 12; + static const int RIGHT_WAIT = 1 << 14; + static const int RIGHT_INSPECT = 1 << 15; + static const int RIGHT_SAME_RIGHTS = 1 << 31; + static const int RIGHTS_BASIC = RIGHT_TRANSFER | RIGHT_DUPLICATE | + RIGHT_WAIT | RIGHT_INSPECT; + static const int RIGHTS_IO = RIGHT_READ | RIGHT_WRITE; + static const int RIGHTS_PROPERTY = RIGHT_GET_PROPERTY | RIGHT_SET_PROPERTY; + static const int DEFAULT_VMO_RIGHTS = RIGHTS_BASIC | RIGHTS_IO | + RIGHTS_PROPERTY | RIGHT_MAP | + RIGHT_SIGNAL; + static const int OBJ_TYPE_VMO = 3; + static const int OBJ_TYPE_CHANNEL = 4; + static const int HANDLE_OP_MOVE = 0; + static const int HANDLE_OP_DUPLICATE = 1; + static const int __ZX_OBJECT_READABLE = 1 << 0; + static const int __ZX_OBJECT_PEER_CLOSED = 1 << 2; +} + +void main() { + group('handle', () { + test('create and duplicate handles', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + + final Handle duplicate = pair.first.duplicate(ZX.RIGHT_SAME_RIGHTS); + expect(duplicate.isValid, isTrue); + + final Handle failedDuplicate = pair.first.duplicate(-1); + expect(failedDuplicate.isValid, isFalse); + }); + + test('failure invalid rights', () { + final HandleResult vmo = System.vmoCreate(0); + expect(vmo.status, equals(ZX.OK)); + final Handle failedDuplicate = vmo.handle.duplicate(-1); + expect(failedDuplicate.isValid, isFalse); + expect(vmo.handle.isValid, isTrue); + }); + + test('failure invalid handle', () { + final Handle handle = Handle.invalid(); + final Handle duplicate = handle.duplicate(ZX.RIGHT_SAME_RIGHTS); + expect(duplicate.isValid, isFalse); + }); + + test('duplicated handle should have same koid', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + + final Handle duplicate = pair.first.duplicate(ZX.RIGHT_SAME_RIGHTS); + expect(duplicate.isValid, isTrue); + + expect(pair.first.koid, duplicate.koid); + }); + + // TODO(fxbug.dev/77599): Simplify once zx_object_get_info is available. + test('reduced rights', () { + // Set up handle. + final HandleResult vmo = System.vmoCreate(2); + expect(vmo.status, equals(ZX.OK)); + + // Duplicate the first handle. + final Handle duplicate = vmo.handle.duplicate(ZX.RIGHTS_BASIC); + expect(duplicate.isValid, isTrue); + + // Write bytes to the original handle. + final ByteData data1 = utf8Bytes('a'); + final int status1 = System.vmoWrite(vmo.handle, 0, data1); + expect(status1, equals(ZX.OK)); + + // Write bytes to the duplicated handle. + final ByteData data2 = utf8Bytes('b'); + final int status2 = System.vmoWrite(duplicate, 1, data2); + expect(status2, equals(ZX.ERR_ACCESS_DENIED)); + + // Read bytes. + final ReadResult readResult = System.vmoRead(vmo.handle, 0, 2); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(2)); + expect(readResult.bytes.lengthInBytes, equals(2)); + expect(readResult.bytesAsUTF8String(), equals('a\x00')); + }); + + test('create and replace handles', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + + final Handle replaced = pair.first.replace(ZX.RIGHT_SAME_RIGHTS); + expect(replaced.isValid, isTrue); + expect(pair.first.isValid, isFalse); + }); + + test('failure invalid rights', () { + final HandleResult vmo = System.vmoCreate(0); + expect(vmo.status, equals(ZX.OK)); + final Handle failedDuplicate = vmo.handle.replace(-1); + expect(failedDuplicate.isValid, isFalse); + expect(vmo.handle.isValid, isFalse); + }); + + test('failure invalid handle', () { + final Handle handle = Handle.invalid(); + final Handle replaced = handle.replace(ZX.RIGHT_SAME_RIGHTS); + expect(handle.isValid, isFalse); + expect(replaced.isValid, isFalse); + }); + + test('transferred handle should have same koid', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + + final int koid = pair.first.koid; + final Handle replaced = pair.first.replace(ZX.RIGHT_SAME_RIGHTS); + expect(replaced.isValid, isTrue); + + expect(koid, replaced.koid); + }); + + // TODO(fxbug.dev/77599): Simplify once zx_object_get_info is available. + test('reduced rights', () { + // Set up handle. + final HandleResult vmo = System.vmoCreate(2); + expect(vmo.status, equals(ZX.OK)); + + // Replace the first handle. + final Handle duplicate = + vmo.handle.replace(ZX.RIGHTS_BASIC | ZX.RIGHT_READ); + expect(duplicate.isValid, isTrue); + + // Write bytes to the original handle. + final ByteData data1 = utf8Bytes('a'); + final int status1 = System.vmoWrite(vmo.handle, 0, data1); + expect(status1, equals(ZX.ERR_BAD_HANDLE)); + + // Write bytes to the duplicated handle. + final ByteData data2 = utf8Bytes('b'); + final int status2 = System.vmoWrite(duplicate, 1, data2); + expect(status2, equals(ZX.ERR_ACCESS_DENIED)); + + // Read bytes. + final ReadResult readResult = System.vmoRead(duplicate, 0, 2); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(2)); + expect(readResult.bytes.lengthInBytes, equals(2)); + expect(readResult.bytesAsUTF8String(), equals('\x00\x00')); + }); + + test('cache koid and invalidate', () { + final HandleResult vmo = System.vmoCreate(0); + expect(vmo.status, equals(ZX.OK)); + int originalKoid = vmo.handle.koid; + expect(originalKoid, notEquals(ZX.KOID_INVALID)); + // Cached koid should be same value. + expect(originalKoid, equals(vmo.handle.koid)); + vmo.handle.close(); + // koid should be invalidated. + expect(vmo.handle.koid, equals(ZX.KOID_INVALID)); + }); + + test('store the disposition arguments correctly', () { + final Handle handle = System.channelCreate().first; + final HandleDisposition disposition = HandleDisposition(1, handle, 2, 3); + expect(disposition.operation, equals(1)); + expect(disposition.handle, equals(handle)); + expect(disposition.type, equals(2)); + expect(disposition.rights, equals(3)); + expect(disposition.result, equals(ZX.OK)); + }); + }); + + group('channel', () { + test('create channel', () { + final HandlePairResult pair = System.channelCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + }); + + test('close channel', () { + final HandlePairResult pair = System.channelCreate(); + expect(pair.first.close(), equals(0)); + expect(pair.first.isValid, isFalse); + expect(pair.second.isValid, isTrue); + expect(System.channelWrite(pair.first, ByteData(1), []), + equals(ZX.ERR_BAD_HANDLE)); + expect(System.channelWrite(pair.second, ByteData(1), []), + equals(ZX.ERR_PEER_CLOSED)); + }); + + test('channel bytes', () { + final HandlePairResult pair = System.channelCreate(); + + // When no data is available, ZX.ERR_SHOULD_WAIT is returned. + expect(System.channelQueryAndRead(pair.second).status, + equals(ZX.ERR_SHOULD_WAIT)); + + // Write bytes. + final ByteData data = utf8Bytes('Hello, world'); + final int status = System.channelWrite(pair.first, data, []); + expect(status, equals(ZX.OK)); + + // Read bytes. + final ReadResult readResult = System.channelQueryAndRead(pair.second); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(data.lengthInBytes)); + expect(readResult.bytes.lengthInBytes, equals(data.lengthInBytes)); + expect(readResult.bytesAsUTF8String(), equals('Hello, world')); + expect(readResult.handles.length, equals(0)); + }); + + test('channel handles', () { + final HandlePairResult pair = System.channelCreate(); + final ByteData data = utf8Bytes(''); + final HandlePairResult eventPair = System.eventpairCreate(); + final int status = + System.channelWrite(pair.first, data, [eventPair.first]); + expect(status, equals(ZX.OK)); + expect(eventPair.first.isValid, isFalse); + + final ReadResult readResult = System.channelQueryAndRead(pair.second); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(0)); + expect(readResult.bytes.lengthInBytes, equals(0)); + expect(readResult.bytesAsUTF8String(), equals('')); + expect(readResult.handles.length, equals(1)); + expect(readResult.handles[0].isValid, isTrue); + }); + + test('async wait channel read', () async { + final HandlePairResult pair = System.channelCreate(); + final Completer> completer = Completer>(); + pair.first.asyncWait(ZX.CHANNEL_READABLE, (int status, int pending) { + completer.complete([status, pending]); + }); + + expect(completer.isCompleted, isFalse); + + System.channelWrite(pair.second, utf8Bytes('Hi'), []); + + final List result = await completer.future; + expect(result[0], equals(ZX.OK)); // status + expect(result[1] & ZX.CHANNEL_READABLE, + equals(ZX.CHANNEL_READABLE)); // pending + }); + + test('async wait channel closed', () async { + final HandlePairResult pair = System.channelCreate(); + final Completer completer = Completer(); + pair.first.asyncWait(ZX.CHANNEL_PEER_CLOSED, (int status, int pending) { + completer.complete(status); + }); + + expect(completer.isCompleted, isFalse); + + pair.second.close(); + + final int status = await completer.future; + expect(status, equals(ZX.OK)); + }); + }); + + group('channel etc functions', () { + test('moved handle', () { + final HandlePairResult pair = System.channelCreate(); + final ByteData data = utf8Bytes(''); + final HandlePairResult transferred = System.channelCreate(); + + final HandleDisposition disposition = HandleDisposition(ZX.HANDLE_OP_MOVE, + transferred.first, ZX.OBJ_TYPE_CHANNEL, ZX.RIGHTS_IO); + final int status = System.channelWriteEtc( + pair.first, data, [disposition]); + expect(status, equals(ZX.OK)); + expect(disposition.result, equals(ZX.OK)); + expect(transferred.first.isValid, isFalse); + + final ReadEtcResult readResult = + System.channelQueryAndReadEtc(pair.second); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(0)); + expect(readResult.bytes.lengthInBytes, equals(0)); + expect(readResult.bytesAsUTF8String(), equals('')); + expect(readResult.handleInfos.length, equals(1)); + final HandleInfo handleInfo = readResult.handleInfos[0]; + expect(handleInfo.handle.isValid, isTrue); + expect(handleInfo.type, equals(ZX.OBJ_TYPE_CHANNEL)); + expect(handleInfo.rights, equals(ZX.RIGHTS_IO)); + }); + + test('copied handle', () { + final HandlePairResult pair = System.channelCreate(); + final ByteData data = utf8Bytes(''); + final HandleResult vmo = System.vmoCreate(0); + + final HandleDisposition disposition = HandleDisposition( + ZX.HANDLE_OP_DUPLICATE, + vmo.handle, + ZX.OBJ_TYPE_VMO, + ZX.RIGHT_SAME_RIGHTS); + final int status = System.channelWriteEtc( + pair.first, data, [disposition]); + expect(status, equals(ZX.OK)); + expect(disposition.result, equals(ZX.OK)); + expect(vmo.handle.isValid, isTrue); + + final ReadEtcResult readResult = + System.channelQueryAndReadEtc(pair.second); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(0)); + expect(readResult.bytes.lengthInBytes, equals(0)); + expect(readResult.bytesAsUTF8String(), equals('')); + expect(readResult.handleInfos.length, equals(1)); + final HandleInfo handleInfo = readResult.handleInfos[0]; + expect(handleInfo.handle.isValid, isTrue); + expect(handleInfo.type, equals(ZX.OBJ_TYPE_VMO)); + expect(handleInfo.rights, equals(ZX.DEFAULT_VMO_RIGHTS)); + }); + + test('closed handle should error', () { + final HandlePairResult pair = System.channelCreate(); + final ByteData data = utf8Bytes(''); + final HandlePairResult closed = System.channelCreate(); + + final HandleDisposition disposition = HandleDisposition(ZX.HANDLE_OP_MOVE, + closed.first, ZX.OBJ_TYPE_CHANNEL, ZX.RIGHT_SAME_RIGHTS); + closed.first.close(); + final int status = System.channelWriteEtc( + pair.first, data, [disposition]); + expect(status, equals(ZX.ERR_BAD_HANDLE)); + expect(disposition.result, equals(ZX.ERR_BAD_HANDLE)); + expect(closed.first.isValid, isFalse); + + final ReadEtcResult readResult = + System.channelQueryAndReadEtc(pair.second); + expect(readResult.status, equals(ZX.ERR_SHOULD_WAIT)); + }); + + test('multiple handles', () { + final HandlePairResult pair = System.channelCreate(); + final ByteData data = utf8Bytes(''); + final HandlePairResult transferred = System.channelCreate(); + final HandleResult vmo = System.vmoCreate(0); + + final List dispositions = [ + HandleDisposition(ZX.HANDLE_OP_MOVE, transferred.first, + ZX.OBJ_TYPE_CHANNEL, ZX.RIGHTS_IO), + HandleDisposition(ZX.HANDLE_OP_DUPLICATE, vmo.handle, ZX.OBJ_TYPE_VMO, + ZX.RIGHT_SAME_RIGHTS) + ]; + final int status = System.channelWriteEtc(pair.first, data, dispositions); + expect(status, equals(ZX.OK)); + expect(dispositions[0].result, equals(ZX.OK)); + expect(dispositions[1].result, equals(ZX.OK)); + expect(transferred.first.isValid, isFalse); + expect(vmo.handle.isValid, isTrue); + + final ReadEtcResult readResult = + System.channelQueryAndReadEtc(pair.second); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(0)); + expect(readResult.bytes.lengthInBytes, equals(0)); + expect(readResult.bytesAsUTF8String(), equals('')); + + expect(readResult.handleInfos.length, equals(2)); + final HandleInfo handleInfo = readResult.handleInfos[0]; + expect(handleInfo.handle.isValid, isTrue); + expect(handleInfo.type, equals(ZX.OBJ_TYPE_CHANNEL)); + expect(handleInfo.rights, equals(ZX.RIGHTS_IO)); + final HandleInfo vmoInfo = readResult.handleInfos[1]; + expect(vmoInfo.handle.isValid, isTrue); + expect(vmoInfo.type, equals(ZX.OBJ_TYPE_VMO)); + expect(vmoInfo.rights, equals(ZX.DEFAULT_VMO_RIGHTS)); + }); + }); + + group('eventpair', () { + test('create', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + }); + + test('duplicate', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + + expect(pair.first.duplicate(ZX.RIGHT_SAME_RIGHTS).isValid, isTrue); + expect(pair.second.duplicate(ZX.RIGHT_SAME_RIGHTS).isValid, isTrue); + }); + + test('close', () { + final HandlePairResult pair = System.eventpairCreate(); + expect(pair.first.close(), equals(0)); + expect(pair.first.isValid, isFalse); + expect(pair.second.isValid, isTrue); + + expect(pair.second.close(), equals(0)); + expect(pair.second.isValid, isFalse); + }); + + test('async wait peer closed', () async { + final HandlePairResult pair = System.eventpairCreate(); + final Completer completer = Completer(); + pair.first.asyncWait(ZX.EVENTPAIR_PEER_CLOSED, (int status, int pending) { + completer.complete(status); + }); + + expect(completer.isCompleted, isFalse); + pair.second.close(); + + final int status = await completer.future; + expect(status, equals(ZX.OK)); + }); + }); + + // NOTE: This only tests stream sockets. + // We should add tests for datagram sockets. + group('socket', () { + test('create socket', () { + final HandlePairResult pair = System.socketCreate(); + expect(pair.status, equals(ZX.OK)); + expect(pair.first.isValid, isTrue); + expect(pair.second.isValid, isTrue); + }); + + test('close socket', () { + final HandlePairResult pair = System.socketCreate(); + expect(pair.first.close(), equals(0)); + expect(pair.first.isValid, isFalse); + expect(pair.second.isValid, isTrue); + final WriteResult firstResult = + System.socketWrite(pair.first, ByteData(1), 0); + expect(firstResult.status, equals(ZX.ERR_BAD_HANDLE)); + final WriteResult secondResult = + System.socketWrite(pair.second, ByteData(1), 0); + expect(secondResult.status, equals(ZX.ERR_PEER_CLOSED)); + }); + + test('read write socket', () { + final HandlePairResult pair = System.socketCreate(); + + // When no data is available, ZX.ERR_SHOULD_WAIT is returned. + expect( + System.socketRead(pair.second, 1).status, equals(ZX.ERR_SHOULD_WAIT)); + + final ByteData data = utf8Bytes('Hello, world'); + final WriteResult writeResult = System.socketWrite(pair.first, data, 0); + expect(writeResult.status, equals(ZX.OK)); + + final ReadResult readResult = + System.socketRead(pair.second, data.lengthInBytes); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals(data.lengthInBytes)); + expect(readResult.bytes.lengthInBytes, equals(data.lengthInBytes)); + expect(readResult.bytesAsUTF8String(), equals('Hello, world')); + }); + + test('partial read socket', () { + final HandlePairResult pair = System.socketCreate(); + final ByteData data = utf8Bytes('Hello, world'); + final WriteResult writeResult = System.socketWrite(pair.first, data, 0); + expect(writeResult.status, equals(ZX.OK)); + + const int shortLength = 'Hello'.length; + final ReadResult shortReadResult = + System.socketRead(pair.second, shortLength); + expect(shortReadResult.status, equals(ZX.OK)); + expect(shortReadResult.numBytes, equals(shortLength)); + expect(shortReadResult.bytes.lengthInBytes, equals(shortLength)); + expect(shortReadResult.bytesAsUTF8String(), equals('Hello')); + + final int longLength = data.lengthInBytes * 2; + final ReadResult longReadResult = + System.socketRead(pair.second, longLength); + expect(longReadResult.status, equals(ZX.OK)); + expect(longReadResult.numBytes, equals(data.lengthInBytes - shortLength)); + expect(longReadResult.bytes.lengthInBytes, equals(longLength)); + expect(longReadResult.bytesAsUTF8String(), equals(', world')); + }); + + test('partial write socket', () { + final HandlePairResult pair = System.socketCreate(); + final WriteResult writeResult1 = + System.socketWrite(pair.first, utf8Bytes('Hello, '), 0); + expect(writeResult1.status, equals(ZX.OK)); + final WriteResult writeResult2 = + System.socketWrite(pair.first, utf8Bytes('world'), 0); + expect(writeResult2.status, equals(ZX.OK)); + + final ReadResult readResult = System.socketRead(pair.second, 100); + expect(readResult.status, equals(ZX.OK)); + expect(readResult.numBytes, equals('Hello, world'.length)); + expect(readResult.bytes.lengthInBytes, equals(100)); + expect(readResult.bytesAsUTF8String(), equals('Hello, world')); + }); + + test('async wait socket read', () async { + final HandlePairResult pair = System.socketCreate(); + final Completer completer = Completer(); + pair.first.asyncWait(ZX.SOCKET_READABLE, (int status, int pending) { + completer.complete(status); + }); + + expect(completer.isCompleted, isFalse); + + System.socketWrite(pair.second, utf8Bytes('Hi'), 0); + + final int status = await completer.future; + expect(status, equals(ZX.OK)); + }); + + test('async wait socket closed', () async { + final HandlePairResult pair = System.socketCreate(); + final Completer completer = Completer(); + pair.first.asyncWait(ZX.SOCKET_PEER_CLOSED, (int status, int pending) { + completer.complete(status); + }); + + expect(completer.isCompleted, isFalse); + + pair.second.close(); + + final int status = await completer.future; + expect(status, equals(ZX.OK)); + }); + }); + + group('vmo', () { + test('fromFile', () { + const String fuchsia = 'Fuchsia'; + File f = File('tmp/testdata') + ..createSync() + ..writeAsStringSync(fuchsia); + String readFuchsia = f.readAsStringSync(); + expect(readFuchsia, equals(fuchsia)); + + FromFileResult fileResult = System.vmoFromFile('tmp/testdata'); + expect(fileResult.status, equals(ZX.OK)); + MapResult mapResult = System.vmoMap(fileResult.handle); + expect(mapResult.status, equals(ZX.OK)); + Uint8List fileData = UnmodifiableUint8ListView(mapResult.data); + String fileString = utf8.decode(fileData.sublist(0, fileResult.numBytes)); + expect(fileString, equals(fuchsia)); + }); + + test('duplicate', () { + const String fuchsia = 'Fuchsia'; + Uint8List data = Uint8List.fromList(fuchsia.codeUnits); + HandleResult createResult = System.vmoCreate(data.length); + expect(createResult.status, equals(ZX.OK)); + int writeResult = System.vmoWrite(createResult.handle, 0, + data.buffer.asByteData()); + expect(writeResult, equals(ZX.OK)); + Handle duplicate = createResult.handle.duplicate(ZX.RIGHTS_BASIC | + ZX.RIGHT_READ | + ZX.RIGHT_MAP); + expect(duplicate.isValid, isTrue); + + // Read from the duplicate. + MapResult mapResult = System.vmoMap(duplicate); + expect(mapResult.status, equals(ZX.OK)); + Uint8List vmoData = UnmodifiableUint8ListView(mapResult.data); + String vmoString = utf8.decode(vmoData.sublist(0, data.length)); + expect(vmoString, equals(fuchsia)); + }); + }); +} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart/BUILD.gn index 45bdfb7cad..995f37bb60 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart/BUILD.gn @@ -96,6 +96,7 @@ dart_library("expect") { deps = [ ":meta" ] sources = [ + "config.dart", "expect.dart", "minitest.dart", ] diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart_runner/BUILD.gn index 87520ce524..de2ebb2901 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/BUILD.gn @@ -65,6 +65,7 @@ template("runner_sources") { "$fuchsia_sdk_root/pkg:trace", "$fuchsia_sdk_root/pkg:vfs_cpp", "$fuchsia_sdk_root/pkg:zx", + "fidl:dart_test", "//flutter/common", "//flutter/shell/platform/fuchsia/dart-pkg/fuchsia", "//flutter/shell/platform/fuchsia/dart-pkg/zircon", diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.cc b/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.cc index 6e01006ed7..80be8c924e 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.cc +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.cc @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -25,6 +27,7 @@ #include #include +#include "dart_api.h" #include "runtime/dart/utils/files.h" #include "runtime/dart/utils/handle_exception.h" #include "runtime/dart/utils/inlines.h" @@ -104,10 +107,13 @@ DartComponentController::DartComponentController( controller) : loop_(new async::Loop(&kLoopConfig)), label_(GetLabelFromUrl(start_info.resolved_url())), - url_(std::move(start_info.resolved_url())), - runner_incoming_services_(runner_incoming_services), + url_(start_info.resolved_url()), + runner_incoming_services_(std::move(runner_incoming_services)), + dart_outgoing_dir_(new vfs::PseudoDir()), start_info_(std::move(start_info)), - binding_(this) { + binding_(this, std::move(controller)) { + binding_.set_error_handler([this](zx_status_t status) { Kill(); }); + // TODO(fxb/84537): This data path is configured based how we build Flutter // applications in tree currently, but the way we build the Flutter // application may change. We should avoid assuming the data path and let the @@ -115,14 +121,6 @@ DartComponentController::DartComponentController( const std::string component_name = GetComponentNameFromUrl(url_); data_path_ = "pkg/data/" + component_name; - if (controller.is_valid()) { - binding_.Bind(std::move(controller)); - binding_.set_error_handler([this](zx_status_t status) { Kill(); }); - } else { - FX_LOG(ERROR, LOG_TAG, - "Fuchsia component controller endpoint is not valid."); - } - zx_status_t idle_timer_status = zx::timer::create(ZX_TIMER_SLACK_LATE, ZX_CLOCK_MONOTONIC, &idle_timer_); if (idle_timer_status != ZX_OK) { @@ -213,6 +211,84 @@ bool DartComponentController::CreateAndBindNamespace() { } } + dart_outgoing_dir_request_ = dart_outgoing_dir_ptr_.NewRequest(); + + fuchsia::io::DirectoryHandle dart_public_dir; + // TODO(anmittal): when fixing enumeration using new c++ vfs, make sure that + // flutter_public_dir is only accessed once we receive OnOpen Event. + // That will prevent FL-175 for public directory + fdio_service_connect_at(dart_outgoing_dir_ptr_.channel().get(), "svc", + dart_public_dir.NewRequest().TakeChannel().release()); + + auto composed_service_dir = std::make_unique(); + composed_service_dir->set_fallback(std::move(dart_public_dir)); + + // Clone and check if client is servicing the directory. + dart_outgoing_dir_ptr_->Clone( + fuchsia::io::OpenFlags::DESCRIBE | + fuchsia::io::OpenFlags::CLONE_SAME_RIGHTS, + dart_outgoing_dir_ptr_to_check_on_open_.NewRequest()); + + // Collect our standard set of directories. + std::vector other_dirs = {"debug", "ctrl", "diagnostics"}; + + dart_outgoing_dir_ptr_to_check_on_open_.events().OnOpen = + [this, other_dirs](zx_status_t status, auto unused) { + dart_outgoing_dir_ptr_to_check_on_open_.Unbind(); + if (status != ZX_OK) { + FML_LOG(ERROR) << "could not bind out directory for dart component(" + << label_ << "): " << zx_status_get_string(status); + return; + } + + // add other directories as RemoteDirs. + for (auto& dir_str : other_dirs) { + fuchsia::io::DirectoryHandle dir; + auto request = dir.NewRequest().TakeChannel(); + auto status = fdio_open_at( + dart_outgoing_dir_ptr_.channel().get(), dir_str.c_str(), + static_cast(fuchsia::io::OpenFlags::DIRECTORY | + fuchsia::io::OpenFlags::RIGHT_READABLE), + request.release()); + if (status == ZX_OK) { + dart_outgoing_dir_->AddEntry( + dir_str.c_str(), + std::make_unique(dir.TakeChannel())); + } else { + FML_LOG(ERROR) << "could not add out directory entry(" << dir_str + << ") for flutter component(" << label_ + << "): " << zx_status_get_string(status); + } + } + }; + dart_outgoing_dir_ptr_to_check_on_open_.set_error_handler( + [this](zx_status_t status) { + dart_outgoing_dir_ptr_to_check_on_open_.Unbind(); + }); + + // Expose the "Echo" service here on behalf of the running dart program, so + // that integration tests can make use of it. + // + // The flutter/engine repository doesn't support connecting to FIDL from Dart, + // so for the tests sake we connect to the FIDL from C++ here and proxy the + // Echo to dart using native hooks. + composed_service_dir->AddService( + dart::test::Echo::Name_, + std::make_unique([this](zx::channel channel, + async_dispatcher_t* dispatcher) { + echo_binding_.AddBinding( + this, fidl::InterfaceRequest(std::move(channel))); + })); + dart_outgoing_dir_->AddEntry("svc", std::move(composed_service_dir)); + + if (start_info_.has_outgoing_dir()) { + dart_outgoing_dir_->Serve( + fuchsia::io::OpenFlags::RIGHT_READABLE | + fuchsia::io::OpenFlags::RIGHT_WRITABLE | + fuchsia::io::OpenFlags::DIRECTORY, + start_info_.mutable_outgoing_dir()->TakeChannel()); + } + return true; } @@ -390,11 +466,9 @@ bool DartComponentController::RunDartMain() { stdout_fd_ = fileno(stdout); stderr_fd_ = fileno(stderr); - fidl::InterfaceRequest outgoing_dir = - std::move(*start_info_.mutable_outgoing_dir()); InitBuiltinLibrariesForIsolate( url_, namespace_, stdout_fd_, stderr_fd_, nullptr /* environment */, - outgoing_dir.TakeChannel(), false /* service_isolate */); + dart_outgoing_dir_request_.TakeChannel(), false /* service_isolate */); Dart_ExitScope(); Dart_ExitIsolate(); @@ -463,6 +537,29 @@ bool DartComponentController::RunDartMain() { return true; } +void DartComponentController::EchoString(fidl::StringPtr value, + EchoStringCallback callback) { + Dart_EnterScope(); + + Dart_Handle builtin_lib = Dart_LookupLibrary(ToDart("dart:fuchsia.builtin")); + FML_CHECK(!tonic::CheckAndHandleError(builtin_lib)); + + Dart_Handle receive_echo_string = ToDart("_receiveEchoString"); + Dart_Handle string_to_echo = + value.has_value() ? tonic::ToDart(*value) : Dart_Null(); + Dart_Handle result = + Dart_Invoke(builtin_lib, receive_echo_string, 1, &string_to_echo); + FML_CHECK(!tonic::CheckAndHandleError(result)); + + fidl::StringPtr echo_string; + if (!Dart_IsNull(result)) { + echo_string = tonic::StdStringFromDart(result); + } + callback(std::move(echo_string)); + + Dart_ExitScope(); +} + void DartComponentController::Kill() { if (Dart_CurrentIsolate()) { tonic::DartMicrotaskQueue* queue = @@ -482,6 +579,10 @@ void DartComponentController::Kill() { } } +void DartComponentController::Stop() { + Kill(); +} + void DartComponentController::MessageEpilogue(Dart_Handle result) { auto dart_state = tonic::DartState::Current(); // If the Dart program has set a return code, then it is intending to shut @@ -510,10 +611,6 @@ void DartComponentController::MessageEpilogue(Dart_Handle result) { } } -void DartComponentController::Stop() { - Kill(); -} - void DartComponentController::OnIdleTimer(async_dispatcher_t* dispatcher, async::WaitBase* wait, zx_status_t status, diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.h b/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.h index 7187c1f812..252962caaa 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.h +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/dart_component_controller.h @@ -5,18 +5,22 @@ #ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_DART_RUNNER_DART_COMPONENT_CONTROLLER_H_ #define FLUTTER_SHELL_PLATFORM_FUCHSIA_DART_RUNNER_DART_COMPONENT_CONTROLLER_H_ -#include - +#include #include #include #include #include #include +#include +#include +#include #include #include +#include #include -#include "lib/fidl/cpp/binding.h" +#include + #include "runtime/dart/utils/mapped_resource.h" #include "third_party/dart/runtime/include/dart_api.h" @@ -24,7 +28,8 @@ namespace dart_runner { /// Starts a Dart component written in CFv2. class DartComponentController - : public fuchsia::component::runner::ComponentController { + : public dart::test::Echo, + public fuchsia::component::runner::ComponentController { public: DartComponentController( fuchsia::component::runner::ComponentStartInfo start_info, @@ -59,6 +64,9 @@ class DartComponentController bool CreateIsolate(const uint8_t* isolate_snapshot_data, const uint8_t* isolate_snapshot_instructions); + // |Echo| + void EchoString(fidl::StringPtr value, EchoStringCallback callback) override; + // |ComponentController| void Kill() override; void Stop() override; @@ -76,12 +84,17 @@ class DartComponentController std::string label_; std::string url_; - std::shared_ptr runner_incoming_services_; std::string data_path_; + std::shared_ptr runner_incoming_services_; std::unique_ptr context_; + std::unique_ptr dart_outgoing_dir_; + fuchsia::io::DirectoryPtr dart_outgoing_dir_ptr_; + fidl::InterfaceRequest dart_outgoing_dir_request_; + fuchsia::io::NodePtr dart_outgoing_dir_ptr_to_check_on_open_; fuchsia::component::runner::ComponentStartInfo start_info_; fidl::Binding binding_; + fidl::BindingSet echo_binding_; fdio_ns_t* namespace_ = nullptr; int stdout_fd_ = -1; diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart b/engine/src/flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart index 996970f2e8..8b03142e5d 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart @@ -50,3 +50,11 @@ _setupHooks() { @pragma('vm:entry-point') _getPrintClosure() => _print; + +typedef EchoStringCallback = String? Function(String? str); +late EchoStringCallback? receiveEchoStringCallback; + +@pragma('vm:entry-point') +String? _receiveEchoString(String? str) { + return receiveEchoStringCallback?.call(str); +} diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/BUILD.gn similarity index 65% rename from engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/BUILD.gn rename to engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/BUILD.gn index e129e9be13..ba9f6be2c7 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/BUILD.gn @@ -5,8 +5,8 @@ import("//build/fuchsia/sdk.gni") import("//flutter/tools/fuchsia/fidl/fidl.gni") -fidl("echo") { - name = "flutter.example.echo" - meta = "//flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/meta.json" +fidl("dart_test") { + name = "dart.test" + meta = "meta.json" sources = [ "echo.fidl" ] } diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/echo.fidl b/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/echo.fidl similarity index 80% rename from engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/echo.fidl rename to engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/echo.fidl index 14624e6be7..eb27c91bad 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/echo.fidl +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/echo.fidl @@ -1,8 +1,8 @@ -// Copyright 2019 The Fuchsia Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -library flutter.example.echo; +library dart.test; const MAX_STRING_LENGTH uint64 = 32; diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/meta.json b/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/meta.json new file mode 100644 index 0000000000..34fa696420 --- /dev/null +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/fidl/meta.json @@ -0,0 +1,9 @@ +{ + "deps": [], + "name": "dart.test", + "root": "dart.test", + "sources": [ + "../../../flutter/shell/platform/fuchsia/dart_runner/fidl/echo.fidl" + ], + "type": "fidl_library" +} \ No newline at end of file diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/README.md b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/README.md deleted file mode 100644 index 149853e98f..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Echo FIDL - -This FIDL protocol allows the Dart integration tests to communicate with a Dart Echo server (a test Dart component that echoes back a request). diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/meta.json b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/meta.json deleted file mode 100644 index 379328987f..0000000000 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "deps": [], - "name": "flutter.example.echo", - "root": "fidl/flutter.example.echo", - "sources": [ - "../../../flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo/echo.fidl" - ], - "type": "fidl_library" -} \ No newline at end of file diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/BUILD.gn index 43e68bab0c..4f7d9e6ee4 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/BUILD.gn @@ -31,9 +31,9 @@ executable("dart-aot-runner-integration-test-bin") { "$fuchsia_sdk_root/pkg:fidl_cpp", "$fuchsia_sdk_root/pkg:sys_component_cpp_testing", "$fuchsia_sdk_root/pkg:zx", + "../dart_echo_server:aot_echo_package", "//flutter/fml", - "//flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo:echo", - "//flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server:aot_echo_package", + "//flutter/shell/platform/fuchsia/dart_runner/fidl:dart_test", "//third_party/googletest:gtest", "//third_party/googletest:gtest_main", ] diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/README.md b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/README.md index 53184dc437..d9312738b0 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/README.md +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/README.md @@ -6,7 +6,7 @@ Contains the integration test for the Dart AOT runner. #### Setup emulator and PM serve ``` -fx set workstation_eng.qemu-x64 +fx set terminal.qemu-x64 ffx emu start --headless fx serve @@ -20,11 +20,11 @@ ninja -C $ENGINE_DIR/out/fuchsia_profile_x64 flutter/shell/platform/fuchsia fuch #### Publish files to PM ``` -$FUCHSIA_DIR/.jiri_root/bin/fx pm publish -a -repo $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f $ENGINE_DIR/out/fuchsia_profile_x64/dart-aot-runner-integration-test-0.far +$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_profile_x64/dart-aot-runner-integration-test-0.far -$FUCHSIA_DIR/.jiri_root/bin/fx pm publish -a -repo $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f $ENGINE_DIR/out/fuchsia_profile_x64/oot_dart_aot_runner-0.far +$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_profile_x64/oot_dart_aot_runner-0.far -$FUCHSIA_DIR/.jiri_root/bin/fx pm publish -a -repo $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f $ENGINE_DIR/out/fuchsia_profile_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/dart_aot_echo_server/dart_aot_echo_server.far +$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_profile_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/dart_aot_echo_server/dart_aot_echo_server.far ``` #### Run test @@ -33,4 +33,4 @@ ffx test run "fuchsia-pkg://fuchsia.com/dart-aot-runner-integration-test#meta/da ``` ## Notes -The `profile` runtime should be used when running the `dart_aot_runner` integration test. Snapshots will fail to generate or generate incorrectly if the wrong runtime is used. +The `profile` runtime should be used when running the `dart_aot_runner` integration test. Snapshots will fail to generate or generate incorrectly if the wrong runtime is used. diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/dart-aot-runner-integration-test.cc b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/dart-aot-runner-integration-test.cc index 33ec20c2ae..34b0cedf46 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/dart-aot-runner-integration-test.cc +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner/dart-aot-runner-integration-test.cc @@ -2,11 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// The generated C++ bindings for the Echo FIDL protocol -#include - +#include #include - #include #include #include @@ -92,16 +89,15 @@ TEST_F(RealmBuilderTest, DartRunnerStartsUp) { // Route the Echo FIDL protocol, this allows the Dart echo server to // communicate with the Realm Builder - realm_builder.AddRoute( - Route{.capabilities = {Protocol{"flutter.example.echo.Echo"}}, - .source = kDartAotEchoServerRef, - .targets = {ParentRef()}}); + realm_builder.AddRoute(Route{.capabilities = {Protocol{"dart.test.Echo"}}, + .source = kDartAotEchoServerRef, + .targets = {ParentRef()}}); // Build the Realm with the provided child and protocols auto realm = realm_builder.Build(dispatcher()); FML_LOG(INFO) << "Realm built: " << realm.component().GetChildName(); // Connect to the Dart echo server - auto echo = realm.component().ConnectSync(); + auto echo = realm.component().ConnectSync(); fidl::StringPtr response; // Attempt to ping the Dart echo server for a response echo->EchoString("hello", &response); diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/BUILD.gn index c6b7622ca9..dcc827d782 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/BUILD.gn @@ -15,14 +15,6 @@ dart_library("lib") { source_dir = "." sources = [ "main.dart" ] - - deps = [ - "//flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo:echo", - "//flutter/tools/fuchsia/dart:fidl", - "//flutter/tools/fuchsia/dart:fuchsia_services", - "//flutter/tools/fuchsia/fidl:fuchsia.logger", - "//flutter/tools/fuchsia/fidl:fuchsia.test", - ] } # Dart component that serves the test Echo FIDL protocol, built using the Dart AOT runner diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/main.dart b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/main.dart index 5874f324d1..3741dcc6a7 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/main.dart +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/main.dart @@ -2,47 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// The server uses async code to be able to listen for incoming Echo requests and connections -// asynchronously. -import 'dart:async'; +import 'dart:fuchsia.builtin'; -// The fidl package contains general utility code for using FIDL in Dart. -import 'package:fidl/fidl.dart' as fidl; -// The generated Dart bindings for the Echo FIDL protocol -import 'package:fidl_flutter_example_echo/fidl_async.dart' as fidl_echo; -// The fuchsia_services package interfaces with the Fuchsia system. In particular, it is used -// to expose a service to other components -import 'package:fuchsia_services/services.dart' as sys; - -// Create an implementation for the Echo protocol by overriding the -// fidl_echo.Echo class from the bindings -class _EchoImpl extends fidl_echo.Echo { - // The stream controller for the stream of OnString events - final _onStringStreamController = StreamController(); - - // Implementation of EchoString that just echoes the request value back - @override - Future echoString(String? value) async { - return value; - } +String? OnEchoString(String? str) { + print('Got echo string: $str'); + return str; } void main(List args) { - // Create the component context. We should not serve outgoing before we add - // the services. - final context = sys.ComponentContext.create(); - // Each FIDL protocol class has an accompanying Binding class, which takes - // an implementation of the protocol and a channel, and dispatches incoming - // requests on the channel to the protocol implementation. - final binding = fidl_echo.EchoBinding(); - // Serves the implementation by passing it a handler for incoming requests, - // and the name of the protocol it is providing. - final echo = _EchoImpl(); - // Add the outgoing service, and then serve the outgoing directory. - context.outgoing - ..addPublicService( - (fidl.InterfaceRequest serverEnd) => - binding.bind(echo, serverEnd), - fidl_echo.Echo.$serviceName) - ..serveFromStartupInfo(); + receiveEchoStringCallback = OnEchoString; } diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-aot-echo-server.cml b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-aot-echo-server.cml index 8f9954f736..10b336bdf9 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-aot-echo-server.cml +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-aot-echo-server.cml @@ -10,11 +10,11 @@ }, // Capabilities provided by this component. capabilities: [ - { protocol: "flutter.example.echo.Echo" }, + { protocol: "dart.test.Echo" }, ], expose: [ { - protocol: "flutter.example.echo.Echo", + protocol: "dart.test.Echo", from: "self", }, ], diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-jit-echo-server.cml b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-jit-echo-server.cml index 9687045f14..f4d3ca6072 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-jit-echo-server.cml +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/meta/dart-jit-echo-server.cml @@ -10,11 +10,11 @@ }, // Capabilities provided by this component. capabilities: [ - { protocol: "flutter.example.echo.Echo" }, + { protocol: "dart.test.Echo" }, ], expose: [ { - protocol: "flutter.example.echo.Echo", + protocol: "dart.test.Echo", from: "self", }, ], diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/BUILD.gn index b464b3f021..2ac51d974b 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/BUILD.gn @@ -31,9 +31,9 @@ executable("dart-jit-runner-integration-test-bin") { "$fuchsia_sdk_root/pkg:fidl_cpp", "$fuchsia_sdk_root/pkg:sys_component_cpp_testing", "$fuchsia_sdk_root/pkg:zx", + "../dart_echo_server:jit_echo_package", "//flutter/fml", - "//flutter/shell/platform/fuchsia/dart_runner/tests/fidl/flutter.example.echo:echo", - "//flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server:jit_echo_package", + "//flutter/shell/platform/fuchsia/dart_runner/fidl:dart_test", "//third_party/googletest:gtest", "//third_party/googletest:gtest_main", ] diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/README.md b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/README.md index 98b52069f1..08789dabe8 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/README.md +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/README.md @@ -6,7 +6,7 @@ Contains the integration test for the Dart JIT runner. #### Setup emulator and PM serve ``` -fx set workstation_eng.qemu-x64 +fx set terminal.qemu-x64 ffx emu start --headless fx serve @@ -20,11 +20,11 @@ ninja -C $ENGINE_DIR/out/fuchsia_debug_x64 flutter/shell/platform/fuchsia fuchsi #### Publish files to PM ``` -$FUCHSIA_DIR/.jiri_root/bin/fx pm publish -a -repo $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f $ENGINE_DIR/out/fuchsia_debug_x64/dart-jit-runner-integration-test-0.far +$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_debug_x64/dart-jit-runner-integration-test-0.far -$FUCHSIA_DIR/.jiri_root/bin/fx pm publish -a -repo $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f $ENGINE_DIR/out/fuchsia_debug_x64/oot_dart_jit_runner-0.far +$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_debug_x64/oot_dart_jit_runner-0.far -$FUCHSIA_DIR/.jiri_root/bin/fx pm publish -a -repo $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f $ENGINE_DIR/out/fuchsia_debug_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/dart_jit_echo_server/dart_jit_echo_server.far +$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_debug_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/dart_jit_echo_server/dart_jit_echo_server.far ``` #### Run test @@ -33,4 +33,4 @@ ffx test run "fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/da ``` ## Notes -The `debug` runtime should be used when running the `dart_jit_runner` integration test. Snapshots will fail to generate or generate incorrectly if the wrong runtime is used. +The `debug` runtime should be used when running the `dart_jit_runner` integration test. Snapshots will fail to generate or generate incorrectly if the wrong runtime is used. diff --git a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart-jit-runner-integration-test.cc b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart-jit-runner-integration-test.cc index ea32bb40f4..3845c9f246 100644 --- a/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart-jit-runner-integration-test.cc +++ b/engine/src/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart-jit-runner-integration-test.cc @@ -2,11 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// The generated C++ bindings for the Echo FIDL protocol -#include - +#include #include - #include #include #include @@ -90,16 +87,15 @@ TEST_F(RealmBuilderTest, DartRunnerStartsUp) { // Route the Echo FIDL protocol, this allows the Dart echo server to // communicate with the Realm Builder - realm_builder.AddRoute( - Route{.capabilities = {Protocol{"flutter.example.echo.Echo"}}, - .source = kDartJitEchoServerRef, - .targets = {ParentRef()}}); + realm_builder.AddRoute(Route{.capabilities = {Protocol{"dart.test.Echo"}}, + .source = kDartJitEchoServerRef, + .targets = {ParentRef()}}); // Build the Realm with the provided child and protocols auto realm = realm_builder.Build(dispatcher()); FML_LOG(INFO) << "Realm built: " << realm.component().GetChildName(); // Connect to the Dart echo server - auto echo = realm.component().ConnectSync(); + auto echo = realm.component().ConnectSync(); fidl::StringPtr response; // Attempt to ping the Dart echo server for a response echo->EchoString("hello", &response); diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/BUILD.gn index ceaf8299f4..0ef785b1fe 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/BUILD.gn @@ -14,8 +14,6 @@ dart_library("lib") { deps = [ "//flutter/shell/platform/fuchsia/dart:args", "//flutter/shell/platform/fuchsia/dart:vector_math", - "//flutter/tools/fuchsia/dart:fuchsia_services", - "//flutter/tools/fuchsia/dart:zircon", "//flutter/tools/fuchsia/fidl:fuchsia.sys", "//flutter/tools/fuchsia/fidl:fuchsia.ui.app", "//flutter/tools/fuchsia/fidl:fuchsia.ui.views", diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart index e64427a8a8..2407487559 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart @@ -10,7 +10,6 @@ import 'dart:ui'; import 'package:args/args.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math_64; -import 'package:zircon/zircon.dart'; final _argsCsvFilePath = '/config/data/args.csv'; diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/README.md b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/README.md index 0680adb441..5755445724 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/README.md +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/README.md @@ -1,8 +1,8 @@ # mouse-input -`mouse-input-test` exercises mouse input through a child view (in this case, the `mouse-input-view` Dart component) and -asserting the location as well as what button was used (mouse down, mouse up, wheel, etc) during the event. We do this by -attaching the child view, injecting mouse input, and validating that the view reports the event back with the expected +`mouse-input-test` exercises mouse input through a child view (in this case, the `mouse-input-view` Dart component) and +asserting the location as well as what button was used (mouse down, mouse up, wheel, etc) during the event. We do this by +attaching the child view, injecting mouse input, and validating that the view reports the event back with the expected payload. ```shell @@ -24,9 +24,9 @@ Reference the Flutter integration test [documentation](https://github.com/flutte ## Playing around with `mouse-input-view` -Build Fuchsia with `workstation_eng.qemu-x64` +Build Fuchsia with `terminal.qemu-x64` ```shell -fx set workstation_eng.qemu-x64 && fx build +fx set terminal.qemu-x64 && fx build ``` Build flutter/engine diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn index 07af06b230..effd9f0405 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn @@ -12,10 +12,7 @@ dart_library("lib") { package_name = "mouse-input-view" sources = [ "mouse-input-view.dart" ] - deps = [ - "//flutter/shell/platform/fuchsia/dart:args", - "//flutter/tools/fuchsia/dart:zircon", - ] + deps = [ "//flutter/shell/platform/fuchsia/dart:args" ] } flutter_component("component") { diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart index e6f44387d8..ff63cee4a6 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart @@ -5,8 +5,7 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:ui'; - -import 'package:zircon/zircon.dart'; +import 'dart:zircon'; void main() { print('Launching mouse-input-view'); diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/README.md b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/README.md index 006236a21c..61c23e9aa5 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/README.md +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/README.md @@ -41,9 +41,9 @@ Reference the Flutter integration test [documentation](https://github.com/flutte ## Playing around with `touch-input-view` -Build Fuchsia with `workstation_eng.qemu-x64` +Build Fuchsia with `terminal.qemu-x64` ```shell -fx set workstation_eng.qemu-x64 && fx build +fx set terminal.qemu-x64 && fx build ``` Build flutter/engine diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn index 31f9cf378f..b0b4027775 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn @@ -15,7 +15,6 @@ dart_library("lib") { deps = [ "//flutter/shell/platform/fuchsia/dart:args", "//flutter/shell/platform/fuchsia/dart:vector_math", - "//flutter/tools/fuchsia/dart:zircon", ] } diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart index 100ebfa9ec..f9ba724693 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart @@ -7,10 +7,10 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:io'; import 'dart:ui'; +import 'dart:zircon'; import 'package:args/args.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math_64; -import 'package:zircon/zircon.dart'; final _argsCsvFilePath = '/config/data/args.csv'; diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn index 6e5c378ae1..8dd9006d81 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn @@ -12,10 +12,7 @@ dart_library("lib") { package_name = "touch-input-view" sources = [ "touch-input-view.dart" ] - deps = [ - "//flutter/shell/platform/fuchsia/dart:args", - "//flutter/tools/fuchsia/dart:zircon", - ] + deps = [ "//flutter/shell/platform/fuchsia/dart:args" ] } flutter_component("component") { diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart index 687d318d0e..1b16ad5ba4 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart @@ -5,8 +5,7 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:ui'; - -import 'package:zircon/zircon.dart'; +import 'dart:zircon'; void main() { print('Launching touch-input-view'); diff --git a/engine/src/flutter/testing/fuchsia/test_suites.yaml b/engine/src/flutter/testing/fuchsia/test_suites.yaml index bfebfa2451..c311fe2fc2 100644 --- a/engine/src/flutter/testing/fuchsia/test_suites.yaml +++ b/engine/src/flutter/testing/fuchsia/test_suites.yaml @@ -1,12 +1,6 @@ # This configuration file specifies several test suites with their package and # test command for femu_test.py. -- test_command: test run fuchsia-pkg://fuchsia.com/flutter-embedder-test#meta/flutter-embedder-test.cm - packages: - - flutter-embedder-test-0.far - - oot_flutter_jit_runner-0.far - - gen/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/child-view/child-view/child-view.far - - gen/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/parent-view/parent-view.far - test_command: test run fuchsia-pkg://fuchsia.com/dart_runner_tests#meta/dart_runner_tests.cm package: dart_runner_tests-0.far - test_command: test run fuchsia-pkg://fuchsia.com/flutter_runner_tests#meta/flutter_runner_tests.cm @@ -54,6 +48,12 @@ emulator_arch: - 'x64' - 'arm64' +- test_command: test run fuchsia-pkg://fuchsia.com/flutter-embedder-test#meta/flutter-embedder-test.cm + packages: + - flutter-embedder-test-0.far + - oot_flutter_jit_runner-0.far + - gen/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/child-view/child-view/child-view.far + - gen/flutter/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/parent-view/parent-view.far - test_command: test run fuchsia-pkg://fuchsia.com/touch-input-test#meta/touch-input-test.cm packages: - touch-input-test-0.far diff --git a/engine/src/flutter/tools/fuchsia/devshell/build_and_copy_to_fuchsia.sh b/engine/src/flutter/tools/fuchsia/devshell/build_and_copy_to_fuchsia.sh index 4aca3f4d7d..0ef08bf703 100755 --- a/engine/src/flutter/tools/fuchsia/devshell/build_and_copy_to_fuchsia.sh +++ b/engine/src/flutter/tools/fuchsia/devshell/build_and_copy_to_fuchsia.sh @@ -154,9 +154,9 @@ if [[ "${fuchsia_cpu}" == x64 ]] then if [[ "${runtime_mode}" == debug ]] then - echo " fx set workstation_eng.x64" + echo " fx set terminal.x64" else - echo " fx set workstation_eng.x64 --release" + echo " fx set terminal.x64 --release" fi fi echo ' fx build' diff --git a/engine/src/flutter/tools/fuchsia/devshell/run_integration_test.sh b/engine/src/flutter/tools/fuchsia/devshell/run_integration_test.sh index bdd51edbb1..467ffb0247 100755 --- a/engine/src/flutter/tools/fuchsia/devshell/run_integration_test.sh +++ b/engine/src/flutter/tools/fuchsia/devshell/run_integration_test.sh @@ -205,7 +205,7 @@ fi for test_package_path in "${test_package_paths[@]}" do engine-info "... Publishing $test_package_path to package repository ($fx_build_dir/amber-files)..." - "$jiri_bin"/fx pm publish -a -repo "$fx_build_dir/amber-files/" -f "$test_package_path" + "$jiri_bin"/ffx repository publish "$fx_build_dir/amber-files/" --package-archive "$test_package_path" done test_package_name_for_url="$(echo "${test_packages[0]}" | sed "s/\-0.far//")" diff --git a/engine/src/flutter/tools/fuchsia/devshell/run_unit_tests.sh b/engine/src/flutter/tools/fuchsia/devshell/run_unit_tests.sh index 653ce9a3d6..396bccd60f 100755 --- a/engine/src/flutter/tools/fuchsia/devshell/run_unit_tests.sh +++ b/engine/src/flutter/tools/fuchsia/devshell/run_unit_tests.sh @@ -92,7 +92,7 @@ test_names=() for test_package in $test_packages do engine-info "... publishing ${test_package} ..." - $ENGINE_DIR/fuchsia/sdk/linux/tools/x64/pm publish -a -r $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files -f "${test_package}" + ${FUCHSIA_DIR}/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive "${test_package}" test_names+=("$(basename ${test_package} | sed -e "s/-0.far//")") done