2022-03-28 12:17:55 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
2022-11-01 20:26:26 +00:00
|
|
|
* Copyright (C) 2022 Intel Corporation.
|
2022-03-28 12:17:55 +00:00
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "spdk/stdinc.h"
|
|
|
|
|
|
|
|
#include "spdk_cunit.h"
|
|
|
|
|
|
|
|
#include "util/xor.c"
|
|
|
|
#include "common/lib/test_env.c"
|
|
|
|
|
|
|
|
#define BUF_COUNT 8
|
|
|
|
#define SRC_BUF_COUNT (BUF_COUNT - 1)
|
|
|
|
#define BUF_SIZE 4096
|
|
|
|
|
|
|
|
static void
|
|
|
|
test_xor_gen(void)
|
|
|
|
{
|
|
|
|
void *bufs[BUF_COUNT];
|
|
|
|
void *bufs2[SRC_BUF_COUNT];
|
|
|
|
uint8_t *ref, *dest;
|
|
|
|
int ret;
|
|
|
|
size_t i, j;
|
|
|
|
uint32_t *tmp;
|
|
|
|
|
|
|
|
/* alloc and fill the buffers with a pattern */
|
|
|
|
for (i = 0; i < BUF_COUNT; i++) {
|
|
|
|
ret = posix_memalign(&bufs[i], spdk_xor_get_optimal_alignment(), BUF_SIZE);
|
|
|
|
SPDK_CU_ASSERT_FATAL(ret == 0);
|
|
|
|
|
|
|
|
tmp = bufs[i];
|
|
|
|
for (j = 0; j < BUF_SIZE / sizeof(*tmp); j++) {
|
|
|
|
tmp[j] = (i << 16) + j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dest = bufs[SRC_BUF_COUNT];
|
|
|
|
|
|
|
|
/* prepare the reference buffer */
|
|
|
|
ref = malloc(BUF_SIZE);
|
|
|
|
SPDK_CU_ASSERT_FATAL(ref != NULL);
|
|
|
|
|
|
|
|
memset(ref, 0, BUF_SIZE);
|
|
|
|
for (i = 0; i < SRC_BUF_COUNT; i++) {
|
|
|
|
for (j = 0; j < BUF_SIZE; j++) {
|
|
|
|
ref[j] ^= ((uint8_t *)bufs[i])[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* generate xor, compare the dest and reference buffers */
|
|
|
|
ret = spdk_xor_gen(dest, bufs, SRC_BUF_COUNT, BUF_SIZE);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
ret = memcmp(ref, dest, BUF_SIZE);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
|
|
|
|
/* len not multiple of alignment */
|
|
|
|
memset(dest, 0xba, BUF_SIZE);
|
|
|
|
ret = spdk_xor_gen(dest, bufs, SRC_BUF_COUNT, BUF_SIZE - 1);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
ret = memcmp(ref, dest, BUF_SIZE - 1);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
|
|
|
|
/* unaligned buffer */
|
|
|
|
memcpy(bufs2, bufs, sizeof(bufs2));
|
|
|
|
bufs2[1] += 1;
|
|
|
|
bufs2[2] += 2;
|
|
|
|
bufs2[3] += 3;
|
|
|
|
|
|
|
|
memset(ref, 0, BUF_SIZE);
|
|
|
|
for (i = 0; i < SRC_BUF_COUNT; i++) {
|
|
|
|
for (j = 0; j < BUF_SIZE - SRC_BUF_COUNT; j++) {
|
|
|
|
ref[j] ^= ((uint8_t *)bufs2[i])[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
memset(dest, 0xba, BUF_SIZE);
|
|
|
|
ret = spdk_xor_gen(dest, bufs2, SRC_BUF_COUNT, BUF_SIZE - SRC_BUF_COUNT);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
ret = memcmp(ref, dest, BUF_SIZE - SRC_BUF_COUNT);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
|
|
|
|
/* xoring a buffer with itself should result in all zeros */
|
|
|
|
memset(ref, 0, BUF_SIZE);
|
|
|
|
bufs2[0] = bufs[0];
|
|
|
|
bufs2[1] = bufs[0];
|
|
|
|
dest = bufs[0];
|
|
|
|
|
|
|
|
ret = spdk_xor_gen(dest, bufs2, 2, BUF_SIZE);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
ret = memcmp(ref, dest, BUF_SIZE);
|
|
|
|
CU_ASSERT(ret == 0);
|
|
|
|
|
|
|
|
/* cleanup */
|
|
|
|
for (i = 0; i < BUF_COUNT; i++) {
|
|
|
|
free(bufs[i]);
|
|
|
|
}
|
|
|
|
free(ref);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
CU_pSuite suite = NULL;
|
|
|
|
unsigned int num_failures;
|
|
|
|
|
|
|
|
CU_set_error_action(CUEA_ABORT);
|
|
|
|
CU_initialize_registry();
|
|
|
|
|
|
|
|
suite = CU_add_suite("xor", NULL, NULL);
|
|
|
|
|
|
|
|
CU_ADD_TEST(suite, test_xor_gen);
|
|
|
|
|
|
|
|
CU_basic_set_mode(CU_BRM_VERBOSE);
|
|
|
|
|
|
|
|
CU_basic_run_tests();
|
|
|
|
|
|
|
|
num_failures = CU_get_number_of_failures();
|
|
|
|
CU_cleanup_registry();
|
|
|
|
|
|
|
|
return num_failures;
|
|
|
|
}
|