test.sh fails under Fedora #56

Closed
opened 2021-04-25 19:58:20 +00:00 by josch · 0 comments
Owner

By Georg Sauthoff on 2019-02-18T19:22:31.870Z

So I tried to bump the Fedora package to img2pdf 0.3.3 and integrate the additional test.sh suite.

Unfortunately, test.sh fails quite early - e.g. on Fedora 29/x86_64:

+ bash -x test.sh
+ set -eu
++ mktemp --directory --tmpdir img2pdf.XXXXXXXXXX
+ tempdir=/tmp/img2pdf.SR90PC6xAR
+ trap error EXIT
+ convert -size 60x60 '(' xc:none -fill red -draw 'circle 30,21 30,3' -gaussian-blur 0x3 ')' '(' '(' xc:none -fill lime -draw 'circle 39,39 36,57' -gaussian-blur 0x3 ')' '(' xc:none -fill blue -draw 'circle 21,39 24,57' -gaussian-blur 0x3 ')' -compose plus -composite ')' -compose plus -composite -strip /tmp/img2pdf.SR90PC6xAR/alpha.png
+ convert /tmp/img2pdf.SR90PC6xAR/alpha.png -background black -alpha remove -alpha off -strip /tmp/img2pdf.SR90PC6xAR/normal16.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal16.png -depth 8 -strip /tmp/img2pdf.SR90PC6xAR/normal.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal.png -negate -strip /tmp/img2pdf.SR90PC6xAR/inverse.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -depth 16 -strip /tmp/img2pdf.SR90PC6xAR/gray16.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 256 -depth 8 -strip /tmp/img2pdf.SR90PC6xAR/gray8.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 16 -depth 4 -strip /tmp/img2pdf.SR90PC6xAR/gray4.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 4 -depth 2 -strip /tmp/img2pdf.SR90PC6xAR/gray2.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 2 -depth 1 -strip /tmp/img2pdf.SR90PC6xAR/gray1.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 2 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette1.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 4 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette2.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 16 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette4.png
+ convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 256 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette8.png
+ cat
+ cd /tmp/img2pdf.SR90PC6xAR
+ md5sum --check --status -
+ error
test.sh: line 84: j: unbound variable

See also: https://copr-be.cloud.fedoraproject.org/results/gsauthof/fedora/fedora-29-x86_64/00859463-python-img2pdf/builder-live.log

I have to say that the way test.sh is written doesn't really lead to any actionable diagnostics. I mean even when I run the script with set -x the failing script doesn't tell me which files exactly produce checksum errors. And even if it would, the reference files don't seem to be part of the repository.

Also, the script fails on the first error instead of running all tests and then displaying a summary of failed/succeeded test cases.

When I am in the situation writing some tests that call a bunch of command utilities I usually use Python as better shell script replacement. That means pytest as convenient test library and the subprocess package for executing the commands. With pytest its quite easy to parametrize test cases and by default output is only displayed for failing tests which keeps the signal to noise ratio low.


By josch on 2019-02-20T18:49:19.456Z


Hi Georg, sorry for the late reply. I'm currently on holidays. I'll tend to this bug after I'm back in two weeks.

Indeed, the script fails on first error but in this case, it could not possibly continue because what fails is the test setup itself. In the beginning, the script uses imagemagick to generate some fake input for img2pdf. That's why there are no "reference files" -- they are generated on the fly. The checksum errors mean, that imagemagick produced some unexpected output. The test is aborted because imagemagick produced unexpected input files. Producing these files has nothing to do with img2pdf as only imagemagick is involved. I'll have to look into it to see why imagemagick decided to not produce the same image on Fedora as it does on Debian.

I also agree, that this testing script could've been done much better and that's why I would certainly welcome pull requests that improve the situation. If somebody is willing to help, please open a separate pull requests to discuss your ideas. Thanks!


By josch on 2019-03-09T16:27:28.607Z


Okay, so today I had some time to spend on this.

Basically what test.sh does is to first generate some dummy test input images and then run the tests on them. To make sure that these dummy images are generated correctly, their md5sum is checked. Funnily it seems that on Fedora x86_64, the generated files are not the same as imagemagick produces them on Debian amd64. This is weird and should not happen, especially because the imagemagick version does not differ that much (6.9.10.23 in Debian versus 6.9.9.38 in Fedora).

So I questioned the whole idea of using imagemagick to produce the test input in the first place and ran the following code on 12 architectures:

convert -size 60x60 \( xc:none -fill red -draw 'circle 30,21 30,3' -gaussian-blur 0x3 \) \
	\( \( xc:none -fill lime -draw 'circle 39,39 36,57' -gaussian-blur 0x3 \) \
	   \( xc:none -fill blue -draw 'circle 21,39 24,57' -gaussian-blur 0x3 \) \
	   -compose plus -composite \
	\) -compose plus -composite \
	-strip \
	"./alpha.png"
convert "./alpha.png" -background black -alpha remove -alpha off -strip "./normal16.png"
convert "./normal16.png" -depth 8 -strip "./normal.png"
convert "./normal.png" -negate -strip "./inverse.png"
convert "./normal16.png" -colorspace Gray -depth 16 -strip "./gray16.png"
convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 256 -depth 8 -strip "./gray8.png"
convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 16 -depth 4 -strip "./gray4.png"
convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 4 -depth 2 -strip "./gray2.png"
convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 2 -depth 1 -strip "./gray1.png"
convert "./normal.png" -dither FloydSteinberg -colors 2 -define png:exclude-chunk=bkgd -strip "./palette1.png"
convert "./normal.png" -dither FloydSteinberg -colors 4 -define png:exclude-chunk=bkgd -strip "./palette2.png"
convert "./normal.png" -dither FloydSteinberg -colors 16 -define png:exclude-chunk=bkgd -strip "./palette4.png"
convert "./normal.png" -dither FloydSteinberg -colors 256 -define png:exclude-chunk=bkgd -strip "./palette8.png"

On Debian amd64 this yields the following md5sums:

a99ef2a356c315090b6939fa4ce70516  alpha.png
0df21ebbce5292654119b17f6e52bc81  gray16.png
6faee81b8db446caa5004ad71bddcb5b  gray1.png
97e423da517ede069348484a1283aa6c  gray2.png
cbed1b6da5183aec0b86909e82b77c41  gray4.png
c0df42fdd69ae2a16ad0c23adb39895e  gray8.png
ac6bb850fb5aaee9fa7dcb67525cd0fc  inverse.png
3f3f8579f5054270e79a39e7cc4e89e0  normal16.png
cbe63b21443af8321b213bde6666951f  normal.png
2f00705cca05fd94406fc39ede4d7322  palette1.png
6cb250d1915c2af99c324c43ff8286eb  palette2.png
ab7b3d3907a851692ee36f5349ed0b2c  palette4.png
03829af4af8776adf56ba2e68f5b111e  palette8.png

On the other architectures, this is not always so. I made a table to visualize the differences:

file amd64 arm64 armel armhf hppa hurd-i386 kfreebsd-amd64 mipsel mips ppc64el s390x sparc64
alpha.png 💚 💚 💚 💚 💚 💜 💚 💚 💚 💚 💚 💚
gray16.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
gray1.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
gray2.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
gray4.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
gray8.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
inverse.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
normal16.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
normal.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
palette1.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
palette2.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
palette4.png 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚 💚
palette8.png 💚 💙 💚 💚 💚 💛 💚 💚 💚 💙 💙 💚

A green heart means the same md5sum as on amd64. Differently colored hearts signify a different md5sum. There are two interesting observations:

On hurd-i386, alpha.png is different but the checksum of all the other files matches. This is odd because alpha.png is the input from which everything else gets generated.

All other differences come from palette8.png which is also weird because the call to convert is the same as for palette1.png, palette2.png and palette4.png, just with a different -colors value. Why is the algorithm used by imagemagick doing different things depending on the architecture and only if 256 colors are chosen?

My next step would be to run the whole thing on Fedora. But maybe you @gms have some free time and run above few lines on your box and then write here which files differed from the amd64 md5sums I posted above?

I might need to replace imagemagick by another software that is actually reproducible independent on the architecture the algorithm is running on.


By josch on 2019-03-09T18:05:13.385Z


Okay, nevermind, on Fedora 29 x86_64, every single png image is different. Here is the diff image created by imagemagick compare of alpha.png:

out

No idea whether this is due to the difference in imagemagick version or some other reasons.

I'll just replace imagemagick with something else that is guaranteed to be stable across versions and architectures.


By josch on 2019-03-12T02:11:31.896Z


The issue should now be fixed in commit d1f101c36a. I replaced imagemagick by a python script using numpy and scipy to create the png input and it produces bit-by-bit identical output on all Debian architectures and Fedora 29 x86_64.


By josch on 2019-03-12T02:11:32.816Z


Status changed to closed


By Georg Sauthoff on 2019-03-19T19:10:33.276Z


Ok, I'll prepare a new img2pdf Fedora package when you cut a new PyPi release.


By josch on 2020-06-05T23:21:41.243Z


commit a84a1b8480 now adds over 4600 lines of pytest -- i hope that is useful for somebody

*By Georg Sauthoff on 2019-02-18T19:22:31.870Z* So I tried to bump the Fedora package to img2pdf 0.3.3 and integrate the additional test.sh suite. Unfortunately, test.sh fails quite early - e.g. on Fedora 29/x86_64: + bash -x test.sh + set -eu ++ mktemp --directory --tmpdir img2pdf.XXXXXXXXXX + tempdir=/tmp/img2pdf.SR90PC6xAR + trap error EXIT + convert -size 60x60 '(' xc:none -fill red -draw 'circle 30,21 30,3' -gaussian-blur 0x3 ')' '(' '(' xc:none -fill lime -draw 'circle 39,39 36,57' -gaussian-blur 0x3 ')' '(' xc:none -fill blue -draw 'circle 21,39 24,57' -gaussian-blur 0x3 ')' -compose plus -composite ')' -compose plus -composite -strip /tmp/img2pdf.SR90PC6xAR/alpha.png + convert /tmp/img2pdf.SR90PC6xAR/alpha.png -background black -alpha remove -alpha off -strip /tmp/img2pdf.SR90PC6xAR/normal16.png + convert /tmp/img2pdf.SR90PC6xAR/normal16.png -depth 8 -strip /tmp/img2pdf.SR90PC6xAR/normal.png + convert /tmp/img2pdf.SR90PC6xAR/normal.png -negate -strip /tmp/img2pdf.SR90PC6xAR/inverse.png + convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -depth 16 -strip /tmp/img2pdf.SR90PC6xAR/gray16.png + convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 256 -depth 8 -strip /tmp/img2pdf.SR90PC6xAR/gray8.png + convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 16 -depth 4 -strip /tmp/img2pdf.SR90PC6xAR/gray4.png + convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 4 -depth 2 -strip /tmp/img2pdf.SR90PC6xAR/gray2.png + convert /tmp/img2pdf.SR90PC6xAR/normal16.png -colorspace Gray -dither FloydSteinberg -colors 2 -depth 1 -strip /tmp/img2pdf.SR90PC6xAR/gray1.png + convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 2 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette1.png + convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 4 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette2.png + convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 16 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette4.png + convert /tmp/img2pdf.SR90PC6xAR/normal.png -dither FloydSteinberg -colors 256 -define png:exclude-chunk=bkgd -strip /tmp/img2pdf.SR90PC6xAR/palette8.png + cat + cd /tmp/img2pdf.SR90PC6xAR + md5sum --check --status - + error test.sh: line 84: j: unbound variable See also: https://copr-be.cloud.fedoraproject.org/results/gsauthof/fedora/fedora-29-x86_64/00859463-python-img2pdf/builder-live.log I have to say that the way test.sh is written doesn't really lead to any actionable diagnostics. I mean even when I run the script with `set -x` the failing script doesn't tell me which files exactly produce checksum errors. And even if it would, the reference files don't seem to be part of the repository. Also, the script fails on the first error instead of running all tests and then displaying a summary of failed/succeeded test cases. When I am in the situation writing some tests that call a bunch of command utilities I usually use Python as better shell script replacement. That means pytest as convenient test library and the subprocess package for executing the commands. With pytest its quite easy to parametrize test cases and by default output is only displayed for failing tests which keeps the signal to noise ratio low. --- *By josch on 2019-02-20T18:49:19.456Z* --- Hi Georg, sorry for the late reply. I'm currently on holidays. I'll tend to this bug after I'm back in two weeks. Indeed, the script fails on first error but in this case, it could not possibly continue because what fails is the test setup itself. In the beginning, the script uses imagemagick to generate some fake input for img2pdf. That's why there are no "reference files" -- they are generated on the fly. The checksum errors mean, that imagemagick produced some unexpected output. The test is aborted because imagemagick produced unexpected input files. Producing these files has nothing to do with img2pdf as only imagemagick is involved. I'll have to look into it to see why imagemagick decided to not produce the same image on Fedora as it does on Debian. I also agree, that this testing script could've been done much better and that's why I would certainly welcome pull requests that improve the situation. If somebody is willing to help, please open a separate pull requests to discuss your ideas. Thanks! --- *By josch on 2019-03-09T16:27:28.607Z* --- Okay, so today I had some time to spend on this. Basically what test.sh does is to first generate some dummy test input images and then run the tests on them. To make sure that these dummy images are generated correctly, their md5sum is checked. Funnily it seems that on Fedora x86_64, the generated files are not the same as imagemagick produces them on Debian amd64. This is weird and should not happen, especially because the imagemagick version does not differ that much (6.9.10.23 in Debian versus 6.9.9.38 in Fedora). So I questioned the whole idea of using imagemagick to produce the test input in the first place and ran the following code on 12 architectures: ``` convert -size 60x60 \( xc:none -fill red -draw 'circle 30,21 30,3' -gaussian-blur 0x3 \) \ \( \( xc:none -fill lime -draw 'circle 39,39 36,57' -gaussian-blur 0x3 \) \ \( xc:none -fill blue -draw 'circle 21,39 24,57' -gaussian-blur 0x3 \) \ -compose plus -composite \ \) -compose plus -composite \ -strip \ "./alpha.png" convert "./alpha.png" -background black -alpha remove -alpha off -strip "./normal16.png" convert "./normal16.png" -depth 8 -strip "./normal.png" convert "./normal.png" -negate -strip "./inverse.png" convert "./normal16.png" -colorspace Gray -depth 16 -strip "./gray16.png" convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 256 -depth 8 -strip "./gray8.png" convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 16 -depth 4 -strip "./gray4.png" convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 4 -depth 2 -strip "./gray2.png" convert "./normal16.png" -colorspace Gray -dither FloydSteinberg -colors 2 -depth 1 -strip "./gray1.png" convert "./normal.png" -dither FloydSteinberg -colors 2 -define png:exclude-chunk=bkgd -strip "./palette1.png" convert "./normal.png" -dither FloydSteinberg -colors 4 -define png:exclude-chunk=bkgd -strip "./palette2.png" convert "./normal.png" -dither FloydSteinberg -colors 16 -define png:exclude-chunk=bkgd -strip "./palette4.png" convert "./normal.png" -dither FloydSteinberg -colors 256 -define png:exclude-chunk=bkgd -strip "./palette8.png" ``` On Debian amd64 this yields the following md5sums: ``` a99ef2a356c315090b6939fa4ce70516 alpha.png 0df21ebbce5292654119b17f6e52bc81 gray16.png 6faee81b8db446caa5004ad71bddcb5b gray1.png 97e423da517ede069348484a1283aa6c gray2.png cbed1b6da5183aec0b86909e82b77c41 gray4.png c0df42fdd69ae2a16ad0c23adb39895e gray8.png ac6bb850fb5aaee9fa7dcb67525cd0fc inverse.png 3f3f8579f5054270e79a39e7cc4e89e0 normal16.png cbe63b21443af8321b213bde6666951f normal.png 2f00705cca05fd94406fc39ede4d7322 palette1.png 6cb250d1915c2af99c324c43ff8286eb palette2.png ab7b3d3907a851692ee36f5349ed0b2c palette4.png 03829af4af8776adf56ba2e68f5b111e palette8.png ``` On the other architectures, this is not always so. I made a table to visualize the differences: | file | amd64 | arm64 | armel | armhf | hppa | hurd-i386 | kfreebsd-amd64 | mipsel | mips | ppc64el | s390x | sparc64 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | alpha.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :purple_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | gray16.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | gray1.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | gray2.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | gray4.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | gray8.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | inverse.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | normal16.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | normal.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | palette1.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | palette2.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | palette4.png | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | :green_heart: | | palette8.png | :green_heart: | :blue_heart: | :green_heart: | :green_heart: | :green_heart: | :yellow_heart: | :green_heart: | :green_heart: | :green_heart: | :blue_heart: | :blue_heart: | :green_heart: | A green heart means the same md5sum as on amd64. Differently colored hearts signify a different md5sum. There are two interesting observations: On hurd-i386, alpha.png is different but the checksum of all the other files matches. This is odd because alpha.png is the input from which everything else gets generated. All other differences come from palette8.png which is also weird because the call to `convert` is the same as for palette1.png, palette2.png and palette4.png, just with a different `-colors` value. Why is the algorithm used by imagemagick doing different things depending on the architecture and only if 256 colors are chosen? My next step would be to run the whole thing on Fedora. But maybe you @gms have some free time and run above few lines on your box and then write here which files differed from the amd64 md5sums I posted above? I might need to replace imagemagick by another software that is actually reproducible independent on the architecture the algorithm is running on. --- *By josch on 2019-03-09T18:05:13.385Z* --- Okay, nevermind, on Fedora 29 x86_64, every single png image is different. Here is the diff image created by imagemagick compare of alpha.png: ![out](/uploads/50fdfd09971b24586d6c3ac39505780a/out.png) No idea whether this is due to the difference in imagemagick version or some other reasons. I'll just replace imagemagick with something else that is guaranteed to be stable across versions and architectures. --- *By josch on 2019-03-12T02:11:31.896Z* --- The issue should now be fixed in commit d1f101c36ac. I replaced imagemagick by a python script using numpy and scipy to create the png input and it produces bit-by-bit identical output on all Debian architectures and Fedora 29 x86_64. --- *By josch on 2019-03-12T02:11:32.816Z* --- Status changed to closed --- *By Georg Sauthoff on 2019-03-19T19:10:33.276Z* --- Ok, I'll prepare a new img2pdf Fedora package when you cut a new PyPi release. --- *By josch on 2020-06-05T23:21:41.243Z* --- commit a84a1b8480af0dc5f6217c7ed83f5107a7a7de66 now adds over 4600 lines of pytest -- i hope that is useful for somebody
josch closed this issue 2021-04-25 19:58:20 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: josch/img2pdf#56
No description provided.