// 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. // // Dart test program for testing dart:ffi dynamic library loading. // // SharedObjects=ffi_test_dynamic_library ffi_test_functions // @dart = 2.9 import 'dart:io'; import 'dart:ffi'; import 'package:expect/expect.dart'; import 'dylib_utils.dart'; void main() { testOpen(); testOpenError(); testLookup(); testLookupError(); testToString(); testEquality(); testHandle(); } void testOpen() { DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); } void testOpenError() { Expect.throws( () => dlopenPlatformSpecific("doesnotexistforsurelibrary123409876")); } typedef NativeDoubleUnOp = Double Function(Double); typedef DoubleUnOp = double Function(double); void testLookup() { DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); var timesFour = l.lookupFunction("timesFour"); Expect.approxEquals(12.0, timesFour(3)); if (Platform.isMacOS || Platform.isIOS || Platform.isAndroid || Platform.isLinux) { // Lookup a symbol from 'libc' since it's loaded with global visibility. DynamicLibrary p = DynamicLibrary.process(); Expect.isTrue(p.lookup("strcmp") != nullptr); } else { Expect.throws(() => DynamicLibrary.process()); } DynamicLibrary e = DynamicLibrary.executable(); Expect.isTrue(e.lookup("Dart_Invoke") != nullptr); } void testLookupError() { DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); Expect.throws(() => l.lookupFunction( "functionnamethatdoesnotexistforsure749237593845")); } void testToString() { DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); Expect.stringEquals( "DynamicLibrary: handle=0x", l.toString().substring(0, 25)); } void testEquality() { DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); DynamicLibrary l2 = dlopenPlatformSpecific("ffi_test_dynamic_library"); Expect.equals(l, l2); Expect.equals(l.hashCode, l2.hashCode); DynamicLibrary l3 = dlopenPlatformSpecific("ffi_test_functions"); Expect.notEquals(l, l3); } void testHandle() { DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); DynamicLibrary l2 = dlopenPlatformSpecific("ffi_test_dynamic_library"); Pointer h = l.handle; Pointer h2 = l2.handle; Expect.equals(h, h2); DynamicLibrary l3 = dlopenPlatformSpecific("ffi_test_functions"); Pointer h3 = l3.handle; Expect.notEquals(h, h3); }