| // 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 |
| |
| 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() { |
| dlopenPlatformSpecific("ffi_test_dynamic_library"); |
| } |
| |
| void testOpenError() { |
| Expect.throws( |
| () => dlopenPlatformSpecific("doesnotexistforsurelibrary123409876"), |
| ); |
| } |
| |
| typedef NativeDoubleUnOp = Double Function(Double); |
| |
| typedef DoubleUnOp = double Function(double); |
| |
| void testLookup() { |
| final l = dlopenPlatformSpecific("ffi_test_dynamic_library"); |
| var timesFour = l.lookupFunction<NativeDoubleUnOp, DoubleUnOp>("timesFour"); |
| Expect.approxEquals(12.0, timesFour(3)); |
| |
| final p = DynamicLibrary.process(); |
| if (Platform.isWindows) { |
| Expect.isTrue(p.lookup<Void>("HeapAlloc") != nullptr); |
| Expect.isTrue(p.lookup<Void>("CoTaskMemAlloc") != nullptr); |
| } else { |
| // Lookup a symbol from 'libc' since it's loaded with global visibility. |
| Expect.isTrue(p.lookup<Void>("strcmp") != nullptr); |
| } |
| |
| final e = DynamicLibrary.executable(); |
| Expect.isTrue(e.lookup("Dart_Invoke") != nullptr); |
| } |
| |
| void testLookupError() { |
| DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library"); |
| Expect.throws( |
| () => l.lookupFunction<NativeDoubleUnOp, DoubleUnOp>( |
| "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<Void> h = l.handle; |
| Pointer<Void> h2 = l2.handle; |
| Expect.equals(h, h2); |
| DynamicLibrary l3 = dlopenPlatformSpecific("ffi_test_functions"); |
| Pointer<Void> h3 = l3.handle; |
| Expect.notEquals(h, h3); |
| } |