openpgpというパッケージを使用して単体テストをしていた時、「Invalid argument(s): Failed to load dynamic library ‘libopenpgp_bridge.dll’: error code 126」というエラーが出たので、その対処方法について記載する。
- 2022/05/12 誤字訂正 廃止->配置
初めに
PGPを使用しようと思い、OpenPGPをダウンロードして使っていたのだけど、このパッケージを使ったクラスをテストしようとしたときに、「Invalid argument(s): Failed to load dynamic library ‘libopenpgp_bridge.dll’: error code 126」というエラーが出て、単体テストができなかった。
アプリケーションでは動いたのだけど。
開発はWindows 11のVisual Studio Code上で行っている。
原因
Dart/Flutterの単体テストは、使用しているパッケージのビルドは行わないという仕様らしい。
今回使ったOpenPGPは、Windows版ではNativeなDLLを動的ローディング(dart:ffi)を使って利用するという仕組みになっていた。
上のパッケージのビルドを行わないということは、テスト用の実行形式の場所にOpenPGPで必要とするdllが配置されないということらしい。
テスト用の実行形式は「Flutter\bin\cache\artifacts\engine」の下に配置されている。
この場所を見ても、DLLは配置されていない。そのため、DLLのローディングに失敗してしまったことになる。
後、このフォルダの下にあるファイルに更新日付を見たら、テストを実施した日付ではなくちょっと古い日付だったので、テスト用のVM何だろうなとは思う。
なおパッケージがビルドされたフォルダの下にはOpenPGP用と思わしきDLLは存在していた。
現状のままだと、OpenPGPを使ったクラスのテストはできないことになってしまう。
対応
パッケージがビルドされた場所にはDLLがあったので、Windowsでのテストを行う場合には、そこをPATHの設定に追加すればいいのでは、という結論になった。
なおDLLが配置されているパスは「ワークスペースルート\build\windows\runner\Debug」。
そこで以下の対応を実施した。
ターミナルのPATHを改訂する
flutterのテストなどをターミナルから起動する場合があるため、ターミナルのPATHにDLLが配置されているパスを追加指定するようにした。
"terminal.integrated.env.windows": {
"PATH":"${workspaceRoot}\\build\\windows\\runner\\Debug;${env:PATH}"
},
launch.jsonの設定
単体テストをデバッグ付きで実施したかったので、以下の項目を追加設定した。
これにより、ソースコード上からのデバッグテストができるようになった。
{
"name": "Path set mode",
"type": "dart",
"request": "launch",
"codeLens": {
// Types of CodeLens to inject
"for": [ "run-test", "run-test-file", "debug-test", "debug-test-file" ],
// Text for CodeLens link (${debugType} will be replaced with "run" or "debug")
"title": "${debugType} (PATH)"
},
"env": { "PATH":"${workspaceRoot}\\build\\windows\\runner\\Debug;${env:PATH}" }
}
対策できなかったもの
このため、上のlaunch.jsonの設定を追加したのだけど、初期から配置されているRun/DebugにPATHを変更してから実行させるという機能を見つけることができなかった。
そのためのlaunch.jsonであり、ターミナルへのPATH追加である。
テストエクスプローラーでの実行がPATH未設定の状態のため、全パス成功の確認がテストエクスプローラーでできなくなってしまった。
ターミナルのPATH追加を行うことで、ターミナル、もしくはタスクから全パス成功の確認ができるようになった。
コメント