1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
#include "config.h"
#include <cmocka.h>
/* Test structure with function pointers similar to cipher struct in libssh */
struct test_ops {
int (*set_encrypt_key)(void *ctx, void *key);
int (*set_decrypt_key)(void *ctx, void *key);
void (*encrypt)(void *ctx, void *in, void *out, size_t len);
void (*decrypt)(void *ctx, void *in, void *out, size_t len);
};
/* Some dummy functions for testing */
static int dummy_set_key(void *ctx, void *key)
{
(void)ctx;
(void)key;
return 0;
}
static void dummy_crypt(void *ctx, void *in, void *out, size_t len)
{
(void)ctx;
(void)in;
(void)out;
(void)len;
}
/* Test assert_non_null with function pointer */
static void test_funcptr_non_null(void **state)
{
struct test_ops ops = {
.set_encrypt_key = dummy_set_key,
.set_decrypt_key = dummy_set_key,
.encrypt = dummy_crypt,
.decrypt = dummy_crypt,
};
(void)state; /* unused */
/* These should pass - function pointers are not NULL */
assert_non_null(ops.set_encrypt_key);
assert_non_null(ops.set_decrypt_key);
assert_non_null(ops.encrypt);
assert_non_null(ops.decrypt);
}
/* Test assert_non_null_msg with function pointer */
static void test_funcptr_non_null_msg(void **state)
{
struct test_ops ops = {
.set_encrypt_key = dummy_set_key,
.set_decrypt_key = NULL,
.encrypt = dummy_crypt,
.decrypt = NULL,
};
(void)state; /* unused */
/* These should pass */
assert_non_null_msg(ops.set_encrypt_key,
"set_encrypt_key should not be NULL");
assert_non_null_msg(ops.encrypt, "encrypt should not be NULL");
}
/* Test assert_null with function pointer */
static void test_funcptr_null(void **state)
{
struct test_ops ops = {
.set_encrypt_key = NULL,
.set_decrypt_key = NULL,
.encrypt = NULL,
.decrypt = NULL,
};
(void)state; /* unused */
/* These should pass - function pointers are NULL */
assert_null(ops.set_encrypt_key);
assert_null(ops.set_decrypt_key);
assert_null(ops.encrypt);
assert_null(ops.decrypt);
}
/* Test assert_null_msg with function pointer */
static void test_funcptr_null_msg(void **state)
{
struct test_ops ops = {
.set_encrypt_key = NULL,
.set_decrypt_key = NULL,
.encrypt = NULL,
.decrypt = NULL,
};
(void)state; /* unused */
/* These should pass */
assert_null_msg(ops.set_encrypt_key, "set_encrypt_key should be NULL");
assert_null_msg(ops.decrypt, "decrypt should be NULL");
}
/* Test assert_ptr_equal with function pointers */
static void test_funcptr_ptr_equal(void **state)
{
struct test_ops ops1 = {
.set_encrypt_key = dummy_set_key,
.set_decrypt_key = dummy_set_key,
.encrypt = dummy_crypt,
.decrypt = dummy_crypt,
};
struct test_ops ops2 = {
.set_encrypt_key = dummy_set_key,
.set_decrypt_key = dummy_set_key,
.encrypt = dummy_crypt,
.decrypt = dummy_crypt,
};
(void)state; /* unused */
/* These should pass - same function pointers */
assert_ptr_equal(ops1.set_encrypt_key, ops2.set_encrypt_key);
assert_ptr_equal(ops1.encrypt, ops2.encrypt);
}
/* Test assert_ptr_not_equal with function pointers */
static void test_funcptr_ptr_not_equal(void **state)
{
struct test_ops ops = {
.set_encrypt_key = dummy_set_key,
.set_decrypt_key = dummy_set_key,
.encrypt = dummy_crypt,
.decrypt = dummy_crypt,
};
(void)state; /* unused */
/* These should pass - different function pointers */
assert_ptr_not_equal(ops.set_encrypt_key, ops.encrypt);
}
int main(void)
{
const struct CMUnitTest funcptr_tests[] = {
cmocka_unit_test(test_funcptr_non_null),
cmocka_unit_test(test_funcptr_non_null_msg),
cmocka_unit_test(test_funcptr_null),
cmocka_unit_test(test_funcptr_null_msg),
cmocka_unit_test(test_funcptr_ptr_equal),
cmocka_unit_test(test_funcptr_ptr_not_equal),
};
return cmocka_run_group_tests(funcptr_tests, NULL, NULL);
}
|