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