1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | |
22 | /** |
23 | * \file SDL_test_fuzzer.h |
24 | * |
25 | * Include file for SDL test framework. |
26 | * |
27 | * This code is a part of the SDL2_test library, not the main SDL library. |
28 | */ |
29 | |
30 | /* |
31 | |
32 | Data generators for fuzzing test data in a reproducible way. |
33 | |
34 | */ |
35 | |
36 | #ifndef SDL_test_fuzzer_h_ |
37 | #define SDL_test_fuzzer_h_ |
38 | |
39 | #include "begin_code.h" |
40 | /* Set up for C function definitions, even when using C++ */ |
41 | #ifdef __cplusplus |
42 | extern "C" { |
43 | #endif |
44 | |
45 | |
46 | /* |
47 | Based on GSOC code by Markus Kauppila <markus.kauppila@gmail.com> |
48 | */ |
49 | |
50 | |
51 | /** |
52 | * \file |
53 | * Note: The fuzzer implementation uses a static instance of random context |
54 | * internally which makes it thread-UNsafe. |
55 | */ |
56 | |
57 | /** |
58 | * Initializes the fuzzer for a test |
59 | * |
60 | * \param execKey Execution "Key" that initializes the random number generator uniquely for the test. |
61 | * |
62 | */ |
63 | void SDLTest_FuzzerInit(Uint64 execKey); |
64 | |
65 | |
66 | /** |
67 | * Returns a random Uint8 |
68 | * |
69 | * \returns Generated integer |
70 | */ |
71 | Uint8 SDLTest_RandomUint8(void); |
72 | |
73 | /** |
74 | * Returns a random Sint8 |
75 | * |
76 | * \returns Generated signed integer |
77 | */ |
78 | Sint8 SDLTest_RandomSint8(void); |
79 | |
80 | |
81 | /** |
82 | * Returns a random Uint16 |
83 | * |
84 | * \returns Generated integer |
85 | */ |
86 | Uint16 SDLTest_RandomUint16(void); |
87 | |
88 | /** |
89 | * Returns a random Sint16 |
90 | * |
91 | * \returns Generated signed integer |
92 | */ |
93 | Sint16 SDLTest_RandomSint16(void); |
94 | |
95 | |
96 | /** |
97 | * Returns a random integer |
98 | * |
99 | * \returns Generated integer |
100 | */ |
101 | Sint32 SDLTest_RandomSint32(void); |
102 | |
103 | |
104 | /** |
105 | * Returns a random positive integer |
106 | * |
107 | * \returns Generated integer |
108 | */ |
109 | Uint32 SDLTest_RandomUint32(void); |
110 | |
111 | /** |
112 | * Returns random Uint64. |
113 | * |
114 | * \returns Generated integer |
115 | */ |
116 | Uint64 SDLTest_RandomUint64(void); |
117 | |
118 | |
119 | /** |
120 | * Returns random Sint64. |
121 | * |
122 | * \returns Generated signed integer |
123 | */ |
124 | Sint64 SDLTest_RandomSint64(void); |
125 | |
126 | /** |
127 | * \returns random float in range [0.0 - 1.0[ |
128 | */ |
129 | float SDLTest_RandomUnitFloat(void); |
130 | |
131 | /** |
132 | * \returns random double in range [0.0 - 1.0[ |
133 | */ |
134 | double SDLTest_RandomUnitDouble(void); |
135 | |
136 | /** |
137 | * \returns random float. |
138 | * |
139 | */ |
140 | float SDLTest_RandomFloat(void); |
141 | |
142 | /** |
143 | * \returns random double. |
144 | * |
145 | */ |
146 | double SDLTest_RandomDouble(void); |
147 | |
148 | /** |
149 | * Returns a random boundary value for Uint8 within the given boundaries. |
150 | * Boundaries are inclusive, see the usage examples below. If validDomain |
151 | * is true, the function will only return valid boundaries, otherwise non-valid |
152 | * boundaries are also possible. |
153 | * If boundary1 > boundary2, the values are swapped |
154 | * |
155 | * Usage examples: |
156 | * RandomUint8BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 |
157 | * RandomUint8BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 |
158 | * RandomUint8BoundaryValue(0, 99, SDL_FALSE) returns 100 |
159 | * RandomUint8BoundaryValue(0, 255, SDL_FALSE) returns 0 (error set) |
160 | * |
161 | * \param boundary1 Lower boundary limit |
162 | * \param boundary2 Upper boundary limit |
163 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
164 | * |
165 | * \returns Random boundary value for the given range and domain or 0 with error set |
166 | */ |
167 | Uint8 SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain); |
168 | |
169 | /** |
170 | * Returns a random boundary value for Uint16 within the given boundaries. |
171 | * Boundaries are inclusive, see the usage examples below. If validDomain |
172 | * is true, the function will only return valid boundaries, otherwise non-valid |
173 | * boundaries are also possible. |
174 | * If boundary1 > boundary2, the values are swapped |
175 | * |
176 | * Usage examples: |
177 | * RandomUint16BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 |
178 | * RandomUint16BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 |
179 | * RandomUint16BoundaryValue(0, 99, SDL_FALSE) returns 100 |
180 | * RandomUint16BoundaryValue(0, 0xFFFF, SDL_FALSE) returns 0 (error set) |
181 | * |
182 | * \param boundary1 Lower boundary limit |
183 | * \param boundary2 Upper boundary limit |
184 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
185 | * |
186 | * \returns Random boundary value for the given range and domain or 0 with error set |
187 | */ |
188 | Uint16 SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain); |
189 | |
190 | /** |
191 | * Returns a random boundary value for Uint32 within the given boundaries. |
192 | * Boundaries are inclusive, see the usage examples below. If validDomain |
193 | * is true, the function will only return valid boundaries, otherwise non-valid |
194 | * boundaries are also possible. |
195 | * If boundary1 > boundary2, the values are swapped |
196 | * |
197 | * Usage examples: |
198 | * RandomUint32BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 |
199 | * RandomUint32BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 |
200 | * RandomUint32BoundaryValue(0, 99, SDL_FALSE) returns 100 |
201 | * RandomUint32BoundaryValue(0, 0xFFFFFFFF, SDL_FALSE) returns 0 (with error set) |
202 | * |
203 | * \param boundary1 Lower boundary limit |
204 | * \param boundary2 Upper boundary limit |
205 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
206 | * |
207 | * \returns Random boundary value for the given range and domain or 0 with error set |
208 | */ |
209 | Uint32 SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain); |
210 | |
211 | /** |
212 | * Returns a random boundary value for Uint64 within the given boundaries. |
213 | * Boundaries are inclusive, see the usage examples below. If validDomain |
214 | * is true, the function will only return valid boundaries, otherwise non-valid |
215 | * boundaries are also possible. |
216 | * If boundary1 > boundary2, the values are swapped |
217 | * |
218 | * Usage examples: |
219 | * RandomUint64BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 |
220 | * RandomUint64BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 |
221 | * RandomUint64BoundaryValue(0, 99, SDL_FALSE) returns 100 |
222 | * RandomUint64BoundaryValue(0, 0xFFFFFFFFFFFFFFFF, SDL_FALSE) returns 0 (with error set) |
223 | * |
224 | * \param boundary1 Lower boundary limit |
225 | * \param boundary2 Upper boundary limit |
226 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
227 | * |
228 | * \returns Random boundary value for the given range and domain or 0 with error set |
229 | */ |
230 | Uint64 SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain); |
231 | |
232 | /** |
233 | * Returns a random boundary value for Sint8 within the given boundaries. |
234 | * Boundaries are inclusive, see the usage examples below. If validDomain |
235 | * is true, the function will only return valid boundaries, otherwise non-valid |
236 | * boundaries are also possible. |
237 | * If boundary1 > boundary2, the values are swapped |
238 | * |
239 | * Usage examples: |
240 | * RandomSint8BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 |
241 | * RandomSint8BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 |
242 | * RandomSint8BoundaryValue(SINT8_MIN, 99, SDL_FALSE) returns 100 |
243 | * RandomSint8BoundaryValue(SINT8_MIN, SINT8_MAX, SDL_FALSE) returns SINT8_MIN (== error value) with error set |
244 | * |
245 | * \param boundary1 Lower boundary limit |
246 | * \param boundary2 Upper boundary limit |
247 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
248 | * |
249 | * \returns Random boundary value for the given range and domain or SINT8_MIN with error set |
250 | */ |
251 | Sint8 SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain); |
252 | |
253 | |
254 | /** |
255 | * Returns a random boundary value for Sint16 within the given boundaries. |
256 | * Boundaries are inclusive, see the usage examples below. If validDomain |
257 | * is true, the function will only return valid boundaries, otherwise non-valid |
258 | * boundaries are also possible. |
259 | * If boundary1 > boundary2, the values are swapped |
260 | * |
261 | * Usage examples: |
262 | * RandomSint16BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 |
263 | * RandomSint16BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 |
264 | * RandomSint16BoundaryValue(SINT16_MIN, 99, SDL_FALSE) returns 100 |
265 | * RandomSint16BoundaryValue(SINT16_MIN, SINT16_MAX, SDL_FALSE) returns SINT16_MIN (== error value) with error set |
266 | * |
267 | * \param boundary1 Lower boundary limit |
268 | * \param boundary2 Upper boundary limit |
269 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
270 | * |
271 | * \returns Random boundary value for the given range and domain or SINT16_MIN with error set |
272 | */ |
273 | Sint16 SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain); |
274 | |
275 | /** |
276 | * Returns a random boundary value for Sint32 within the given boundaries. |
277 | * Boundaries are inclusive, see the usage examples below. If validDomain |
278 | * is true, the function will only return valid boundaries, otherwise non-valid |
279 | * boundaries are also possible. |
280 | * If boundary1 > boundary2, the values are swapped |
281 | * |
282 | * Usage examples: |
283 | * RandomSint32BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 |
284 | * RandomSint32BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 |
285 | * RandomSint32BoundaryValue(SINT32_MIN, 99, SDL_FALSE) returns 100 |
286 | * RandomSint32BoundaryValue(SINT32_MIN, SINT32_MAX, SDL_FALSE) returns SINT32_MIN (== error value) |
287 | * |
288 | * \param boundary1 Lower boundary limit |
289 | * \param boundary2 Upper boundary limit |
290 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
291 | * |
292 | * \returns Random boundary value for the given range and domain or SINT32_MIN with error set |
293 | */ |
294 | Sint32 SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain); |
295 | |
296 | /** |
297 | * Returns a random boundary value for Sint64 within the given boundaries. |
298 | * Boundaries are inclusive, see the usage examples below. If validDomain |
299 | * is true, the function will only return valid boundaries, otherwise non-valid |
300 | * boundaries are also possible. |
301 | * If boundary1 > boundary2, the values are swapped |
302 | * |
303 | * Usage examples: |
304 | * RandomSint64BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 |
305 | * RandomSint64BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 |
306 | * RandomSint64BoundaryValue(SINT64_MIN, 99, SDL_FALSE) returns 100 |
307 | * RandomSint64BoundaryValue(SINT64_MIN, SINT64_MAX, SDL_FALSE) returns SINT64_MIN (== error value) and error set |
308 | * |
309 | * \param boundary1 Lower boundary limit |
310 | * \param boundary2 Upper boundary limit |
311 | * \param validDomain Should the generated boundary be valid (=within the bounds) or not? |
312 | * |
313 | * \returns Random boundary value for the given range and domain or SINT64_MIN with error set |
314 | */ |
315 | Sint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain); |
316 | |
317 | |
318 | /** |
319 | * Returns integer in range [min, max] (inclusive). |
320 | * Min and max values can be negative values. |
321 | * If Max in smaller than min, then the values are swapped. |
322 | * Min and max are the same value, that value will be returned. |
323 | * |
324 | * \param min Minimum inclusive value of returned random number |
325 | * \param max Maximum inclusive value of returned random number |
326 | * |
327 | * \returns Generated random integer in range |
328 | */ |
329 | Sint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max); |
330 | |
331 | |
332 | /** |
333 | * Generates random null-terminated string. The minimum length for |
334 | * the string is 1 character, maximum length for the string is 255 |
335 | * characters and it can contain ASCII characters from 32 to 126. |
336 | * |
337 | * Note: Returned string needs to be deallocated. |
338 | * |
339 | * \returns Newly allocated random string; or NULL if length was invalid or string could not be allocated. |
340 | */ |
341 | char * SDLTest_RandomAsciiString(void); |
342 | |
343 | |
344 | /** |
345 | * Generates random null-terminated string. The maximum length for |
346 | * the string is defined by the maxLength parameter. |
347 | * String can contain ASCII characters from 32 to 126. |
348 | * |
349 | * Note: Returned string needs to be deallocated. |
350 | * |
351 | * \param maxLength The maximum length of the generated string. |
352 | * |
353 | * \returns Newly allocated random string; or NULL if maxLength was invalid or string could not be allocated. |
354 | */ |
355 | char * SDLTest_RandomAsciiStringWithMaximumLength(int maxLength); |
356 | |
357 | |
358 | /** |
359 | * Generates random null-terminated string. The length for |
360 | * the string is defined by the size parameter. |
361 | * String can contain ASCII characters from 32 to 126. |
362 | * |
363 | * Note: Returned string needs to be deallocated. |
364 | * |
365 | * \param size The length of the generated string |
366 | * |
367 | * \returns Newly allocated random string; or NULL if size was invalid or string could not be allocated. |
368 | */ |
369 | char * SDLTest_RandomAsciiStringOfSize(int size); |
370 | |
371 | /** |
372 | * Returns the invocation count for the fuzzer since last ...FuzzerInit. |
373 | */ |
374 | int SDLTest_GetFuzzerInvocationCount(void); |
375 | |
376 | /* Ends C function definitions when using C++ */ |
377 | #ifdef __cplusplus |
378 | } |
379 | #endif |
380 | #include "close_code.h" |
381 | |
382 | #endif /* SDL_test_fuzzer_h_ */ |
383 | |
384 | /* vi: set ts=4 sw=4 expandtab: */ |
385 | |