summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorTim Burke <tim.burke@gmail.com>2017-07-06 00:21:01 +0000
committerTim Burke <tim.burke@gmail.com>2017-07-06 17:40:38 +0000
commita9b20ae6a38073afe91ae2b7d789ddfb7dabade8 (patch)
tree5453dc1088cf5504c64dbb6e90d68500090fbef3 /test
parent9b4d8bcf8dc97d7edad3dc1443b317ecb5a0a254 (diff)
downloadliberasurecode-a9b20ae6a38073afe91ae2b7d789ddfb7dabade8.tar.gz
Use zlib for CRC-32
Previously, we had our own CRC that was almost but not quite like zlib's implementation. However, * it hasn't been subjected to the same rigor with regard to error-detection properties and * it may not even get used, depending upon whether zlib happens to get loaded before or after liberasurecode. Now, we'll use zlib's CRC-32 when writing new frags, while still tolerating frags that were created with the old implementation. Change-Id: Ib5ea2a830c7c23d66bf2ca404a3eb84ad00c5bc5 Closes-Bug: 1666320
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am2
-rw-r--r--test/liberasurecode_test.c36
2 files changed, 36 insertions, 2 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index d8ffa79..2e33bdc 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -15,7 +15,7 @@ check_PROGRAMS += alg_sig_test
liberasurecode_test_SOURCES = liberasurecode_test.c
liberasurecode_test_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/include/erasurecode @GCOV_FLAGS@
-liberasurecode_test_LDFLAGS = @GCOV_LDFLAGS@ $(top_builddir)/src/liberasurecode.la -ldl -lpthread
+liberasurecode_test_LDFLAGS = @GCOV_LDFLAGS@ $(top_builddir)/src/liberasurecode.la -ldl -lpthread -lz
check_PROGRAMS += liberasurecode_test
libec_slap_SOURCES = libec_slap.c
diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c
index 4791ca9..68c1c13 100644
--- a/test/liberasurecode_test.c
+++ b/test/liberasurecode_test.c
@@ -28,6 +28,7 @@
#include <assert.h>
#include <stdbool.h>
+#include <zlib.h>
#include "erasurecode.h"
#include "erasurecode_helpers.h"
#include "erasurecode_helpers_ext.h"
@@ -475,7 +476,7 @@ static void validate_fragment_checksum(struct ec_args *args,
assert(false); //currently only have support crc32
break;
case CHKSUM_CRC32:
- computed = crc32(0, fragment_data, size);
+ computed = crc32(0, (unsigned char *) fragment_data, size);
break;
case CHKSUM_NONE:
assert(metadata->chksum_mismatch == 0);
@@ -1745,6 +1746,35 @@ static void test_verify_stripe_metadata_frag_idx_invalid(
verify_fragment_metadata_mismatch_impl(be_id, args, FRAGIDX_OUT_OF_RANGE);
}
+static void test_metadata_crcs()
+{
+ // We've observed headers like this in the wild, using our busted crc32
+ char header[] =
+ "\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x10\x00"
+ "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x07\x01\x0e\x02\x00\xcc\x5e\x0c\x0b\x00"
+ "\x04\x01\x00\x22\xee\x45\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00";
+
+ fragment_metadata_t res;
+
+ assert(liberasurecode_get_fragment_metadata(header, &res) == 0);
+ assert(is_invalid_fragment_header((fragment_header_t *) header) == 0);
+
+ // Switch it to zlib's implementation
+ header[70] = '\x18';
+ header[69] = '\x73';
+ header[68] = '\xf8';
+ header[67] = '\xec';
+
+ assert(liberasurecode_get_fragment_metadata(header, &res) == 0);
+ assert(is_invalid_fragment_header((fragment_header_t *) header) == 0);
+
+ // Write down the wrong thing
+ header[70] = '\xff';
+ assert(liberasurecode_get_fragment_metadata(header, &res) == -EBADHEADER);
+ assert(is_invalid_fragment_header((fragment_header_t *) header) == 1);
+}
//static void test_verify_str
@@ -1805,6 +1835,10 @@ struct testcase testcases[] = {
test_liberasurecode_get_version,
EC_BACKENDS_MAX, CHKSUM_TYPES_MAX,
.skip = false},
+ {"test_metadata_crcs",
+ test_metadata_crcs,
+ EC_BACKENDS_MAX, 0,
+ .skip = false},
// NULL backend test
{"create_and_destroy_backend",
test_create_and_destroy_backend,