From beb4ff6c7a728f7d5e15ed57a8f045fc0623fb43 Mon Sep 17 00:00:00 2001 From: Sebastian Freundt Date: Tue, 10 Jun 2014 10:40:45 +0000 Subject: [PATCH] Tests, heed Tim's advice and emit ARCHIVE_FAILED for entries ... that cannot be stored (natively) in WARC format. --- libarchive/archive_write_set_format_warc.c | 9 ++++++-- libarchive/test/test_write_format_warc.c | 13 ++++++++++- .../test/test_write_format_warc_empty.c | 23 ++++++++++++++----- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/libarchive/archive_write_set_format_warc.c b/libarchive/archive_write_set_format_warc.c index 90d868109..f16c8b1a2 100644 --- a/libarchive/archive_write_set_format_warc.c +++ b/libarchive/archive_write_set_format_warc.c @@ -243,9 +243,14 @@ _warc_header(struct archive_write *a, struct archive_entry *entry) __archive_write_output(a, hdr, r); /* and let subsequent calls to _data() know about the size */ w->populz = rh.cntlen; + return (ARCHIVE_OK); } - /* just pretend it's all good */ - return (ARCHIVE_OK); + /* just resort to erroring as per Tim's advice */ + archive_set_error( + &a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "WARC can only process regular files"); + return (ARCHIVE_FAILED); } static ssize_t diff --git a/libarchive/test/test_write_format_warc.c b/libarchive/test/test_write_format_warc.c index cc8f3ca1d..60d1898fa 100644 --- a/libarchive/test/test_write_format_warc.c +++ b/libarchive/test/test_write_format_warc.c @@ -111,11 +111,22 @@ DEFINE_TEST(test_write_format_warc) archive_entry_copy_pathname(ae, "dir"); archive_entry_set_filetype(ae, AE_IFDIR); archive_entry_set_size(ae, 512); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + /* test whether last archive is indeed empty */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + + /* Test EOF */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + free(buff); } diff --git a/libarchive/test/test_write_format_warc_empty.c b/libarchive/test/test_write_format_warc_empty.c index 1b3206a07..905536e26 100644 --- a/libarchive/test/test_write_format_warc_empty.c +++ b/libarchive/test/test_write_format_warc_empty.c @@ -47,7 +47,7 @@ DEFINE_TEST(test_write_format_warc_empty) archive_entry_set_mtime(ae, 5, 0); archive_entry_copy_pathname(ae, "."); archive_entry_set_mode(ae, S_IFDIR | 0755); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); /* Add ".." entry which must be ignored. */ @@ -57,7 +57,7 @@ DEFINE_TEST(test_write_format_warc_empty) archive_entry_set_mtime(ae, 5, 0); archive_entry_copy_pathname(ae, ".."); archive_entry_set_mode(ae, S_IFDIR | 0755); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); /* Add "/" entry which must be ignored. */ @@ -67,7 +67,7 @@ DEFINE_TEST(test_write_format_warc_empty) archive_entry_set_mtime(ae, 5, 0); archive_entry_copy_pathname(ae, "/"); archive_entry_set_mode(ae, S_IFDIR | 0755); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); /* Add "../" entry which must be ignored. */ @@ -77,7 +77,7 @@ DEFINE_TEST(test_write_format_warc_empty) archive_entry_set_mtime(ae, 5, 0); archive_entry_copy_pathname(ae, "../"); archive_entry_set_mode(ae, S_IFDIR | 0755); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); /* Add "../../." entry which must be ignored. */ @@ -87,7 +87,7 @@ DEFINE_TEST(test_write_format_warc_empty) archive_entry_set_mtime(ae, 5, 0); archive_entry_copy_pathname(ae, "../../."); archive_entry_set_mode(ae, S_IFDIR | 0755); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); /* Add "..//.././" entry which must be ignored. */ @@ -97,10 +97,21 @@ DEFINE_TEST(test_write_format_warc_empty) archive_entry_set_mtime(ae, 5, 0); archive_entry_copy_pathname(ae, "..//.././"); archive_entry_set_mode(ae, S_IFDIR | 0755); - assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); /* Close out the archive without writing anything. */ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + + /* Test whether last archive is empty indeed. */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + + /* Test EOF */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } -- 2.47.2