diff mbox series

[v4,19/32] tests/functional: add zstd support to uncompress utility

Message ID 20250108121054.1126164-20-alex.bennee@linaro.org
State New
Headers show
Series testing/next: functional tests, qtest clocks, vm and keymaps (pre-PR-FINAL) | expand

Commit Message

Alex Bennée Jan. 8, 2025, 12:10 p.m. UTC
Rather than using the python library (which has a different API
anyway) lets just call the binary. zstdtools is already in out
qemu.yml so all test containers should have it around. Tests should
still use @skipIfMissingCommands('zstd') to gracefully handle when
only minimal dependencies have been installed.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
v4
  - add chmod step to helper
  - also handle .zst extension
---
 tests/functional/qemu_test/uncompress.py | 26 ++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Daniel P. Berrangé Jan. 8, 2025, 12:32 p.m. UTC | #1
On Wed, Jan 08, 2025 at 12:10:41PM +0000, Alex Bennée wrote:
> Rather than using the python library (which has a different API
> anyway) lets just call the binary. zstdtools is already in out
> qemu.yml so all test containers should have it around. Tests should
> still use @skipIfMissingCommands('zstd') to gracefully handle when
> only minimal dependencies have been installed.
> 
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> 
> ---
> v4
>   - add chmod step to helper
>   - also handle .zst extension
> ---
>  tests/functional/qemu_test/uncompress.py | 26 ++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

> 
> diff --git a/tests/functional/qemu_test/uncompress.py b/tests/functional/qemu_test/uncompress.py
> index 6d02ded066..911d74ec23 100644
> --- a/tests/functional/qemu_test/uncompress.py
> +++ b/tests/functional/qemu_test/uncompress.py


> @@ -79,5 +101,9 @@ def guess_uncompress_format(compressed):
>          return "xz"
>      elif ext == ".gz":
>          return "gz"
> +    elif ext == ".zstd":
> +        return "zstd"
> +    elif ext == ".zst":
> +        return "zstd"

Or

  elif ext in [".zstd", ".zst"]:
      return 'zstd'

Either way, by R-b stands.

With regards,
Daniel
Thomas Huth Jan. 8, 2025, 2:08 p.m. UTC | #2
On 08/01/2025 13.10, Alex Bennée wrote:
> Rather than using the python library (which has a different API
> anyway) lets just call the binary. zstdtools is already in out
> qemu.yml so all test containers should have it around. Tests should
> still use @skipIfMissingCommands('zstd') to gracefully handle when
> only minimal dependencies have been installed.
> 
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

Reviewed-by: Thomas Huth <thuth@redhat.com>
diff mbox series

Patch

diff --git a/tests/functional/qemu_test/uncompress.py b/tests/functional/qemu_test/uncompress.py
index 6d02ded066..911d74ec23 100644
--- a/tests/functional/qemu_test/uncompress.py
+++ b/tests/functional/qemu_test/uncompress.py
@@ -10,8 +10,10 @@ 
 import gzip
 import lzma
 import os
+import stat
 import shutil
 from urllib.parse import urlparse
+from subprocess import check_call, CalledProcessError
 
 from .asset import Asset
 
@@ -38,6 +40,24 @@  def lzma_uncompress(xz_path, output_path):
             os.remove(output_path)
             raise
 
+
+def zstd_uncompress(zstd_path, output_path):
+    if os.path.exists(output_path):
+        return
+
+    try:
+        check_call(['zstd', "-f", "-d", zstd_path,
+                    "-o", output_path])
+    except CalledProcessError as e:
+        os.remove(output_path)
+        raise Exception(
+            f"Unable to decompress zstd file {zstd_path} with {e}") from e
+
+    # zstd copies source archive permissions for the output
+    # file, so must make this writable for QEMU
+    os.chmod(output_path, stat.S_IRUSR | stat.S_IWUSR)
+
+
 '''
 @params compressed: filename, Asset, or file-like object to uncompress
 @params uncompressed: filename to uncompress into
@@ -59,6 +79,8 @@  def uncompress(compressed, uncompressed, format=None):
         lzma_uncompress(str(compressed), uncompressed)
     elif format == "gz":
         gzip_uncompress(str(compressed), uncompressed)
+    elif format == "zstd":
+        zstd_uncompress(str(compressed), uncompressed)
     else:
         raise Exception(f"Unknown compression format {format}")
 
@@ -79,5 +101,9 @@  def guess_uncompress_format(compressed):
         return "xz"
     elif ext == ".gz":
         return "gz"
+    elif ext == ".zstd":
+        return "zstd"
+    elif ext == ".zst":
+        return "zstd"
     else:
         raise Exception(f"Unknown compression format for {compressed}")