xref: /isa-l/mem/mem_zero_detect_test.c (revision e1470f70f6d996a4ed995fc6b378e563c795128a)
1 /**********************************************************************
2   Copyright(c) 2011-2018 Intel Corporation All rights reserved.
3 
4   Redistribution and use in source and binary forms, with or without
5   modification, are permitted provided that the following conditions
6   are met:
7     * Redistributions of source code must retain the above copyright
8       notice, this list of conditions and the following disclaimer.
9     * Redistributions in binary form must reproduce the above copyright
10       notice, this list of conditions and the following disclaimer in
11       the documentation and/or other materials provided with the
12       distribution.
13     * Neither the name of Intel Corporation nor the names of its
14       contributors may be used to endorse or promote products derived
15       from this software without specific prior written permission.
16 
17   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 **********************************************************************/
29 
30 #include <stdio.h>
31 #include <string.h>
32 #include <stdlib.h>
33 #include <limits.h>
34 #include "mem_routines.h"
35 #include "types.h"
36 
37 #define TEST_MEM  10*1024*1024
38 #define TEST_LEN  8*1024
39 #define RAND_ALIGN   32
40 #define BORDER_BYTES (5*RAND_ALIGN + 7)
41 
42 #ifndef RANDOMS
43 # define RANDOMS 2000
44 #endif
45 #ifndef TEST_SEED
46 # define TEST_SEED 0x1234
47 #endif
48 
49 int main(int argc, char *argv[])
50 {
51 	int i, j, l, sign;
52 	unsigned long long r;
53 	void *buf;
54 	unsigned char *a;
55 	int failures = 0, ret_neg = 1;
56 
57 	printf("mem_zero_detect_test %d bytes, %d randoms, seed=0x%x ", TEST_MEM, RANDOMS,
58 	       TEST_SEED);
59 	if (posix_memalign(&buf, 64, TEST_MEM)) {
60 		printf("alloc error: Fail");
61 		return -1;
62 	}
63 
64 	srand(TEST_SEED);
65 
66 	// Test full zero buffer
67 	memset(buf, 0, TEST_MEM);
68 	failures = isal_zero_detect(buf, TEST_MEM);
69 
70 	if (failures) {
71 		printf("Fail large buf test\n");
72 		return failures;
73 	}
74 	putchar('.');
75 
76 	// Test small buffers
77 	for (i = 0; i < TEST_LEN; i++) {
78 		failures |= isal_zero_detect(buf, i);
79 		if (failures) {
80 			printf("Fail len=%d\n", i);
81 			return failures;
82 		}
83 	}
84 	putchar('.');
85 
86 	// Test small buffers near end of alloc region
87 	a = buf;
88 	for (i = 0; i < TEST_LEN; i++)
89 		failures |= isal_zero_detect(&a[TEST_LEN - i], i);
90 
91 	if (failures) {
92 		printf("Fail:\n");
93 		return failures;
94 	}
95 	putchar('.');
96 
97 	// Test for detect non zero
98 	a[TEST_MEM / 2] = 1;
99 	ret_neg = isal_zero_detect(a, TEST_MEM);
100 	if (ret_neg == 0) {
101 		printf("Fail on not detect\n");
102 		return -1;
103 	}
104 	a[TEST_MEM / 2] = 0;
105 	putchar('.');
106 
107 	// Test various non-zero offsets
108 	for (i = 0; i < BORDER_BYTES; i++) {
109 		for (j = 0; j < CHAR_BIT; j++) {
110 			a[i] = 1 << j;
111 			ret_neg = isal_zero_detect(a, TEST_MEM);
112 			if (ret_neg == 0) {
113 				printf("Fail on not detect offsets %d, %d\n", i, j);
114 				return -1;
115 			}
116 			a[i] = 0;
117 		}
118 	}
119 	putchar('.');
120 	fflush(0);
121 
122 	// Test random non-zero offsets
123 	for (i = 0; i < RANDOMS; i++) {
124 		r = rand();
125 		r = (r % TEST_LEN) ^ (r & (RAND_ALIGN - 1));
126 		if (r >= TEST_LEN)
127 			continue;
128 
129 		a[r] = 1 << (r & (CHAR_BIT - 1));
130 		ret_neg = isal_zero_detect(a, TEST_MEM);
131 		if (ret_neg == 0) {
132 			printf("Fail on not detect rand %d, e=%lld\n", i, r);
133 			return -1;
134 		}
135 		a[r] = 0;
136 	}
137 	putchar('.');
138 	fflush(0);
139 
140 	// Test putting non-zero byte at end of buffer
141 	for (i = 1; i < BORDER_BYTES; i++) {
142 		for (j = 0; j < CHAR_BIT; j++) {
143 			a[TEST_MEM - i] = 1 << j;
144 			ret_neg = isal_zero_detect(a, TEST_MEM);
145 			if (ret_neg == 0) {
146 				printf("Fail on not detect rand offset=%d, idx=%d\n", i, j);
147 				return -1;
148 			}
149 			a[TEST_MEM - i] = 0;
150 		}
151 	}
152 	putchar('.');
153 
154 	// Test various size buffers and non-zero offsets
155 	for (l = 1; l < TEST_LEN; l++) {
156 		for (i = 0; i < l + BORDER_BYTES; i++) {
157 			failures = isal_zero_detect(a, l);
158 
159 			if (failures) {
160 				printf("Fail on detect non-zero with l=%d\n", l);
161 				return -1;
162 			}
163 
164 			a[i] = 1;
165 			ret_neg = isal_zero_detect(a, l);
166 
167 			if ((i < l) && (ret_neg == 0)) {
168 				printf("Fail on non-zero buffer l=%d err=%d\n", l, i);
169 				return -1;
170 			}
171 			if ((i >= l) && (ret_neg != 0)) {
172 				printf("Fail on bad pass detect l=%d err=%d\n", l, i);
173 				return -1;
174 			}
175 			a[i] = 0;
176 		}
177 	}
178 	putchar('.');
179 
180 	// Test random test size and non-zero error offsets
181 	for (i = 0; i < RANDOMS; i++) {
182 		r = rand();
183 		r = (r % TEST_LEN) ^ (r & (RAND_ALIGN - 1));
184 		l = r + 1 + (rand() & (CHAR_BIT - 1));
185 		a[r] = 1 << (r & (CHAR_BIT - 1));
186 		ret_neg = isal_zero_detect(a, l);
187 		if (ret_neg == 0) {
188 			printf("Fail on not detect rand %d, l=%d, e=%lld\n", i, l, r);
189 			return -1;
190 		}
191 		a[r] = 0;
192 	}
193 	putchar('.');
194 	fflush(0);
195 
196 	// Test combinations of zero and non-zero buffers
197 	for (i = 0; i < RANDOMS; i++) {
198 		r = rand();
199 		r = (r % TEST_LEN) ^ (r & (RAND_ALIGN - 1));
200 		sign = rand() & 1 ? 1 : -1;
201 		l = r + sign * (rand() & (2 * RAND_ALIGN - 1));
202 
203 		if ((l >= TEST_LEN) || (l < 0) || (r >= TEST_LEN))
204 			continue;
205 
206 		a[r] = 1 << (r & (CHAR_BIT - 1));
207 		ret_neg = isal_zero_detect(a, l);
208 
209 		if ((r < l) && (ret_neg == 0)) {
210 			printf("Fail on non-zero rand buffer %d, l=%d, e=%lld\n", i, l, r);
211 			return -1;
212 		}
213 		if ((r >= l) && (ret_neg != 0)) {
214 			printf("Fail on bad pass zero detect rand %d, l=%d, e=%lld\n", i, l,
215 			       r);
216 			return -1;
217 		}
218 
219 		a[r] = 0;
220 	}
221 	putchar('.');
222 	fflush(0);
223 
224 	printf(failures == 0 ? " Pass\n" : " Fail\n");
225 	return failures;
226 }
227