]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Add tests for appending various filters before archive open 2526/head
authorFrançois Degros <fdegros@chromium.org>
Fri, 24 Apr 2026 07:34:10 +0000 (17:34 +1000)
committerFrançois Degros <fdegros@chromium.org>
Fri, 24 Apr 2026 07:35:27 +0000 (17:35 +1000)
Extend test coverage to ensure all supported filters can be appended
to an archive reader before it is opened, matching the behavior
required to fix #2514.

Added tests for: BZIP2, LRZIP, LZ4, LZIP, LZMA, ZSTD, RPM, UU, and NONE.

libarchive/test/test_read_set_format.c

index 2bac5acc55694dd170a7df2b67aa3f0aad4b3769..ed7d362a8a544e8a1145b9899266391b43e3304d 100644 (file)
@@ -223,6 +223,162 @@ DEFINE_TEST(test_read_append_compress_filter)
   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
 }
 
+DEFINE_TEST(test_read_append_bzip2_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_BZIP2);
+  if (r != ARCHIVE_OK && archive_bzlib_version() == NULL && !canBzip2()) {
+    skipping("bzip2 tests require bzlib or working bzip2 command");
+    archive_read_free(a);
+    return;
+  }
+  if (r == ARCHIVE_WARN && canBzip2())
+    assertEqualString(archive_error_string(a), "Using external bzip2 program");
+  else
+    assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_lrzip_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_LRZIP);
+  if (r != ARCHIVE_OK && !canLrzip()) {
+    skipping("lrzip tests require working lrzip command");
+    archive_read_free(a);
+    return;
+  }
+  if (r == ARCHIVE_WARN && canLrzip())
+    assertEqualString(archive_error_string(a), "Using external lrzip program for lrzip decompression");
+  else
+    assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_lz4_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_LZ4);
+  if (r != ARCHIVE_OK && archive_liblz4_version() == NULL && !canLz4()) {
+    skipping("lz4 tests require liblz4 or working lz4 command");
+    archive_read_free(a);
+    return;
+  }
+  if (r == ARCHIVE_WARN && canLz4())
+    assertEqualString(archive_error_string(a), "Using external lz4 program");
+  else
+    assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_lzip_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_LZIP);
+  if (r != ARCHIVE_OK && archive_liblzma_version() == NULL && !canLzip()) {
+    skipping("lzip tests require liblzma or working lzip command");
+    archive_read_free(a);
+    return;
+  }
+  if (r == ARCHIVE_WARN && canLzip())
+    assertEqualString(archive_error_string(a), "Using external lzip program for lzip decompression");
+  else
+    assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_lzma_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_LZMA);
+  if (r != ARCHIVE_OK && archive_liblzma_version() == NULL && !canLzma()) {
+    skipping("lzma tests require liblzma or working lzma command");
+    archive_read_free(a);
+    return;
+  }
+  if (r == ARCHIVE_WARN && canLzma())
+    assertEqualString(archive_error_string(a), "Using external lzma program for lzma decompression");
+  else
+    assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_zstd_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_ZSTD);
+  if (r != ARCHIVE_OK && archive_libzstd_version() == NULL && !canZstd()) {
+    skipping("zstd tests require libzstd or working zstd command");
+    archive_read_free(a);
+    return;
+  }
+  if (r == ARCHIVE_WARN && canZstd())
+    assertEqualString(archive_error_string(a), "Using external zstd program for zstd decompression");
+  else
+    assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_rpm_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_RPM);
+  assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_uu_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_UU);
+  assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
+DEFINE_TEST(test_read_append_none_filter)
+{
+  struct archive *a;
+  int r;
+
+  assert((a = archive_read_new()) != NULL);
+  assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
+  r = archive_read_append_filter(a, ARCHIVE_FILTER_NONE);
+  assertEqualIntA(a, ARCHIVE_OK, r);
+  archive_read_free(a);
+}
+
 DEFINE_TEST(test_read_append_filter_program)
 {
   struct archive_entry *ae;