1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2022 Intel Corporation.
3 * All rights reserved.
4 */
5
6 #include "spdk/stdinc.h"
7
8 #include "spdk_internal/cunit.h"
9
10 #include "util/xor.c"
11 #include "common/lib/test_env.c"
12
13 #define BUF_COUNT 8
14 #define SRC_BUF_COUNT (BUF_COUNT - 1)
15 #define BUF_SIZE 4096
16
17 static void
test_xor_gen(void)18 test_xor_gen(void)
19 {
20 void *bufs[BUF_COUNT];
21 void *bufs2[SRC_BUF_COUNT];
22 uint8_t *ref, *dest;
23 int ret;
24 size_t i, j;
25 uint32_t *tmp;
26
27 /* alloc and fill the buffers with a pattern */
28 for (i = 0; i < BUF_COUNT; i++) {
29 ret = posix_memalign(&bufs[i], spdk_xor_get_optimal_alignment(), BUF_SIZE);
30 SPDK_CU_ASSERT_FATAL(ret == 0);
31
32 tmp = bufs[i];
33 for (j = 0; j < BUF_SIZE / sizeof(*tmp); j++) {
34 tmp[j] = (i << 16) + j;
35 }
36 }
37 dest = bufs[SRC_BUF_COUNT];
38
39 /* prepare the reference buffer */
40 ref = malloc(BUF_SIZE);
41 SPDK_CU_ASSERT_FATAL(ref != NULL);
42
43 memset(ref, 0, BUF_SIZE);
44 for (i = 0; i < SRC_BUF_COUNT; i++) {
45 for (j = 0; j < BUF_SIZE; j++) {
46 ref[j] ^= ((uint8_t *)bufs[i])[j];
47 }
48 }
49
50 /* generate xor, compare the dest and reference buffers */
51 ret = spdk_xor_gen(dest, bufs, SRC_BUF_COUNT, BUF_SIZE);
52 CU_ASSERT(ret == 0);
53 ret = memcmp(ref, dest, BUF_SIZE);
54 CU_ASSERT(ret == 0);
55
56 /* len not multiple of alignment */
57 memset(dest, 0xba, BUF_SIZE);
58 ret = spdk_xor_gen(dest, bufs, SRC_BUF_COUNT, BUF_SIZE - 1);
59 CU_ASSERT(ret == 0);
60 ret = memcmp(ref, dest, BUF_SIZE - 1);
61 CU_ASSERT(ret == 0);
62
63 /* unaligned buffer */
64 memcpy(bufs2, bufs, sizeof(bufs2));
65 bufs2[1] += 1;
66 bufs2[2] += 2;
67 bufs2[3] += 3;
68
69 memset(ref, 0, BUF_SIZE);
70 for (i = 0; i < SRC_BUF_COUNT; i++) {
71 for (j = 0; j < BUF_SIZE - SRC_BUF_COUNT; j++) {
72 ref[j] ^= ((uint8_t *)bufs2[i])[j];
73 }
74 }
75
76 memset(dest, 0xba, BUF_SIZE);
77 ret = spdk_xor_gen(dest, bufs2, SRC_BUF_COUNT, BUF_SIZE - SRC_BUF_COUNT);
78 CU_ASSERT(ret == 0);
79 ret = memcmp(ref, dest, BUF_SIZE - SRC_BUF_COUNT);
80 CU_ASSERT(ret == 0);
81
82 /* xoring a buffer with itself should result in all zeros */
83 memset(ref, 0, BUF_SIZE);
84 bufs2[0] = bufs[0];
85 bufs2[1] = bufs[0];
86 dest = bufs[0];
87
88 ret = spdk_xor_gen(dest, bufs2, 2, BUF_SIZE);
89 CU_ASSERT(ret == 0);
90 ret = memcmp(ref, dest, BUF_SIZE);
91 CU_ASSERT(ret == 0);
92
93 /* cleanup */
94 for (i = 0; i < BUF_COUNT; i++) {
95 free(bufs[i]);
96 }
97 free(ref);
98 }
99
100 int
main(int argc,char ** argv)101 main(int argc, char **argv)
102 {
103 CU_pSuite suite = NULL;
104 unsigned int num_failures;
105
106 CU_initialize_registry();
107
108 suite = CU_add_suite("xor", NULL, NULL);
109
110 CU_ADD_TEST(suite, test_xor_gen);
111
112
113 num_failures = spdk_ut_run_tests(argc, argv, NULL);
114
115 CU_cleanup_registry();
116
117 return num_failures;
118 }
119