// 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( "Test$name", isLeaf: true, ) : ffiTestFunctions .lookupFunction( "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() {}