// 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("timesFour"); Expect.approxEquals(12.0, timesFour(3)); final p = DynamicLibrary.process(); if (Platform.isWindows) { Expect.isTrue(p.lookup("HeapAlloc") != nullptr); Expect.isTrue(p.lookup("CoTaskMemAlloc") != nullptr); } else { // Lookup a symbol from 'libc' since it's loaded with global visibility. Expect.isTrue(p.lookup("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( "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); }