forked from NixOS/nixpkgs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
python3Packages.invisible-watermark: add tests
After the 0.2.0 version, there are even more possible cases to consider. I found it too annoying to do all the testing manually. Add some tests to make it easy to test everything automatically. The test python3Packages.invisible-watermark.tests.withOnnx-rivaGan would fail in the nix sandbox on aarch64-linux: ``` Error in cpuinfo: failed to parse the list of possible processors in /sys/devices/system/cpu/possible Error in cpuinfo: failed to parse the list of present processors in /sys/devices/system/cpu/present Error in cpuinfo: failed to parse both lists of possible and present processors terminate called after throwing an instance of 'onnxruntime::OnnxRuntimeException' what(): /build/source/include/onnxruntime/core/common/logging/logging.h:294 static const onnxruntime::logging::Logger& onnxruntime::logging::LoggingManager::DefaultLogger() Attempt to use DefaultLogger but none has been registered. /build/.attr-0l2nkwhif96f51f4amnlf414lhl4rv9vh8iffyp431v6s28gsr90: line 9: 5 Aborted (core dumped) invisible-watermark --verbose --action encode --type bytes --method 'rivaGan' --watermark 'asdf' --output output.png '/nix/store/srl698a32n9d2pmyf5zqfk65gjzq3mhp-source/test_vectors/original.jpg' Exit code of invisible-watermark was 134 while 0 was expected. ``` so I have disabled that test. I believe microsoft/onnxruntime#10038 describes the same issue.
- Loading branch information
Showing
5 changed files
with
167 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 64 additions & 0 deletions
64
pkgs/development/python-modules/invisible-watermark/tests/cli.nix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
{ image | ||
, method | ||
, python3Packages | ||
, runCommand | ||
, testName | ||
, withOnnx | ||
}: | ||
|
||
# This file runs one test case. | ||
# There are six test cases in total. method can have three possible values and | ||
# withOnnx two possible values. 3 * 2 = 6. | ||
# | ||
# The case where the method is rivaGan and invisible-watermark is built | ||
# without onnx is expected to fail and this case is handled accordingly. | ||
# | ||
# The test works by first encoding a message into a test image, | ||
# then decoding the message from the image again and checking | ||
# if the message was decoded correctly. | ||
|
||
let | ||
message = if method == "rivaGan" then | ||
"asdf" # rivaGan only supports 32 bits | ||
else | ||
"fnörd1"; | ||
length = (builtins.stringLength message) * 8; | ||
invisible-watermark' = python3Packages.invisible-watermark.override { inherit withOnnx; }; | ||
expected-exit-code = if method == "rivaGan" && !withOnnx then "1" else "0"; | ||
in | ||
runCommand "invisible-watermark-test-${testName}" { nativeBuildInputs = [ invisible-watermark' ]; } '' | ||
set +e | ||
invisible-watermark \ | ||
--verbose \ | ||
--action encode \ | ||
--type bytes \ | ||
--method '${method}' \ | ||
--watermark '${message}' \ | ||
--output output.png \ | ||
'${image}' | ||
exit_code="$?" | ||
set -euf -o pipefail | ||
if [ "$exit_code" != '${expected-exit-code}' ]; then | ||
echo "Exit code of invisible-watermark was $exit_code while ${expected-exit-code} was expected." | ||
exit 1 | ||
fi | ||
if [ '${expected-exit-code}' == '1' ]; then | ||
echo 'invisible-watermark failed as expected.' | ||
touch "$out" | ||
exit 0 | ||
fi | ||
decoded_message="$(invisible-watermark \ | ||
--action decode \ | ||
--type bytes \ | ||
--method '${method}' \ | ||
--length '${toString length}' \ | ||
output.png \ | ||
)" | ||
if [ '${message}' != "$decoded_message" ]; then | ||
echo "invisible-watermark did not decode the watermark correctly." | ||
echo "The original message was ${message} but the decoded message was $decoded_message." | ||
exit 1 | ||
fi | ||
touch "$out" | ||
'' |
19 changes: 19 additions & 0 deletions
19
pkgs/development/python-modules/invisible-watermark/tests/python/decode.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
import os | ||
import cv2 | ||
from imwatermark import WatermarkDecoder | ||
|
||
input_file = os.environ['image'] | ||
output_file_path = os.environ['out'] | ||
num_bits = int(os.environ['num_bits']) | ||
method = os.environ['method'] | ||
|
||
bgr = cv2.imread(input_file) | ||
|
||
decoder = WatermarkDecoder('bytes', num_bits) | ||
watermark = decoder.decode(bgr, method) | ||
message = watermark.decode('utf-8') | ||
|
||
with open(output_file_path, 'w') as f: | ||
f.write(message) |
42 changes: 42 additions & 0 deletions
42
pkgs/development/python-modules/invisible-watermark/tests/python/default.nix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
{ image | ||
, invisible-watermark | ||
, opencv4 | ||
, python3 | ||
, runCommand | ||
, stdenvNoCC | ||
}: | ||
|
||
# This test checks if the python code shown in the README works correctly | ||
|
||
let | ||
message = "fnörd1"; | ||
method = "dwtDct"; | ||
|
||
pythonWithPackages = python3.withPackages (pp: with pp; [ invisible-watermark opencv4 ]); | ||
pythonInterpreter = pythonWithPackages.interpreter; | ||
|
||
encode = stdenvNoCC.mkDerivation { | ||
name = "encode"; | ||
realBuilder = pythonInterpreter; | ||
args = [ ./encode.py ]; | ||
inherit image message method; | ||
}; | ||
|
||
decode = stdenvNoCC.mkDerivation { | ||
name = "decode"; | ||
realBuilder = pythonInterpreter; | ||
args = [ ./decode.py ]; | ||
inherit method; | ||
image = "${encode}/test_wm.png"; | ||
num_bits = (builtins.stringLength message) * 8; | ||
}; | ||
in | ||
runCommand "invisible-watermark-test-python" { } '' | ||
decoded_message="$(cat '${decode}')" | ||
if [ '${message}' != "$decoded_message" ]; then | ||
echo "invisible-watermark did not decode the watermark correctly." | ||
echo "The original message was ${message} but the decoded message was $decoded_message." | ||
exit 1 | ||
fi | ||
touch "$out" | ||
'' |
21 changes: 21 additions & 0 deletions
21
pkgs/development/python-modules/invisible-watermark/tests/python/encode.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
import os | ||
import cv2 | ||
from imwatermark import WatermarkEncoder | ||
|
||
input_file_path = os.environ['image'] | ||
output_dir = os.environ['out'] | ||
message = os.environ['message'] | ||
method = os.environ['method'] | ||
|
||
os.mkdir(output_dir) | ||
|
||
bgr = cv2.imread(input_file_path) | ||
|
||
encoder = WatermarkEncoder() | ||
encoder.set_watermark('bytes', message.encode('utf-8')) | ||
bgr_encoded = encoder.encode(bgr, method) | ||
|
||
output_file = os.path.join(output_dir, 'test_wm.png') | ||
cv2.imwrite(output_file, bgr_encoded) |