summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/liberasurecode_test.c110
1 files changed, 88 insertions, 22 deletions
diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c
index 1a7dfc4..16507ec 100644
--- a/test/liberasurecode_test.c
+++ b/test/liberasurecode_test.c
@@ -387,6 +387,9 @@ int *create_skips_array(struct ec_args *args, int skip)
static int create_fake_frags_no_meta(char ***array, int num_frags,
const char *data, int data_len)
{
+ // N.B. The difference from creat_frags_arry is to creat new
+ // memory allocation and set a copy of data/parity there. The
+ // allocated memory should be maintained by the caller.
int _num_frags = 0;
int i = 0;
char **ptr = NULL;
@@ -415,6 +418,10 @@ static int create_frags_array(char ***array,
struct ec_args *args,
int *skips)
{
+ // N.B. this function sets pointer reference to the ***array
+ // from **data and **parity so DO NOT free each value of
+ // the array independently because the data and parity will
+ // be expected to be cleanup via liberasurecode_encode_cleanup
int num_frags = 0;
int i = 0;
char **ptr = NULL;
@@ -445,6 +452,12 @@ out:
return num_frags;
}
+static void cleanup_avail_frags(char **avail_frags,
+ int num_frags)
+{
+ while(num_frags > 0) free(avail_frags[--num_frags]);
+ free(avail_frags);
+}
static int encode_failure_stub(void *desc, char **data,
char **parity, int blocksize)
{
@@ -596,6 +609,7 @@ static void test_encode_invalid_args()
assert(rc < 0);
instance->common.ops->encode = orig_encode_func;
+ liberasurecode_instance_destroy(desc);
free(orig_data);
}
@@ -627,6 +641,7 @@ static void test_encode_cleanup_invalid_args()
rc = liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
assert(rc == 0);
+ liberasurecode_instance_destroy(desc);
free(orig_data);
}
@@ -643,7 +658,10 @@ static void test_decode_invalid_args()
int *skips = create_skips_array(&null_args, -1);
char *decoded_data = NULL;
uint64_t decoded_data_len = 0;
- const char *fake_data = " ";
+ // fake_data len should be bigger than fragment_header_t for
+ // the verifications
+ int fake_data_len = 1024;
+ char *fake_data = create_buffer(fake_data_len, 'y');
desc = liberasurecode_instance_create(EC_BACKEND_NULL, &null_args);
if (-EBACKENDNOTAVAIL == desc) {
@@ -655,30 +673,40 @@ static void test_decode_invalid_args()
// test with invalid fragments (no metadata headers)
num_avail_frags = create_fake_frags_no_meta(&avail_frags, (null_args.k +
null_args.m),
- fake_data, strlen(fake_data));
+ fake_data, fake_data_len);
assert(num_avail_frags > 0);
+ free(fake_data);
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
- strlen(fake_data), 1,
+ fake_data_len, 1,
&decoded_data, &decoded_data_len);
// no metadata headers w/ force_metadata_checks results in EBADHEADER
assert(rc == -EBADHEADER);
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
- strlen(fake_data), 0,
+ fake_data_len, 0,
&decoded_data, &decoded_data_len);
// no metadata headers w/o force_metadata_checks also results in EBADHEADER
assert(rc == -EBADHEADER);
+ // encoded_fragment_len is too small
+ rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
+ 1, 1, &decoded_data, &decoded_data_len);
+ assert(rc == -EBADHEADER);
+
+ cleanup_avail_frags(avail_frags, num_avail_frags);
+
// test with num_fragments < (k)
num_avail_frags = create_fake_frags_no_meta(&avail_frags, (null_args.k - 1),
" ", 1);
assert(num_avail_frags > 0);
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
- strlen(fake_data), 1,
+ fake_data_len, 1,
&decoded_data, &decoded_data_len);
assert(rc == -EINSUFFFRAGS);
+ cleanup_avail_frags(avail_frags, num_avail_frags);
+
rc = liberasurecode_encode(desc, orig_data, orig_data_size,
&encoded_data, &encoded_parity, &encoded_fragment_len);
assert(rc == 0);
@@ -706,11 +734,15 @@ static void test_decode_invalid_args()
encoded_fragment_len, 1,
&decoded_data, NULL);
assert(rc < 0);
+
free(skips);
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
+ // N.B. create_frags_array sets pointer reference of either encoded_data
+ // or encoded_parity and they are cleaned up via
+ // liberasurecode_encode_cleanup
free(avail_frags);
free(orig_data);
-
}
static void test_decode_cleanup_invalid_args()
@@ -731,7 +763,7 @@ static void test_decode_cleanup_invalid_args()
rc = liberasurecode_decode_cleanup(desc, NULL);
assert(rc == 0);
-
+ liberasurecode_instance_destroy(desc);
free(orig_data);
}
@@ -767,6 +799,7 @@ static void test_reconstruct_fragment_invalid_args()
assert(rc < 0);
free(out_frag);
+ free(avail_frags);
// Test for EINSUFFFRAGS
// we have to call encode to get fragments which have valid header.
@@ -780,9 +813,10 @@ static void test_reconstruct_fragment_invalid_args()
rc = liberasurecode_reconstruct_fragment(desc, encoded_data, 1, encoded_fragment_len, 1, out_frag);
assert(rc == -EINSUFFFRAGS);
+ free(orig_data);
free(out_frag);
- free(avail_frags);
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
}
static void test_fragments_needed_invalid_args()
@@ -811,6 +845,7 @@ static void test_fragments_needed_invalid_args()
rc = liberasurecode_fragments_needed(desc, &frags_to_recon, &frags_to_exclude, NULL);
assert(rc < 0);
+ liberasurecode_instance_destroy(desc);
}
static void test_get_fragment_metadata_invalid_args() {
@@ -861,7 +896,8 @@ static void test_verify_stripe_metadata_invalid_args() {
rc = liberasurecode_verify_stripe_metadata(desc, frags, 0);
assert(rc == -EINVALIDPARAMS);
-
+ liberasurecode_instance_destroy(desc);
+ free(frags);
}
static void test_get_fragment_partition()
@@ -881,6 +917,8 @@ static void test_get_fragment_partition()
desc = liberasurecode_instance_create(EC_BACKEND_NULL, &null_args);
if (-EBACKENDNOTAVAIL == desc) {
fprintf (stderr, "Backend library not available!\n");
+ free(orig_data);
+ free(skips);
return;
}
assert(desc > 0);
@@ -890,7 +928,19 @@ static void test_get_fragment_partition()
missing = alloc_and_set_buffer(sizeof(char*) * null_args.k, -1);
- for(i = 0; i < null_args.m; i++) skips[i] = 1;
+ for(i = 0; i < null_args.m; i++) {
+ skips[i] = 1;
+ /* get_fragment_partition is going to NULL all the entries in
+ * encoded_data and encoded_parity before populating them again
+ * from avail_frags. Since we're explicitly *not* including these
+ * data frags in avail_frags, free them now.
+ */
+ if (i < null_args.k) {
+ free(encoded_data[i]);
+ } else {
+ free(encoded_parity[i - null_args.k]);
+ }
+ }
num_avail_frags = create_frags_array(&avail_frags, encoded_data,
encoded_parity, &null_args, skips);
@@ -899,11 +949,19 @@ static void test_get_fragment_partition()
assert(0 == rc);
for(i = 0; i < null_args.m; i++) assert(missing[i] == i);
- assert(missing[++i] == -1);
+ // Loop already pushed us one past
+ assert(missing[i] == -1);
+ free(avail_frags);
free(missing);
- for(i = 0; i < null_args.m + 1; i++) skips[i] = 1;
+ skips[i] = 1;
+ if (i < null_args.k) {
+ free(encoded_data[i]);
+ } else {
+ free(encoded_parity[i - null_args.k]);
+ }
+
num_avail_frags = create_frags_array(&avail_frags, encoded_data,
encoded_parity, &null_args, skips);
@@ -919,6 +977,7 @@ static void test_get_fragment_partition()
free(missing);
free(skips);
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
free(avail_frags);
free(orig_data);
}
@@ -1012,10 +1071,7 @@ static void encode_decode_test_impl(const ec_backend_id_t be_id,
rc = liberasurecode_decode_cleanup(desc, decoded_data);
assert(rc == 0);
- if (desc) {
- assert(0 == liberasurecode_instance_destroy(desc));
- }
-
+ assert(0 == liberasurecode_instance_destroy(desc));
free(orig_data);
free(avail_frags);
}
@@ -1087,11 +1143,12 @@ static void reconstruct_test_impl(const ec_backend_id_t be_id,
rc = liberasurecode_reconstruct_fragment(desc, avail_frags, num_avail_frags, encoded_fragment_len, i, out);
assert(rc == 0);
assert(memcmp(out, cmp, encoded_fragment_len) == 0);
+ free(avail_frags);
}
free(orig_data);
free(out);
- free(avail_frags);
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
}
static void test_fragments_needed_impl(const ec_backend_id_t be_id,
@@ -1215,6 +1272,7 @@ static void test_fragments_needed_impl(const ec_backend_id_t be_id,
assert(is_valid_fragment == 1);
i++;
}
+ liberasurecode_instance_destroy(desc);
free(fragments_to_reconstruct);
free(fragments_to_exclude);
free(fragments_needed);
@@ -1287,6 +1345,7 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
assert(be_version == be->common.ec_backend_version);
}
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
free(orig_data);
}
@@ -1399,6 +1458,8 @@ static void test_decode_reconstruct_specific_error_case(
EC_BACKEND_ISA_L_RS_VAND, &specific_1010_args);
if (-EBACKENDNOTAVAIL == desc) {
fprintf (stderr, "Backend library not available!\n");
+ free(orig_data);
+ free(skips);
return;
}
assert(desc > 0);
@@ -1448,6 +1509,7 @@ static void test_decode_reconstruct_specific_error_case(
assert(rc == 0);
free(out_frag);
+ free(avail_frags);
// cleanup all
rc = liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
@@ -1456,12 +1518,8 @@ static void test_decode_reconstruct_specific_error_case(
rc = liberasurecode_decode_cleanup(desc, decoded_data);
assert(rc == 0);
- if (desc) {
- assert(0 == liberasurecode_instance_destroy(desc));
- }
-
+ assert(0 == liberasurecode_instance_destroy(desc));
free(orig_data);
- free(avail_frags);
free(skips);
}
@@ -1522,6 +1580,8 @@ static void test_verify_stripe_metadata(const ec_backend_id_t be_id,
if (-EBACKENDNOTAVAIL == desc) {
fprintf (stderr, "Backend library not available!\n");
+ free(orig_data);
+ free(skip);
return;
}
assert(desc > 0);
@@ -1539,8 +1599,10 @@ static void test_verify_stripe_metadata(const ec_backend_id_t be_id,
assert(0 == rc);
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
free(orig_data);
free(skip);
+ free(avail_frags);
}
static void verify_fragment_metadata_mismatch_impl(const ec_backend_id_t be_id, struct ec_args *args,
@@ -1563,6 +1625,8 @@ static void verify_fragment_metadata_mismatch_impl(const ec_backend_id_t be_id,
if (-EBACKENDNOTAVAIL == desc) {
fprintf (stderr, "Backend library not available!\n");
+ free(orig_data);
+ free(skip);
return;
}
assert(desc > 0);
@@ -1627,6 +1691,8 @@ static void verify_fragment_metadata_mismatch_impl(const ec_backend_id_t be_id,
}
}
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
+ liberasurecode_instance_destroy(desc);
+ free(avail_frags);
free(orig_data);
free(skip);
}