546ddc645e
Change-Id: Iaa29e2df68875fbb363ab2ac5cd59cc99e65532b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422102 Auto-Submit: Daco Harkes <dacoharkes@google.com> Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com>
63 lines
1.6 KiB
Dart
63 lines
1.6 KiB
Dart
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'dart:ffi';
|
|
|
|
import 'dylib_utils.dart';
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
|
|
|
|
typedef NativeCallbackTest = Int32 Function(Pointer);
|
|
typedef NativeCallbackTestFn = int Function(Pointer);
|
|
|
|
class CallbackTest {
|
|
final String name;
|
|
final void Function() afterCallbackChecks;
|
|
final bool isLeaf;
|
|
|
|
// Either a NativeCallable or a Pointer.fromFunction.
|
|
final Object callback;
|
|
|
|
CallbackTest(this.name, this.callback, {this.isLeaf = false})
|
|
: afterCallbackChecks = noChecks {}
|
|
CallbackTest.withCheck(
|
|
this.name,
|
|
this.callback,
|
|
this.afterCallbackChecks, {
|
|
this.isLeaf = false,
|
|
}) {}
|
|
|
|
void run() {
|
|
final NativeCallbackTestFn tester = isLeaf
|
|
? ffiTestFunctions
|
|
.lookupFunction<NativeCallbackTest, NativeCallbackTestFn>(
|
|
"Test$name",
|
|
isLeaf: true,
|
|
)
|
|
: ffiTestFunctions
|
|
.lookupFunction<NativeCallbackTest, NativeCallbackTestFn>(
|
|
"Test$name",
|
|
isLeaf: false,
|
|
);
|
|
|
|
final cb = callback;
|
|
final int testCode = tester(
|
|
cb is NativeCallable ? cb.nativeFunction : cb as Pointer,
|
|
);
|
|
|
|
if (testCode != 0) {
|
|
Expect.fail("Test $name failed.");
|
|
}
|
|
|
|
afterCallbackChecks();
|
|
if (cb is NativeCallable) {
|
|
cb.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void noChecks() {}
|