3

我正在编写一个 Dart 库来使用 Flutter 访问 C 共享对象。

到目前为止,我创建的示例应用程序(在某种程度上)按预期工作,但我想包括单元测试也让库保持稳定。

细节:

  • 共享对象在 APP/android/src/main/jniLibs/{abi}/liboqs.so
  • example/lib/main.dart 中的示例应用程序并按预期工作
  • 库位于 APP/lib/liboqs_flutter.dart

图书馆使用

  static final ffi.DynamicLibrary _liboqs = Platform.isAndroid
      ? ffi.DynamicLibrary.open("liboqs.so")
      : ffi.DynamicLibrary.process();

设置库。

但是当我尝试使用flutter_test访问这个库时(例如运行运行静态最终C本机函数OQS_init的init函数LiboqsFlutter.init(),我得到:

Failed to load "/{HOME DIRECTOR}/liboqs_flutter/test/liboqs_flutter_test.dart": Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT, OQS_init): symbol not found)

我知道颤振测试无法访问“主要”资产,但我该如何强制通过它,以便我可以正确测试我的代码?

这个问题提供了两种解决方案

但我并不完全了解如何让这些对我有用。颤振驱动程序如何在这里帮助我?应该将#2 代码添加到测试中还是原始库中并在测试中调用?如果我已经在 main/jniLibs 文件夹中预建了共享对象,我真的需要在测试时重建项目吗?这似乎浪费了很多时间来测试应用程序。

4

1 回答 1

3

Android Studio 中的测试可以通过以下两种方式之一进行。1)在手机或模拟器环境中或 2)在桌面上。我正在构建一个 Flutter 包,所以我有一个在手机上测试的示例,以及一个在我的开发环境(桌面)上测试的 Dart 库。

我正在寻找的配置在桌面上。因此,我需要为我的 (Mac) 环境编译共享对象 (.dylib),将其包含在 build/test 文件夹中,然后像这样调用它:

static ffi.DynamicLibrary _open() {
    if (Platform.environment.containsKey('FLUTTER_TEST')) {
      return ffi.DynamicLibrary.open('build/test/{clibrary}.dylib');
    } else {
      return Platform.isAndroid
          ? ffi.DynamicLibrary.open("liboqs.so")
          : ffi.DynamicLibrary.process();
    }
  }

为了完整起见,首先检测操作系统然后提供适当的共享对象文件是有意义的。

这将确保您拥有可用于单元测试的共享对象。

颤振驱动选项出于相同目的使用集成测试。我认为添加一些 hacky 代码比添加另一个依赖项只是为了测试更好。

于 2021-03-20T14:13:12.323 回答