xref: /aosp_15_r20/external/AFLplusplus/test/unittests/unit_hash.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker #include <stdarg.h>
2*08b48e0bSAndroid Build Coastguard Worker #include <stddef.h>
3*08b48e0bSAndroid Build Coastguard Worker #include <setjmp.h>
4*08b48e0bSAndroid Build Coastguard Worker #include <assert.h>
5*08b48e0bSAndroid Build Coastguard Worker #include <cmocka.h>
6*08b48e0bSAndroid Build Coastguard Worker /* cmocka < 1.0 didn't support these features we need */
7*08b48e0bSAndroid Build Coastguard Worker #ifndef assert_ptr_equal
8*08b48e0bSAndroid Build Coastguard Worker #define assert_ptr_equal(a, b) \
9*08b48e0bSAndroid Build Coastguard Worker     _assert_int_equal(cast_ptr_to_largest_integral_type(a), \
10*08b48e0bSAndroid Build Coastguard Worker                       cast_ptr_to_largest_integral_type(b), \
11*08b48e0bSAndroid Build Coastguard Worker                       __FILE__, __LINE__)
12*08b48e0bSAndroid Build Coastguard Worker #define CMUnitTest UnitTest
13*08b48e0bSAndroid Build Coastguard Worker #define cmocka_unit_test unit_test
14*08b48e0bSAndroid Build Coastguard Worker #define cmocka_run_group_tests(t, setup, teardown) run_tests(t)
15*08b48e0bSAndroid Build Coastguard Worker #endif
16*08b48e0bSAndroid Build Coastguard Worker 
17*08b48e0bSAndroid Build Coastguard Worker 
18*08b48e0bSAndroid Build Coastguard Worker extern void mock_assert(const int result, const char* const expression,
19*08b48e0bSAndroid Build Coastguard Worker                         const char * const file, const int line);
20*08b48e0bSAndroid Build Coastguard Worker #undef assert
21*08b48e0bSAndroid Build Coastguard Worker #define assert(expression) \
22*08b48e0bSAndroid Build Coastguard Worker     mock_assert((int)(expression), #expression, __FILE__, __LINE__);
23*08b48e0bSAndroid Build Coastguard Worker 
24*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
25*08b48e0bSAndroid Build Coastguard Worker #include "hash.h"
26*08b48e0bSAndroid Build Coastguard Worker 
27*08b48e0bSAndroid Build Coastguard Worker /* remap exit -> assert, then use cmocka's mock_assert
28*08b48e0bSAndroid Build Coastguard Worker     (compile with `--wrap=exit`) */
29*08b48e0bSAndroid Build Coastguard Worker extern void exit(int status);
30*08b48e0bSAndroid Build Coastguard Worker extern void __real_exit(int status);
31*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status);
__wrap_exit(int status)32*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status) {
33*08b48e0bSAndroid Build Coastguard Worker     (void)status;
34*08b48e0bSAndroid Build Coastguard Worker     assert(0);
35*08b48e0bSAndroid Build Coastguard Worker }
36*08b48e0bSAndroid Build Coastguard Worker 
37*08b48e0bSAndroid Build Coastguard Worker /* ignore all printfs */
38*08b48e0bSAndroid Build Coastguard Worker #undef printf
39*08b48e0bSAndroid Build Coastguard Worker extern int printf(const char *format, ...);
40*08b48e0bSAndroid Build Coastguard Worker extern int __real_printf(const char *format, ...);
41*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...);
__wrap_printf(const char * format,...)42*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...) {
43*08b48e0bSAndroid Build Coastguard Worker     (void)format;
44*08b48e0bSAndroid Build Coastguard Worker     return 1;
45*08b48e0bSAndroid Build Coastguard Worker }
46*08b48e0bSAndroid Build Coastguard Worker 
47*08b48e0bSAndroid Build Coastguard Worker /* Rand with 0 seed would broke in the past */
test_hash(void ** state)48*08b48e0bSAndroid Build Coastguard Worker static void test_hash(void **state) {
49*08b48e0bSAndroid Build Coastguard Worker     (void)state;
50*08b48e0bSAndroid Build Coastguard Worker 
51*08b48e0bSAndroid Build Coastguard Worker     char bitmap[64] = {0};
52*08b48e0bSAndroid Build Coastguard Worker     u64 hash0 = hash64(bitmap, sizeof(bitmap), 0xa5b35705);
53*08b48e0bSAndroid Build Coastguard Worker 
54*08b48e0bSAndroid Build Coastguard Worker     bitmap[10] = 1;
55*08b48e0bSAndroid Build Coastguard Worker     u64 hash1 = hash64(bitmap, sizeof(bitmap), 0xa5b35705);
56*08b48e0bSAndroid Build Coastguard Worker 
57*08b48e0bSAndroid Build Coastguard Worker     assert_int_not_equal(hash0, hash1);
58*08b48e0bSAndroid Build Coastguard Worker 
59*08b48e0bSAndroid Build Coastguard Worker     bitmap[10] = 0;
60*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(hash0, hash64(bitmap, sizeof(bitmap), 0xa5b35705));
61*08b48e0bSAndroid Build Coastguard Worker 
62*08b48e0bSAndroid Build Coastguard Worker     bitmap[10] = 1;
63*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(hash1, hash64(bitmap, sizeof(bitmap), 0xa5b35705));
64*08b48e0bSAndroid Build Coastguard Worker 
65*08b48e0bSAndroid Build Coastguard Worker }
66*08b48e0bSAndroid Build Coastguard Worker 
main(int argc,char ** argv)67*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
68*08b48e0bSAndroid Build Coastguard Worker     (void)argc;
69*08b48e0bSAndroid Build Coastguard Worker     (void)argv;
70*08b48e0bSAndroid Build Coastguard Worker 
71*08b48e0bSAndroid Build Coastguard Worker     const struct CMUnitTest tests[] = {
72*08b48e0bSAndroid Build Coastguard Worker         cmocka_unit_test(test_hash)
73*08b48e0bSAndroid Build Coastguard Worker     };
74*08b48e0bSAndroid Build Coastguard Worker 
75*08b48e0bSAndroid Build Coastguard Worker     //return cmocka_run_group_tests (tests, setup, teardown);
76*08b48e0bSAndroid Build Coastguard Worker     __real_exit( cmocka_run_group_tests (tests, NULL, NULL) );
77*08b48e0bSAndroid Build Coastguard Worker 
78*08b48e0bSAndroid Build Coastguard Worker     // fake return for dumb compilers
79*08b48e0bSAndroid Build Coastguard Worker     return 0;
80*08b48e0bSAndroid Build Coastguard Worker }
81