diff options
49 files changed, 3219 insertions, 9245 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 09ed2a6..0b72eff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(alarm C CXX) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +PROJECT(alarm) INCLUDE(FindPkgConfig) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") @@ -27,16 +27,19 @@ IF(_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG) INSTALL(FILES ${CMAKE_SOURCE_DIR}/alarmmgr_log_dump.sh DESTINATION ${TZ_SYS_ETC}/dump.d/module.d/) ENDIF(_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG) -IF(BUILD_GTESTS) +IF(BUILD_GCOV) SET(EXTRA_CFLAGS "-Werror-implicit-function-declaration") -ELSE(BUILD_GTESTS) +ELSE(BUILD_GCOV) SET(EXTRA_CFLAGS "-Werror-implicit-function-declaration -fvisibility=hidden") -ENDIF(BUILD_GTESTS) +ENDIF(BUILD_GCOV) IF(BUILD_GCOV) ADD_DEFINITIONS("-DTIZEN_TEST_GCOV") ENDIF(BUILD_GCOV) -IF(BUILD_GTESTS) - ADD_SUBDIRECTORY(unittest) -ENDIF(BUILD_GTESTS) +SET(GTEST_TEST "gtest-alarmmgr") +ADD_SUBDIRECTORY(unittest) + +ENABLE_TESTING() +ADD_TEST(NAME ${GTEST_TEST} COMMAND ${GTEST_TEST} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/unittest) diff --git a/include/alarm-internal.h b/include/alarm-internal.h index b64299d..eca3ae4 100644 --- a/include/alarm-internal.h +++ b/include/alarm-internal.h @@ -38,12 +38,15 @@ extern "C" { #define MAX_PKG_NAME_LEN MAX_SERVICE_NAME_LEN-8 #define MAX_PKG_ID_LEN 512 #define MAX_APP_ID_LEN 256 -#define MIN_INEXACT_INTERVAL 600 +#define MIN_INEXACT_INTERVAL 900 #define REGULAR_UID_MIN 5000 +#define MAX_APPID_CACHE_SIZE 100 #define BILLION 1000000000 /* for calculating nano seconds */ #define MILLION 1000000 /* for calculating micro seconds */ +#define INEXACT_INTERVAL_QUANTUM 900 + typedef struct { GDBusConnection *connection; GDBusConnection *session_conn; @@ -61,33 +64,26 @@ enum async_param_type { SET_SYSTIME_WITH_PROPAGATION_DELAY, }; -typedef enum { - PROFILE_UNKNOWN = 0, - PROFILE_MOBILE, - PROFILE_WEARABLE, - PROFILE_TV, - PROFILE_IVI, - PROFILE_COMMON, -} profile_t; - #define ALARM_TYPE_RELATIVE 0x80000000 /**< relative */ #define ALARM_TYPE_WITHCB 0x40000000 /**< withcb */ #define ALARM_TYPE_PERIOD 0x10000000 /**< periodic */ -bool _send_alarm_create(alarm_context_t context, alarm_info_t *alarm, +#define base_info_t alarm_info_t + +bool _send_alarm_create(alarm_context_t context, base_info_t *base, alarm_id_t *id, const char *dst_service_name, const char *dst_service_name_mod, int *error_code); -bool _send_alarm_create_appsvc(alarm_context_t context, alarm_info_t *alarm_info, +bool _send_alarm_create_appsvc(alarm_context_t context, base_info_t *base_info, alarm_id_t *alarm_id, bundle *b, int *error_code); -bool _send_alarm_create_noti(alarm_context_t context, alarm_info_t *alarm_info, +bool _send_alarm_create_noti(alarm_context_t context, base_info_t *base_info, alarm_id_t *alarm_id, notification_h noti, int *error_code); bool _send_alarm_update(alarm_context_t context, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int update_flag, int *error_code); + base_info_t *base_info, int update_flag, int *error_code); bool _send_alarm_delete(alarm_context_t context, alarm_id_t alarm_id, int *error_code); bool _send_alarm_delete_all(alarm_context_t context, int *error_code); bool _send_alarm_get_list_of_ids(alarm_context_t context, int maxnum_of_ids, GVariantIter **iter, int *num_of_ids, int *error_code); bool _send_alarm_get_number_of_ids(alarm_context_t context, int *num_of_ids, int *error_code); -bool _send_alarm_get_info(alarm_context_t context, alarm_id_t alarm_id, alarm_info_t *alarm_info, int *error_code); +bool _send_alarm_get_info(alarm_context_t context, alarm_id_t alarm_id, base_info_t *base_info, int *error_code); bool _send_alarm_get_next_duetime(alarm_context_t context, alarm_id_t alarm_id, time_t* duetime, int *error_code); bool _send_alarm_get_all_info(alarm_context_t context, char ** db_path, int *error_code); bool _send_alarm_reset(alarm_context_t context, int *error_code); @@ -124,7 +120,7 @@ typedef struct { char *bundle; char *noti; - alarm_info_t alarm_info; + base_info_t base_info; periodic_method_e method; long requested_interval; @@ -165,7 +161,7 @@ typedef struct _bg_category_cb_info_t { bool has_bg; } bg_category_cb_info_t; -void _release_alarm_info_t(); +void _release_alarm_info_t(__alarm_info_t *entry); void _alarm_set_next_duetime(__alarm_info_t *alarm_info); void _alarm_schedule(); @@ -183,23 +179,24 @@ bool _can_skip_expired_cb(alarm_id_t alarm_id); void _alarm_expired(); void _rtc_set(); -int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id); -int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id); -int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id); -int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id); -int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid); -int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid); -int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid); -int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids); -int alarm_manager_alarm_get_list_of_ids(GVariant *parameters, uid_t uid, pid_t pid, GVariant **alarm_array, int *num_of_alarm); +int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender, int *alarm_id); +int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender, int *alarm_id); +int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender, int *alarm_id); +int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender, int *alarm_id); +int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender); +int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender); +int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender); +int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, const gchar *sender, int *num_of_ids); +int alarm_manager_alarm_get_list_of_ids(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender, + GVariantBuilder *alarm_array, int *num_of_alarm); int alarm_manager_alarm_get_appsvc_info(GVariant *parameters, uid_t uid, gchar **b_data); int alarm_manager_alarm_get_noti_info(GVariant *parameters, uid_t uid, gchar **noti_data); -int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, alarm_info_t *alarm_info); +int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, base_info_t *base_info); int alarm_manager_alarm_get_next_duetime(GVariant *parameters, uid_t uid, time_t *duetime); int alarm_manager_alarm_get_all_info(uid_t uid, char **db_path); int alarm_manager_alarm_set_rtc_time(GVariant *parameters); -int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid); -int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, pid_t pid); +int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid, const gchar *sender); +int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, pid_t pid, const gchar *sender); int alarm_manager_alarm_set_timezone(GVariant* parameters); int alarm_manager_alarm_set_global(GVariant *parameters, uid_t uid); int alarm_manager_alarm_get_global(GVariant *parameters, gboolean *global); diff --git a/include/alarm.h b/include/alarm.h index e6cac64..3c5e29a 100644 --- a/include/alarm.h +++ b/include/alarm.h @@ -1701,6 +1701,9 @@ int alarmmgr_add_reference_periodic_alarm_withcb(int interval, alarm_cb_t handle int alarmmgr_update_alarm(alarm_id_t alarm_id, alarm_entry_t *alarm, int update_flag); +int alarmmgr_add_alarm_withcb_with_localtime(alarm_entry_t *alarm, + alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id); + #ifdef __cplusplus } #endif diff --git a/lib/alarm-lib-dbus.c b/lib/alarm-lib-dbus.c index 6c763a2..7916b1b 100644 --- a/lib/alarm-lib-dbus.c +++ b/lib/alarm-lib-dbus.c @@ -48,7 +48,7 @@ static int __dbus_call_sync(GDBusProxy *proxy, const gchar *method_name, return error_code; } -bool _send_alarm_create_noti(alarm_context_t context, alarm_info_t *alarm_info, +bool _send_alarm_create_noti(alarm_context_t context, base_info_t *base_info, alarm_id_t *alarm_id, notification_h noti, int *error_code) { int return_code = -1; @@ -78,20 +78,20 @@ bool _send_alarm_create_noti(alarm_context_t context, alarm_info_t *alarm_info, noti_data = g_base64_encode((guchar *)data, datalen); param = g_variant_new("(iiiiiiiiiixiixs)", - alarm_info->start.year, - alarm_info->start.month, - alarm_info->start.day, - alarm_info->start.hour, - alarm_info->start.min, - alarm_info->start.sec, - alarm_info->end.year, - alarm_info->end.month, - alarm_info->end.day, - alarm_info->mode.u_interval.day_of_week, - (gint64)alarm_info->mode.u_interval.interval, - alarm_info->mode.repeat, - alarm_info->alarm_type, - (gint64)alarm_info->reserved_info, + base_info->start.year, + base_info->start.month, + base_info->start.day, + base_info->start.hour, + base_info->start.min, + base_info->start.sec, + base_info->end.year, + base_info->end.month, + base_info->end.day, + base_info->mode.u_interval.day_of_week, + (gint64)base_info->mode.u_interval.interval, + base_info->mode.repeat, + base_info->alarm_type, + (gint64)base_info->reserved_info, (char *)noti_data); if (noti_data) @@ -125,7 +125,7 @@ bool _send_alarm_create_noti(alarm_context_t context, alarm_info_t *alarm_info, return true; } -bool _send_alarm_create_appsvc(alarm_context_t context, alarm_info_t *alarm_info, +bool _send_alarm_create_appsvc(alarm_context_t context, base_info_t *base_info, alarm_id_t *alarm_id, bundle *b, int *error_code) { int return_code = -1; @@ -142,20 +142,20 @@ bool _send_alarm_create_appsvc(alarm_context_t context, alarm_info_t *alarm_info } param = g_variant_new("(iiiiiiiiiixiixs)", - alarm_info->start.year, - alarm_info->start.month, - alarm_info->start.day, - alarm_info->start.hour, - alarm_info->start.min, - alarm_info->start.sec, - alarm_info->end.year, - alarm_info->end.month, - alarm_info->end.day, - alarm_info->mode.u_interval.day_of_week, - (gint64)alarm_info->mode.u_interval.interval, - alarm_info->mode.repeat, - alarm_info->alarm_type, - (gint64)alarm_info->reserved_info, + base_info->start.year, + base_info->start.month, + base_info->start.day, + base_info->start.hour, + base_info->start.min, + base_info->start.sec, + base_info->end.year, + base_info->end.month, + base_info->end.day, + base_info->mode.u_interval.day_of_week, + (gint64)base_info->mode.u_interval.interval, + base_info->mode.repeat, + base_info->alarm_type, + (gint64)base_info->reserved_info, (char *)b_data); if (b_data) @@ -186,7 +186,7 @@ bool _send_alarm_create_appsvc(alarm_context_t context, alarm_info_t *alarm_info return true; } -bool _send_alarm_create(alarm_context_t context, alarm_info_t *alarm_info, +bool _send_alarm_create(alarm_context_t context, base_info_t *base_info, alarm_id_t *alarm_id, const char *dst_service_name, const char *dst_service_name_mod, int *error_code) { @@ -197,7 +197,7 @@ bool _send_alarm_create(alarm_context_t context, alarm_info_t *alarm_info, /*TODO: Dbus bus name validation is must & will be added to avoid alarm-server crash*/ if (context.app_service_name == NULL && strlen(dst_service_name) == 4 - && strncmp(dst_service_name, "null", 4) == 0) { + && strcmp(dst_service_name, "null") == 0) { LOGE("Invalid arg. Provide valid destination or call alarmmgr_init()\n"); if (error_code) *error_code = ERR_ALARM_INVALID_PARAM; @@ -207,20 +207,20 @@ bool _send_alarm_create(alarm_context_t context, alarm_info_t *alarm_info, param = g_variant_new("(ssiiiiiiiiiiiiixss)", context.app_service_name, context.app_service_name_mod, - alarm_info->start.year, - alarm_info->start.month, - alarm_info->start.day, - alarm_info->start.hour, - alarm_info->start.min, - alarm_info->start.sec, - alarm_info->msec, - alarm_info->end.year, - alarm_info->end.month, - alarm_info->end.day, - alarm_info->mode.u_interval.day_of_week, - alarm_info->mode.repeat, - alarm_info->alarm_type, - (gint64)alarm_info->reserved_info, + base_info->start.year, + base_info->start.month, + base_info->start.day, + base_info->start.hour, + base_info->start.min, + base_info->start.sec, + base_info->msec, + base_info->end.year, + base_info->end.month, + base_info->end.day, + base_info->mode.u_interval.day_of_week, + base_info->mode.repeat, + base_info->alarm_type, + (gint64)base_info->reserved_info, dst_service_name, dst_service_name_mod); return_code = __dbus_call_sync(context.proxy, "alarm_create", @@ -332,7 +332,7 @@ bundle *_send_alarm_get_appsvc_info(alarm_context_t context, alarm_id_t alarm_id notification_h _send_alarm_get_noti_info(alarm_context_t context, alarm_id_t alarm_id, int *error_code) { int return_code = -1; - int datalen; + gsize datalen; GVariant *noti_gv = NULL; GVariant *body = NULL; notification_h noti = NULL; @@ -360,7 +360,7 @@ notification_h _send_alarm_get_noti_info(alarm_context_t context, alarm_id_t ala if (error_code) *error_code = return_code; } else { - data = g_base64_decode(noti_data, (gsize *)&datalen); + data = g_base64_decode(noti_data, &datalen); noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"), data, datalen, @@ -485,7 +485,6 @@ bool _send_alarm_get_list_of_ids(alarm_context_t context, int maxnum_of_ids, { int return_code = -1; GVariantIter *iter_temp = NULL; - GVariant *arr = NULL; GVariant *param = NULL; GVariant *reply = NULL; @@ -499,8 +498,7 @@ bool _send_alarm_get_list_of_ids(alarm_context_t context, int maxnum_of_ids, return false; } - g_variant_get(reply, "(@aiii)", &arr, num_of_ids, &return_code); - g_variant_get(arr, "ai", &iter_temp); + g_variant_get(reply, "(a(i)ii)", &iter_temp, num_of_ids, &return_code); LOGD("alarm_get_list_of_ids() dbus sync success. return_code[%d].", return_code); @@ -509,6 +507,7 @@ bool _send_alarm_get_list_of_ids(alarm_context_t context, int maxnum_of_ids, if (error_code) *error_code = return_code; + g_variant_iter_free(iter_temp); g_variant_unref(reply); return false; } @@ -553,7 +552,7 @@ bool _send_alarm_get_number_of_ids(alarm_context_t context, int *num_of_ids, } bool _send_alarm_get_info(alarm_context_t context, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int *error_code) + base_info_t *base_info, int *error_code) { int return_code = -1; GVariant *param = NULL; @@ -570,21 +569,21 @@ bool _send_alarm_get_info(alarm_context_t context, alarm_id_t alarm_id, } g_variant_get(reply, "(iiiiiiiiiiiixi)", - &alarm_info->start.year, - &alarm_info->start.month, - &alarm_info->start.day, - &alarm_info->start.hour, - &alarm_info->start.min, - &alarm_info->start.sec, - &alarm_info->end.year, - &alarm_info->end.month, - &alarm_info->end.day, - &alarm_info->mode.u_interval.day_of_week, - &alarm_info->mode.repeat, - &alarm_info->alarm_type, + &base_info->start.year, + &base_info->start.month, + &base_info->start.day, + &base_info->start.hour, + &base_info->start.min, + &base_info->start.sec, + &base_info->end.year, + &base_info->end.month, + &base_info->end.day, + &base_info->mode.u_interval.day_of_week, + &base_info->mode.repeat, + &base_info->alarm_type, &tmp_reserved_info, &return_code); - alarm_info->reserved_info = (time_t)tmp_reserved_info; + base_info->reserved_info = (time_t)tmp_reserved_info; LOGD("alarm_get_info() dbus sync success. return_code[%d].", return_code); @@ -910,6 +909,7 @@ bool _send_alarm_get_global(alarm_context_t context, const alarm_id_t alarm_id, int return_code = -1; GVariant *param = NULL; GVariant *reply = NULL; + gboolean is_global = FALSE; param = g_variant_new("(i)", alarm_id); @@ -921,7 +921,8 @@ bool _send_alarm_get_global(alarm_context_t context, const alarm_id_t alarm_id, return false; } - g_variant_get(reply, "(bi)", global, &return_code); + g_variant_get(reply, "(bi)", &is_global, &return_code); + *global = is_global ? true : false; LOGD("alarm_get_global dbus sync() success. alarm_id[%d], global[%d]\ return_code[%d]", alarm_id, *global, return_code); @@ -939,7 +940,7 @@ bool _send_alarm_get_global(alarm_context_t context, const alarm_id_t alarm_id, } bool _send_alarm_update(alarm_context_t context, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int update_flag, int *error_code) + base_info_t *base_info, int update_flag, int *error_code) { int return_code = -1; GVariant *param = NULL; @@ -947,19 +948,19 @@ bool _send_alarm_update(alarm_context_t context, alarm_id_t alarm_id, param = g_variant_new("(iiiiiiiiiixiixi)", alarm_id, - alarm_info->start.year, - alarm_info->start.month, - alarm_info->start.day, - alarm_info->start.hour, - alarm_info->start.min, - alarm_info->start.sec, - alarm_info->end.year, - alarm_info->end.month, - alarm_info->end.day, - (gint64)alarm_info->mode.u_interval.interval, - alarm_info->mode.repeat, - alarm_info->alarm_type, - (gint64)alarm_info->reserved_info, + base_info->start.year, + base_info->start.month, + base_info->start.day, + base_info->start.hour, + base_info->start.min, + base_info->start.sec, + base_info->end.year, + base_info->end.month, + base_info->end.day, + (gint64)base_info->mode.u_interval.interval, + base_info->mode.repeat, + base_info->alarm_type, + (gint64)base_info->reserved_info, update_flag); return_code = __dbus_call_sync(context.proxy, "alarm_update", diff --git a/lib/alarm-lib.c b/lib/alarm-lib.c index 1f53853..d1e06e0 100644 --- a/lib/alarm-lib.c +++ b/lib/alarm-lib.c @@ -33,7 +33,6 @@ #include <gio/gio.h> #include <pkgmgr-info.h> #include <notification.h> -#include <tzplatform_config.h> #ifndef EXPORT_API #define EXPORT_API __attribute__ ((visibility("default"))) @@ -74,7 +73,7 @@ struct alarm_async_param_t { static alarm_cb_info_t *alarmcb_head; -guint registration_id; +static guint registration_id; static GDBusNodeInfo *introspection_data; @@ -95,7 +94,7 @@ static const GDBusInterfaceVTable interface_vtable = { NULL }; -void _initialize_alarm_info(alarm_info_t *alarm_info, int alarm_type, +void _initialize_alarm_info(base_info_t *base_info, int alarm_type, time_t trigger_at_time, time_t interval, bool precision) { struct timespec current_time; @@ -103,10 +102,10 @@ void _initialize_alarm_info(alarm_info_t *alarm_info, int alarm_type, clock_gettime(CLOCK_REALTIME, ¤t_time); - memset(alarm_info, 0, sizeof(alarm_info_t)); + memset(base_info, 0, sizeof(base_info_t)); - alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; - alarm_info->alarm_type = alarm_type; + base_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; + base_info->alarm_type = alarm_type; if (current_time.tv_nsec > (BILLION / 2)) { /* When the nanosecond part of the current_time is bigger than 500ms, @@ -115,40 +114,40 @@ void _initialize_alarm_info(alarm_info_t *alarm_info, int alarm_type, } else { current_time.tv_sec += trigger_at_time; } - alarm_info->reserved_info = current_time.tv_sec; + base_info->reserved_info = current_time.tv_sec; tzset(); /* Processes the TZ environment variable, and Set timezone, daylight, and tzname. */ localtime_r(¤t_time.tv_sec, &duetime_tm); - alarm_info->start.year = duetime_tm.tm_year + 1900; - alarm_info->start.month = duetime_tm.tm_mon + 1; - alarm_info->start.day = duetime_tm.tm_mday; + base_info->start.year = duetime_tm.tm_year + 1900; + base_info->start.month = duetime_tm.tm_mon + 1; + base_info->start.day = duetime_tm.tm_mday; - alarm_info->end.year = 0; - alarm_info->end.month = 0; - alarm_info->end.day = 0; + base_info->end.year = 0; + base_info->end.month = 0; + base_info->end.day = 0; - alarm_info->start.hour = duetime_tm.tm_hour; - alarm_info->start.min = duetime_tm.tm_min; - alarm_info->start.sec = duetime_tm.tm_sec; + base_info->start.hour = duetime_tm.tm_hour; + base_info->start.min = duetime_tm.tm_min; + base_info->start.sec = duetime_tm.tm_sec; if (interval <= 0) { - alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; - alarm_info->mode.u_interval.interval = 0; + base_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; + base_info->mode.u_interval.interval = 0; } else { - alarm_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT; - alarm_info->mode.u_interval.interval = interval; + base_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT; + base_info->mode.u_interval.interval = interval; } - alarm_info->msec = precision ? (int)current_time.tv_nsec / MILLION : 0; + base_info->msec = precision ? (int)current_time.tv_nsec / MILLION : 0; LOGD("trigger_at_time(%ld), start(%d-%d-%d, %02d:%02d:%02d),\ repeat(%d), interval(%ld), type(%d)", - trigger_at_time, alarm_info->start.day, alarm_info->start.month, - alarm_info->start.year, alarm_info->start.hour, - alarm_info->start.min, alarm_info->start.sec, - alarm_info->mode.repeat, alarm_info->mode.u_interval.interval, - alarm_info->alarm_type); + trigger_at_time, base_info->start.day, base_info->start.month, + base_info->start.year, base_info->start.hour, + base_info->start.min, base_info->start.sec, + base_info->mode.repeat, base_info->mode.u_interval.interval, + base_info->alarm_type); } static void __add_resultcb(alarm_id_t alarm_id, alarm_cb_t cb_func, void *data) @@ -329,21 +328,21 @@ static bool __alarm_validate_time(alarm_date_t *date, int *error_code) return true; } -static int __check_validation(alarm_info_t *alarm_info, const char *function) +static int __check_validation(base_info_t *base_info, const char *function) { int error_code; - if (!__alarm_validate_date(&alarm_info->start, &error_code)) { + if (!__alarm_validate_date(&base_info->start, &error_code)) { LOGE("%s : start date error\n", function); return error_code; } - if (!__alarm_validate_time(&alarm_info->start, &error_code)) { + if (!__alarm_validate_time(&base_info->start, &error_code)) { LOGE("%s : start time error\n", function); return error_code; } - if (!__alarm_validate_date(&alarm_info->end, &error_code)) { + if (!__alarm_validate_date(&base_info->end, &error_code)) { LOGE("%s : end date error\n", function); return error_code; } @@ -386,8 +385,10 @@ static void __bus_get_for_async_api(GObject *source_object, GAsyncResult *res, alarm_context.connection = g_bus_get_finish(res, &error); if (!alarm_context.connection) { - LOGE("dbus error message: %s", error->message); - g_error_free(error); + if (error) { + LOGE("dbus error message: %s", error->message); + g_error_free(error); + } g_variant_unref(param->v); g_free(param); pthread_mutex_unlock(&init_lock); @@ -438,17 +439,12 @@ static int __sub_init() return ALARMMGR_RESULT_SUCCESS; } -#if !(GLIB_CHECK_VERSION(2, 32, 0)) - g_thread_init(NULL); -#endif -#if !(GLIB_CHECK_VERSION(2, 36, 0)) - g_type_init(); -#endif - alarm_context.connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); if (alarm_context.connection == NULL) { - LOGE("g_bus_get_sync() is failed. error: %s", error->message); - g_error_free(error); + if (error) { + LOGE("g_bus_get_sync() is failed. error: %s", error->message); + g_error_free(error); + } pthread_mutex_unlock(&init_lock); return ERR_ALARM_SYSTEM_FAIL; } @@ -464,7 +460,7 @@ static int __compare_api_version(int *result, uid_t uid) int ret = 0; pkgmgrinfo_pkginfo_h pkginfo = NULL; char pkgid[MAX_PKG_ID_LEN] = {0, }; - char *pkg_version; + char *pkg_version = NULL; if (aul_app_get_pkgid_bypid_for_uid(getpid(), pkgid, sizeof(pkgid), uid) != AUL_R_OK) { LOGE("aul_app_get_pkgid_bypid() is failed. PID %d may not be app.", getpid()); @@ -474,8 +470,11 @@ static int __compare_api_version(int *result, uid_t uid) LOGE("Failed to get pkginfo\n"); } else { ret = pkgmgrinfo_pkginfo_get_api_version(pkginfo, &pkg_version); - if (ret != PMINFO_R_OK) + if (ret != PMINFO_R_OK) { LOGE("Failed to check api version [%d]\n", ret); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); + return ret; + } *result = strverscmp(pkg_version, "2.4"); pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); @@ -484,7 +483,7 @@ static int __compare_api_version(int *result, uid_t uid) return ret; } -static void __adjust_current_milliseconds(alarm_info_t *alarm_info) +static void __adjust_current_milliseconds(base_info_t *base_info) { struct timespec current_time; struct tm start_tm; @@ -495,12 +494,12 @@ static void __adjust_current_milliseconds(alarm_info_t *alarm_info) /* When the nanosecond part of the current_time is bigger than 500ms, * the duetime increases by extra 1sec. */ - start_tm.tm_year = alarm_info->start.year - 1900; - start_tm.tm_mon = alarm_info->start.month - 1; - start_tm.tm_mday = alarm_info->start.day; - start_tm.tm_hour = alarm_info->start.hour; - start_tm.tm_min = alarm_info->start.min; - start_tm.tm_sec = alarm_info->start.sec; + start_tm.tm_year = base_info->start.year - 1900; + start_tm.tm_mon = base_info->start.month - 1; + start_tm.tm_mday = base_info->start.day; + start_tm.tm_hour = base_info->start.hour; + start_tm.tm_min = base_info->start.min; + start_tm.tm_sec = base_info->start.sec; start_tm.tm_isdst = -1; start = timegm(&start_tm); @@ -508,17 +507,18 @@ static void __adjust_current_milliseconds(alarm_info_t *alarm_info) if (current_time.tv_sec == start) { start += 1; + tzset(); localtime_r(&start, &start_tm); - alarm_info->start.year = start_tm.tm_year + 1900; - alarm_info->start.month = start_tm.tm_mon + 1; - alarm_info->start.day = start_tm.tm_mday; - alarm_info->start.hour = start_tm.tm_hour; - alarm_info->start.min = start_tm.tm_min; - alarm_info->start.sec = start_tm.tm_sec; + base_info->start.year = start_tm.tm_year + 1900; + base_info->start.month = start_tm.tm_mon + 1; + base_info->start.day = start_tm.tm_mday; + base_info->start.hour = start_tm.tm_hour; + base_info->start.min = start_tm.tm_min; + base_info->start.sec = start_tm.tm_sec; LOGW("adjusted start(%d-%d-%d, %02d:%02d:%02d),", - alarm_info->start.day, alarm_info->start.month, alarm_info->start.year, - alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec); + base_info->start.day, base_info->start.month, base_info->start.year, + base_info->start.hour, base_info->start.min, base_info->start.sec); } } } @@ -541,10 +541,10 @@ EXPORT_API int alarmmgr_init(const char *appid) char service_name[MAX_SERVICE_NAME_LEN] = { 0 }; char service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 }; int ret; - int len = 0; + size_t len = 0; guint owner_id = 0; - int i = 0; - int j = 0; + size_t i = 0; + size_t j = 0; bool is_user = false; if (appid == NULL) { @@ -677,11 +677,15 @@ EXPORT_API void alarmmgr_fini() alarm_context.session_conn = NULL; } - if (alarm_context.app_service_name) + if (alarm_context.app_service_name) { free(alarm_context.app_service_name); - if (alarm_context.app_service_name_mod) - free(alarm_context.app_service_name_mod); + alarm_context.app_service_name = NULL; + } + if (alarm_context.app_service_name_mod) { + free(alarm_context.app_service_name_mod); + alarm_context.app_service_name_mod = NULL; + } b_initialized = false; sub_initialized = false; @@ -706,37 +710,37 @@ EXPORT_API int alarmmgr_set_cb(alarm_cb_t handler, void *user_param) EXPORT_API alarm_entry_t *alarmmgr_create_alarm(void) { - alarm_info_t *alarm = (alarm_info_t *)malloc(sizeof(alarm_info_t)); + base_info_t *base_info = (base_info_t *)malloc(sizeof(base_info_t)); - if (alarm == NULL) { + if (base_info == NULL) { LOGE("alarm is null"); return NULL; } - alarm->start.year = 0; - alarm->start.month = 0; - alarm->start.day = 0; - alarm->start.hour = 0; - alarm->start.min = 0; - alarm->start.sec = 0; + base_info->start.year = 0; + base_info->start.month = 0; + base_info->start.day = 0; + base_info->start.hour = 0; + base_info->start.min = 0; + base_info->start.sec = 0; - alarm->msec = 0; + base_info->msec = 0; - alarm->end.year = 0; - alarm->end.month = 0; - alarm->end.day = 0; - alarm->end.hour = 0; - alarm->end.min = 0; - alarm->end.sec = 0; + base_info->end.year = 0; + base_info->end.month = 0; + base_info->end.day = 0; + base_info->end.hour = 0; + base_info->end.min = 0; + base_info->end.sec = 0; - alarm->mode.repeat = ALARM_REPEAT_MODE_ONCE; - alarm->mode.u_interval.interval = 0; + base_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; + base_info->mode.u_interval.interval = 0; - alarm->alarm_type = ALARM_TYPE_DEFAULT; + base_info->alarm_type = ALARM_TYPE_DEFAULT; - alarm->reserved_info = 0; + base_info->reserved_info = 0; - return (alarm_entry_t *) alarm; + return (alarm_entry_t *) base_info; } EXPORT_API int alarmmgr_free_alarm(alarm_entry_t *alarm) @@ -753,7 +757,7 @@ EXPORT_API int alarmmgr_free_alarm(alarm_entry_t *alarm) EXPORT_API int alarmmgr_set_time(alarm_entry_t *alarm, alarm_date_t time) { - alarm_info_t *alarm_info; + base_info_t *base_info; int error_code; if (alarm == NULL) { @@ -761,7 +765,7 @@ EXPORT_API int alarmmgr_set_time(alarm_entry_t *alarm, alarm_date_t time) return ERR_ALARM_INVALID_PARAM; } - alarm_info = (alarm_info_t *)alarm; + base_info = (base_info_t *)alarm; if (!__alarm_validate_date(&time, &error_code)) { LOGE("start date error\n"); return error_code; @@ -772,7 +776,7 @@ EXPORT_API int alarmmgr_set_time(alarm_entry_t *alarm, alarm_date_t time) return error_code; } - memcpy(&alarm_info->start, &time, sizeof(alarm_date_t)); + memcpy(&base_info->start, &time, sizeof(alarm_date_t)); return ALARMMGR_RESULT_SUCCESS; } @@ -780,15 +784,14 @@ EXPORT_API int alarmmgr_set_time(alarm_entry_t *alarm, alarm_date_t time) EXPORT_API int alarmmgr_get_time(const alarm_entry_t *alarm, alarm_date_t *time) { - alarm_info_t *alarm_info = (alarm_info_t *)alarm; - - if (alarm == NULL) { - LOGE("alarm is null"); + if (alarm == NULL || time == NULL) { + LOGE("alarm or time is null"); return ERR_ALARM_INVALID_PARAM; } - if (time != NULL) - memcpy(time, &alarm_info->start, sizeof(alarm_date_t)); + base_info_t *base_info = (base_info_t *)alarm; + + memcpy(time, &base_info->start, sizeof(alarm_date_t)); return ALARMMGR_RESULT_SUCCESS; } @@ -796,20 +799,20 @@ EXPORT_API int alarmmgr_get_time(const alarm_entry_t *alarm, EXPORT_API int alarmmgr_set_repeat_mode(alarm_entry_t *alarm, alarm_repeat_mode_t repeat, int interval) { - alarm_info_t *alarm_info = (alarm_info_t *)alarm; + base_info_t *base_info = (base_info_t *)alarm; if (repeat >= ALARM_REPEAT_MODE_MAX) { LOGE("repeat value is invalid"); return ERR_ALARM_INVALID_PARAM; } - alarm_info->mode.repeat = repeat; + base_info->mode.repeat = repeat; if (repeat == ALARM_REPEAT_MODE_REPEAT || repeat == ALARM_REPEAT_MODE_WEEKLY) { if (interval <= 0) return ERR_ALARM_INVALID_PARAM; - alarm_info->mode.u_interval.interval = interval; + base_info->mode.u_interval.interval = interval; } return ALARMMGR_RESULT_SUCCESS; @@ -818,48 +821,44 @@ EXPORT_API int alarmmgr_set_repeat_mode(alarm_entry_t *alarm, EXPORT_API int alarmmgr_get_repeat_mode(const alarm_entry_t *alarm, alarm_repeat_mode_t *repeat, int *interval) { - alarm_info_t *alarm_info = (alarm_info_t *)alarm; - - if (alarm == NULL) { - LOGE("alarm is null"); + if (alarm == NULL || repeat == NULL || interval == NULL) { + LOGE("alarm or repeat or interval is null"); return ERR_ALARM_INVALID_PARAM; } - if (repeat != NULL) - *repeat = alarm_info->mode.repeat; - if (interval != NULL) - *interval = alarm_info->mode.u_interval.interval; + base_info_t *base_info = (base_info_t *)alarm; + *repeat = base_info->mode.repeat; + *interval = base_info->mode.u_interval.interval; return ALARMMGR_RESULT_SUCCESS; } EXPORT_API int alarmmgr_set_type(alarm_entry_t *alarm, int alarm_type) { - alarm_info_t *alarm_info; + base_info_t *base_info; if (alarm == NULL) { LOGE("alarm is null"); return ERR_ALARM_INVALID_PARAM; } - alarm_info = (alarm_info_t *)alarm; - alarm_info->alarm_type = alarm_type; - alarm_info->alarm_type &= (~ALARM_TYPE_RELATIVE); + base_info = (base_info_t *)alarm; + base_info->alarm_type = alarm_type; + base_info->alarm_type &= (~ALARM_TYPE_RELATIVE); return ALARMMGR_RESULT_SUCCESS; } EXPORT_API int alarmmgr_get_type(const alarm_entry_t *alarm, int *alarm_type) { - alarm_info_t *alarm_info = (alarm_info_t *)alarm; - - if (alarm == NULL) { - LOGE("alarm is null"); + if (alarm == NULL || alarm_type == NULL) { + LOGE("alarm or alarm_type is null"); return ERR_ALARM_INVALID_PARAM; } - if (alarm_type != NULL) - *alarm_type = alarm_info->alarm_type; + base_info_t *base_info = (base_info_t *)alarm; + + *alarm_type = base_info->alarm_type; return ALARMMGR_RESULT_SUCCESS; } @@ -908,6 +907,9 @@ EXPORT_API int alarmmgr_get_alarm_noti_info(alarm_id_t alarm_id, notification_h { int ret = 0; + if (noti == NULL) + return ERR_ALARM_INVALID_PARAM; + ret = __sub_init(); if (ret < 0) return ret; @@ -962,7 +964,7 @@ EXPORT_API int alarmmgr_set_rtc_time(alarm_date_t *time) EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, void *bundle_data, alarm_id_t *alarm_id) { - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; alarm_mode_t *mode; const char *operation = NULL; int error_code = 0; @@ -971,13 +973,13 @@ EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, vo LOGD("[alarm-lib]:alarm_create() is called\n"); - alarm_info = (alarm_info_t *)alarm; - if (alarm_info == NULL || alarm_id == NULL) { + base_info = (base_info_t *)alarm; + if (base_info == NULL || alarm_id == NULL) { LOGE("Invalid parameter\n"); return ERR_ALARM_INVALID_PARAM; } - __adjust_current_milliseconds(alarm_info); + __adjust_current_milliseconds(base_info); b = (bundle *)bundle_data; if (b == NULL) { @@ -996,30 +998,30 @@ EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, vo appid = appsvc_get_appid(b); if (appid == NULL) { - if ((alarm_info->alarm_type & ALARM_TYPE_NOLAUNCH) || + if ((base_info->alarm_type & ALARM_TYPE_NOLAUNCH) || (operation && !strcmp(operation, APPSVC_OPERATION_DEFAULT))) { LOGE("appid is invalid"); return ERR_ALARM_INVALID_PARAM; } } - mode = &alarm_info->mode; + mode = &base_info->mode; LOGW("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%ld), type(%d)", - alarm_info->start.day, alarm_info->start.month, alarm_info->start.year, - alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec, - alarm_info->end.year, alarm_info->end.month, alarm_info->end.day, - alarm_info->mode.repeat, alarm_info->mode.u_interval.interval, alarm_info->alarm_type); + base_info->start.day, base_info->start.month, base_info->start.year, + base_info->start.hour, base_info->start.min, base_info->start.sec, + base_info->end.year, base_info->end.month, base_info->end.day, + base_info->mode.repeat, base_info->mode.u_interval.interval, base_info->alarm_type); /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */ if (mode->repeat >= ALARM_REPEAT_MODE_MAX) return ERR_ALARM_INVALID_PARAM; - error_code = __check_validation(alarm_info, __FUNCTION__); + error_code = __check_validation(base_info, __FUNCTION__); if (error_code != ALARMMGR_RESULT_SUCCESS) return error_code; - if (!_send_alarm_create_appsvc(alarm_context, alarm_info, alarm_id, b, &error_code)) + if (!_send_alarm_create_appsvc(alarm_context, base_info, alarm_id, b, &error_code)) return error_code; return ALARMMGR_RESULT_SUCCESS; @@ -1031,12 +1033,12 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm, { char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 }; char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 }; - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; alarm_mode_t *mode; int ret; int error_code; - int i = 0; - int j = 0; + size_t i = 0; + size_t j = 0; LOGD("[alarm-lib]:alarm_create() is called\n"); @@ -1045,25 +1047,25 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm, return ERR_ALARM_INVALID_PARAM; } - alarm_info = (alarm_info_t *) alarm; - if (alarm_info == NULL || alarm_id == NULL) { + base_info = (base_info_t *) alarm; + if (base_info == NULL || alarm_id == NULL) { LOGE("Invalid parameter bundle\n"); return ERR_ALARM_INVALID_PARAM; } - __adjust_current_milliseconds(alarm_info); + __adjust_current_milliseconds(base_info); - mode = &alarm_info->mode; + mode = &base_info->mode; ret = __sub_init(); if (ret < 0) return ret; LOGD("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%ld), type(%d)", - alarm_info->start.day, alarm_info->start.month, alarm_info->start.year, - alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec, - alarm_info->end.year, alarm_info->end.month, alarm_info->end.day, - alarm_info->mode.repeat, alarm_info->mode.u_interval.interval, alarm_info->alarm_type); + base_info->start.day, base_info->start.month, base_info->start.year, + base_info->start.hour, base_info->start.min, base_info->start.sec, + base_info->end.year, base_info->end.month, base_info->end.day, + base_info->mode.repeat, base_info->mode.u_interval.interval, base_info->alarm_type); /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */ if (mode->repeat >= ALARM_REPEAT_MODE_MAX) { @@ -1076,7 +1078,7 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm, return ERR_ALARM_INVALID_PARAM; } - error_code = __check_validation(alarm_info, __FUNCTION__); + error_code = __check_validation(base_info, __FUNCTION__); if (error_code != ALARMMGR_RESULT_SUCCESS) return error_code; @@ -1095,52 +1097,77 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm, j++; } - if (!_send_alarm_create(alarm_context, alarm_info, alarm_id, dst_service_name, dst_service_name_mod, &error_code)) + if (!_send_alarm_create(alarm_context, base_info, alarm_id, dst_service_name, dst_service_name_mod, &error_code)) return error_code; } else { - if (!_send_alarm_create(alarm_context, alarm_info, alarm_id, "null", "null", &error_code)) + if (!_send_alarm_create(alarm_context, base_info, alarm_id, "null", "null", &error_code)) return error_code; } return ALARMMGR_RESULT_SUCCESS; } +EXPORT_API int alarmmgr_add_alarm_withcb_with_localtime(alarm_entry_t *alarm, + alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id) +{ + int ret; + + if (alarm == NULL || handler == NULL || alarm_id == NULL) { + LOGE("Invalid Parameter"); + return ERR_ALARM_INVALID_PARAM; + } + + __check_appid(); + ret = alarmmgr_init(g_appid); + if (ret < 0) + return ret; + + alarm->alarm_type |= ALARM_TYPE_WITHCB; + ret = alarmmgr_add_alarm_with_localtime(alarm, NULL, alarm_id); + if (ret != ALARMMGR_RESULT_SUCCESS) + return ret; + + __add_resultcb(*alarm_id, handler, user_param); + + return ALARMMGR_RESULT_SUCCESS; +} + EXPORT_API int alarmmgr_add_alarm_noti_with_localtime(alarm_entry_t *alarm, notification_h noti, alarm_id_t *alarm_id) { - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; int error_code = 0; - alarm_info = (alarm_info_t *)alarm; + base_info = (base_info_t *)alarm; alarm_mode_t *mode; - if (alarm_info == NULL || alarm_id == NULL) { + if (base_info == NULL || alarm_id == NULL) { LOGE("Invalid parameter\n"); return ERR_ALARM_INVALID_PARAM; } - __adjust_current_milliseconds(alarm_info); + __adjust_current_milliseconds(base_info); if (__alarmmgr_init_appsvc() < 0) { LOGE("Unable to initialize dbus!!!\n"); return ERR_ALARM_SYSTEM_FAIL; } - mode = &alarm_info->mode; + mode = &base_info->mode; LOGW("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%ld), type(%d)", - alarm_info->start.day, alarm_info->start.month, alarm_info->start.year, - alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec, - alarm_info->end.year, alarm_info->end.month, alarm_info->end.day, - alarm_info->mode.repeat, alarm_info->mode.u_interval.interval, alarm_info->alarm_type); + base_info->start.day, base_info->start.month, base_info->start.year, + base_info->start.hour, base_info->start.min, base_info->start.sec, + base_info->end.year, base_info->end.month, base_info->end.day, + base_info->mode.repeat, base_info->mode.u_interval.interval, base_info->alarm_type); /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */ if (mode->repeat >= ALARM_REPEAT_MODE_MAX) return ERR_ALARM_INVALID_PARAM; - error_code = __check_validation(alarm_info, __FUNCTION__); + error_code = __check_validation(base_info, __FUNCTION__); if (error_code != ALARMMGR_RESULT_SUCCESS) return error_code; - if (!_send_alarm_create_noti(alarm_context, alarm_info, alarm_id, noti, &error_code)) + if (!_send_alarm_create_noti(alarm_context, base_info, alarm_id, noti, &error_code)) return error_code; return ALARMMGR_RESULT_SUCCESS; @@ -1153,7 +1180,7 @@ EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time, int error_code = 0; int result = 0; int modified_alarm_type = 0; - alarm_info_t alarm_info; + base_info_t base_info; const char *operation = NULL; const char *appid = NULL; bundle *b; @@ -1202,16 +1229,16 @@ EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time, modified_alarm_type ^= ALARM_TYPE_INEXACT; } - _initialize_alarm_info(&alarm_info, modified_alarm_type | ALARM_TYPE_RELATIVE, + _initialize_alarm_info(&base_info, modified_alarm_type | ALARM_TYPE_RELATIVE, trigger_at_time, interval, false); - if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT) && - alarm_info.mode.u_interval.interval < MIN_INEXACT_INTERVAL) { - alarm_info.mode.u_interval.interval = MIN_INEXACT_INTERVAL; - alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT; + if ((base_info.alarm_type & ALARM_TYPE_INEXACT) && + base_info.mode.u_interval.interval < MIN_INEXACT_INTERVAL) { + base_info.mode.u_interval.interval = MIN_INEXACT_INTERVAL; + base_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT; } - if (!_send_alarm_create_appsvc(alarm_context, &alarm_info, alarm_id, b, &error_code)) + if (!_send_alarm_create_appsvc(alarm_context, &base_info, alarm_id, b, &error_code)) return error_code; @@ -1225,7 +1252,7 @@ EXPORT_API int alarmmgr_add_alarm_noti(int alarm_type, time_t trigger_at_time, alarm_id_t *alarm_id) { int error_code = 0; - alarm_info_t alarm_info; + base_info_t base_info; if (__alarmmgr_init_appsvc() < 0) { LOGE("Unable to initialize dbus!!!\n"); @@ -1242,16 +1269,16 @@ EXPORT_API int alarmmgr_add_alarm_noti(int alarm_type, time_t trigger_at_time, return ERR_ALARM_INVALID_PARAM; } - _initialize_alarm_info(&alarm_info, alarm_type | ALARM_TYPE_RELATIVE, + _initialize_alarm_info(&base_info, alarm_type | ALARM_TYPE_RELATIVE, trigger_at_time, interval, false); - if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT) && - alarm_info.mode.u_interval.interval < MIN_INEXACT_INTERVAL) { - alarm_info.mode.u_interval.interval = MIN_INEXACT_INTERVAL; - alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT; + if ((base_info.alarm_type & ALARM_TYPE_INEXACT) && + base_info.mode.u_interval.interval < MIN_INEXACT_INTERVAL) { + base_info.mode.u_interval.interval = MIN_INEXACT_INTERVAL; + base_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT; } - if (!_send_alarm_create_noti(alarm_context, &alarm_info, alarm_id, noti, &error_code)) + if (!_send_alarm_create_noti(alarm_context, &base_info, alarm_id, noti, &error_code)) return error_code; return ALARMMGR_RESULT_SUCCESS; @@ -1264,10 +1291,10 @@ static int _alarmmgr_add_alarm(int alarm_type, { char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 }; char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 }; - int i = 0; - int j = 0; + size_t i = 0; + size_t j = 0; int error_code; - alarm_info_t alarm_info; + base_info_t base_info; int ret; ret = __sub_init(); @@ -1289,7 +1316,7 @@ static int _alarmmgr_add_alarm(int alarm_type, return ERR_ALARM_INVALID_PARAM; } - _initialize_alarm_info(&alarm_info, alarm_type | ALARM_TYPE_RELATIVE, + _initialize_alarm_info(&base_info, alarm_type | ALARM_TYPE_RELATIVE, trigger_at_time, interval, precision); if (destination != NULL) { @@ -1310,13 +1337,13 @@ static int _alarmmgr_add_alarm(int alarm_type, j++; } - if (!_send_alarm_create(alarm_context, &alarm_info, + if (!_send_alarm_create(alarm_context, &base_info, alarm_id, dst_service_name, dst_service_name_mod, &error_code)) return error_code; } else { - if (!_send_alarm_create(alarm_context, &alarm_info, alarm_id, + if (!_send_alarm_create(alarm_context, &base_info, alarm_id, "null", "null", &error_code)) return error_code; } @@ -1346,7 +1373,7 @@ static int _alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time, alarm_id_t *alarm_id, bool precision) { int error_code = 0; - alarm_info_t alarm_info; + base_info_t base_info; int ret = 0; __check_appid(); @@ -1366,11 +1393,11 @@ static int _alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time, return ERR_ALARM_INVALID_PARAM; } - _initialize_alarm_info(&alarm_info, + _initialize_alarm_info(&base_info, alarm_type | ALARM_TYPE_RELATIVE | ALARM_TYPE_WITHCB, trigger_at_time, interval, precision); - if (!_send_alarm_create(alarm_context, &alarm_info, alarm_id, "null", "null", &error_code)) + if (!_send_alarm_create(alarm_context, &base_info, alarm_id, "null", "null", &error_code)) return error_code; __add_resultcb(*alarm_id, handler, user_param); @@ -1461,7 +1488,7 @@ EXPORT_API int alarmmgr_enum_alarm_ids(alarm_enum_fn_t fn, void *user_param) if (!_send_alarm_get_list_of_ids(alarm_context, maxnum_of_ids, &iter, &num_of_ids, &return_code)) return return_code; - while (g_variant_iter_loop(iter, "i", &alarm_id)) { + while (g_variant_iter_loop(iter, "(i)", &alarm_id)) { LOGD("alarm_id (%d)", alarm_id); (*fn)(alarm_id, user_param); } @@ -1473,7 +1500,7 @@ EXPORT_API int alarmmgr_enum_alarm_ids(alarm_enum_fn_t fn, void *user_param) EXPORT_API int alarmmgr_get_info(alarm_id_t alarm_id, alarm_entry_t *alarm) { int error_code; - alarm_info_t *alarm_info = (alarm_info_t *) alarm; + base_info_t *base_info = (base_info_t *) alarm; int ret; ret = __sub_init(); @@ -1482,12 +1509,12 @@ EXPORT_API int alarmmgr_get_info(alarm_id_t alarm_id, alarm_entry_t *alarm) LOGD("[alarm-lib]:alarm_get_info() is called\n"); - if (alarm_id < 0 || alarm_info == NULL) { - LOGE("[alarm-lib]:alarm_info is null or alar_id is invalid[%d].", alarm_id); + if (alarm_id < 0 || base_info == NULL) { + LOGE("[alarm-lib]:base_info is null or alar_id is invalid[%d].", alarm_id); return ERR_ALARM_INVALID_PARAM; } - if (!_send_alarm_get_info(alarm_context, alarm_id, alarm_info, &error_code)) + if (!_send_alarm_get_info(alarm_context, alarm_id, base_info, &error_code)) return error_code; return ALARMMGR_RESULT_SUCCESS; @@ -1638,12 +1665,6 @@ EXPORT_API int alarmmgr_set_systime64_async(time_t new_time, alarm_set_time_cb_t result_cb, user_param)) return ERR_ALARM_SYSTEM_FAIL; } else { -#if !(GLIB_CHECK_VERSION(2, 32, 0)) - g_thread_init(NULL); -#endif -#if !(GLIB_CHECK_VERSION(2, 36, 0)) - g_type_init(); -#endif param = g_try_new0(struct alarm_async_param_t, 1); if (param == NULL) { LOGE("Failed to alloc param"); @@ -1689,12 +1710,6 @@ EXPORT_API int alarmmgr_set_systime_with_propagation_delay_async(struct timespec new_time, req_time, result_cb, user_param)) return ERR_ALARM_SYSTEM_FAIL; } else { -#if !(GLIB_CHECK_VERSION(2, 32, 0)) - g_thread_init(NULL); -#endif -#if !(GLIB_CHECK_VERSION(2, 36, 0)) - g_type_init(); -#endif param = g_try_new0(struct alarm_async_param_t, 1); if (param == NULL) { LOGE("Failed to alloc param"); @@ -1770,7 +1785,7 @@ EXPORT_API int alarmmgr_get_global(const alarm_id_t alarm_id, EXPORT_API int alarmmgr_update_alarm(alarm_id_t alarm_id, alarm_entry_t *alarm, int update_flag) { - alarm_info_t *alarm_info; + base_info_t *base_info; int ret; LOGD("[alarm-lib]:alarmmgr_update_alarm() is called\n"); @@ -1780,8 +1795,8 @@ EXPORT_API int alarmmgr_update_alarm(alarm_id_t alarm_id, return ERR_ALARM_INVALID_PARAM; } - alarm_info = (alarm_info_t *) alarm; - if (alarm_info == NULL || alarm_id <= 0) { + base_info = (base_info_t *) alarm; + if (base_info == NULL || alarm_id <= 0) { LOGE("[alarm-lib]:alarm is NULL or invalid alarm_id[%d]\n", alarm_id); return ERR_ALARM_INVALID_PARAM; } @@ -1793,18 +1808,18 @@ EXPORT_API int alarmmgr_update_alarm(alarm_id_t alarm_id, return ret; LOGD("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%ld), type(%d)", - alarm_info->start.day, alarm_info->start.month, alarm_info->start.year, - alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec, - alarm_info->end.year, alarm_info->end.month, alarm_info->end.day, - alarm_info->mode.repeat, alarm_info->mode.u_interval.interval, alarm_info->alarm_type); + base_info->start.day, base_info->start.month, base_info->start.year, + base_info->start.hour, base_info->start.min, base_info->start.sec, + base_info->end.year, base_info->end.month, base_info->end.day, + base_info->mode.repeat, base_info->mode.u_interval.interval, base_info->alarm_type); if (update_flag == ALARM_UPDATE_FLAG_TIME) { - error_code = __check_validation(alarm_info, __FUNCTION__); + error_code = __check_validation(base_info, __FUNCTION__); if (error_code != ALARMMGR_RESULT_SUCCESS) return error_code; } - if (!_send_alarm_update(alarm_context, alarm_id, alarm_info, update_flag, &error_code)) + if (!_send_alarm_update(alarm_context, alarm_id, base_info, update_flag, &error_code)) return error_code; return ALARMMGR_RESULT_SUCCESS; diff --git a/mock/aul_mock.cc b/mock/aul_mock.cc new file mode 100644 index 0000000..521dc1b --- /dev/null +++ b/mock/aul_mock.cc @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "aul_mock.h" + +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" int aul_app_get_appid_bypid(int arg1, char* arg2, int arg3) { + return MOCK_HOOK_P3(AulMock, aul_app_get_appid_bypid, arg1, arg2, arg3); +} + +extern "C" int aul_app_get_pkgid_bypid_for_uid(int arg1, char* arg2, int arg3, + uid_t arg4) { + return MOCK_HOOK_P4(AulMock, aul_app_get_pkgid_bypid_for_uid, arg1, arg2, + arg3, arg4); +} diff --git a/mock/aul_mock.h b/mock/aul_mock.h new file mode 100644 index 0000000..ce34f54 --- /dev/null +++ b/mock/aul_mock.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_AUL_MOCK_H_ +#define UNIT_TESTS_MOCK_AUL_MOCK_H_ + +#include <aul.h> +#include <bundle.h> +#include <bundle_cpp.h> +#include <gmock/gmock.h> + +#include "module_mock.h" + +class AulMock : public virtual ModuleMock { + public: + AulMock() { + using ::testing::_; + using ::testing::Return; + using ::testing::Invoke; + + ON_CALL(*this, aul_app_get_appid_bypid(_, _, _)) + .WillByDefault(Invoke([&](int pid, char *appid, int len) -> int { + snprintf(appid, len, "test_appid"); + return 0; + })); + } + + virtual ~AulMock() {} + + MOCK_METHOD3(aul_app_get_appid_bypid, int (int, char*, int)); + MOCK_METHOD4(aul_app_get_pkgid_bypid_for_uid, int (int, char*, int, uid_t)); +}; + +#endif // UNIT_TESTS_MOCK_AUL_MOCK_H_ + diff --git a/mock/dbus_mock.cc b/mock/dbus_mock.cc new file mode 100644 index 0000000..77ff661 --- /dev/null +++ b/mock/dbus_mock.cc @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "dbus_mock.h" + +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" GDBusConnection* g_bus_get_sync(GBusType bus_type, + GCancellable* cancellable, GError** error) { + return MOCK_HOOK_P3(DbusMock, g_bus_get_sync, bus_type, cancellable, error); +} + +extern "C" GDBusProxy* g_dbus_proxy_new_sync(GDBusConnection* arg1, + GDBusProxyFlags arg2, GDBusInterfaceInfo* arg3, const gchar* arg4, + const gchar* arg5, const gchar* arg6, GCancellable* arg7, GError** arg8) { + return MOCK_HOOK_P8(DbusMock, g_dbus_proxy_new_sync, arg1, arg2, + arg3, arg4, arg5, arg6, arg7, arg8); +} + +extern "C" GDBusNodeInfo* g_dbus_node_info_new_for_xml(const gchar* arg1, + GError** arg2) { + return MOCK_HOOK_P2(DbusMock, g_dbus_node_info_new_for_xml, arg1, arg2); +} + +extern "C" guint g_bus_own_name_on_connection(GDBusConnection* arg1, + const gchar* arg2, GBusNameOwnerFlags arg3, GBusNameAcquiredCallback arg4, + GBusNameLostCallback arg5, gpointer arg6, GDestroyNotify arg7) { + return MOCK_HOOK_P7(DbusMock, g_bus_own_name_on_connection, arg1, arg2, + arg3, arg4, arg5, arg6, arg7); +} + +extern "C" guint g_dbus_connection_register_object(GDBusConnection* arg1, + const gchar* arg2, GDBusInterfaceInfo* arg3, + const GDBusInterfaceVTable* arg4, gpointer arg5, GDestroyNotify arg6, + GError** arg7) { + return MOCK_HOOK_P7(DbusMock, g_dbus_connection_register_object, arg1, arg2, + arg3, arg4, arg5, arg6, arg7); +} + +extern "C" gboolean g_dbus_connection_unregister_object(GDBusConnection* arg1, + guint arg2) { + return MOCK_HOOK_P2(DbusMock, g_dbus_connection_unregister_object, arg1, + arg2); +} + +extern "C" void g_dbus_method_invocation_return_value( + GDBusMethodInvocation* arg1, GVariant* arg2) { + MOCK_HOOK_P2(DbusMock, g_dbus_method_invocation_return_value, arg1, arg2); +} + +extern "C" void g_bus_unown_name(guint arg1) { + MOCK_HOOK_P1(DbusMock, g_bus_unown_name, arg1); +} + +extern "C" gboolean g_dbus_connection_emit_signal(GDBusConnection* arg1, + const gchar* arg2, const gchar* arg3, const gchar* arg4, const gchar* arg5, + GVariant* arg6, GError** arg7) { + return MOCK_HOOK_P7(DbusMock, g_dbus_connection_emit_signal, arg1, arg2, + arg3, arg4, arg5, arg6, arg7); +} + +extern "C" gboolean g_dbus_connection_flush_sync(GDBusConnection* arg1, + GCancellable* arg2, GError** arg3) { + return MOCK_HOOK_P3(DbusMock, g_dbus_connection_flush_sync, arg1, arg2, + arg3); +} + +extern "C" void g_dbus_node_info_unref(GDBusNodeInfo* arg1) { + MOCK_HOOK_P1(DbusMock, g_dbus_node_info_unref, arg1); +} + +extern "C" guint g_dbus_connection_signal_subscribe(GDBusConnection* arg1, + const gchar* arg2, const gchar* arg3, const gchar* arg4, const gchar* arg5, + const gchar* arg6, GDBusSignalFlags arg7, GDBusSignalCallback arg8, + gpointer arg9, GDestroyNotify arg10) { + return MOCK_HOOK_P10(DbusMock, g_dbus_connection_signal_subscribe, arg1, arg2, + arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); +} + +extern "C" GVariant* g_dbus_proxy_call_sync(GDBusProxy* arg1, + const gchar* arg2, GVariant* arg3, GDBusCallFlags arg4, gint arg5, + GCancellable* arg6, GError** arg7) { + return MOCK_HOOK_P7(DbusMock, g_dbus_proxy_call_sync, arg1, arg2, + arg3, arg4, arg5, arg6, arg7); +} + +extern "C" void g_dbus_proxy_call(GDBusProxy* arg1, const gchar* arg2, + GVariant* arg3, GDBusCallFlags arg4, gint arg5, GCancellable* arg6, + GAsyncReadyCallback arg7, gpointer arg8) { + return MOCK_HOOK_P8(DbusMock, g_dbus_proxy_call, arg1, arg2, + arg3, arg4, arg5, arg6, arg7, arg8); +} diff --git a/mock/dbus_mock.h b/mock/dbus_mock.h new file mode 100644 index 0000000..0e01c5b --- /dev/null +++ b/mock/dbus_mock.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_DBUS_MOCK_H_ +#define UNIT_TESTS_MOCK_DBUS_MOCK_H_ + +#include <gmock/gmock.h> +#include <glib.h> +#include <gio/gio.h> + +#include "module_mock.h" + +class DbusMock : public virtual ModuleMock { + public: + DbusMock() { + using ::testing::_; + using ::testing::Return; + using ::testing::Invoke; + + static int dummy; + GDBusConnection* conn = (GDBusConnection*)&dummy; + + ON_CALL(*this, g_bus_get_sync(_, _, _)) + .WillByDefault(Return(conn)); + } + + MOCK_METHOD3(g_bus_get_sync, GDBusConnection* (GBusType, GCancellable*, + GError**)); + MOCK_METHOD8(g_dbus_proxy_new_sync, GDBusProxy* (GDBusConnection*, + GDBusProxyFlags, GDBusInterfaceInfo*, const gchar*, const gchar*, + const gchar*, GCancellable*, GError**)); + MOCK_METHOD2(g_dbus_node_info_new_for_xml, GDBusNodeInfo* (const gchar*, + GError**)); + MOCK_METHOD7(g_bus_own_name_on_connection, guint (GDBusConnection*, + const gchar*, GBusNameOwnerFlags, GBusNameAcquiredCallback, + GBusNameLostCallback, gpointer, GDestroyNotify)); + MOCK_METHOD7(g_dbus_connection_register_object, guint (GDBusConnection*, + const gchar*, GDBusInterfaceInfo*, const GDBusInterfaceVTable*, gpointer, + GDestroyNotify, GError**)); + MOCK_METHOD2(g_dbus_connection_unregister_object, gboolean (GDBusConnection*, + guint)); + MOCK_METHOD2(g_dbus_method_invocation_return_value, + void (GDBusMethodInvocation*, GVariant*)); + MOCK_METHOD1(g_bus_unown_name, void (guint)); + MOCK_METHOD7(g_dbus_connection_emit_signal, gboolean (GDBusConnection*, + const gchar*, const gchar*, const gchar*, const gchar*, GVariant*, + GError**)); + MOCK_METHOD3(g_dbus_connection_flush_sync, gboolean (GDBusConnection*, + GCancellable*, GError**)); + MOCK_METHOD1(g_dbus_node_info_unref, void (GDBusNodeInfo*)); + MOCK_METHOD10(g_dbus_connection_signal_subscribe, guint (GDBusConnection*, + const gchar*, const gchar*, const gchar*, const gchar*, const gchar*, + GDBusSignalFlags, GDBusSignalCallback, gpointer, GDestroyNotify)); + MOCK_METHOD7(g_dbus_proxy_call_sync, GVariant* (GDBusProxy*, const gchar*, + GVariant*, GDBusCallFlags, gint, GCancellable*, GError**)); + MOCK_METHOD8(g_dbus_proxy_call, void (GDBusProxy*, const gchar*, GVariant*, + GDBusCallFlags, gint, GCancellable*, GAsyncReadyCallback, gpointer)); +}; + +#endif // UNIT_TESTS_MOCK_DBUS_MOCK_H_ + diff --git a/mock/fff.h b/mock/fff.h deleted file mode 100644 index 6289a58..0000000 --- a/mock/fff.h +++ /dev/null @@ -1,6493 +0,0 @@ -/* -LICENSE - -The MIT License (MIT) - -Copyright (c) 2010 Michael Long - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -#ifndef FAKE_FUNCTIONS -#define FAKE_FUNCTIONS - -#include <stdarg.h> -#include <string.h> /* For memset and memcpy */ - -#define FFF_MAX_ARGS (20u) -#ifndef FFF_ARG_HISTORY_LEN - #define FFF_ARG_HISTORY_LEN (50u) -#endif -#ifndef FFF_CALL_HISTORY_LEN - #define FFF_CALL_HISTORY_LEN (50u) -#endif -/* -- INTERNAL HELPER MACROS -- */ -#define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \ - FUNCNAME##_fake.return_val_seq = ARRAY_POINTER; \ - FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN; -#define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \ - FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER; \ - FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN; - -/* Defining a function to reset a fake function */ -#define RESET_FAKE(FUNCNAME) { \ - FUNCNAME##_reset(); \ -} \ - - -#define DECLARE_ARG(type, n, FUNCNAME) \ - type arg##n##_val; \ - type arg##n##_history[FFF_ARG_HISTORY_LEN]; - -#define DECLARE_ALL_FUNC_COMMON \ - unsigned int call_count; \ - unsigned int arg_history_len; \ - unsigned int arg_histories_dropped; \ - -#define DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - RETURN_TYPE return_val_history[FFF_ARG_HISTORY_LEN]; - -#define SAVE_ARG(FUNCNAME, n) \ - memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n)); - -#define ROOM_FOR_MORE_HISTORY(FUNCNAME) \ - FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN - -#define SAVE_RET_HISTORY(FUNCNAME, RETVAL) \ - if ((FUNCNAME##_fake.call_count - 1) < FFF_ARG_HISTORY_LEN) \ - memcpy((void *)&FUNCNAME##_fake.return_val_history[FUNCNAME##_fake.call_count - 1], (const void *) &RETVAL, sizeof(RETVAL)); \ - -#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \ - memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN)); - -#define HISTORY_DROPPED(FUNCNAME) \ - FUNCNAME##_fake.arg_histories_dropped++ - -#define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - RETURN_TYPE return_val; \ - int return_val_seq_len; \ - int return_val_seq_idx; \ - RETURN_TYPE * return_val_seq; \ - -#define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - int custom_fake_seq_len; \ - int custom_fake_seq_idx; \ - -#define INCREMENT_CALL_COUNT(FUNCNAME) \ - FUNCNAME##_fake.call_count++ - -#define RETURN_FAKE_RESULT(FUNCNAME) \ - if (FUNCNAME##_fake.return_val_seq_len){ /* then its a sequence */ \ - if(FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) { \ - SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx]) \ - return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++]; \ - } \ - SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]) \ - return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]; /* return last element */ \ - } \ - SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val) \ - return FUNCNAME##_fake.return_val; \ - -#ifdef __cplusplus - #define FFF_EXTERN_C extern "C"{ - #define FFF_END_EXTERN_C } -#else /* ansi c */ - #define FFF_EXTERN_C - #define FFF_END_EXTERN_C -#endif /* cpp/ansi c */ - -#define DEFINE_RESET_FUNCTION(FUNCNAME) \ - void FUNCNAME##_reset(void){ \ - memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \ - FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN; \ - } -/* -- END INTERNAL HELPER MACROS -- */ - -typedef void (*fff_function_t)(void); -typedef struct { - fff_function_t call_history[FFF_CALL_HISTORY_LEN]; - unsigned int call_history_idx; -} fff_globals_t; - -FFF_EXTERN_C -extern fff_globals_t fff; -FFF_END_EXTERN_C - -#define DEFINE_FFF_GLOBALS \ - FFF_EXTERN_C \ - fff_globals_t fff; \ - FFF_END_EXTERN_C - -#define FFF_RESET_HISTORY() \ - fff.call_history_idx = 0; \ - memset(fff.call_history, 0, sizeof(fff.call_history)); - -#define REGISTER_CALL(function) \ - if(fff.call_history_idx < FFF_CALL_HISTORY_LEN) \ - fff.call_history[fff.call_history_idx++] = (fff_function_t)function; - -#define DECLARE_FAKE_VOID_FUNC0(FUNCNAME) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(void); \ - void(**custom_fake_seq)(void); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(void); \ - -#define DEFINE_FAKE_VOID_FUNC0(FUNCNAME) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(void){ \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC0(FUNCNAME) \ - DECLARE_FAKE_VOID_FUNC0(FUNCNAME) \ - DEFINE_FAKE_VOID_FUNC0(FUNCNAME) \ - - -#define DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0); \ - void(**custom_fake_seq)(ARG0_TYPE arg0); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0); \ - -#define DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0){ \ - SAVE_ARG(FUNCNAME, 0); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \ - DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \ - DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1); \ - -#define DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \ - -#define DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \ - -#define DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \ - -#define DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \ - -#define DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \ - -#define DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \ - -#define DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \ - -#define DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \ - -#define DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \ - -#define DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \ - -#define DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \ - -#define DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \ - -#define DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \ - -#define DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \ - -#define DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \ - -#define DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \ - -#define DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \ - -#define DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - SAVE_ARG(FUNCNAME, 18); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - SAVE_ARG_HISTORY(FUNCNAME, 18); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \ - DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \ - -#define DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - SAVE_ARG(FUNCNAME, 18); \ - SAVE_ARG(FUNCNAME, 19); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - SAVE_ARG_HISTORY(FUNCNAME, 18); \ - SAVE_ARG_HISTORY(FUNCNAME, 19); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - } \ - else{ \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(void); \ - RETURN_TYPE(**custom_fake_seq)(void); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(void); \ - -#define DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(void){ \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \ - DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \ - DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \ - - -#define DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0); \ - -#define DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0){ \ - SAVE_ARG(FUNCNAME, 0); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \ - DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \ - DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1); \ - -#define DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \ - -#define DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \ - -#define DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \ - -#define DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \ - -#define DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \ - -#define DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \ - -#define DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \ - -#define DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \ - -#define DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \ - -#define DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \ - -#define DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \ - -#define DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \ - -#define DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \ - -#define DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \ - -#define DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \ - -#define DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \ - -#define DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \ - -#define DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - SAVE_ARG(FUNCNAME, 18); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - SAVE_ARG_HISTORY(FUNCNAME, 18); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \ - - -#define DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \ - DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \ - -#define DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - SAVE_ARG(FUNCNAME, 18); \ - SAVE_ARG(FUNCNAME, 19); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - SAVE_ARG_HISTORY(FUNCNAME, 18); \ - SAVE_ARG_HISTORY(FUNCNAME, 19); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - else{ \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - } \ - } \ - if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \ - - -#define DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ...); \ - -#define DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg0); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg0); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg0); \ - FUNCNAME##_fake.custom_fake(arg0, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...); \ - -#define DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg1); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg1); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg1); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...); \ - -#define DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg2); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg2); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg2); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...); \ - -#define DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg3); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg3); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg3); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...); \ - -#define DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg4); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg4); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg4); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...); \ - -#define DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg5); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg5); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg5); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...); \ - -#define DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg6); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg6); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg6); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...); \ - -#define DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg7); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg7); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg7); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...); \ - -#define DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg8); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg8); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg8); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...); \ - -#define DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg9); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg9); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg9); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...); \ - -#define DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg10); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg10); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg10); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...); \ - -#define DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg11); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg11); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg11); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...); \ - -#define DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg12); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg12); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg12); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...); \ - -#define DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg13); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg13); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg13); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...); \ - -#define DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg14); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg14); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg14); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...); \ - -#define DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg15); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg15); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg15); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...); \ - -#define DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg16); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg16); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg16); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...); \ - -#define DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg17); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg17); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg17); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - - -#define DECLARE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \ - void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...); \ - -#define DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - SAVE_ARG(FUNCNAME, 18); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - SAVE_ARG_HISTORY(FUNCNAME, 18); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg18); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - va_end(ap); \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg18); \ - FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - va_end(ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - va_list ap; \ - va_start(ap, arg18); \ - FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - va_end(ap); \ - } \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - DECLARE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg0); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg0); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg0); \ - ret = FUNCNAME##_fake.custom_fake(arg0, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg1); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg1); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg1); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg2); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg2); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg2); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg3); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg3); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg3); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg4); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg4); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg4); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg5); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg5); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg5); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg6); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg6); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg6); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg7); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg7); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg7); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg8); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg8); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg8); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg9); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg9); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg9); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg10); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg10); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg10); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg11); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg11); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg11); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg12); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg12); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg12); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg13); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg13); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg13); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg14); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg14); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg14); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg15); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg15); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg15); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg16); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg16); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg16); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg17); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg17); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg17); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \ - - -#define DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - typedef struct FUNCNAME##_Fake { \ - DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \ - DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \ - DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \ - DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \ - DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \ - DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \ - DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \ - DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \ - DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \ - DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \ - DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \ - DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \ - DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \ - DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \ - DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \ - DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \ - DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \ - DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \ - DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \ - DECLARE_ALL_FUNC_COMMON \ - DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \ - DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \ - DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \ - RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \ - RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \ - } FUNCNAME##_Fake; \ - extern FUNCNAME##_Fake FUNCNAME##_fake; \ - void FUNCNAME##_reset(void); \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...); \ - -#define DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - FUNCNAME##_Fake FUNCNAME##_fake; \ - RETURN_TYPE FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...){ \ - SAVE_ARG(FUNCNAME, 0); \ - SAVE_ARG(FUNCNAME, 1); \ - SAVE_ARG(FUNCNAME, 2); \ - SAVE_ARG(FUNCNAME, 3); \ - SAVE_ARG(FUNCNAME, 4); \ - SAVE_ARG(FUNCNAME, 5); \ - SAVE_ARG(FUNCNAME, 6); \ - SAVE_ARG(FUNCNAME, 7); \ - SAVE_ARG(FUNCNAME, 8); \ - SAVE_ARG(FUNCNAME, 9); \ - SAVE_ARG(FUNCNAME, 10); \ - SAVE_ARG(FUNCNAME, 11); \ - SAVE_ARG(FUNCNAME, 12); \ - SAVE_ARG(FUNCNAME, 13); \ - SAVE_ARG(FUNCNAME, 14); \ - SAVE_ARG(FUNCNAME, 15); \ - SAVE_ARG(FUNCNAME, 16); \ - SAVE_ARG(FUNCNAME, 17); \ - SAVE_ARG(FUNCNAME, 18); \ - if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \ - SAVE_ARG_HISTORY(FUNCNAME, 0); \ - SAVE_ARG_HISTORY(FUNCNAME, 1); \ - SAVE_ARG_HISTORY(FUNCNAME, 2); \ - SAVE_ARG_HISTORY(FUNCNAME, 3); \ - SAVE_ARG_HISTORY(FUNCNAME, 4); \ - SAVE_ARG_HISTORY(FUNCNAME, 5); \ - SAVE_ARG_HISTORY(FUNCNAME, 6); \ - SAVE_ARG_HISTORY(FUNCNAME, 7); \ - SAVE_ARG_HISTORY(FUNCNAME, 8); \ - SAVE_ARG_HISTORY(FUNCNAME, 9); \ - SAVE_ARG_HISTORY(FUNCNAME, 10); \ - SAVE_ARG_HISTORY(FUNCNAME, 11); \ - SAVE_ARG_HISTORY(FUNCNAME, 12); \ - SAVE_ARG_HISTORY(FUNCNAME, 13); \ - SAVE_ARG_HISTORY(FUNCNAME, 14); \ - SAVE_ARG_HISTORY(FUNCNAME, 15); \ - SAVE_ARG_HISTORY(FUNCNAME, 16); \ - SAVE_ARG_HISTORY(FUNCNAME, 17); \ - SAVE_ARG_HISTORY(FUNCNAME, 18); \ - } \ - else{ \ - HISTORY_DROPPED(FUNCNAME); \ - } \ - INCREMENT_CALL_COUNT(FUNCNAME); \ - REGISTER_CALL(FUNCNAME); \ - if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \ - if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \ - va_list ap; \ - va_start(ap, arg18); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - } \ - else{ \ - va_list ap; \ - va_start(ap, arg18); \ - RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - va_end(ap); \ - return ret; \ - return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - } \ - } \ - if(FUNCNAME##_fake.custom_fake){ \ - RETURN_TYPE ret; \ - va_list ap; \ - va_start(ap, arg18); \ - ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \ - va_end(ap); \ - SAVE_RET_HISTORY(FUNCNAME, ret); \ - return ret; \ - } \ - RETURN_FAKE_RESULT(FUNCNAME) \ - } \ - DEFINE_RESET_FUNCTION(FUNCNAME) \ - -#define FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \ - -/* MSVC expand macro fix */ -#define EXPAND(x) x - -#define PP_NARG_MINUS2(...) EXPAND(PP_NARG_MINUS2_(__VA_ARGS__, PP_RSEQ_N_MINUS2())) - -#define PP_NARG_MINUS2_(...) EXPAND(PP_ARG_MINUS2_N(__VA_ARGS__)) - -#define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N - -#define PP_RSEQ_N_MINUS2() 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 - -#define PP_NARG_MINUS1(...) EXPAND(PP_NARG_MINUS1_(__VA_ARGS__, PP_RSEQ_N_MINUS1())) - -#define PP_NARG_MINUS1_(...) EXPAND(PP_ARG_MINUS1_N(__VA_ARGS__)) - -#define PP_ARG_MINUS1_N( _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N - -#define PP_RSEQ_N_MINUS1() 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 - - - -/* DECLARE AND DEFINE FAKE FUNCTIONS - PLACE IN TEST FILES */ - -#define FAKE_VALUE_FUNC(...) EXPAND(FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__)) - -#define FUNC_VALUE_(N,...) EXPAND(FUNC_VALUE_N(N,__VA_ARGS__)) - -#define FUNC_VALUE_N(N,...) EXPAND(FAKE_VALUE_FUNC ## N(__VA_ARGS__)) - - -#define FAKE_VOID_FUNC(...) EXPAND(FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)) - -#define FUNC_VOID_(N,...) EXPAND(FUNC_VOID_N(N,__VA_ARGS__)) - -#define FUNC_VOID_N(N,...) EXPAND(FAKE_VOID_FUNC ## N(__VA_ARGS__)) - - -#define FAKE_VALUE_FUNC_VARARG(...) EXPAND(FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__)) - -#define FUNC_VALUE_VARARG_(N,...) EXPAND(FUNC_VALUE_VARARG_N(N,__VA_ARGS__)) - -#define FUNC_VALUE_VARARG_N(N,...) EXPAND(FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__)) - - -#define FAKE_VOID_FUNC_VARARG(...) EXPAND(FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)) - -#define FUNC_VOID_VARARG_(N,...) EXPAND(FUNC_VOID_VARARG_N(N,__VA_ARGS__)) - -#define FUNC_VOID_VARARG_N(N,...) EXPAND(FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__)) - - - -/* DECLARE FAKE FUNCTIONS - PLACE IN HEADER FILES */ - -#define DECLARE_FAKE_VALUE_FUNC(...) EXPAND(DECLARE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__)) - -#define DECLARE_FUNC_VALUE_(N,...) EXPAND(DECLARE_FUNC_VALUE_N(N,__VA_ARGS__)) - -#define DECLARE_FUNC_VALUE_N(N,...) EXPAND(DECLARE_FAKE_VALUE_FUNC ## N(__VA_ARGS__)) - - -#define DECLARE_FAKE_VOID_FUNC(...) EXPAND(DECLARE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)) - -#define DECLARE_FUNC_VOID_(N,...) EXPAND(DECLARE_FUNC_VOID_N(N,__VA_ARGS__)) - -#define DECLARE_FUNC_VOID_N(N,...) EXPAND(DECLARE_FAKE_VOID_FUNC ## N(__VA_ARGS__)) - - -#define DECLARE_FAKE_VALUE_FUNC_VARARG(...) EXPAND(DECLARE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__)) - -#define DECLARE_FUNC_VALUE_VARARG_(N,...) EXPAND(DECLARE_FUNC_VALUE_VARARG_N(N,__VA_ARGS__)) - -#define DECLARE_FUNC_VALUE_VARARG_N(N,...) EXPAND(DECLARE_FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__)) - - -#define DECLARE_FAKE_VOID_FUNC_VARARG(...) EXPAND(DECLARE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)) - -#define DECLARE_FUNC_VOID_VARARG_(N,...) EXPAND(DECLARE_FUNC_VOID_VARARG_N(N,__VA_ARGS__)) - -#define DECLARE_FUNC_VOID_VARARG_N(N,...) EXPAND(DECLARE_FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__)) - - - -/* DEFINE FAKE FUNCTIONS - PLACE IN SOURCE FILES */ - -#define DEFINE_FAKE_VALUE_FUNC(...) EXPAND(DEFINE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__)) - -#define DEFINE_FUNC_VALUE_(N,...) EXPAND(DEFINE_FUNC_VALUE_N(N,__VA_ARGS__)) - -#define DEFINE_FUNC_VALUE_N(N,...) EXPAND(DEFINE_FAKE_VALUE_FUNC ## N(__VA_ARGS__)) - - -#define DEFINE_FAKE_VOID_FUNC(...) EXPAND(DEFINE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)) - -#define DEFINE_FUNC_VOID_(N,...) EXPAND(DEFINE_FUNC_VOID_N(N,__VA_ARGS__)) - -#define DEFINE_FUNC_VOID_N(N,...) EXPAND(DEFINE_FAKE_VOID_FUNC ## N(__VA_ARGS__)) - - -#define DEFINE_FAKE_VALUE_FUNC_VARARG(...) EXPAND(DEFINE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__)) - -#define DEFINE_FUNC_VALUE_VARARG_(N,...) EXPAND(DEFINE_FUNC_VALUE_VARARG_N(N,__VA_ARGS__)) - -#define DEFINE_FUNC_VALUE_VARARG_N(N,...) EXPAND(DEFINE_FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__)) - - -#define DEFINE_FAKE_VOID_FUNC_VARARG(...) EXPAND(DEFINE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__)) - -#define DEFINE_FUNC_VOID_VARARG_(N,...) EXPAND(DEFINE_FUNC_VOID_VARARG_N(N,__VA_ARGS__)) - -#define DEFINE_FUNC_VOID_VARARG_N(N,...) EXPAND(DEFINE_FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__)) - - - - -#endif /* FAKE_FUNCTIONS */ diff --git a/mock/gio_fake.h b/mock/gio_fake.h deleted file mode 100644 index 5192754..0000000 --- a/mock/gio_fake.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef MOCK_GIO_H_ -#define MOCK_GIO_H_ - -#include "mock.h" - -#include <glib.h> -#include <gio/gio.h> - -DECLARE_FAKE_VALUE_FUNC(GDBusConnection*, g_bus_get_sync, - GBusType, GCancellable*, GError**); - -DECLARE_FAKE_VALUE_FUNC(GDBusProxy*, g_dbus_proxy_new_sync, - GDBusConnection*, GDBusProxyFlags, GDBusInterfaceInfo*, - const gchar*, const gchar*, const gchar*, GCancellable*, GError**); - -DECLARE_FAKE_VALUE_FUNC(GDBusNodeInfo*, g_dbus_node_info_new_for_xml, - const gchar*, GError**); - -DECLARE_FAKE_VALUE_FUNC(guint, g_bus_own_name_on_connection, GDBusConnection*, - const gchar*, GBusNameOwnerFlags,GBusNameAcquiredCallback, - GBusNameLostCallback, gpointer, GDestroyNotify); - -DECLARE_FAKE_VALUE_FUNC(guint, g_dbus_connection_register_object, - GDBusConnection*, const gchar*, GDBusInterfaceInfo*, - const GDBusInterfaceVTable*, gpointer, GDestroyNotify, GError**); - -DECLARE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_unregister_object, - GDBusConnection*, guint); - -DECLARE_FAKE_VOID_FUNC(g_dbus_method_invocation_return_value, - GDBusMethodInvocation*, GVariant*); - -DECLARE_FAKE_VALUE_FUNC(GVariant*, g_dbus_connection_call_sync, GDBusConnection*, - const gchar*, const gchar*, const gchar*, const gchar*, GVariant*, - const GVariantType*, GDBusCallFlags, gint, GCancellable*, GError**); - -DECLARE_FAKE_VALUE_FUNC(const gchar*, g_dbus_method_invocation_get_sender, - GDBusMethodInvocation*); - -DECLARE_FAKE_VOID_FUNC(g_bus_unown_name, guint); - -DECLARE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_emit_signal, - GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar*, - GVariant*, GError**); - -DECLARE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_flush_sync, - GDBusConnection*, GCancellable*, GError**); - -DECLARE_FAKE_VOID_FUNC(g_dbus_node_info_unref, GDBusNodeInfo*); - -DECLARE_FAKE_VALUE_FUNC(guint, g_dbus_connection_signal_subscribe, - GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar*, - const gchar*, GDBusSignalFlags, GDBusSignalCallback, gpointer, - GDestroyNotify); - -DECLARE_FAKE_VALUE_FUNC(GVariant*, g_dbus_proxy_call_sync, - GDBusProxy*, const gchar*, GVariant*, GDBusCallFlags, gint, - GCancellable*, GError**); - -DECLARE_FAKE_VOID_FUNC(g_dbus_proxy_call, - GDBusProxy*, const gchar*, GVariant*, GDBusCallFlags, gint, - GCancellable*, GAsyncReadyCallback, gpointer); -#endif //MOCK_GIO_H_ diff --git a/mock/glib_fake.h b/mock/glib_fake.h deleted file mode 100755 index a46077a..0000000 --- a/mock/glib_fake.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef MOCK_GLIB_H_ -#define MOCK_GLIB_H_ - -#include <glib.h> - -#include "mock.h" - -DECLARE_FAKE_VALUE_FUNC(gsize, g_variant_get_size, GVariant*); -DECLARE_FAKE_VALUE_FUNC3_VARARG(gboolean, g_variant_iter_loop, GVariantIter*, - const gchar*, ...); -DECLARE_FAKE_VOID_FUNC(g_variant_iter_free, GVariantIter*); -DECLARE_FAKE_VOID_FUNC(g_variant_unref, GVariant*); -DECLARE_FAKE_VALUE_FUNC(gpointer, g_hash_table_lookup, GHashTable*, gconstpointer); -DECLARE_FAKE_VALUE_FUNC(guint, g_hash_table_foreach_remove, GHashTable*, - GHRFunc, gpointer); -DECLARE_FAKE_VALUE_FUNC(gboolean, g_hash_table_insert, GHashTable*, - gpointer, gpointer); - -#endif //MOCK_GLIB_H_ diff --git a/mock/aul_fake.h b/mock/glib_mock.cc index 88393ab..1fa52e9 100644 --- a/mock/aul_fake.h +++ b/mock/glib_mock.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2021 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,15 +14,11 @@ * limitations under the License. */ -#ifndef MOCK_AUL_H_ -#define MOCK_AUL_H_ +#include "glib_mock.h" -#include <aul.h> +#include "mock_hook.h" +#include "test_fixture.h" -#include "mock.h" - -DECLARE_FAKE_VALUE_FUNC(int, aul_app_get_appid_bypid, int, char*, int); -DECLARE_FAKE_VALUE_FUNC(int, aul_app_get_pkgid_bypid_for_uid, int, char*, int, - uid_t); - -#endif //MOCK_AUL_H_ +extern "C" gsize g_variant_get_size(GVariant* arg1) { + return MOCK_HOOK_P1(GlibMock, g_variant_get_size, arg1); +} diff --git a/mock/notification_fake.h b/mock/glib_mock.h index 28e86f2..6aed636 100644 --- a/mock/notification_fake.h +++ b/mock/glib_mock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2021 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,17 +14,24 @@ * limitations under the License. */ -#ifndef MOCK_NOTIFICATION_H_ -#define MOCK_NOTIFICATION_H_ +#ifndef UNIT_TESTS_MOCK_GLIB_MOCK_H_ +#define UNIT_TESTS_MOCK_GLIB_MOCK_H_ +#include <gio/gio.h> #include <glib.h> -#include <notification.h> -#include <notification_ipc.h> +#include <gmock/gmock.h> -#include "mock.h" +#include "module_mock.h" -DECLARE_FAKE_VALUE_FUNC(notification_h, notification_create, notification_type_e); -DECLARE_FAKE_VALUE_FUNC(GVariant*, notification_ipc_make_gvariant_from_noti, - notification_h, bool); +class GlibMock : public virtual ModuleMock { + public: + GlibMock() { + using ::testing::_; + using ::testing::Return; + using ::testing::Invoke; + } -#endif //MOCK_NOTIFICATION_H_ + MOCK_METHOD1(g_variant_get_size, gsize (GVariant*)); +}; + +#endif // UNIT_TESTS_MOCK_GLIB_MOCK_H_ diff --git a/mock/mock.cc b/mock/mock.cc deleted file mode 100644 index 11aa6d1..0000000 --- a/mock/mock.cc +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "aul_fake.h" -#include "gio_fake.h" -#include "glib_fake.h" -#include "mock.h" -#include "notification_fake.h" -#include "pkgmgr_info_fake.h" - -DEFINE_FFF_GLOBALS; - -/* gio.h */ -DEFINE_FAKE_VALUE_FUNC(GDBusConnection*, g_bus_get_sync, - GBusType, GCancellable*, GError**); -DEFINE_FAKE_VALUE_FUNC(GDBusProxy*, g_dbus_proxy_new_sync, - GDBusConnection*, GDBusProxyFlags, GDBusInterfaceInfo*, - const gchar*, const gchar*, const gchar*, GCancellable*, GError**); -DEFINE_FAKE_VALUE_FUNC(GDBusNodeInfo*, g_dbus_node_info_new_for_xml, - const gchar*, GError**); -DEFINE_FAKE_VALUE_FUNC(guint, g_bus_own_name_on_connection, GDBusConnection*, - const gchar*, GBusNameOwnerFlags,GBusNameAcquiredCallback, - GBusNameLostCallback, gpointer, GDestroyNotify); -DEFINE_FAKE_VALUE_FUNC(guint, g_dbus_connection_register_object, - GDBusConnection*, const gchar*, GDBusInterfaceInfo*, - const GDBusInterfaceVTable*, gpointer, GDestroyNotify, GError**); -DEFINE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_unregister_object, - GDBusConnection*, guint); -DEFINE_FAKE_VOID_FUNC(g_dbus_method_invocation_return_value, - GDBusMethodInvocation*, GVariant*); -DEFINE_FAKE_VOID_FUNC(g_bus_unown_name, guint); -DEFINE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_emit_signal, - GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar*, - GVariant*, GError**); -DEFINE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_flush_sync, - GDBusConnection*, GCancellable*, GError**); -DEFINE_FAKE_VOID_FUNC(g_dbus_node_info_unref, GDBusNodeInfo*); -DEFINE_FAKE_VALUE_FUNC(guint, g_dbus_connection_signal_subscribe, - GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar*, - const gchar*, GDBusSignalFlags, GDBusSignalCallback, gpointer, - GDestroyNotify); -DEFINE_FAKE_VALUE_FUNC(GVariant*, g_dbus_proxy_call_sync, - GDBusProxy*, const gchar*, GVariant*, GDBusCallFlags, gint, - GCancellable*, GError**); -DEFINE_FAKE_VOID_FUNC(g_dbus_proxy_call, - GDBusProxy*, const gchar*, GVariant*, GDBusCallFlags, gint, - GCancellable*, GAsyncReadyCallback, gpointer); - -/* glib_fake.h */ -DEFINE_FAKE_VALUE_FUNC(const gchar*, g_dbus_method_invocation_get_sender, GDBusMethodInvocation*); -DEFINE_FAKE_VALUE_FUNC(gsize, g_variant_get_size, GVariant*); -DEFINE_FAKE_VALUE_FUNC3_VARARG(gboolean, g_variant_iter_loop, GVariantIter*, const gchar*, ...); -DEFINE_FAKE_VOID_FUNC(g_variant_iter_free, GVariantIter*); -DEFINE_FAKE_VOID_FUNC(g_variant_unref, GVariant*); -DEFINE_FAKE_VALUE_FUNC(gpointer, g_hash_table_lookup, GHashTable*, gconstpointer); -DEFINE_FAKE_VALUE_FUNC(guint, g_hash_table_foreach_remove, GHashTable*, - GHRFunc, gpointer); -DEFINE_FAKE_VALUE_FUNC(gboolean, g_hash_table_insert, GHashTable*, - gpointer, gpointer); - -/* aul.h */ -DEFINE_FAKE_VALUE_FUNC(int, aul_app_get_appid_bypid, int, char*, int); -DEFINE_FAKE_VALUE_FUNC(int, aul_app_get_pkgid_bypid_for_uid, int, char*, int, uid_t); - -/* notification.h */ -DEFINE_FAKE_VALUE_FUNC(notification_h, notification_create, notification_type_e); -DEFINE_FAKE_VALUE_FUNC(GVariant*, notification_ipc_make_gvariant_from_noti, notification_h, bool); - -/* pkgmgr_info_fake.h */ -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_get_usr_pkginfo, const char *, - uid_t, pkgmgrinfo_pkginfo_h*); -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_get_api_version, - pkgmgrinfo_pkginfo_h, char **); -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_is_global, - pkgmgrinfo_pkginfo_h, bool *); -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_destroy_pkginfo, - pkgmgrinfo_pkginfo_h); -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_appinfo_get_usr_appinfo, const char *, - uid_t, pkgmgrinfo_appinfo_h*); -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_appinfo_get_component_type, - pkgmgrinfo_appinfo_h, char **); -DEFINE_FAKE_VALUE_FUNC(int, pkgmgrinfo_appinfo_destroy_appinfo, - pkgmgrinfo_appinfo_h); diff --git a/mock/mock_hook.h b/mock/mock_hook.h new file mode 100644 index 0000000..e212cc1 --- /dev/null +++ b/mock/mock_hook.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_MOCK_HOOK_H_ +#define UNIT_TESTS_MOCK_MOCK_HOOK_H_ + +#define MOCK_HOOK_P0(MOCK_CLASS, f) \ + TestFixture::GetMock<MOCK_CLASS>().f() +#define MOCK_HOOK_P1(MOCK_CLASS, f, p1) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1) +#define MOCK_HOOK_P2(MOCK_CLASS, f, p1, p2) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2) +#define MOCK_HOOK_P3(MOCK_CLASS, f, p1, p2, p3) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2, p3) +#define MOCK_HOOK_P4(MOCK_CLASS, f, p1, p2, p3, p4) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2, p3, p4) +#define MOCK_HOOK_P5(MOCK_CLASS, f, p1, p2, p3, p4, p5) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2, p3, p4, p5) +#define MOCK_HOOK_P6(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2, p3, p4, p5, p6) +#define MOCK_HOOK_P7(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2, p3, p4, p5, p6, p7) +#define MOCK_HOOK_P8(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8) \ + TestFixture::GetMock<MOCK_CLASS>().f(p1, p2, p3, p4, p5, p6, p7, p8) +#define MOCK_HOOK_P10(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) \ + TestFixture::GetMock<MOCK_CLASS>().f( \ + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) +#define MOCK_HOOK_P11(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) \ + TestFixture::GetMock<MOCK_CLASS>().f( \ + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) + +#endif // UNIT_TESTS_MOCK_MOCK_HOOK_H_ diff --git a/mock/module_mock.h b/mock/module_mock.h new file mode 100644 index 0000000..9b19d89 --- /dev/null +++ b/mock/module_mock.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_MODULE_MOCK_H_ +#define UNIT_TESTS_MOCK_MODULE_MOCK_H_ + +class ModuleMock { + public: + virtual ~ModuleMock() {} +}; + +#endif // UNIT_TESTS_MOCK_MODULE_MOCK_H_ diff --git a/mock/notification_mock.cc b/mock/notification_mock.cc new file mode 100644 index 0000000..5a7fec6 --- /dev/null +++ b/mock/notification_mock.cc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "notification_mock.h" + +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" GVariant* notification_ipc_make_gvariant_from_noti( + notification_h arg1, bool arg2) { + return MOCK_HOOK_P2(NotificationMock, + notification_ipc_make_gvariant_from_noti, arg1, arg2); +} diff --git a/mock/notification_mock.h b/mock/notification_mock.h new file mode 100644 index 0000000..f6358d6 --- /dev/null +++ b/mock/notification_mock.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_NOTIFICATION_MOCK_H_ +#define UNIT_TESTS_MOCK_NOTIFICATION_MOCK_H_ + +#include <gmock/gmock.h> +#include <glib.h> +#include <notification.h> +#include <notification_ipc.h> + +#include "module_mock.h" + +class NotificationMock : public virtual ModuleMock { + public: + NotificationMock() { + using ::testing::_; + using ::testing::Return; + using ::testing::Invoke; + } + + MOCK_METHOD2(notification_ipc_make_gvariant_from_noti, + GVariant* (notification_h, bool)); +}; + +#endif // UNIT_TESTS_MOCK_NOTIFICATION_MOCK_H_ diff --git a/mock/pkgmgr_info_fake.h b/mock/pkgmgr_info_fake.h deleted file mode 100644 index 4b739dd..0000000 --- a/mock/pkgmgr_info_fake.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef MOCK_PKGMGR_INFO_H_ -#define MOCK_PKGMGR_INFO_H_ - -#include <pkgmgr-info.h> - -#include "mock.h" - -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_get_usr_pkginfo, const char *, - uid_t, pkgmgrinfo_pkginfo_h*); -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_get_api_version, - pkgmgrinfo_pkginfo_h, char **); -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_is_global, - pkgmgrinfo_pkginfo_h, bool *); -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_pkginfo_destroy_pkginfo, - pkgmgrinfo_pkginfo_h); -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_appinfo_get_usr_appinfo, const char *, - uid_t, pkgmgrinfo_appinfo_h*); -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_appinfo_get_component_type, - pkgmgrinfo_appinfo_h, char **); -DECLARE_FAKE_VALUE_FUNC(int, pkgmgrinfo_appinfo_destroy_appinfo, - pkgmgrinfo_appinfo_h); - - -#endif //MOCK_PKGMGR_INFO_H_ diff --git a/mock/pkgmgr_info_mock.cc b/mock/pkgmgr_info_mock.cc new file mode 100644 index 0000000..2c9f1ac --- /dev/null +++ b/mock/pkgmgr_info_mock.cc @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "pkgmgr_info_mock.h" + +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" int pkgmgrinfo_pkginfo_get_usr_pkginfo(const char* arg1, uid_t arg2, + pkgmgrinfo_pkginfo_h* arg3) { + return MOCK_HOOK_P3(PkgmgrInfoMock, pkgmgrinfo_pkginfo_get_usr_pkginfo, arg1, + arg2, arg3); +} + +extern "C" int pkgmgrinfo_pkginfo_get_api_version(pkgmgrinfo_pkginfo_h arg1, + char** arg2) { + return MOCK_HOOK_P2(PkgmgrInfoMock, pkgmgrinfo_pkginfo_get_api_version, arg1, + arg2); +} + +extern "C" int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h arg1, + bool* arg2) { + return MOCK_HOOK_P2(PkgmgrInfoMock, pkgmgrinfo_pkginfo_is_global, arg1, + arg2); +} + +extern "C" int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h arg1) { + return MOCK_HOOK_P1(PkgmgrInfoMock, pkgmgrinfo_pkginfo_destroy_pkginfo, + arg1); +} + +extern "C" int pkgmgrinfo_appinfo_get_usr_appinfo(const char* arg1, uid_t arg2, + pkgmgrinfo_appinfo_h* arg3) { + return MOCK_HOOK_P3(PkgmgrInfoMock, pkgmgrinfo_appinfo_get_usr_appinfo, arg1, + arg2, arg3); +} + +extern "C" int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_pkginfo_h arg1, + char** arg2) { + return MOCK_HOOK_P2(PkgmgrInfoMock, pkgmgrinfo_appinfo_get_pkgid, arg1, + arg2); +} + +extern "C" int pkgmgrinfo_appinfo_get_component_type(pkgmgrinfo_appinfo_h arg1, + char** arg2) { + return MOCK_HOOK_P2(PkgmgrInfoMock, pkgmgrinfo_appinfo_get_component_type, arg1, + arg2); +} + +extern "C" int pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo_h arg1) { + return MOCK_HOOK_P1(PkgmgrInfoMock, pkgmgrinfo_appinfo_destroy_appinfo, + arg1); +} diff --git a/mock/pkgmgr_info_mock.h b/mock/pkgmgr_info_mock.h new file mode 100644 index 0000000..9350fa2 --- /dev/null +++ b/mock/pkgmgr_info_mock.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_PKGMGR_INFO_MOCK_H_ +#define UNIT_TESTS_MOCK_PKGMGR_INFO_MOCK_H_ + +#include <gmock/gmock.h> +#include <pkgmgr-info.h> + +#include "module_mock.h" + +class PkgmgrInfoMock : public virtual ModuleMock { + public: + PkgmgrInfoMock() { + using ::testing::_; + using ::testing::Return; + using ::testing::Invoke; + } + + virtual ~PkgmgrInfoMock() {} + + MOCK_METHOD3(pkgmgrinfo_pkginfo_get_usr_pkginfo, + int (const char *, uid_t, pkgmgrinfo_pkginfo_h*)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_get_api_version, + int (pkgmgrinfo_pkginfo_h, char **)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_is_global, + int (pkgmgrinfo_pkginfo_h, bool *)); + MOCK_METHOD1(pkgmgrinfo_pkginfo_destroy_pkginfo, + int (pkgmgrinfo_pkginfo_h)); + MOCK_METHOD3(pkgmgrinfo_appinfo_get_usr_appinfo, + int (const char *, uid_t, pkgmgrinfo_appinfo_h*)); + MOCK_METHOD2(pkgmgrinfo_appinfo_get_pkgid, + int (pkgmgrinfo_pkginfo_h, char **)); + MOCK_METHOD2(pkgmgrinfo_appinfo_get_component_type, + int (pkgmgrinfo_appinfo_h, char **)); + MOCK_METHOD1(pkgmgrinfo_appinfo_destroy_appinfo, + int (pkgmgrinfo_appinfo_h)); +}; + +#endif // UNIT_TESTS_MOCK_PKGMGR_INFO_MOCK_H_ + diff --git a/mock/mock.h b/mock/test_fixture.cc index 0a8cab4..27f5666 100644 --- a/mock/mock.h +++ b/mock/test_fixture.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,8 @@ * limitations under the License. */ -#ifndef MOCK_MOCK_H__ -#define MOCK_MOCK_H__ +#include "test_fixture.h" -#include "fff.h" +#include <memory> -#endif // MOCK_MOCK_H__ +std::unique_ptr<ModuleMock> TestFixture::mock_; diff --git a/mock/test_fixture.h b/mock/test_fixture.h new file mode 100644 index 0000000..1ea3b8f --- /dev/null +++ b/mock/test_fixture.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_TEST_FIXTURE_H_ +#define UNIT_TESTS_MOCK_TEST_FIXTURE_H_ + +#include <gtest/gtest.h> + +#include <memory> +#include <stdexcept> +#include <string> +#include <utility> + +#include "module_mock.h" + +class TestFixture : public ::testing::Test { + public: + explicit TestFixture(std::unique_ptr<ModuleMock>&& mock) { + mock_ = std::move(mock); + } + virtual ~TestFixture() { + mock_.reset(); + } + + virtual void SetUp() {} + virtual void TearDown() {} + + template <typename T> + static T& GetMock() { + auto ptr = dynamic_cast<T*>(mock_.get()); + if (!ptr) + throw std::invalid_argument("The test does not provide mock of \"" + + std::string(typeid(T).name()) + "\""); + return *ptr; + } + + static std::unique_ptr<ModuleMock> mock_; +}; + +#endif // UNIT_TESTS_MOCK_TEST_FIXTURE_H_ diff --git a/mock/tzplatform_config_mock.cc b/mock/tzplatform_config_mock.cc new file mode 100644 index 0000000..7decf73 --- /dev/null +++ b/mock/tzplatform_config_mock.cc @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tzplatform_config_mock.h" + +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" const char* tzplatform_mkpath(enum tzplatform_variable arg1, const char* arg2) { + return MOCK_HOOK_P2(TzplatformConfigMock, tzplatform_mkpath, arg1, arg2); +}
\ No newline at end of file diff --git a/mock/tzplatform_config_mock.h b/mock/tzplatform_config_mock.h new file mode 100644 index 0000000..e0bc14e --- /dev/null +++ b/mock/tzplatform_config_mock.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UNIT_TESTS_MOCK_TZPLATFORM_CONFIG_MOCK_H_ +#define UNIT_TESTS_MOCK_TZPLATFORM_CONFIG_MOCK_H_ + +#include <tzplatform_config.h> +#include <gmock/gmock.h> + +#include "module_mock.h" + +class TzplatformConfigMock : public virtual ModuleMock { + public: + TzplatformConfigMock() { + using ::testing::_; + using ::testing::Return; + using ::testing::Invoke; + } + + MOCK_METHOD2(tzplatform_mkpath, const char* (enum tzplatform_variable, + const char*)); +}; + +#endif // UNIT_TESTS_MOCK_TZPLATFORM_CONFIG_MOCK_H_
\ No newline at end of file diff --git a/packaging/alarm-manager.spec b/packaging/alarm-manager.spec index 8ebb196..0eff0f4 100644 --- a/packaging/alarm-manager.spec +++ b/packaging/alarm-manager.spec @@ -1,6 +1,6 @@ Name: alarm-manager Summary: Alarm library -Version: 0.10.4 +Version: 0.12.36 Release: 1 Group: System/Libraries License: Apache-2.0 @@ -34,18 +34,18 @@ BuildRequires: pkgconfig(libsystemd) BuildRequires: pkgconfig(eventsystem) BuildRequires: pkgconfig(notification) BuildRequires: python-xml -BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(cert-svc-vcore) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) BuildRequires: pkgconfig(cynara-creds-gdbus) +BuildRequires: pkgconfig(gmock) +BuildRequires: pkgconfig(tizen-database) %if 0%{?gcov:1} BuildRequires: lcov -BuildRequires: zip %endif -%if 0%{?gtests:1} +%if 0%{?gcov:1} BuildRequires: pkgconfig(gmock) %endif Requires(post): /sbin/ldconfig @@ -174,16 +174,10 @@ MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` -DTZ_SYS_ETC=%{TZ_SYS_ETC} \ -D_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG:BOOL=${_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG} \ -DALARM_CONF_DIR=%{_datadir}/alarm-manager \ - -DBUILD_GTESTS=%{?gtests:1}%{!?gtests:0} \ -DBUILD_GCOV=%{?gcov:1}%{!?gcov:0} \ make %{?jobs:-j%jobs} -%if 0%{?gcov:1} -mkdir -p gcov-obj -find . -name '*.gcno' -exec cp '{}' gcov-obj ';' -%endif - %install rm -rf %{buildroot} %make_install @@ -197,22 +191,53 @@ ln -s ../alarm-server.service %{buildroot}%{_unitdir}/multi-user.target.wants/al ln -sf ../alarm-session-agent.socket %{buildroot}%{_unitdir_user}/sockets.target.wants/alarm-session-agent.socket mkdir -p %{buildroot}%{_tmpfilesdir} install -m 0644 %SOURCE4 %{buildroot}%{_tmpfilesdir}/alarm-manager.conf -mkdir -p %{buildroot}%{_libdir}/udev/rules.d -install -m 0644 %SOURCE5 %{buildroot}%{_libdir}/udev/rules.d +mkdir -p %{buildroot}/usr/lib/udev/rules.d +install -m 0644 %SOURCE5 %{buildroot}/usr/lib/udev/rules.d mkdir -p %{buildroot}%{logdir} %if 0%{?gcov:1} -mkdir -p %{buildroot}%{_datadir}/gcov/obj -install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj +builddir=$(basename $PWD) +gcno_obj_dir=%{buildroot}%{_datadir}/gcov/obj/%{name}/"$builddir" +mkdir -p "$gcno_obj_dir" +find . -name '*.gcno' -exec cp --parents '{}' "$gcno_obj_dir" ';' %endif +################################################# +# generate unittest automation script +################################################# +cat << EOF > run-unittest.sh +#!/bin/bash +setup() { + echo "setup start" +} + +test_main() { + echo "test_main start" + /usr/bin/gtest-alarmmgr +} + +teardown() { + echo "teardown start" +} + +main() { + setup + test_main + teardown +} + +main "$@" +EOF + +mkdir -p %{buildroot}%{_bindir}/tizen-unittests/%{name} +install -m 0755 run-unittest.sh %{buildroot}%{_bindir}/tizen-unittests/%{name} + %check -(cd unittest && LD_LIBRARY_PATH=../lib ctest -V) +export LD_LIBRARY_PATH=../lib +ctest -V %if 0%{?gcov:1} -lcov -c --ignore-errors graph --no-external -q -d . -o alarm-manager.info -genhtml alarm-manager.info -o alarm-manager.out -zip -r alarm-manager.zip alarm-manager.out -install -m 0644 alarm-manager.zip %{buildroot}%{_datadir}/gcov/ +lcov -c --ignore-errors mismatch,graph,unused --no-external -b . -d . -o %{name}.info +genhtml %{name}.info -o out --legend --show-details %endif %post -p /sbin/ldconfig @@ -231,7 +256,7 @@ install -m 0644 alarm-manager.zip %{buildroot}%{_datadir}/gcov/ if [ -e /etc/config/model-config.xml ]; then grep "feature\/profile.*tv" /etc/config/model-config.xml > /dev/null if [ $? -eq 0 ]; then - rm %{_libdir}/udev/rules.d/99-rtc.rules + rm /usr/lib/udev/rules.d/99-rtc.rules fi fi @@ -247,7 +272,7 @@ fi %license LICENSE %config %{_sysconfdir}/dbus-1/system.d/alarm-service.conf %{_tmpfilesdir}/alarm-manager.conf -%{_libdir}/udev/rules.d/99-rtc.rules +/usr/lib/udev/rules.d/99-rtc.rules %if 0%{?appfw_feature_alarm_manager_module_log} %attr(0755,root,root) %{TZ_SYS_ETC}/dump.d/module.d/alarmmgr_log_dump.sh %attr(0755,app_fw,app_fw) %{logdir} @@ -283,10 +308,9 @@ fi ################################################# # unittests ################################################# -%if 0%{?gtests:1} %files unittests %{_bindir}/gtest* -%endif +%{_bindir}/tizen-unittests/%{name}/run-unittest.sh ################################################# # gcov diff --git a/packaging/alarm-server.service b/packaging/alarm-server.service index f939f59..caed160 100644 --- a/packaging/alarm-server.service +++ b/packaging/alarm-server.service @@ -13,6 +13,7 @@ SecureBits=keep-caps TimeoutStopSec=3s Restart=on-failure RestartSec=0 +MemoryLimit=50M [Install] WantedBy=multi-user.target diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 2dc595d..30a3af4 100755 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -4,10 +4,12 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/server) AUX_SOURCE_DIRECTORY(./ SRCS) +ADD_DEFINITIONS("-DPLUGIN_LIB_DIR=\"${LIB_INSTALL_DIR}\"") + PKG_CHECK_MODULES(svr_pkgs REQUIRED glib-2.0 dlog aul bundle appsvc pkgmgr-info pkgmgr vconf - gio-2.0 gio-unix-2.0 capi-system-device libtzplatform-config libsystemd-login - eventsystem notification capi-system-info sqlite3 cert-svc-vcore - cynara-session cynara-client cynara-creds-gdbus) + gio-2.0 gio-unix-2.0 capi-system-device libtzplatform-config libsystemd + eventsystem notification sqlite3 cert-svc-vcore + cynara-session cynara-client cynara-creds-gdbus tizen-database) FOREACH(flag ${svr_pkgs_CFLAGS_OTHER}) IF(${flag} MATCHES "\\-D+") @@ -18,7 +20,10 @@ ENDFOREACH(flag) INCLUDE_DIRECTORIES(${svr_pkgs_INCLUDE_DIRS}) LINK_DIRECTORIES(${svr_pkgs_LIBRARY_DIRS}) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpie") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpie -fPIC") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} -fPIC -std=c++17") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2") ADD_EXECUTABLE(${SERVER} ${SRCS}) diff --git a/server/alarm-manager-db-migration.c b/server/alarm-manager-db-migration.c deleted file mode 100644 index 14bcc3f..0000000 --- a/server/alarm-manager-db-migration.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdio.h> -#include <sqlite3.h> - -#include "alarm-manager-db.h" - -extern sqlite3 *alarmmgr_db; - -int migration_func_version_1(void) -{ - static const char *query = "CREATE TABLE IF NOT EXISTS alarmmgr_temp (\n" \ - " alarm_id INTEGER PRIMARY KEY, \n" \ - " start INTEGER, \n" \ - " end INTEGER, \n" \ - " uid INTEGER, \n" \ - " global INTEGER, \n" \ - " is_disabled INTEGER, \n" \ - " caller_pkgid TEXT, \n" \ - " callee_pkgid TEXT, \n" \ - " app_unique_name TEXT, \n" \ - " app_service_name TEXT, \n" \ - " app_service_name_mod TEXT, \n" \ - " bundle TEXT, \n" \ - " noti_len INTEGER, \n" \ - " noti TEXT, \n" \ - " year INTEGER, \n" \ - " month INTEGER, \n" \ - " day INTEGER, \n" \ - " hour INTEGER, \n" \ - " min INTEGER, \n" \ - " sec INTEGER, \n" \ - " msec INTEGER, \n" \ - " day_of_week INTEGER, \n" \ - " repeat INTEGER, \n" \ - " alarm_type INTEGER, \n" \ - " reserved_info INTEGER, \n" \ - " dst_service_name TEXT, \n" \ - " dst_service_name_mod TEXT \n" \ - ")"; - - static const char *insert_query = "INSERT INTO alarmmgr_temp (alarm_id, start, \ - end, uid, global, is_disabled, caller_pkgid, callee_pkgid, \ - app_unique_name, app_service_name, app_service_name_mod, \ - bundle, noti_len, noti, year, month, day, hour, min, sec, msec,\ - day_of_week, repeat, alarm_type, reserved_info, \ - dst_service_name, dst_service_name_mod) \ - SELECT alarm_id, start, end, uid, global, is_disabled, \ - caller_pkgid, callee_pkgid, app_unique_name, app_service_name, \ - app_service_name_mod, bundle, noti_len, noti, year, month, \ - day, hour, min, sec, msec, day_of_week, repeat, alarm_type, \ - reserved_info, dst_service_name, dst_service_name_mod \ - FROM alarmmgr"; - - char *error_message = NULL; - int ret; - - LOGD("DB migration init version start"); - - ret = sqlite3_exec(alarmmgr_db, "DROP TABLE IF EXISTS alarmmgr_temp", NULL, - NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("Don't execute drop, error message = %s", error_message); - sqlite3_free(error_message); - return ret; - } - - ret = sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("Don't execute query = %s, error message = %s", query, error_message); - sqlite3_free(error_message); - return ret; - } - - ret = sqlite3_exec(alarmmgr_db, insert_query, NULL, NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("Don't execute query = %s, error message = %s", insert_query, error_message); - sqlite3_free(error_message); - return ret; - } - - ret = sqlite3_exec(alarmmgr_db, "DROP TABLE alarmmgr", NULL, NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("Don't execute drop alarmmgr, error message = %s", error_message); - sqlite3_free(error_message); - return ret; - } - - ret = sqlite3_exec(alarmmgr_db, "ALTER TABLE alarmmgr_temp RENAME TO alarmmgr", - NULL, NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("Don't execute alter, error message = %s", error_message); - sqlite3_free(error_message); - return ret; - } - - return ALARMMGR_RESULT_SUCCESS; -} diff --git a/server/alarm-manager-db.c b/server/alarm-manager-db.c deleted file mode 100644 index 0fdd4bf..0000000 --- a/server/alarm-manager-db.c +++ /dev/null @@ -1,780 +0,0 @@ -/* - * Copyright (c) 2000 - 2019 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <signal.h> -#include <string.h> -#include <sys/types.h> - -#include <sqlite3.h> -#include <glib.h> -#include <tzplatform_config.h> -#if !GLIB_CHECK_VERSION(2, 31, 0) -#include <glib/gmacros.h> -#endif - -#include "alarm-manager-db.h" - -#define ALARMMGR_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".alarmmgr.db") -#define QUERY_CREATE_TABLE_ALARMMGR \ - " CREATE TABLE IF NOT EXISTS alarmmgr (\n" \ - " alarm_id INTEGER PRIMARY KEY, \n" \ - " start INTEGER, \n" \ - " end INTEGER, \n" \ - " uid INTEGER, \n" \ - " global INTEGER, \n" \ - " is_disabled INTEGER, \n" \ - " caller_pkgid TEXT, \n" \ - " callee_pkgid TEXT, \n" \ - " app_unique_name TEXT, \n" \ - " app_service_name TEXT, \n" \ - " app_service_name_mod TEXT, \n" \ - " bundle TEXT, \n" \ - " noti_len INTEGER, \n" \ - " noti TEXT, \n" \ - " year INTEGER, \n" \ - " month INTEGER, \n" \ - " day INTEGER, \n" \ - " hour INTEGER, \n" \ - " min INTEGER, \n" \ - " sec INTEGER, \n" \ - " msec INTEGER, \n" \ - " day_of_week INTEGER, \n" \ - " repeat INTEGER, \n" \ - " alarm_type INTEGER, \n" \ - " reserved_info INTEGER, \n" \ - " dst_service_name TEXT, \n" \ - " dst_service_name_mod TEXT \n" \ - ")" - -enum schema_version -{ - SCHEMA_VERSION_0 = 0, - SCHEMA_VERSION_1 = 1, - SCHEMA_VERSION_LATEST = SCHEMA_VERSION_1 -} schema_version_e; - -typedef struct -{ - const char *change_log; - int (*func)(void); -} migration_func; - -extern GSList *g_disabled_alarm_list; -extern __alarm_server_context_t alarm_context; - -sqlite3 *alarmmgr_db; -static bool is_db_corrupted = false; - -static const migration_func m_func[] = -{ - {"SCHEMA_VERSION_0", NULL}, - {"SCHEMA_VERSION_1", migration_func_version_1} -}; - -static int __create_db_version(void) -{ - static const char *query = "CREATE TABLE IF NOT EXISTS schema_version (version INTEGER)"; - - if (sqlite3_exec(alarmmgr_db, query, NULL, NULL, NULL) != SQLITE_OK) { - LOGE("Failed to execute the query (%s)\n", sqlite3_errmsg(alarmmgr_db)); - return -1; - } - - return 0; -} - -static int __update_db_version(int ver) -{ - char *query; - - if (sqlite3_exec(alarmmgr_db, "DELETE FROM schema_version", NULL, NULL, NULL) - != SQLITE_OK) { - LOGE("Failed to execute the query (%s)\n", sqlite3_errmsg(alarmmgr_db)); - return -1; - } - - query = sqlite3_mprintf("INSERT INTO schema_version (version) VALUES (%d)", ver); - if (query == NULL) { - LOGE("Failed to alloc query"); - return -1; - } - - if (sqlite3_exec(alarmmgr_db, query, NULL, NULL, NULL) != SQLITE_OK) { - LOGE("Failed to execute the query (%s)\n", sqlite3_errmsg(alarmmgr_db)); - sqlite3_free(query); - return -1; - } - - sqlite3_free(query); - - return 0; -} - -static int __get_db_version(void) -{ - static const char *dml = "SELECT version FROM schema_version"; - sqlite3_stmt *stmt; - int ret; - - ret = sqlite3_prepare_v2(alarmmgr_db, dml, -1, &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("sqlite3_prepare_v2 error : %d", ret); - return -1; - } - - if (sqlite3_step(stmt) != SQLITE_ROW) - ret = -1; - else - ret = sqlite3_column_int(stmt, 0); - - sqlite3_reset(stmt); - sqlite3_clear_bindings(stmt); - sqlite3_finalize(stmt); - return ret; -} - -static int __db_upgrade(void) -{ - int ver, ret, i; - - ver = __get_db_version(); - if (ver >= SCHEMA_VERSION_LATEST) - return 0; - - if (sqlite3_exec(alarmmgr_db, "BEGIN TRANSACTION", NULL, NULL, NULL)) { - LOGE("begin transaction error : %s", sqlite3_errmsg(alarmmgr_db)); - return -1; - } - - if (ver == -1) { - LOGD("Schema version not exists : %d", ver); - ret = __create_db_version(); - if (ret != 0) - goto out; - - ver = SCHEMA_VERSION_0; - } - - for (i = ver + 1 ; i <= SCHEMA_VERSION_LATEST; i++) { - if (m_func[i].func() != ALARMMGR_RESULT_SUCCESS) { - ret = -1; - goto out; - } - - } - ret = __update_db_version(SCHEMA_VERSION_LATEST); - -out: - if (ret == 0) { - if (sqlite3_exec(alarmmgr_db, "END TRANSACTION", NULL, NULL, NULL)) - LOGE("end transaction error : %s", sqlite3_errmsg(alarmmgr_db)); - } else { - if (sqlite3_exec(alarmmgr_db, "ROLLBACK TRANSACTION", NULL, NULL, NULL)) - LOGE("rollback transaction error : %s", sqlite3_errmsg(alarmmgr_db)); - } - return ret; -} - -static int __db_busyhandler(void *pData, int count) -{ - if (5 - count > 0) { - struct timespec time = { - .tv_sec = 0, - .tv_nsec = (count + 1) * 100 * 1000 * 1000 - }; - nanosleep(&time, NULL); - LOGD("alarmmgr_db: busy handler called. count: %d", count + 1); - return 1; - } else { - LOGD("alarmmgr_db: busy handler will return SQLITE_BUSY error"); - return 0; - } -} - -bool _save_alarms(__alarm_info_t *__alarm_info) -{ - char *error_message = NULL; - alarm_info_t *alarm_info = - (alarm_info_t *) &(__alarm_info->alarm_info); - alarm_date_t *start = &alarm_info->start; - alarm_mode_t *mode = &alarm_info->mode; - - char *query = sqlite3_mprintf("insert into alarmmgr( alarm_id, start,\ - end, uid, global, is_disabled, caller_pkgid, callee_pkgid, app_unique_name,\ - app_service_name, app_service_name_mod, bundle, noti_len, noti, year,\ - month, day, hour, min, sec, msec, day_of_week, repeat,\ - alarm_type, reserved_info, dst_service_name, dst_service_name_mod)\ - values (%d,%lld,%lld,%d,%d,0,%Q,%Q,%Q,%Q,%Q,%Q,%d,%Q,%d,%d,%d,%d,%d,%d,%d,%d,%d,\ - %d,%lld,%Q,%Q)",\ - __alarm_info->alarm_id, - (gint64)__alarm_info->start, - (gint64)__alarm_info->end, - __alarm_info->uid, - __alarm_info->global, - CHECK_NULL_STRING(__alarm_info->caller_pkgid), - CHECK_NULL_STRING(__alarm_info->callee_pkgid), - CHECK_NULL_STRING(__alarm_info->app_unique_name), - CHECK_NULL_STRING(__alarm_info->app_service_name), - CHECK_NULL_STRING(__alarm_info->app_service_name_mod), - CHECK_NULL_STRING(__alarm_info->bundle), - __alarm_info->noti ? strlen(__alarm_info->noti) : 0, - CHECK_NULL_STRING(__alarm_info->noti), - start->year, - start->month, - start->day, - start->hour, - start->min, - start->sec, - alarm_info->msec, - mode->u_interval.day_of_week, - mode->repeat, - alarm_info->alarm_type, - (gint64)alarm_info->reserved_info, - CHECK_NULL_STRING(__alarm_info->dst_service_name), - CHECK_NULL_STRING(__alarm_info->dst_service_name_mod)); - - if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) { - SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message); - sqlite3_free(error_message); - sqlite3_free(query); - return false; - } - - sqlite3_free(query); - return true; -} - -bool _update_alarms(__alarm_info_t *__alarm_info) -{ - char *error_message = NULL; - alarm_info_t *alarm_info = - (alarm_info_t *) &(__alarm_info->alarm_info); - alarm_date_t *start = &alarm_info->start; - alarm_mode_t *mode = &alarm_info->mode; - - char *query = sqlite3_mprintf("update alarmmgr set start=%lld, end=%lld,\ - uid=%d, global=%d, is_disabled=0, caller_pkgid=%Q, callee_pkgid=%Q, app_unique_name=%Q, app_service_name=%Q, app_service_name_mod=%Q,\ - bundle=%Q, noti_len=%d, noti=%Q, year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d, msec=%d,\ - day_of_week=%d, repeat=%d, alarm_type=%d,\ - reserved_info=%lld, dst_service_name=%Q, dst_service_name_mod=%Q\ - where alarm_id=%d",\ - (gint64)__alarm_info->start, - (gint64)__alarm_info->end, - __alarm_info->uid, - __alarm_info->global, - CHECK_NULL_STRING(__alarm_info->caller_pkgid), - CHECK_NULL_STRING(__alarm_info->callee_pkgid), - CHECK_NULL_STRING(__alarm_info->app_unique_name), - CHECK_NULL_STRING(__alarm_info->app_service_name), - CHECK_NULL_STRING(__alarm_info->app_service_name_mod), - CHECK_NULL_STRING(__alarm_info->bundle), - __alarm_info->noti ? strlen(__alarm_info->noti) : 0, - CHECK_NULL_STRING(__alarm_info->noti), - start->year, - start->month, - start->day, - start->hour, - start->min, - start->sec, - alarm_info->msec, - mode->u_interval.day_of_week, - mode->repeat, - alarm_info->alarm_type, - (gint64)alarm_info->reserved_info, - CHECK_NULL_STRING(__alarm_info->dst_service_name), - CHECK_NULL_STRING(__alarm_info->dst_service_name_mod), - __alarm_info->alarm_id); - - if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) { - SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message); - sqlite3_free(error_message); - sqlite3_free(query); - return false; - } - - sqlite3_free(query); - return true; -} - -bool _delete_alarms(alarm_id_t alarm_id) -{ - char *error_message = NULL; - char *query = sqlite3_mprintf("delete from alarmmgr where alarm_id=%d", alarm_id); - - if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) { - SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message); - sqlite3_free(error_message); - sqlite3_free(query); - return false; - } - - sqlite3_free(query); - return true; -} - -void _load_alarms_from_db() -{ - int i = 0; - int col_idx; - const char *query = "select * from alarmmgr"; - const char *null_str = "null"; - sqlite3_stmt *stmt = NULL; - const char *tail = NULL; - alarm_info_t *alarm_info = NULL; - __alarm_info_t *__alarm_info = NULL; - alarm_date_t *start = NULL; - alarm_mode_t *mode = NULL; - int is_disabled; - char caller_pkgid[MAX_PKG_ID_LEN] = {0,}; - char callee_pkgid[MAX_PKG_ID_LEN] = {0,}; - char app_unique_name[MAX_APP_ID_LEN] = {0,}; - char app_service_name[MAX_SERVICE_NAME_LEN] = {0,}; - char app_service_name_mod[MAX_SERVICE_NAME_LEN] = {0,}; - char dst_service_name[MAX_SERVICE_NAME_LEN] = {0,}; - char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = {0,}; - char bundle[MAX_BUNDLE_NAME_LEN] = {0,}; - int noti_len; - char *noti; - gint64 start_64, end_64, reserved_info_64; - - if (SQLITE_OK != sqlite3_prepare(alarmmgr_db, query, strlen(query), &stmt, &tail)) { - LOGE("sqlite3_prepare() is failed."); - return; - } - - for (i = 0; SQLITE_ROW == sqlite3_step(stmt); i++) { - col_idx = 0; - __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t)); - - if (G_UNLIKELY(__alarm_info == NULL)) { - LOGE("Memory allocation failed."); - goto done; - } - alarm_info = (alarm_info_t *) &(__alarm_info->alarm_info); - start = &alarm_info->start; - mode = &alarm_info->mode; - - __alarm_info->alarm_id = sqlite3_column_int(stmt, col_idx++); - start_64 = sqlite3_column_int64(stmt, col_idx++); - __alarm_info->start = (time_t)start_64; - end_64 = sqlite3_column_int64(stmt, col_idx++); - __alarm_info->end = (time_t)end_64; - __alarm_info->uid = sqlite3_column_int(stmt, col_idx++); - __alarm_info->global = sqlite3_column_int(stmt, col_idx++); - is_disabled = sqlite3_column_int(stmt, col_idx++); - - strncpy(caller_pkgid, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_PKG_ID_LEN - 1); - strncpy(callee_pkgid, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_PKG_ID_LEN - 1); - strncpy(app_unique_name, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_APP_ID_LEN - 1); - strncpy(app_service_name, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_SERVICE_NAME_LEN - 1); - strncpy(app_service_name_mod, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_SERVICE_NAME_LEN - 1); - strncpy(bundle, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_BUNDLE_NAME_LEN - 1); - noti_len = sqlite3_column_int(stmt, col_idx++); - noti_len = noti_len ? noti_len : strlen(null_str); - noti = (char *)calloc(1, noti_len + 1); - if (noti) - strncpy(noti, (const char *)sqlite3_column_text(stmt, col_idx++), - noti_len); - start->year = sqlite3_column_int(stmt, col_idx++); - start->month = sqlite3_column_int(stmt, col_idx++); - start->day = sqlite3_column_int(stmt, col_idx++); - start->hour = sqlite3_column_int(stmt, col_idx++); - start->min = sqlite3_column_int(stmt, col_idx++); - start->sec = sqlite3_column_int(stmt, col_idx++); - alarm_info->msec = sqlite3_column_int(stmt, col_idx++); - mode->u_interval.day_of_week = sqlite3_column_int(stmt, col_idx++); - mode->repeat = (alarm_repeat_mode_t)sqlite3_column_int(stmt, col_idx++); - alarm_info->alarm_type = sqlite3_column_int(stmt, col_idx++); - reserved_info_64 = sqlite3_column_int64(stmt, col_idx++); - alarm_info->reserved_info = (time_t)reserved_info_64; - strncpy(dst_service_name, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_SERVICE_NAME_LEN - 1); - strncpy(dst_service_name_mod, (const char *)sqlite3_column_text(stmt, col_idx++), - MAX_SERVICE_NAME_LEN - 1); - - __alarm_info->caller_pkgid = STRDUP_WITH_NULLCMP(caller_pkgid); - __alarm_info->callee_pkgid = STRDUP_WITH_NULLCMP(callee_pkgid); - __alarm_info->app_unique_name = STRDUP_WITH_NULLCMP(app_unique_name); - __alarm_info->app_service_name = STRDUP_WITH_NULLCMP(app_service_name); - __alarm_info->app_service_name_mod = - STRDUP_WITH_NULLCMP(app_service_name_mod); - __alarm_info->dst_service_name = STRDUP_WITH_NULLCMP(dst_service_name); - __alarm_info->dst_service_name_mod = - STRDUP_WITH_NULLCMP(dst_service_name_mod); - __alarm_info->bundle = STRDUP_WITH_NULLCMP(bundle); - if (noti) { - __alarm_info->noti = STRDUP_WITH_NULLCMP(noti); - free(noti); - } - - if (is_disabled) { - _alarm_set_next_duetime(__alarm_info); - g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, __alarm_info); - LOGW("Save alarm_id[%d] caller[%s] callee[%s]", __alarm_info->alarm_id, caller_pkgid, callee_pkgid); - } else { - _alarm_set_next_duetime(__alarm_info); - alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info); - } - } -done: - _alarm_schedule(); - if (sqlite3_finalize(stmt) != SQLITE_OK) - LOGE("sqlite3_finalize() is failed."); - - return; -} - -int _get_db_path_for_all_info(uid_t uid, char** db_path) -{ - sqlite3 *alarmmgr_tool_db; - char db_path_tmp[50] = {0,}; - const char *query_for_creating_table = "create table alarmmgr_tool \ - (alarm_id integer primary key,\ - duetime_epoch integer,\ - duetime text,\ - start_epoch integer,\ - end_epoch integer,\ - global integer,\ - caller_pkgid text,\ - callee_pkgid text,\ - app_unique_name text,\ - app_service_name text,\ - dst_service_name text,\ - day_of_week integer,\ - repeat integer,\ - alarm_type integer)"; - const char *query_for_deleting_table = "drop table alarmmgr_tool"; - time_t current_time = 0; - struct tm current_tm; - GSList *gs_iter = NULL; - __alarm_info_t *entry = NULL; - char *error_message = NULL; - int index = 0; - - /* Open a DB */ - time(¤t_time); - localtime_r(¤t_time, ¤t_tm); - snprintf(db_path_tmp, sizeof(db_path_tmp), "/tmp/alarmmgr_%d%d%d_%02d%02d%02d.db", - current_tm.tm_year + 1900, current_tm.tm_mon + 1, current_tm.tm_mday, current_tm.tm_hour, current_tm.tm_min, current_tm.tm_sec); - *db_path = strdup(db_path_tmp); - if (*db_path == NULL) { - LOGE("Out of memory"); - return ERR_ALARM_SYSTEM_FAIL; - } - - if (sqlite3_open(db_path_tmp, &alarmmgr_tool_db) != SQLITE_OK) { - LOGE("Failed to open [%s]", db_path_tmp); - return ERR_ALARM_SYSTEM_FAIL; - } - - /* Register busy handler */ - if (sqlite3_busy_handler(alarmmgr_tool_db, __db_busyhandler, NULL) != SQLITE_OK) { - LOGE("Failed to register the busy handler"); - sqlite3_close(alarmmgr_tool_db); - return ERR_ALARM_SYSTEM_FAIL; - } - - /* Drop a table */ - if (sqlite3_exec(alarmmgr_tool_db, query_for_deleting_table, NULL, NULL, &error_message) != SQLITE_OK) { - LOGE("Deleting the table is failed. error message = %s", error_message); - sqlite3_free(error_message); - } - - /* Create a table if it does not exist */ - if (sqlite3_exec(alarmmgr_tool_db, query_for_creating_table, NULL, NULL, &error_message) != SQLITE_OK) { - LOGE("Creating the table is failed. error message = %s", error_message); - sqlite3_free(error_message); - sqlite3_close(alarmmgr_tool_db); - return ERR_ALARM_SYSTEM_FAIL; - } - - /* Get information of all alarms and save those into the DB. */ - for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { - entry = (__alarm_info_t*)gs_iter->data; - if (uid >= REGULAR_UID_MIN && entry->uid != uid) - continue; - ++index; - SECURE_LOGD("#%d alarm id[%d] app_name[%s] duetime[%ld]", - index, entry->alarm_id, entry->app_unique_name, entry->start); - - alarm_info_t *alarm_info = (alarm_info_t *) &(entry->alarm_info); - alarm_mode_t *mode = &alarm_info->mode; - - char *query = sqlite3_mprintf("insert into alarmmgr_tool( alarm_id, duetime_epoch, duetime, start_epoch,\ - end_epoch, global, caller_pkgid, callee_pkgid, app_unique_name, app_service_name, dst_service_name, day_of_week, repeat, alarm_type)\ - values (%d,%d,%Q,%d,%d,%d,%Q,%Q,%Q,%Q,%Q,%d,%d,%d)", - entry->alarm_id, - (int)entry->due_time, - ctime(&(entry->due_time)), - (int)entry->start, - (int)entry->end, - (bool)entry->global, - CHECK_NULL_STRING(entry->caller_pkgid), - CHECK_NULL_STRING(entry->callee_pkgid), - CHECK_NULL_STRING(entry->app_unique_name), - CHECK_NULL_STRING(entry->app_service_name), - CHECK_NULL_STRING(entry->dst_service_name), - mode->u_interval.day_of_week, - mode->repeat, - entry->alarm_info.alarm_type); - - if (sqlite3_exec(alarmmgr_tool_db, query, NULL, NULL, &error_message) != SQLITE_OK) { - SECURE_LOGE("sqlite3_exec() is failed. error message = %s", error_message); - sqlite3_free(error_message); - } - - sqlite3_free(query); - } - - sqlite3_close(alarmmgr_tool_db); - return ALARMMGR_RESULT_SUCCESS; -} - -gboolean _update_relative_alarms(gpointer user_data) -{ - GSList *iter = NULL; - __alarm_info_t *entry = NULL; - char *error_message = NULL; - - if (sqlite3_exec(alarmmgr_db, "BEGIN EXCLUSIVE", NULL, NULL, &error_message) != SQLITE_OK) { - SECURE_LOGE("sqlite3_exec() is failed. error message = %s", error_message); - sqlite3_free(error_message); - return false; - } - - for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { - entry = (__alarm_info_t *)iter->data; - alarm_info_t *alarm_info = &(entry->alarm_info); - if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) - _update_alarms(entry); - } - - if (sqlite3_exec(alarmmgr_db, "COMMIT", NULL, NULL, &error_message) != SQLITE_OK) { - SECURE_LOGE("sqlite3_exec() is failed. error message = %s", error_message); - sqlite3_free(error_message); - return false; - } - - return false; -} - -bool _alarm_set_global_to_db(__alarm_info_t *alarm_info, bool global) -{ - - char *error_message = NULL; - char *query = sqlite3_mprintf("update alarmmgr set global=%d where alarm_id=%d", - alarm_info->global, alarm_info->alarm_id); - - if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) { - SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message); - sqlite3_free(query); - sqlite3_free(error_message); - return false; - } - - sqlite3_free(query); - return true; -} - -void _update_db_for_disabled_alarm(alarm_id_t alarm_id, bool disabled) -{ - char *error_message = NULL; - - LOGW("Update (%d) is_disabled to (%d)", alarm_id, disabled); - char *query = sqlite3_mprintf("update alarmmgr set is_disabled=%d where alarm_id=%d", disabled, alarm_id); - - if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) { - SECURE_LOGE("Failed to update the DB table. error message = %s", error_message); - sqlite3_free(error_message); - } - - sqlite3_free(query); - return; -} - -int __check_callback(void *pid, int argc, char **argv, char **notUsed2) -{ - if (strcmp(argv[0], "ok") != 0) { - LOGE("check integrity result : %s" , argv[0]); - is_db_corrupted = true; - return -1; - } else { - LOGD("check integrity result : %s" , argv[0]); - } - - return 0; -} - -int __check_alarmmgr_table(sqlite3 *alarmmgr_db, bool *is_exist) -{ - sqlite3_stmt *stmt = NULL; - int count, sqlret; - - sqlret = sqlite3_prepare_v2(alarmmgr_db, - "SELECT COUNT(*) FROM sqlite_master WHERE name='alarmmgr'", - -1, &stmt, NULL); - if (sqlret != SQLITE_OK) { - /* LCOV_EXCL_START */ - LOGE("sqlite3_prepare_v2 failed [%d][%s]", sqlret, - sqlite3_errmsg(alarmmgr_db)); - return sqlret; - /* LCOV_EXCL_STOP */ - } - - sqlret = sqlite3_step(stmt); - if (sqlret == SQLITE_ROW) - count = sqlite3_column_int(stmt, 0); - else - count = 0; - - LOGD("DB search result[%d]", count); - - if (count > 0) - *is_exist = true; - else - *is_exist = false; - - sqlite3_finalize(stmt); - - return SQLITE_OK; - -} -bool _initialize_db() -{ - char *error_message = NULL; - int ret; - bool is_exist; - - /* Create or Open the DB file */ - ret = sqlite3_open(ALARMMGR_DB_FILE, &alarmmgr_db); - if (ret != SQLITE_OK) { - LOGE("Failed to open [%s]. error: %s", ALARMMGR_DB_FILE, sqlite3_errmsg(alarmmgr_db)); - if (ret == SQLITE_CORRUPT) - goto recover; - else - return false; - } - /* Register busy handler */ - ret = sqlite3_busy_handler(alarmmgr_db, __db_busyhandler, NULL); - if (ret != SQLITE_OK) { - LOGE("Failed to register the busy handler"); - if (ret == SQLITE_CORRUPT) { - goto recover; - } else { - sqlite3_close(alarmmgr_db); - return false; - } - } - - ret = __check_alarmmgr_table(alarmmgr_db, &is_exist); - if (ret != SQLITE_OK) { - if (ret == SQLITE_CORRUPT) { - goto recover; - } else { - sqlite3_close(alarmmgr_db); - return false; - } - } - - /* Create alarmmgr table */ - ret = sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message); - if (ret == SQLITE_CORRUPT || ret == SQLITE_NOTADB) { - goto recover; - } else { - sqlite3_close(alarmmgr_db); - sqlite3_free(error_message); - return false; - } - } - - if (is_exist == false) { - if (__create_db_version() != 0) { - sqlite3_close(alarmmgr_db); - return false; - } - - if (__update_db_version(SCHEMA_VERSION_LATEST) != 0) { - sqlite3_close(alarmmgr_db); - return false; - } - } else { - ret = __db_upgrade(); - if (ret) { - LOGE("Failed db's migration"); - sqlite3_close(alarmmgr_db); - return false; - } - } - - /* Check integrity of DB */ - ret = sqlite3_exec(alarmmgr_db, "PRAGMA integrity_check", __check_callback, NULL, 0); - if (ret != SQLITE_OK || is_db_corrupted) { - LOGE("Loss alarm db's integrity"); - goto recover; - } - - return true; - -recover: - if (alarmmgr_db) - sqlite3_close(alarmmgr_db); - if (error_message) - sqlite3_free(error_message); - unlink(ALARMMGR_DB_FILE); - - ret = sqlite3_open(ALARMMGR_DB_FILE, &alarmmgr_db); - if (ret != SQLITE_OK) { - LOGE("[recover] Failed to open [%s]. error: %s", ALARMMGR_DB_FILE, sqlite3_errmsg(alarmmgr_db)); - return false; - } - - ret = sqlite3_busy_handler(alarmmgr_db, __db_busyhandler, NULL); - if (ret != SQLITE_OK) { - LOGE("[recover] Failed to register the busy handler"); - sqlite3_close(alarmmgr_db); - return false; - } - - ret = sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message); - if (ret != SQLITE_OK) { - LOGE("[recover] Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message); - sqlite3_close(alarmmgr_db); - sqlite3_free(error_message); - return false; - } - - if (__create_db_version() != 0) { - sqlite3_close(alarmmgr_db); - return false; - } - - if (__update_db_version(SCHEMA_VERSION_LATEST) != 0) { - sqlite3_close(alarmmgr_db); - return false; - } - - return true; -} diff --git a/server/alarm-manager-db.cc b/server/alarm-manager-db.cc new file mode 100644 index 0000000..73f564f --- /dev/null +++ b/server/alarm-manager-db.cc @@ -0,0 +1,864 @@ +/* +* Copyright (c) 2000 - 2023 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +#include "alarm-manager-db.h" + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <signal.h> +#include <string.h> +#include <sys/types.h> +#include <sqlite3.h> +#include <glib.h> +#include <tzplatform_config.h> + +#include <database.hpp> + +extern GSList* g_disabled_alarm_list; +extern __alarm_server_context_t alarm_context; + +namespace { + +constexpr const char QUERY_CREATE_TABLE_ALARMMGR[] = R"__alarm( +CREATE TABLE IF NOT EXISTS alarmmgr ( + alarm_id INTEGER PRIMARY KEY, + start INTEGER, + end INTEGER, + uid INTEGER, + global INTEGER, + is_disabled INTEGER, + caller_pkgid TEXT, + callee_pkgid TEXT, + app_unique_name TEXT, + app_service_name TEXT, + app_service_name_mod TEXT, + bundle TEXT, + noti_len INTEGER, + noti TEXT, + year INTEGER, + month INTEGER, + day INTEGER, + hour INTEGER, + min INTEGER, + sec INTEGER, + msec INTEGER, + day_of_week INTEGER, + repeat INTEGER, + alarm_type INTEGER, + reserved_info INTEGER, + dst_service_name TEXT, + dst_service_name_mod TEXT) +)__alarm"; + +constexpr const int LATEST_SETTIME_ID = -2; + +enum SchemaVersion { + SCHEMA_VERSION_0 = 0, + SCHEMA_VERSION_1 = 1, + SCHEMA_VERSION_LATEST = SCHEMA_VERSION_1 +}; + +struct MigrationFunc { + const char *change_log; + int (*func)(void); +}; + +std::unique_ptr<tizen_base::Database> alarmmgr_db; +bool is_db_corrupted = false; + +char* GetCString(int idx, const tizen_base::Database::Result::Record& rec, + int max_size = -1) { + std::optional<std::string> str = rec.GetString(idx); + if (!str) + return nullptr; + if (*str == "null") + return nullptr; + + if (max_size > 0) { + return strdup(str->substr(max_size).c_str()); + } + + return strdup(str->c_str()); +} + +int MigrationFuncVersion1() { + static const char query[] = + "CREATE TABLE IF NOT EXISTS alarmmgr_temp (" + " alarm_id INTEGER PRIMARY KEY, " + " start INTEGER, " + " end INTEGER, " + " uid INTEGER, " + " global INTEGER, " + " is_disabled INTEGER, " + " caller_pkgid TEXT, " + " callee_pkgid TEXT, " + " app_unique_name TEXT, " + " app_service_name TEXT, " + " app_service_name_mod TEXT, " + " bundle TEXT, " + " noti_len INTEGER, " + " noti TEXT, " + " year INTEGER, " + " month INTEGER, " + " day INTEGER, " + " hour INTEGER, " + " min INTEGER, " + " sec INTEGER, " + " msec INTEGER, " + " day_of_week INTEGER, " + " repeat INTEGER, " + " alarm_type INTEGER, " + " reserved_info INTEGER, " + " dst_service_name TEXT, " + " dst_service_name_mod TEXT " + ")"; + + static const char insert_query[] = + "INSERT INTO alarmmgr_temp (alarm_id, start, " + "end, uid, global, is_disabled, caller_pkgid, callee_pkgid, " + "app_unique_name, app_service_name, app_service_name_mod, " + "bundle, noti_len, noti, year, month, day, hour, min, sec, msec, " + "day_of_week, repeat, alarm_type, reserved_info, " + "dst_service_name, dst_service_name_mod) " + "SELECT alarm_id, start, end, uid, global, is_disabled, " + "caller_pkgid, callee_pkgid, app_unique_name, app_service_name, " + "app_service_name_mod, bundle, noti_len, noti, year, month, " + "day, hour, min, sec, msec, day_of_week, repeat, alarm_type, " + "reserved_info, dst_service_name, dst_service_name_mod " + "FROM alarmmgr"; + + LOGD("DB migration init version start"); + alarmmgr_db->OneStepExec({ "DROP TABLE IF EXISTS alarmmgr_temp" }); + alarmmgr_db->OneStepExec({ query }); + alarmmgr_db->OneStepExec({ insert_query }); + alarmmgr_db->OneStepExec({ "DROP TABLE alarmmgr" }); + alarmmgr_db->OneStepExec({ "ALTER TABLE alarmmgr_temp RENAME TO alarmmgr" }); + + return ALARMMGR_RESULT_SUCCESS; +} + +const MigrationFunc m_func[] = { + { "SCHEMA_VERSION_0", nullptr }, + { "SCHEMA_VERSION_1", MigrationFuncVersion1 } +}; + +const char* GetAlarmDbFile() { + static std::string str; + + if (!str.empty()) + return str.c_str(); + + str = tzplatform_mkpath(TZ_SYS_DB, ".alarmmgr.db"); + return str.c_str(); +} + +int CreateDbVersion() { + alarmmgr_db->OneStepExec( + { "CREATE TABLE IF NOT EXISTS schema_version (version INTEGER)" }); + return 0; +} + +int UpdateDbVersion(int ver) { + auto r = alarmmgr_db->Exec({ "DELETE FROM schema_version" }); + if (!r) { + LOGE("db.Exec() failed: %s", static_cast<const char*>(r)); + return -1; + } + + auto q = tizen_base::Database::Sql( + "INSERT INTO schema_version (version) VALUES (?)") + .Bind(ver); + r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec() failed: %s", static_cast<const char*>(r)); + return -1; + } + + return 0; +} + +int GetDbVersion() { + auto r = alarmmgr_db->Exec({ "SELECT version FROM schema_version" }); + if (!r) { + LOGE("db.Exec() failed: %s", static_cast<const char*>(r)); + return -1; + } + + auto rec = r.GetFirstRecord(); + if (!rec) + return -1; + return static_cast<int>(rec->Get(0)); +} + +int DbUpgrade() { + int ver = GetDbVersion(); + if (ver >= SCHEMA_VERSION_LATEST) + return 0; + + auto guard = alarmmgr_db->CreateTransactionGuard(); + if (ver == -1) { + LOGD("Schema version not exists : %d", ver); + int ret = CreateDbVersion(); + if (ret != 0) + return ret; + + ver = SCHEMA_VERSION_0; + } + + for (int i = ver + 1 ; i <= SCHEMA_VERSION_LATEST; i++) { + if (m_func[i].func() != ALARMMGR_RESULT_SUCCESS) + return -1; + } + + int ret = UpdateDbVersion(SCHEMA_VERSION_LATEST); + guard.Commit(); + + return ret; +} + +bool DbBusyHandler(int count) { + if (5 - count > 0) { + struct timespec time = { + .tv_sec = 0, + .tv_nsec = (count + 1) * 100 * 1000 * 1000 + }; + nanosleep(&time, nullptr); + LOGD("alarmmgr_db: busy handler called. count: %d", count + 1); + return true; + } else { + LOGD("alarmmgr_db: busy handler will return SQLITE_BUSY error"); + return false; + } +} + +bool ReopenDb() { + unlink(GetAlarmDbFile()); + try { + alarmmgr_db.reset( + new tizen_base::Database( + GetAlarmDbFile(), SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + DbBusyHandler)); + alarmmgr_db->OneStepExec({ QUERY_CREATE_TABLE_ALARMMGR }); + } catch (const tizen_base::DbException& e) { + LOGE("[ReopenDb] Failed error: %s", e.msg()); + alarmmgr_db.reset(); + return false; + } + + if (CreateDbVersion() != 0) { + alarmmgr_db.reset(); + return false; + } + + if (UpdateDbVersion(SCHEMA_VERSION_LATEST) != 0) { + alarmmgr_db.reset(); + return false; + } + + return true; +} + +void RecoverDb() { +} + +int CheckAlarmMgrTable(const tizen_base::Database& db, bool* is_exist) { + auto r = db.Exec( + { "SELECT COUNT(*) FROM sqlite_master WHERE name='alarmmgr'" }); + if (!r) { + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + return static_cast<int>(r); + } + + auto rec = r.GetFirstRecord(); + if (!rec) { + *is_exist = false; + return SQLITE_OK; + } + + int count = static_cast<int>(rec->Get(0)); + LOGD("DB search result[%d]", count); + + if (count > 0) + *is_exist = true; + else + *is_exist = false; + + return SQLITE_OK; +} + +int CheckCallback(void* pid, int argc, char** argv, char** notUsed2) { + if (strcmp(argv[0], "ok") != 0) { + LOGE("check integrity result : %s" , argv[0]); + is_db_corrupted = true; + return -1; + } else { + LOGD("check integrity result : %s" , argv[0]); + } + + return 0; +} + +bool SaveAlarms(__alarm_info_t* __alarm_info) { + base_info_t* base_info = static_cast<base_info_t*>( + &(__alarm_info->base_info)); + alarm_date_t* start = &base_info->start; + alarm_mode_t* mode = &base_info->mode; + + auto q = tizen_base::Database::Sql( + "INSERT INTO alarmmgr (alarm_id, start, end, uid, global, is_disabled, " + "caller_pkgid, callee_pkgid, app_unique_name, app_service_name, " + "app_service_name_mod, bundle, noti_len, noti, year, month, day, " + "hour, min, sec, msec, day_of_week, repeat, alarm_type, reserved_info, " + "dst_service_name, dst_service_name_mod) " + "VALUES (?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " + "?, ?, ?, ?, ?, ?)") + .Bind(__alarm_info->alarm_id) + .Bind(static_cast<int64_t>(__alarm_info->start)) + .Bind(static_cast<int64_t>(__alarm_info->end)) + .Bind(static_cast<int>(__alarm_info->uid)) + .Bind(__alarm_info->global) + .Bind(__alarm_info->caller_pkgid) + .Bind(__alarm_info->callee_pkgid) + .Bind(__alarm_info->app_unique_name) + .Bind(__alarm_info->app_service_name) + .Bind(__alarm_info->app_service_name_mod) + .Bind(__alarm_info->bundle) + .Bind(__alarm_info->noti ? + static_cast<int>(strlen(__alarm_info->noti)) : 0) + .Bind(__alarm_info->noti) + .Bind(start->year) + .Bind(start->month) + .Bind(start->day) + .Bind(start->hour) + .Bind(start->min) + .Bind(start->sec) + .Bind(base_info->msec) + .Bind(mode->u_interval.day_of_week) + .Bind(mode->repeat) + .Bind(base_info->alarm_type) + .Bind(static_cast<int64_t>(base_info->reserved_info)) + .Bind(__alarm_info->dst_service_name) + .Bind(__alarm_info->dst_service_name_mod); + auto r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + return false; + } + + return true; +} + +bool UpdateAlarms(__alarm_info_t* __alarm_info) { + base_info_t* base_info = + static_cast<base_info_t*>(&(__alarm_info->base_info)); + alarm_date_t* start = &base_info->start; + alarm_mode_t* mode = &base_info->mode; + + auto q = tizen_base::Database::Sql( + "UPDATE alarmmgr SET start=?, end=?, uid=?, global=?, is_disabled=0, " + "caller_pkgid=?, callee_pkgid=?, app_unique_name=?, app_service_name=?, " + "app_service_name_mod=?, bundle=?, noti_len=?, noti=?, year=?, month=?, " + "day=?, hour=?, min=?, sec=?, msec=?, day_of_week=?, repeat=?, " + "alarm_type=?, reserved_info=?, dst_service_name=?, " + "dst_service_name_mod=? WHERE alarm_id=?") + .Bind(static_cast<int64_t>(__alarm_info->start)) + .Bind(static_cast<int64_t>(__alarm_info->end)) + .Bind(static_cast<int>(__alarm_info->uid)) + .Bind(__alarm_info->global) + .Bind(__alarm_info->caller_pkgid) + .Bind(__alarm_info->callee_pkgid) + .Bind(__alarm_info->app_unique_name) + .Bind(__alarm_info->app_service_name) + .Bind(__alarm_info->app_service_name_mod) + .Bind(__alarm_info->bundle) + .Bind(__alarm_info->noti ? + static_cast<int>(strlen(__alarm_info->noti)) : 0) + .Bind(__alarm_info->noti) + .Bind(start->year) + .Bind(start->month) + .Bind(start->day) + .Bind(start->hour) + .Bind(start->min) + .Bind(start->sec) + .Bind(base_info->msec) + .Bind(mode->u_interval.day_of_week) + .Bind(mode->repeat) + .Bind(base_info->alarm_type) + .Bind(static_cast<int64_t>(base_info->reserved_info)) + .Bind(__alarm_info->dst_service_name) + .Bind(__alarm_info->dst_service_name_mod) + .Bind(__alarm_info->alarm_id); + + auto r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec() failed: %s", static_cast<const char*>(r)); + return false; + } + + return true; +} + +bool DeleteAlarms(alarm_id_t alarm_id) { + auto q = tizen_base::Database::Sql( + "DELETE FROM alarmmgr WHERE alarm_id=?") + .Bind(alarm_id); + + auto r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + return false; + } + + return true; +} + +void LoadAlarmsFromDb() { + if (!alarmmgr_db) + return; + + auto r = alarmmgr_db->Exec({ "SELECT * FROM alarmmgr" }); + if (!r) { + LOGE("db.Exec() failed: %s", static_cast<const char*>(r)); + return; + } + + for (const auto& rec : r) { + int col_idx = 0; + __alarm_info_t* __alarm_info = reinterpret_cast<__alarm_info_t*>( + calloc(1, sizeof(__alarm_info_t))); + + if (G_UNLIKELY(__alarm_info == nullptr)) { + LOGE("Memory allocation failed."); + break; + } + + base_info_t* base_info = (base_info_t *) &(__alarm_info->base_info); + alarm_date_t* start = &base_info->start; + alarm_mode_t* mode = &base_info->mode; + __alarm_info->alarm_id = static_cast<int>(rec.Get(col_idx++)); + int64_t start_64 = static_cast<int64_t>(rec.Get(col_idx++)); + __alarm_info->start = static_cast<time_t>(start_64); + int64_t end_64 = static_cast<int64_t>(rec.Get(col_idx++)); + __alarm_info->end = static_cast<time_t>(end_64); + __alarm_info->uid = static_cast<int>(rec.Get(col_idx++)); + __alarm_info->global = static_cast<int>(rec.Get(col_idx++)); + int is_disabled = static_cast<int>(rec.Get(col_idx++)); + __alarm_info->caller_pkgid = GetCString(col_idx++, rec); + __alarm_info->callee_pkgid = GetCString(col_idx++, rec); + __alarm_info->app_unique_name = GetCString(col_idx++, rec); + __alarm_info->app_service_name = GetCString(col_idx++, rec); + __alarm_info->app_service_name_mod = GetCString(col_idx++, rec); + __alarm_info->bundle = GetCString(col_idx++, rec); + int noti_len = static_cast<int>(rec.Get(col_idx++)); + noti_len = noti_len ? noti_len : strlen("null"); + __alarm_info->noti = GetCString(col_idx++, rec, noti_len); + start->year = static_cast<int>(rec.Get(col_idx++)); + start->month = static_cast<int>(rec.Get(col_idx++)); + start->day = static_cast<int>(rec.Get(col_idx++)); + start->hour = static_cast<int>(rec.Get(col_idx++)); + start->min = static_cast<int>(rec.Get(col_idx++)); + start->sec = static_cast<int>(rec.Get(col_idx++)); + base_info->msec = static_cast<int>(rec.Get(col_idx++)); + mode->u_interval.day_of_week = static_cast<int>(rec.Get(col_idx++)); + mode->repeat = static_cast<alarm_repeat_mode_t>(static_cast<int>(rec.Get(col_idx++))); + base_info->alarm_type = static_cast<int>(rec.Get(col_idx++)); + int64_t reserved_info_64 = static_cast<int64_t>(rec.Get(col_idx++)); + base_info->reserved_info = static_cast<time_t>(reserved_info_64); + __alarm_info->dst_service_name = GetCString(col_idx++, rec); + __alarm_info->dst_service_name_mod = GetCString(col_idx++, rec); + + if (is_disabled) { + _alarm_set_next_duetime(__alarm_info); + g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, __alarm_info); + LOGW("Save alarm_id[%d] caller[%s] callee[%s]", __alarm_info->alarm_id, + __alarm_info->caller_pkgid, __alarm_info->callee_pkgid); + } else { + _alarm_set_next_duetime(__alarm_info); + alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info); + } + } + + _alarm_schedule(); +} + +int GetDbPathForAllInfo(uid_t uid, char** db_path) { + char db_path_tmp[50] = {0,}; + constexpr const char query_for_creating_table[] = + "CREATE TABLE alarmmgr_tool (alarm_id integer primary key, " + "duetime_epoch integer, duetime text, start_epoch integer, " + "end_epoch integer, global integer, caller_pkgid text, " + "callee_pkgid text, app_unique_name text, app_service_name text, " + "dst_service_name text, day_of_week integer, repeat integer, " + "alarm_type integer)"; + constexpr const char query_for_deleting_table[] = + "DROP TABLE alarmmgr_tool"; + time_t current_time = 0; + struct tm current_tm; + int index = 0; + + time(¤t_time); + tzset(); + localtime_r(¤t_time, ¤t_tm); + snprintf(db_path_tmp, sizeof(db_path_tmp), + "/tmp/alarmmgr_%d%d%d_%02d%02d%02d.db", + current_tm.tm_year + 1900, current_tm.tm_mon + 1, + current_tm.tm_mday, current_tm.tm_hour, current_tm.tm_min, + current_tm.tm_sec); + + *db_path = strdup(db_path_tmp); + if (*db_path == nullptr) { + LOGE("Out of memory"); + return ERR_ALARM_SYSTEM_FAIL; + } + + tizen_base::Database alarmmgr_tool_db(db_path_tmp, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + DbBusyHandler); + auto r = alarmmgr_tool_db.Exec({ query_for_deleting_table }); + if (!r) + LOGE("Deleting the table failed : %s", static_cast<const char*>(r)); + + alarmmgr_tool_db.OneStepExec({ query_for_creating_table }); + for (GSList* gs_iter = alarm_context.alarms; gs_iter != nullptr; + gs_iter = g_slist_next(gs_iter)) { + __alarm_info_t* entry = reinterpret_cast<__alarm_info_t*>( + gs_iter->data); + if (uid >= REGULAR_UID_MIN && entry->uid != uid) + continue; + ++index; + SECURE_LOGD("#%d alarm id[%d] app_name[%s] duetime[%ld]", + index, entry->alarm_id, entry->app_unique_name, entry->start); + + base_info_t *base_info = (base_info_t *) &(entry->base_info); + alarm_mode_t *mode = &base_info->mode; + + auto q = tizen_base::Database::Sql( + "INSERT INTO alarmmgr_tool( alarm_id, duetime_epoch, duetime, " + "start_epoch, end_epoch, global, caller_pkgid, callee_pkgid, " + "app_unique_name, app_service_name, dst_service_name, day_of_week, " + "repeat, alarm_type) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)") + .Bind(entry->alarm_id) + .Bind(static_cast<int>(entry->due_time)) + .Bind(ctime(&(entry->due_time))) + .Bind(static_cast<int>(entry->start)) + .Bind(static_cast<int>(entry->end)) + .Bind((bool)entry->global) + .Bind(entry->caller_pkgid) + .Bind(entry->callee_pkgid) + .Bind(entry->app_unique_name) + .Bind(entry->app_service_name) + .Bind(entry->dst_service_name) + .Bind(mode->u_interval.day_of_week) + .Bind(mode->repeat) + .Bind(entry->base_info.alarm_type); + auto r = alarmmgr_tool_db.Exec(q); + if (!r) + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + } + + return ALARMMGR_RESULT_SUCCESS; +} + +void UpdateRelativeAlarms(gpointer user_data) { + auto guard = alarmmgr_db->CreateTransactionGuard(); + + for (GSList* iter = alarm_context.alarms; iter != nullptr; + iter = g_slist_next(iter)) { + __alarm_info_t* entry = reinterpret_cast<__alarm_info_t*>(iter->data); + base_info_t* base_info = &(entry->base_info); + if (base_info->alarm_type & ALARM_TYPE_RELATIVE) + _update_alarms(entry); + } + + guard.Commit(); +} + +bool AlarmSetGlobalToDb(__alarm_info_t* alarm_info, bool global) { + auto q = tizen_base::Database::Sql( + "UPDATE alarmmgr SET global=? WHERE alarm_id=?") + .Bind(alarm_info->global) + .Bind(alarm_info->alarm_id); + + auto r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + return false; + } + + return true; +} + +void UpdateDbForDisabledAlarm(alarm_id_t alarm_id, bool disabled) { + LOGW("Update (%d) is_disabled to (%d)", alarm_id, disabled); + auto q = tizen_base::Database::Sql( + "UPDATE alarmmgr SET is_disabled=? WHERE alarm_id=?") + .Bind(disabled) + .Bind(alarm_id); + + auto r = alarmmgr_db->Exec(q); + if (!r) + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); +} + +bool InitializeDb() { + try { + alarmmgr_db.reset(new tizen_base::Database(GetAlarmDbFile(), + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, DbBusyHandler)); + } catch (const tizen_base::DbException& e) { + LOGE("Failed to open [%s]. error: %s", GetAlarmDbFile(), e.msg()); + if (e.code() == SQLITE_CORRUPT) + RecoverDb(); + else + return false; + } + + bool is_exist = false; + int ret = CheckAlarmMgrTable(*alarmmgr_db, &is_exist); + if (ret != SQLITE_OK) { + if (ret == SQLITE_CORRUPT) { + RecoverDb(); + } else { + alarmmgr_db.reset(); + return false; + } + } + + auto r = alarmmgr_db->Exec({QUERY_CREATE_TABLE_ALARMMGR}); + + if (!r) { + LOGE("Don't execute query = %s, error message = %s", + QUERY_CREATE_TABLE_ALARMMGR, static_cast<const char*>(r)); + if (static_cast<int>(r) == SQLITE_CORRUPT || + static_cast<int>(r) == SQLITE_NOTADB) { + RecoverDb(); + alarmmgr_db.reset(); + } + + return false; + } + + if (is_exist == false) { + if (CreateDbVersion() != 0) { + alarmmgr_db.reset(); + return false; + } + + if (UpdateDbVersion(SCHEMA_VERSION_LATEST) != 0) { + alarmmgr_db.reset(); + return false; + } + } else { + ret = DbUpgrade(); + if (ret) { + LOGE("Failed db's migration"); + alarmmgr_db.reset(); + return false; + } + } + + ret = sqlite3_exec(alarmmgr_db->GetRaw(), "PRAGMA integrity_check", + CheckCallback, nullptr, 0); + if (ret != SQLITE_OK || is_db_corrupted) { + LOGE("Loss alarm db's integrity"); + return ReopenDb(); + } + + return true; +} + +bool SetLatestSettime(time_t settime) { + auto q = tizen_base::Database::Sql( + "INSERT OR REPLACE INTO alarmmgr( alarm_id, start, " + "end, uid, global, is_disabled, caller_pkgid, callee_pkgid, " + "app_unique_name, app_service_name, app_service_name_mod, bundle, " + "noti_len, noti, year, month, day, hour, min, sec, msec, day_of_week, " + "repeat, alarm_type, reserved_info, dst_service_name, " + "dst_service_name_mod) " + "VALUES (?, ?, 0, 0, 0, 1, 'n', 'n', 'n', 'n', 'n', 'n', 0, 'n', " + "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'n', 'n')") + .Bind(LATEST_SETTIME_ID) + .Bind(static_cast<int64_t>(settime)); + + if (!alarmmgr_db) + return false; + + auto r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + return false; + } + + LOGD("latest_settime : %ld", settime); + return true; +} + +bool GetLatestSettime(time_t* settime) { + auto q = tizen_base::Database::Sql( + "SELECT start FROM alarmmgr WHERE alarm_id=?") + .Bind(LATEST_SETTIME_ID); + + if (!alarmmgr_db) + return false; + + auto r = alarmmgr_db->Exec(q); + if (!r) { + LOGE("db.Exec failed : %s", static_cast<const char*>(r)); + return false; + } + + auto rec = r.GetFirstRecord(); + if (!rec) { + LOGE("latest_settime is not set"); + return false; + } + + *settime = static_cast<int64_t>(rec->Get(0)); + LOGD("latest_settime : %ld", *settime); + return true; +} + +} // namespace + +bool _save_alarms(__alarm_info_t* __alarm_info) { + try { + return SaveAlarms(__alarm_info); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} + +bool _update_alarms(__alarm_info_t* __alarm_info) { + try { + return UpdateAlarms(__alarm_info); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} + +bool _delete_alarms(alarm_id_t alarm_id) { + try { + return DeleteAlarms(alarm_id); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} + +void _load_alarms_from_db() { + try { + LoadAlarmsFromDb(); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + } +} + +int _get_db_path_for_all_info(uid_t uid, char** db_path) { + try { + return GetDbPathForAllInfo(uid, db_path); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return ERR_ALARM_SYSTEM_FAIL; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return ERR_ALARM_SYSTEM_FAIL; + } +} + +gboolean _update_relative_alarms(gpointer user_data) { + try { + UpdateRelativeAlarms(user_data); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + } + + return G_SOURCE_REMOVE; +} + +bool _alarm_set_global_to_db(__alarm_info_t* alarm_info, bool global) { + try { + return AlarmSetGlobalToDb(alarm_info, global); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} + +void _update_db_for_disabled_alarm(alarm_id_t alarm_id, bool disabled) { + try { + UpdateDbForDisabledAlarm(alarm_id, disabled); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + } +} + +bool _initialize_db() { + try { + return InitializeDb(); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} + +bool _set_latest_settime(time_t settime) { + try { + return SetLatestSettime(settime); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} + +bool _get_latest_settime(time_t* settime) { + try { + return GetLatestSettime(settime); + } catch (const tizen_base::DbException& e) { + LOGE("Exception: %s", e.msg()); + return false; + } catch (const std::exception& e) { + LOGE("Exception: %s", e.what()); + return false; + } +} diff --git a/server/alarm-manager-db.h b/server/alarm-manager-db.h index b454ba2..e8ab5b6 100644 --- a/server/alarm-manager-db.h +++ b/server/alarm-manager-db.h @@ -15,15 +15,15 @@ */ #pragma once -#ifdef __cplusplus -extern "C" { -#endif - #include <glib.h> #include "alarm.h" #include "alarm-internal.h" +#ifdef __cplusplus +extern "C" { +#endif + bool _alarm_set_global_to_db(__alarm_info_t *alarm_info, bool global); bool _delete_alarms(alarm_id_t alarm_id); int _get_db_path_for_all_info(uid_t uid, char** db_path); @@ -33,8 +33,8 @@ bool _save_alarms(__alarm_info_t *__alarm_info); bool _update_alarms(__alarm_info_t *__alarm_info); gboolean _update_relative_alarms(gpointer user_data); void _update_db_for_disabled_alarm(alarm_id_t alarm_id, bool disabled_by_ups); - -int migration_func_version_1(void); +bool _get_latest_settime(time_t *settime); +bool _set_latest_settime(time_t settime); #ifdef __cplusplus } diff --git a/server/alarm-manager-dbus.c b/server/alarm-manager-dbus.c index 927ae04..43ff36f 100644 --- a/server/alarm-manager-dbus.c +++ b/server/alarm-manager-dbus.c @@ -142,7 +142,7 @@ static const gchar introspection_xml[] = " </method>" " <method name='alarm_get_list_of_ids'>" " <arg type='i' name='max_number_of_ids' direction='in' />" -" <arg type='ai' name='alarm_id' direction='out' />" +" <arg type='a(i)' name='alarm_id' direction='out' />" " <arg type='i' name='number_of_ids' direction='out' />" " <arg type='i' name='return_code' direction='out' />" " </method>" @@ -228,7 +228,7 @@ static gboolean __send_noti_to_session_bus(char *service_name, { int fd; int ret; - int len; + size_t len; struct sockaddr_un saddr; uint8_t *data; GVariant *gv; @@ -270,18 +270,18 @@ static gboolean __send_noti_to_session_bus(char *service_name, g_variant_store(gv, gv_data); g_variant_unref(gv); - data = (uint8_t *)malloc(len + 4); + data = (uint8_t *)malloc(len + sizeof(len)); if (!data) { close(fd); free(gv_data); return FALSE; } - memcpy(data, &len, 4); - memcpy(data + 4, gv_data, len); + memcpy(data, &len, sizeof(len)); + memcpy(data + sizeof(len), gv_data, len); free(gv_data); - if (send(fd, data, len + 4, 0) == -1) { + if (send(fd, data, len + sizeof(len), 0) == -1) { LOGE("sendto() failed (errno %d)", errno); free(data); close(fd); @@ -634,38 +634,40 @@ static void handle_method_call(GDBusConnection *connection, pid_t pid = __get_caller_pid(name); if (g_strcmp0(method_name, "alarm_create_periodic") == 0) { - ret = alarm_manager_alarm_create_periodic(parameters, uid, pid, &alarm_id); + ret = alarm_manager_alarm_create_periodic(parameters, uid, pid, sender, &alarm_id); g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, ret)); } else if (g_strcmp0(method_name, "alarm_create") == 0) { - ret = alarm_manager_alarm_create(parameters, uid, pid, &alarm_id); + ret = alarm_manager_alarm_create(parameters, uid, pid, sender, &alarm_id); g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, ret)); } else if (g_strcmp0(method_name, "alarm_create_appsvc") == 0) { - ret = alarm_manager_alarm_create_appsvc(parameters, uid, pid, &alarm_id); + ret = alarm_manager_alarm_create_appsvc(parameters, uid, pid, sender, &alarm_id); g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, ret)); } else if (g_strcmp0(method_name, "alarm_create_noti") == 0) { const char *notification_priv = "http://tizen.org/privilege/notification"; ret = _cynara_check(invoc, notification_priv, pid); if (ret == ALARMMGR_RESULT_SUCCESS) { - ret = alarm_manager_alarm_create_noti(parameters, uid, pid, &alarm_id); + ret = alarm_manager_alarm_create_noti(parameters, uid, pid, sender, &alarm_id); } g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, ret)); } else if (g_strcmp0(method_name, "alarm_delete") == 0) { - ret = alarm_manager_alarm_delete(parameters, uid, pid); + ret = alarm_manager_alarm_delete(parameters, uid, pid, sender); g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ret)); } else if (g_strcmp0(method_name, "alarm_delete_all") == 0) { - ret = alarm_manager_alarm_delete_all(parameters, uid, pid); + ret = alarm_manager_alarm_delete_all(parameters, uid, pid, sender); g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ret)); } else if (g_strcmp0(method_name, "alarm_update") == 0) { - ret = alarm_manager_alarm_update(parameters, uid, pid); + ret = alarm_manager_alarm_update(parameters, uid, pid, sender); g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ret)); } else if (g_strcmp0(method_name, "alarm_get_number_of_ids") == 0) { - ret = alarm_manager_alarm_get_number_of_ids(uid, pid, &num_of_alarm); + ret = alarm_manager_alarm_get_number_of_ids(uid, pid, sender, &num_of_alarm); g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_alarm, ret)); } else if (g_strcmp0(method_name, "alarm_get_list_of_ids") == 0) { - GVariant *arr = NULL; + GVariantBuilder *arr = g_variant_builder_new(G_VARIANT_TYPE("a(i)")); - ret = alarm_manager_alarm_get_list_of_ids(parameters, uid, pid, &arr, &num_of_alarm); - g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", arr, num_of_alarm, ret)); + ret = alarm_manager_alarm_get_list_of_ids(parameters, uid, pid, sender, arr, &num_of_alarm); + g_dbus_method_invocation_return_value(invoc, g_variant_new("(a(i)ii)", arr, num_of_alarm, ret)); + + g_variant_builder_unref(arr); } else if (g_strcmp0(method_name, "alarm_get_appsvc_info") == 0) { gchar *b_data = NULL; @@ -682,19 +684,19 @@ static void handle_method_call(GDBusConnection *connection, if (noti_data) free(noti_data); } else if (g_strcmp0(method_name, "alarm_get_info") == 0) { - alarm_info_t alarm_info = { 0, }; + base_info_t base_info = { 0, }; - ret = alarm_manager_alarm_get_info(parameters, uid, &alarm_info); + ret = alarm_manager_alarm_get_info(parameters, uid, &base_info); g_dbus_method_invocation_return_value( invoc, g_variant_new("(iiiiiiiiiiiixi)", - alarm_info.start.year, alarm_info.start.month, - alarm_info.start.day, alarm_info.start.hour, - alarm_info.start.min, alarm_info.start.sec, - alarm_info.end.year, alarm_info.end.month, - alarm_info.end.day, alarm_info.mode.u_interval.day_of_week, - alarm_info.mode.repeat, alarm_info.alarm_type, - (gint64)alarm_info.reserved_info, ret)); + base_info.start.year, base_info.start.month, + base_info.start.day, base_info.start.hour, + base_info.start.min, base_info.start.sec, + base_info.end.year, base_info.end.month, + base_info.end.day, base_info.mode.u_interval.day_of_week, + base_info.mode.repeat, base_info.alarm_type, + (gint64)base_info.reserved_info, ret)); } else if (g_strcmp0(method_name, "alarm_get_next_duetime") == 0) { time_t duetime; ret = alarm_manager_alarm_get_next_duetime(parameters, uid, &duetime); @@ -715,12 +717,12 @@ static void handle_method_call(GDBusConnection *connection, _display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN); } else if (g_strcmp0(method_name, "alarm_set_time") == 0) { _display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0); - ret = alarm_manager_alarm_set_time(parameters, pid); + ret = alarm_manager_alarm_set_time(parameters, pid, sender); g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ret)); _display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN); } else if (g_strcmp0(method_name, "alarm_set_time_with_propagation_delay") == 0) { _display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0); - ret = alarm_manager_alarm_set_time_with_propagation_delay(parameters, pid); + ret = alarm_manager_alarm_set_time_with_propagation_delay(parameters, pid, sender); g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ret)); _display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN); } else if (g_strcmp0(method_name, "alarm_set_timezone") == 0) { @@ -750,19 +752,6 @@ static void __on_bus_name_acquired(GDBusConnection *connection, gpointer user_data) { LOGD("bus acquired(%s)", name); - - guint reg_id = 0; - GError *error = NULL; - - reg_id = g_dbus_connection_register_object(connection, - ALARM_MGR_DBUS_PATH, - introspection_data->interfaces[0], - &interface_vtable, - NULL, NULL, &error); - if (reg_id == 0) { - LOGE("g_dbus_connection_register_object error(%s)", error->message); - g_error_free(error); - } } static void __on_bus_name_owner_changed(GDBusConnection *connection, @@ -782,9 +771,11 @@ static void __on_bus_name_owner_changed(GDBusConnection *connection, if (signal_name && strcmp(signal_name, "NameOwnerChanged") == 0) { g_variant_get(parameters, "(&sss)", &service_name, NULL, NULL); - for (entry = g_expired_alarm_list; entry; entry = entry->next) { - if (entry->data) { - expire_info = (__expired_alarm_t *) entry->data; + for (entry = g_expired_alarm_list; entry;) { + expire_info = (__expired_alarm_t *) entry->data; + entry = entry->next; + + if (expire_info) { SECURE_LOGD("expired service(%s), owner changed service(%s)", expire_info->service_name, service_name); @@ -797,7 +788,7 @@ static void __on_bus_name_owner_changed(GDBusConnection *connection, 0, expire_info->uid); g_expired_alarm_list = - g_slist_remove(g_expired_alarm_list, entry->data); + g_slist_remove(g_expired_alarm_list, (gpointer)expire_info); g_free(expire_info); } } @@ -811,6 +802,8 @@ bool _initialize_dbus(void) GError *error = NULL; guint subsc_id; guint owner_id; + guint reg_id; + LOGD("__initialize_dbus Enter"); connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); @@ -826,25 +819,41 @@ bool _initialize_dbus(void) subsc_id = g_dbus_connection_signal_subscribe(connection, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameOwnerChanged", "/org/freedesktop/DBus", NULL, - G_DBUS_SIGNAL_FLAGS_NONE, __on_bus_name_owner_changed, NULL, NULL); + G_DBUS_SIGNAL_FLAGS_NONE, __on_bus_name_owner_changed, + NULL, NULL); if (subsc_id == 0) { LOGE("Subscribing to signal for invoking callback is failed."); g_object_unref(connection); return false; } - introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, &error); + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, + &error); if (!introspection_data) { - LOGE("g_dbus_node_info_new_for_xml error(%s)", error->message); + LOGE("g_dbus_node_info_new_for_xml error(%s)", + error ? error->message : ""); g_object_unref(connection); - g_error_free(error); + g_clear_error(&error); + return false; + } + + reg_id = g_dbus_connection_register_object(connection, + ALARM_MGR_DBUS_PATH, + introspection_data->interfaces[0], + &interface_vtable, + NULL, NULL, &error); + if (reg_id == 0) { + LOGE("g_dbus_connection_register_object error(%s)", + error ? error->message : ""); + g_dbus_node_info_unref(introspection_data); + g_object_unref(connection); + g_clear_error(&error); return false; } owner_id = g_bus_own_name_on_connection(connection, ALARM_MGR_DBUS_NAME, G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_name_acquired, NULL, NULL, NULL); - if (owner_id == 0) { LOGE("Acquiring the own name is failed."); g_dbus_node_info_unref(introspection_data); diff --git a/server/alarm-manager-schedule.c b/server/alarm-manager-schedule.c index 68b9180..ba1409f 100644 --- a/server/alarm-manager-schedule.c +++ b/server/alarm-manager-schedule.c @@ -98,14 +98,14 @@ static time_t __alarm_next_duetime_once(__alarm_info_t *__alarm_info) struct tm tmp_tm; int current_dst = 0; - if ((__alarm_info->alarm_info.alarm_type & ALARM_TYPE_RELATIVE) && __alarm_info->start != 0) { + if ((__alarm_info->base_info.alarm_type & ALARM_TYPE_RELATIVE) && __alarm_info->start != 0) { LOGE("Final due_time = %ld, %s", __alarm_info->start, ctime(&__alarm_info->start)); return __alarm_info->start; } - alarm_info_t *alarm_info = &__alarm_info->alarm_info; - alarm_date_t *start = &alarm_info->start; + base_info_t *base_info = &__alarm_info->base_info; + alarm_date_t *start = &base_info->start; tzset(); time(¤t_time); @@ -163,8 +163,8 @@ static time_t __alarm_next_duetime_repeat(__alarm_info_t *__alarm_info) time_t current_time = 0; struct tm duetime_tm; - alarm_info_t *alarm_info = &__alarm_info->alarm_info; - alarm_date_t *start = &alarm_info->start; + base_info_t *base_info = &__alarm_info->base_info; + alarm_date_t *start = &base_info->start; time(¤t_time); @@ -177,26 +177,26 @@ static time_t __alarm_next_duetime_repeat(__alarm_info_t *__alarm_info) duetime_tm.tm_mday = start->day; duetime_tm.tm_isdst = -1; - if (alarm_info->alarm_type & ALARM_TYPE_PERIOD && - alarm_info->mode.u_interval.interval > 0) { + if (base_info->alarm_type & ALARM_TYPE_PERIOD && + base_info->mode.u_interval.interval > 0) { /* For minimize 'while loop' * Duetime should be "periodic_standard_time + (interval * x) >= current" */ time_t periodic_standard_time = _get_periodic_alarm_standard_time(); time_t temp; - temp = (current_time - periodic_standard_time) / alarm_info->mode.u_interval.interval; - due_time = periodic_standard_time + (temp * alarm_info->mode.u_interval.interval); + temp = (current_time - periodic_standard_time) / base_info->mode.u_interval.interval; + due_time = periodic_standard_time + (temp * base_info->mode.u_interval.interval); } else { due_time = mktime(&duetime_tm); } while (__alarm_info->start > due_time || current_time > due_time || ((!is_time_changed) && (current_time == due_time))) { - if (due_time + alarm_info->mode.u_interval.interval < due_time) { + if (due_time + base_info->mode.u_interval.interval < due_time) { LOGD("time_t OVERFLOW!! duetime = %ld", due_time); due_time = -1; break; } - due_time += alarm_info->mode.u_interval.interval; + due_time += base_info->mode.u_interval.interval; } localtime_r(&due_time, &duetime_tm); @@ -217,8 +217,8 @@ static time_t __alarm_next_duetime_annually(__alarm_info_t *__alarm_info) time_t current_time = 0; struct tm duetime_tm; - alarm_info_t *alarm_info = &__alarm_info->alarm_info; - alarm_date_t *start = &alarm_info->start; + base_info_t *base_info = &__alarm_info->base_info; + alarm_date_t *start = &base_info->start; time(¤t_time); localtime_r(¤t_time, &duetime_tm); @@ -252,8 +252,8 @@ static time_t __alarm_next_duetime_monthly(__alarm_info_t *__alarm_info) time_t current_time = 0; struct tm duetime_tm; - alarm_info_t *alarm_info = &__alarm_info->alarm_info; - alarm_date_t *start = &alarm_info->start; + base_info_t *base_info = &__alarm_info->base_info; + alarm_date_t *start = &base_info->start; time(¤t_time); localtime_r(¤t_time, &duetime_tm); @@ -298,9 +298,9 @@ static time_t __alarm_next_duetime_weekly(__alarm_info_t *__alarm_info) struct tm before_tm; struct tm after_tm; - alarm_info_t *alarm_info = &__alarm_info->alarm_info; - alarm_date_t *start = &alarm_info->start; - alarm_mode_t *mode = &alarm_info->mode; + base_info_t *base_info = &__alarm_info->base_info; + alarm_date_t *start = &base_info->start; + alarm_mode_t *mode = &base_info->mode; tzset(); time(¤t_time); @@ -402,10 +402,11 @@ void _alarm_set_next_duetime(__alarm_info_t *__alarm_info) struct tm tm, *cur_tm = NULL; struct tm *due_tm = NULL; - alarm_info_t *alarm_info = &__alarm_info->alarm_info; - alarm_mode_t *mode = &alarm_info->mode; + base_info_t *base_info = &__alarm_info->base_info; + alarm_mode_t *mode = &base_info->mode; time(¤t_time); + tzset(); cur_tm = localtime_r(¤t_time, &tm); if (cur_tm && cur_tm->tm_isdst > 0) is_dst = 1; @@ -429,6 +430,11 @@ void _alarm_set_next_duetime(__alarm_info_t *__alarm_info) return; } + if (due_time < 0) { + LOGE("due_time(%ld) is wrong(id : %d)", due_time, __alarm_info->alarm_id); + return; + } + if (mode->repeat != ALARM_REPEAT_MODE_WEEKLY && mode->repeat != ALARM_REPEAT_MODE_ONCE) { due_tm = localtime_r(&due_time, &tm); if (is_dst == 0 && due_tm && due_tm->tm_isdst == 1) { @@ -463,13 +469,12 @@ static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time) time(¤t_time); - for (iter = alarm_context.alarms; iter != NULL; - iter = g_slist_next(iter)) { + for (iter = alarm_context.alarms; iter != NULL;) { entry = (__alarm_info_t *)iter->data; due_time = entry->due_time; - double interval = 0; + iter = g_slist_next(iter); SECURE_LOGD("alarm[%d] with duetime(%ld) at current(%ld) - (%s) z:%d", entry->alarm_id, due_time, current_time, entry->app_unique_name, (int)entry->zombie_mode); @@ -490,12 +495,12 @@ static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time) LOGW("The alarm(%d) is removed [unique_name : %s, dst : %s", entry->alarm_id, entry->app_unique_name, dst); - if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + if (!(entry->base_info.alarm_type & ALARM_TYPE_VOLATILE)) _delete_alarms(entry->alarm_id); _save_alarm_info_log("AUTO_DELETE", entry); - alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data); + alarm_context.alarms = g_slist_remove(alarm_context.alarms, (gpointer)entry); _release_alarm_info_t(entry); continue; } else { diff --git a/server/alarm-manager-timer.c b/server/alarm-manager-timer.c index e0e876d..ff6a304 100644 --- a/server/alarm-manager-timer.c +++ b/server/alarm-manager-timer.c @@ -128,7 +128,7 @@ static gboolean __timer_glib_prepare(GSource *src, gint *timeout) return FALSE; } -GSourceFuncs funcs = { +static GSourceFuncs funcs = { .prepare = __timer_glib_prepare, .check = __timer_glib_check, .dispatch = __timer_glib_dispatch, @@ -202,7 +202,7 @@ void _alarm_set_timer(int timer, time_t due_time) /*set timer as absolute time */ /*we create dummy timer when the interval is longer than one day. */ /*the timer will be expired in half day. */ - + tzset(); localtime_r(&due_time, &ts_ret); if (interval > 60 * 60 * 24) { diff --git a/server/alarm-manager-util.c b/server/alarm-manager-util.c index 1486adb..6d283d5 100644 --- a/server/alarm-manager-util.c +++ b/server/alarm-manager-util.c @@ -16,7 +16,6 @@ #define _GNU_SOURCE #include <fcntl.h> -#include <system_info.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -43,8 +42,8 @@ static int __bg_category_func(const char *name, void *user_data) { bg_category_cb_info_t *info = (bg_category_cb_info_t *)user_data; LOGD("appid[%s], bg name = %s", info->appid, name); - if (name && strncmp("enable", name, strlen(name)) && - strncmp("disable", name, strlen(name))) { + if (name && strcmp("enable", name) && + strcmp("disable", name)) { info->has_bg = true; return -1; } @@ -52,52 +51,11 @@ static int __bg_category_func(const char *name, void *user_data) return 0; } -profile_t _get_profile() -{ - static profile_t saved = PROFILE_UNKNOWN; - char *profileName; - int r; - - if (__builtin_expect(saved != PROFILE_UNKNOWN, 1)) - return saved; - - r = system_info_get_platform_string("http://tizen.org/feature/profile", - &profileName); - if (r != SYSTEM_INFO_ERROR_NONE) { - LOGD("Failed to get profile info. error(%d)", r); - return saved; - } - - switch (*profileName) { - case 'm': - case 'M': - saved = PROFILE_MOBILE; - break; - case 'w': - case 'W': - saved = PROFILE_WEARABLE; - break; - case 't': - case 'T': - saved = PROFILE_TV; - break; - case 'i': - case 'I': - saved = PROFILE_IVI; - break; - default: // common or unknown ==> ALL ARE COMMON. - saved = PROFILE_COMMON; - } - free(profileName); - - return saved; -} - int _pkg_is_global(const char *callee_pkgid, uid_t uid) { int retval; int return_code = ERR_ALARM_SYSTEM_FAIL; - pkgmgrinfo_pkginfo_h handle; + pkgmgrinfo_pkginfo_h handle = NULL; retval = pkgmgrinfo_pkginfo_get_usr_pkginfo(callee_pkgid, uid, &handle); if (retval != PMINFO_R_OK) { @@ -241,9 +199,9 @@ int _get_pid_from_appid(const char *app_id, uid_t uid) char *_get_pkgid_by_appid(const char *app_id, uid_t uid) { - pkgmgrinfo_pkginfo_h handle; + pkgmgrinfo_pkginfo_h handle = NULL; char *pkgid = NULL; - char *temp; + char *temp = NULL; if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &handle) == PMINFO_R_OK) { if (pkgmgrinfo_appinfo_get_pkgid(handle, &temp) == PMINFO_R_OK) { @@ -271,7 +229,7 @@ int _is_ui_app(const char *appid, uid_t uid) return 0; ret = pkgmgrinfo_appinfo_get_component_type(appinfo_h, &component); - if (ret == 0 && component != NULL && strncmp(component, "uiapp", 5) == 0) + if (ret == 0 && component != NULL && strcmp(component, "uiapp") == 0) found = 1; if (appinfo_h) @@ -300,7 +258,7 @@ int _compare_api_version(int *result, int pid, uid_t uid) int ret = 0; pkgmgrinfo_pkginfo_h pkginfo = NULL; char pkgid[MAX_PKG_ID_LEN] = {0, }; - char *pkg_version; + char *pkg_version = NULL; if (aul_app_get_pkgid_bypid_for_uid(pid, pkgid, sizeof(pkgid), uid) != AUL_R_OK) { LOGE("aul_app_get_pkgid_bypid() is failed. PID %d may not be app.", getpid()); @@ -330,7 +288,7 @@ bool _permit_by_config(pkgmgrinfo_appinfo_h handle, uid_t uid) if (access(tzplatform_mkpath(TZ_SYS_RO_SHARE, "alarm-manager/alarm-config-platform-service-permitted"), F_OK) == 0) { LOGD("This profile permit alarm for service applications which has platform cert\n"); - char *pkgid; + char *pkgid = NULL; int r; const char *cert_value; pkgmgrinfo_certinfo_h certinfo; @@ -389,8 +347,8 @@ bool _permit_by_config(pkgmgrinfo_appinfo_h handle, uid_t uid) LOGE("certsvc_certificate_get_visibility() is failed."); pkgmgrinfo_pkginfo_destroy_certinfo(certinfo); - certsvc_instance_free(instance); certsvc_certificate_free(certificate); + certsvc_instance_free(instance); LOGW("visibility is %d", visibility); if (visibility & CERTSVC_VISIBILITY_PLATFORM) { @@ -558,8 +516,8 @@ void _save_alarm_info_log(const char *tag, __alarm_info_t *info) "interval:%ld, duetime: %ld %s", info->alarm_id, info->uid, info->app_unique_name, info->callee_pkgid, info->dst_service_name, info->dst_service_name_mod, - info->alarm_info.alarm_type, info->alarm_info.mode.repeat, - info->alarm_info.mode.u_interval.interval, info->due_time, due_time_str); + info->base_info.alarm_type, info->base_info.mode.repeat, + info->base_info.mode.u_interval.interval, info->due_time, due_time_str); _save_module_log(tag, log_message); #endif /* _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG */ diff --git a/server/alarm-manager-util.h b/server/alarm-manager-util.h index b37019d..0e010ed 100644 --- a/server/alarm-manager-util.h +++ b/server/alarm-manager-util.h @@ -30,7 +30,6 @@ extern "C" { #define ALARMMGR_LOG_TAG_SIZE 20 #define ALARMMGR_LOG_MESSAGE_SIZE 330 -profile_t _get_profile(); int _cynara_check(GDBusMethodInvocation *invocation, const char* privilege, pid_t pid); char* _get_pkgid_by_appid(const char* app_id, uid_t uid); diff --git a/server/alarm-manager.c b/server/alarm-manager.c index ddc5db3..41977c7 100644 --- a/server/alarm-manager.c +++ b/server/alarm-manager.c @@ -48,20 +48,15 @@ #include "alarm-manager-util.h" #include "alarm-manager-dbus.h" -#if !GLIB_CHECK_VERSION(2, 31, 0) -#include <glib/gmacros.h> -#endif - /* link path for timezone info */ -#define TIMEZONE_INFO_LINK_PATH tzplatform_mkpath(TZ_SYS_ETC, "localtime") +#define TIMEZONE_INFO_LINK_DIR_PATH tzplatform_getenv(TZ_SYS_ETC) +#define TIMEZONE_INFO_LINK_FILE_NAME "localtime" #ifndef RTC_WKALM_BOOT_SET #define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm) #endif -#define _APPFW_FEATURE_WAKEUP_USING_RTC (_get_profile() != PROFILE_TV) - -#define PATH_LIB_ALARMMGR_PLUGIN "/usr/lib/libalarm-server-plugin.so" +#define PATH_LIB_ALARMMGR_PLUGIN PLUGIN_LIB_DIR"/libalarm-server-plugin.so" static void *plugin_handle; static int (*RTC_INIT)(void); @@ -82,10 +77,12 @@ extern bool g_dummy_timer_is_set; GSList *g_scheduled_alarm_list; GSList *g_expired_alarm_list; GSList *g_disabled_alarm_list; -GHashTable *caller_appid_cache_table; +static GHashTable *caller_appid_cache_table; bool is_time_changed = false; /* for calculating next duetime */ static time_t periodic_alarm_standard_time = 0; +static bool using_rtc = false; +static bool is_rtc_reset = false; struct running_info_t { pid_t pid; @@ -96,30 +93,32 @@ struct running_info_t { typedef struct { int pid; bool is_app; + char *sender; char *unique_name; } appid_cache_t; -static long __get_proper_interval(long interval, int alarm_type); +static time_t __get_proper_interval(time_t interval); static void __alarm_add_to_list(__alarm_info_t *__alarm_info); static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id); static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int update_flag, int *error_code); + base_info_t *base_info, int update_flag, int *error_code); static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id, - int *error_code); -static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info, - __alarm_info_t *__alarm_info); -static void __alarm_update_due_time_of_all_items_in_list(time_t new_time,double diff_time); -static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid, - int pid, periodic_method_e method, long requested_interval, int is_ref, - char *app_service_name, char *app_service_name_mod, - const char *dst_service_name, const char *dst_service_name_mod, - int *error_code); -static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id, - long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code); + int *error_code); +static void __alarm_set_start_and_end_time(base_info_t *base_info, + __alarm_info_t *__alarm_info); +static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double diff_time); +static bool __alarm_create(base_info_t *base_info, alarm_id_t *alarm_id, uid_t uid, + int pid, const gchar *sender, periodic_method_e method, + long requested_interval, int is_ref, char *app_service_name, + char *app_service_name_mod, const char *dst_service_name, + const char *dst_service_name_mod, int *error_code); +static bool __alarm_create_appsvc(base_info_t *base_info, alarm_id_t *alarm_id, + long requested_interval, uid_t uid, int pid, const gchar *sender, + char *bundle_data, int *error_code); static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code); static bool __alarm_update(uid_t uid, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int update_flag, int *error_code); + base_info_t *base_info, int update_flag, int *error_code); static void __on_system_time_external_changed(keynode_t *node, void *data); static void __initialize_alarm_list(); static void __initialize_scheduled_alarm_list(); @@ -127,7 +126,8 @@ static void __initialize_noti(); static gboolean __alarm_expired_directly(gpointer user_data); void _release_alarm_info_t(__alarm_info_t *entry); -static notification_h __get_notification(guchar *data, int datalen); +static notification_h __get_notification(guchar *data, gsize datalen); +static void __free_cached_value(gpointer data); static bool __get_caller_unique_name(int pid, char *unique_name, int size, bool *is_app, uid_t uid) { @@ -143,7 +143,7 @@ static bool __get_caller_unique_name(int pid, char *unique_name, int size, bool /* When a caller is an application, the unique name is appID. */ if (is_app) *is_app = true; - strncpy(unique_name, caller_appid, size - 1); + snprintf(unique_name, size, "%s", caller_appid); } else { /* Otherwise, the unique name is /proc/pid/cmdline. */ char *cmdline; @@ -155,7 +155,7 @@ static bool __get_caller_unique_name(int pid, char *unique_name, int size, bool if (!cmdline) return false; else - strncpy(unique_name, cmdline, size - 1); + snprintf(unique_name, size, "%s", cmdline); free(cmdline); } @@ -175,13 +175,14 @@ gboolean __hash_table_remove_cb(gpointer key, gpointer value, gpointer user_data return false; } -static bool __get_cached_unique_name(int pid, char *unique_name, int size, bool *is_app, uid_t uid) +static bool __get_cached_unique_name(int pid, const gchar *sender, + char *unique_name, int size, bool *is_app, uid_t uid) { appid_cache_t *data; bool ret = false; bool _is_app; - data = (appid_cache_t *)g_hash_table_lookup(caller_appid_cache_table, GINT_TO_POINTER(pid)); + data = (appid_cache_t *)g_hash_table_lookup(caller_appid_cache_table, (gpointer)sender); if (data) { snprintf(unique_name, size, "%s", data->unique_name); if (is_app) @@ -198,9 +199,19 @@ static bool __get_cached_unique_name(int pid, char *unique_name, int size, bool data = (appid_cache_t *)calloc(1, sizeof(appid_cache_t)); if (data) { data->unique_name = strdup(unique_name); + data->sender = strdup(sender); data->is_app = _is_app; data->pid = pid; - g_hash_table_insert(caller_appid_cache_table, GINT_TO_POINTER(data->pid), (gpointer)data); + + if (data->unique_name && data->sender) { + if (g_hash_table_size(caller_appid_cache_table) > MAX_APPID_CACHE_SIZE) + g_hash_table_remove_all(caller_appid_cache_table); + + g_hash_table_insert(caller_appid_cache_table, (gpointer)data->sender, (gpointer)data); + } else { + LOGE("Out of memory"); + __free_cached_value(data); + } } if (is_app) @@ -219,20 +230,22 @@ void __hashtable_foreach_cb(gpointer key, gpointer value, gpointer user_data) LOGD("# %s(%d) - %d", data->unique_name, data->pid, data->is_app); } -void __free_cached_value(gpointer data) +static void __free_cached_value(gpointer data) { appid_cache_t *value = (appid_cache_t *)data; if (value) { if (value->unique_name) free(value->unique_name); + if (value->sender) + free(value->sender); free(value); } } void _rtc_set() { - if (_APPFW_FEATURE_WAKEUP_USING_RTC) { + if (using_rtc) { char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; #ifdef _SIMUL /* RTC does not work in simulator. */ LOGE("because it is simulator's mode, we don't set RTC."); @@ -296,7 +309,10 @@ static bool __set_time(time_t _time) return false; } - if (_APPFW_FEATURE_WAKEUP_USING_RTC) { + if (!_set_latest_settime(_time)) + LOGE("DB is failed."); + + if (using_rtc) { char buf[1024]; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; @@ -372,7 +388,7 @@ static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t * static void __alarm_add_to_list(__alarm_info_t *__alarm_info) { - alarm_info_t *alarm_info = &__alarm_info->alarm_info; + base_info_t *base_info = &__alarm_info->base_info; __alarm_info_t *entry = NULL; GSList *iter = NULL; @@ -387,12 +403,13 @@ static void __alarm_add_to_list(__alarm_info_t *__alarm_info) LOGD("[alarm-server]: alarm_id(%d).", entry->alarm_id); } - if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { + if (!(base_info->alarm_type & ALARM_TYPE_VOLATILE)) { if (!_save_alarms(__alarm_info)) LOGE("Saving alarm_id(%d) in DB is failed.", __alarm_info->alarm_id); } - DO_AFTER_ALARM_CREATE(__alarm_info->pid, __alarm_info->app_unique_name); + if (using_rtc) + DO_AFTER_ALARM_CREATE(__alarm_info->pid, __alarm_info->app_unique_name); } static bool __check_bundle_for_update(const gchar *b_data, uid_t uid) @@ -422,12 +439,12 @@ static bool __check_bundle_for_update(const gchar *b_data, uid_t uid) } static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int update_flag, int *error_code) + base_info_t *base_info, int update_flag, int *error_code) { bool found = false; GSList *iter = NULL; __alarm_info_t *entry = NULL; - alarm_info_t *_alarm_info = NULL; + base_info_t *found_base_info = NULL; time_t current_time; for (iter = alarm_context.alarms; iter != NULL; @@ -436,10 +453,10 @@ static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id, if (entry->uid == uid && entry->alarm_id == alarm_id) { found = true; - _alarm_info = &entry->alarm_info; + found_base_info = &entry->base_info; - if (update_flag == ALARM_UPDATE_FLAG_TIME || - ALARM_UPDATE_FLAG_WEEK) { + if ((update_flag == ALARM_UPDATE_FLAG_TIME) || + (update_flag == ALARM_UPDATE_FLAG_WEEK)) { if (!__check_bundle_for_update(entry->bundle, entry->uid)) { *error_code = ERR_ALARM_NOT_PERMITTED_APP; @@ -448,32 +465,31 @@ static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id, } if (update_flag == ALARM_UPDATE_FLAG_TIME) { - __alarm_set_start_and_end_time(alarm_info, entry); - memcpy(_alarm_info, alarm_info, sizeof(alarm_info_t)); + __alarm_set_start_and_end_time(base_info, entry); + memcpy(found_base_info, base_info, sizeof(base_info_t)); - if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_ONCE) { + if (found_base_info->mode.repeat == ALARM_REPEAT_MODE_ONCE) { time(¤t_time); - _alarm_info->reserved_info = current_time; + found_base_info->reserved_info = current_time; } } else if (update_flag == ALARM_UPDATE_FLAG_PERIOD) { - _alarm_info->alarm_type |= ALARM_TYPE_INEXACT; - _alarm_info->alarm_type |= ALARM_TYPE_PERIOD; - _alarm_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT; - _alarm_info->mode.u_interval.interval = - __get_proper_interval(alarm_info->mode.u_interval.interval, - _alarm_info->alarm_type); + found_base_info->alarm_type |= ALARM_TYPE_INEXACT; + found_base_info->alarm_type |= ALARM_TYPE_PERIOD; + found_base_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT; + found_base_info->mode.u_interval.interval = + __get_proper_interval(base_info->mode.u_interval.interval); } else if (update_flag == ALARM_UPDATE_FLAG_WEEK) { - _alarm_info->alarm_type &= ~ALARM_TYPE_INEXACT; - _alarm_info->mode = alarm_info->mode; + found_base_info->alarm_type &= ~ALARM_TYPE_INEXACT; + found_base_info->mode = base_info->mode; } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_PERIOD) { - if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_REPEAT) { - _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; - _alarm_info->mode.u_interval.interval = 0; + if (found_base_info->mode.repeat == ALARM_REPEAT_MODE_REPEAT) { + found_base_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; + found_base_info->mode.u_interval.interval = 0; } } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_WEEK_FLAG) { - if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_WEEKLY) { - _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; - _alarm_info->mode.u_interval.interval = 0; + if (found_base_info->mode.repeat == ALARM_REPEAT_MODE_WEEKLY) { + found_base_info->mode.repeat = ALARM_REPEAT_MODE_ONCE; + found_base_info->mode.u_interval.interval = 0; } } break; @@ -486,7 +502,7 @@ static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id, return NULL; } - if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { + if (!(base_info->alarm_type & ALARM_TYPE_VOLATILE)) { if (!_update_alarms(entry)) LOGE("Updating alarm_id(%d) in DB is failed.", alarm_id); } @@ -499,7 +515,7 @@ static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id, { bool found = false; - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; GSList *iter = NULL; __alarm_info_t *entry = NULL; @@ -510,11 +526,11 @@ static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id, for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { entry = (__alarm_info_t *)iter->data; if (entry->uid == uid && entry->alarm_id == alarm_id) { - alarm_info = &entry->alarm_info; + base_info = &entry->base_info; LOGD("[alarm-server]:Remove alarm id(%d)", entry->alarm_id); - if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { + if (!(base_info->alarm_type & ALARM_TYPE_VOLATILE)) { if (!_delete_alarms(alarm_id)) break; } @@ -537,17 +553,17 @@ static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id, return true; } -static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info, +static void __alarm_set_start_and_end_time(base_info_t *base_info, __alarm_info_t *__alarm_info) { - alarm_date_t *start = &alarm_info->start; - alarm_date_t *end = &alarm_info->end; + alarm_date_t *start = &base_info->start; + alarm_date_t *end = &base_info->end; struct tm alarm_tm = { 0, }; if (start->year != 0) { - if ((alarm_info->alarm_type & ALARM_TYPE_RELATIVE) && alarm_info->reserved_info != 0) { - __alarm_info->start = alarm_info->reserved_info; + if ((base_info->alarm_type & ALARM_TYPE_RELATIVE) && base_info->reserved_info != 0) { + __alarm_info->start = base_info->reserved_info; } else { alarm_tm.tm_year = start->year - 1900; alarm_tm.tm_mon = start->month - 1; @@ -588,47 +604,57 @@ static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double __alarm_info_t *entry = NULL; struct tm *p_time = NULL; struct tm due_time_result; - bool is_rtc_reset = false; is_time_changed = true; if (periodic_alarm_standard_time != 0) - periodic_alarm_standard_time += diff_time; + periodic_alarm_standard_time += (time_t)diff_time; tzset(); for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { entry = (__alarm_info_t *)iter->data; - alarm_info_t *alarm_info = &(entry->alarm_info); - if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) { + base_info_t *base_info = &(entry->base_info); + if (base_info->alarm_type & ALARM_TYPE_RELATIVE) { /* case of RTC reset */ - if (entry->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) { - if ((entry->due_time + diff_time - new_time) > - (entry->due_time - entry->alarm_info.reserved_info)) { + if (entry->base_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) { + if (is_rtc_reset) { LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld", ctime(&new_time), new_time, diff_time, entry->alarm_id, ctime(&entry->due_time), entry->due_time, - entry->alarm_info.reserved_info); + entry->base_info.reserved_info); continue; } - entry->due_time += diff_time; - entry->alarm_info.reserved_info = new_time; + if (entry->due_time + (time_t)diff_time < (time_t)diff_time) { + LOGE("time_t OVERFLOW!! %ld %f id %d", + entry->due_time, diff_time, entry->alarm_id); + continue; + } + entry->due_time += (time_t)diff_time; + entry->base_info.reserved_info = new_time; } else { - entry->due_time += diff_time; - is_rtc_reset = false; - if ((entry->due_time - new_time) > alarm_info->mode.u_interval.interval) { - is_rtc_reset = true; + if (is_rtc_reset) { + if (entry->due_time > new_time) + continue; + entry->due_time = new_time + - ((entry->due_time - new_time) % alarm_info->mode.u_interval.interval); + (new_time % base_info->mode.u_interval.interval); LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld", ctime(&new_time), new_time, diff_time, entry->alarm_id, ctime(&entry->due_time), entry->due_time, - alarm_info->mode.u_interval.interval); + base_info->mode.u_interval.interval); + } else { + if (entry->due_time + (time_t)diff_time < (time_t)diff_time) { + LOGE("time_t OVERFLOW!! %ld %f id %d", + entry->due_time, diff_time, entry->alarm_id); + continue; + } + entry->due_time += (time_t)diff_time; } } - alarm_date_t *start = &alarm_info->start; /**< start time of the alarm */ - alarm_date_t *end = &alarm_info->end; /**< end time of the alarm */ + alarm_date_t *start = &base_info->start; /**< start time of the alarm */ + alarm_date_t *end = &base_info->end; /**< end time of the alarm */ p_time = localtime_r(&entry->due_time, &due_time_result); if (p_time != NULL) { @@ -643,7 +669,7 @@ static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double entry->start = entry->due_time; if (entry->end != 0 && is_rtc_reset == false) { - entry->end += diff_time; + entry->end += (time_t)diff_time; p_time = localtime_r(&entry->end, &due_time_result); if (p_time != NULL) { end->year = p_time->tm_year + 1900; @@ -658,14 +684,20 @@ static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double _alarm_set_next_duetime(entry); } + if (is_rtc_reset) { + is_rtc_reset = false; + LOGW("RTC RESET -> RTC Normal"); + _save_module_log("[RTC NORMAL]", "RTC RESET -> NORMAL"); + } + time(¤t_time); - for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { + for (iter = alarm_context.alarms; iter != NULL;) { entry = (__alarm_info_t *)iter->data; due_time = entry->due_time; double interval = 0; - + iter = g_slist_next(iter); LOGD("alarm[%d] with duetime(%ld) at current(%ld)", entry->alarm_id, due_time, current_time); if (due_time == 0) { /* 0 means this alarm has been disabled */ continue; @@ -682,12 +714,12 @@ static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double LOGW("The alarm(%d) is removed [unique_name : %s, dst : %s", entry->alarm_id, entry->app_unique_name, dst); - if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + if (!(entry->base_info.alarm_type & ALARM_TYPE_VOLATILE)) _delete_alarms(entry->alarm_id); _save_alarm_info_log("AUTO_DELETE", entry); - alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data); + alarm_context.alarms = g_slist_remove(alarm_context.alarms, (gpointer)entry); _release_alarm_info_t(entry); continue; } else { @@ -741,8 +773,8 @@ static bool __alarm_add_and_set(__alarm_info_t *alarm_info, pid_t pid) alarm_info->dst_service_name, alarm_context.c_due_time); - if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) - alarm_info->alarm_info.reserved_info = current_time; + if (alarm_info->base_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + alarm_info->base_info.reserved_info = current_time; if (alarm_context.c_due_time < current_time) { LOGW("Caution!! alarm_context.c_due_time (%ld) is less than current time(%ld)", @@ -754,16 +786,16 @@ static bool __alarm_add_and_set(__alarm_info_t *alarm_info, pid_t pid) if (alarm_info->due_time == 0) { LOGW("[alarm-server]:Create a new alarm: due_time is 0. [alarm(%d):repeat_type(%d)]", - alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat); + alarm_info->alarm_id, alarm_info->base_info.mode.repeat); - if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + if (alarm_info->base_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) return false; __alarm_add_to_list(alarm_info); return true; } else if (current_time == alarm_info->due_time) { LOGW("[alarm-server]:Create alarm: current_time(%ld) is same as due_time(%ld) [alarm(%d):repeat_type(%d)]", - current_time, alarm_info->due_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat); + current_time, alarm_info->due_time, alarm_info->alarm_id, alarm_info->base_info.mode.repeat); __alarm_add_to_list(alarm_info); _clear_scheduled_alarm_list(); @@ -785,14 +817,15 @@ static bool __alarm_add_and_set(__alarm_info_t *alarm_info, pid_t pid) LOGW("[alarm-server]: Expired Due Time. \ [Due time=%ld, Current Time=%ld]!!!Do not add to schedule list. \ [alarm(%d):repeat_type(%d)]", - alarm_info->due_time, current_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat); + alarm_info->due_time, current_time, alarm_info->alarm_id, alarm_info->base_info.mode.repeat); - if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + if (alarm_info->base_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) return false; __alarm_add_to_list(alarm_info); return true; } else { + tzset(); localtime_r(&(alarm_info->due_time), &ts_ret); strftime(due_time_r, 30, "%c", &ts_ret); SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)", @@ -817,8 +850,9 @@ static bool __alarm_add_and_set(__alarm_info_t *alarm_info, pid_t pid) return true; } -static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id, - long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code) +static bool __alarm_create_appsvc(base_info_t *base_info, alarm_id_t *alarm_id, + long requested_interval, uid_t uid, int pid, const gchar *sender, + char *bundle_data, int *error_code) { char app_name[MAX_APP_ID_LEN] = { 0 }; bundle *b; @@ -841,8 +875,10 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id __alarm_info->alarm_id = -1; __alarm_info->requested_interval = requested_interval; __alarm_info->global = false; + __alarm_info->method = CUT_OFF; - if (__get_cached_unique_name(pid, app_name, sizeof(app_name), &caller_is_app, uid) == false) { + if (__get_cached_unique_name(pid, sender, app_name, sizeof(app_name), + &caller_is_app, uid) == false) { *error_code = ERR_ALARM_SYSTEM_FAIL; _release_alarm_info_t(__alarm_info); return false; @@ -877,8 +913,8 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id b_data = NULL; } - __alarm_set_start_and_end_time(alarm_info, __alarm_info); - memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); + __alarm_set_start_and_end_time(base_info, __alarm_info); + memcpy(&(__alarm_info->base_info), base_info, sizeof(base_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); if (__alarm_add_and_set(__alarm_info, pid) == false) { @@ -892,11 +928,11 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id return true; } -static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid, - int pid, periodic_method_e method, long requested_interval, int is_ref, - char *app_service_name, char *app_service_name_mod, - const char *dst_service_name, const char *dst_service_name_mod, - int *error_code) +static bool __alarm_create(base_info_t *base_info, alarm_id_t *alarm_id, + uid_t uid, int pid, const gchar *sender, periodic_method_e method, + long requested_interval, int is_ref, char *app_service_name, + char *app_service_name_mod, const char *dst_service_name, + const char *dst_service_name_mod, int *error_code) { char unique_name[MAX_APP_ID_LEN] = { 0 }; bool caller_is_app = false; @@ -918,7 +954,7 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t __alarm_info->is_ref = is_ref; __alarm_info->global = false; - if (__get_cached_unique_name(pid, unique_name, sizeof(unique_name), + if (__get_cached_unique_name(pid, sender, unique_name, sizeof(unique_name), &caller_is_app, uid) == false) { *error_code = ERR_ALARM_SYSTEM_FAIL; _release_alarm_info_t(__alarm_info); @@ -941,8 +977,8 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t if (dst_service_name_mod) __alarm_info->dst_service_name_mod = strdup(dst_service_name_mod); - __alarm_set_start_and_end_time(alarm_info, __alarm_info); - memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); + __alarm_set_start_and_end_time(base_info, __alarm_info); + memcpy(&(__alarm_info->base_info), base_info, sizeof(base_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); if (__alarm_add_and_set(__alarm_info, pid) == false) { @@ -960,13 +996,13 @@ static char *__create_new_noti_data(char *noti_data, pid_t pid, uid_t uid) { GVariant *noti_gv; guchar *decoded_data; - int decoded_datalen; + gsize decoded_datalen; notification_h noti = NULL; char *new_noti_data = NULL; guchar* data = NULL; int datalen; - decoded_data = g_base64_decode(noti_data, (gsize *)&decoded_datalen); + decoded_data = g_base64_decode(noti_data, &decoded_datalen); if (decoded_data == NULL) return NULL; @@ -1002,8 +1038,9 @@ end: return new_noti_data; } -static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id, - long requested_interval, uid_t uid, int pid, char *noti_data, int *error_code) +static bool __alarm_create_noti(base_info_t *base_info, alarm_id_t *alarm_id, + long requested_interval, uid_t uid, int pid, const gchar *sender, + char *noti_data, int *error_code) { char app_name[MAX_APP_ID_LEN] = { 0 }; bool caller_is_app = false; @@ -1023,17 +1060,18 @@ static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id, __alarm_info->alarm_id = -1; __alarm_info->requested_interval = requested_interval; __alarm_info->global = false; + __alarm_info->method = CUT_OFF; - if (__get_cached_unique_name(pid, app_name, sizeof(app_name), &caller_is_app, uid) == false) { + if (__get_cached_unique_name(pid, sender, app_name, sizeof(app_name), + &caller_is_app, uid) == false) { *error_code = ERR_ALARM_SYSTEM_FAIL; _release_alarm_info_t(__alarm_info); return false; } __alarm_info->app_unique_name = strdup(app_name); - if (caller_is_app) { + if (caller_is_app) __alarm_info->caller_pkgid = _get_pkgid_by_appid(app_name, uid); - } SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null", __alarm_info->caller_pkgid); @@ -1050,8 +1088,8 @@ static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id, __alarm_info->noti = strdup(noti_data); } - __alarm_set_start_and_end_time(alarm_info, __alarm_info); - memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); + __alarm_set_start_and_end_time(base_info, __alarm_info); + memcpy(&(__alarm_info->base_info), base_info, sizeof(base_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); if (__alarm_add_and_set(__alarm_info, pid) == false) { @@ -1066,7 +1104,7 @@ static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id, } static bool __alarm_update(uid_t uid, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int update_flag, int *error_code) + base_info_t *base_info, int update_flag, int *error_code) { time_t current_time; char due_time_r[100] = { 0 }; @@ -1082,16 +1120,16 @@ static bool __alarm_update(uid_t uid, alarm_id_t alarm_id, alarm_context.c_due_time = -1; } - __alarm_info = __alarm_update_in_list(uid, alarm_id, alarm_info, + __alarm_info = __alarm_update_in_list(uid, alarm_id, base_info, update_flag, error_code); if (!__alarm_info) { LOGE("[alarm-server]: requested alarm_id " - "(%d) does not exist. so this value is invalid id.", alarm_id); + "(%d) is not proper. so this value is invalid id.", alarm_id); return false; } - if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) - __alarm_info->alarm_info.reserved_info = current_time; + if (__alarm_info->base_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + __alarm_info->base_info.reserved_info = current_time; _alarm_set_next_duetime(__alarm_info); @@ -1128,6 +1166,7 @@ static bool __alarm_update(uid_t uid, alarm_id_t alarm_id, __alarm_info->due_time, current_time); return true; } else { + tzset(); localtime_r(&(__alarm_info->due_time), &ts_ret); strftime(due_time_r, 30, "%c", &ts_ret); SECURE_LOGD("[alarm-server]:Update alarm: alarm(%d) " @@ -1183,27 +1222,27 @@ bool _can_skip_expired_cb(alarm_id_t alarm_id) { GSList *gs_iter = NULL; __alarm_info_t *entry = NULL; - alarm_info_t *alarm = NULL; + base_info_t *base_info = NULL; for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = (__alarm_info_t *)gs_iter->data; if (entry->alarm_id == alarm_id) { - alarm = &(entry->alarm_info); + base_info = &(entry->base_info); time_t ts = 0; struct tm ts_tm; int dur = entry->requested_interval; int from, to; - if (dur == 0 || !(alarm->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF) + if (dur == 0 || !(base_info->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF) return false; - ts_tm.tm_hour = alarm->start.hour; - ts_tm.tm_min = alarm->start.min; - ts_tm.tm_sec = alarm->start.sec; + ts_tm.tm_hour = base_info->start.hour; + ts_tm.tm_min = base_info->start.min; + ts_tm.tm_sec = base_info->start.sec; - ts_tm.tm_year = alarm->start.year - 1900; - ts_tm.tm_mon = alarm->start.month - 1; - ts_tm.tm_mday = alarm->start.day; + ts_tm.tm_year = base_info->start.year - 1900; + ts_tm.tm_mon = base_info->start.month - 1; + ts_tm.tm_mday = base_info->start.day; ts_tm.tm_isdst = -1; ts = mktime(&ts_tm); @@ -1211,7 +1250,7 @@ bool _can_skip_expired_cb(alarm_id_t alarm_id) from = (ts / dur) * dur; to = from + dur; - if (ts >= from && ts < to && from > ts - alarm->mode.u_interval.interval) + if (ts >= from && ts < to && from > ts - base_info->mode.u_interval.interval) return false; return true; @@ -1236,7 +1275,7 @@ static int __find_login_user(uid_t *uid) free(uids); return -1; } else { - if (!strncmp(state, "online", 6)) { + if (!strcmp(state, "online")) { *uid = uids[i]; free(uids); free(state); @@ -1250,7 +1289,7 @@ static int __find_login_user(uid_t *uid) return -1; } -static notification_h __get_notification(guchar *data, int datalen) +static notification_h __get_notification(guchar *data, gsize datalen) { int ret; GVariant *noti_gv = NULL; @@ -1298,13 +1337,12 @@ static notification_h __get_notification(guchar *data, int datalen) static void __expire_notification(__alarm_info_t *alarm_info) { int ret; - int datalen; + gsize datalen; notification_h noti; guchar *noti_data; int expire_mode = ALARM_EXPIRE_MODE_NORMAL; - noti_data = g_base64_decode(alarm_info->noti, - (gsize *)&datalen); + noti_data = g_base64_decode(alarm_info->noti, &datalen); if (!noti_data) { LOGE("Failed to decode noti data"); return; @@ -1380,9 +1418,9 @@ static void __expire_app_control(__alarm_info_t *alarm_info) } else { /* since 2.4 */ appid = (char *)appsvc_get_appid(b); - if ((alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) { + if ((alarm_info->base_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) { LOGE("This alarm is ignored\n"); - } else if (!(alarm_info->alarm_info.alarm_type & ALARM_TYPE_INEXACT) || + } else if (!(alarm_info->base_info.alarm_type & ALARM_TYPE_INEXACT) || !_can_skip_expired_cb(alarm_info->alarm_id)) { if (alarm_info->global) { if (__find_login_user(&target_uid) < 0) { @@ -1459,9 +1497,9 @@ static int __expire_dbus_activation(__alarm_info_t *alarm_info) strncpy(appid, alarm_info->dst_service_name + 6, sizeof(appid) - 1); } - if (alarm_info->uid >= REGULAR_UID_MIN) { + if (alarm_info->uid >= REGULAR_UID_MIN) is_app = _is_app(appid, alarm_info->uid); - } + LOGD("appid : %s app?(%d)", appid, is_app); if (is_app) { @@ -1479,7 +1517,7 @@ static int __expire_dbus_activation(__alarm_info_t *alarm_info) LOGD("before alarm_send_noti_to_application"); _alarm_send_noti_to_application_by_dbus(destination_app_service_name, - alarm_info->alarm_id, alarm_info->alarm_info.msec, alarm_info->uid); /* dbus auto activation */ + alarm_info->alarm_id, alarm_info->base_info.msec, alarm_info->uid); /* dbus auto activation */ LOGD("after _alarm_send_noti_to_application_by_dbus"); } else { /* Case #3-2. The process was killed && App type @@ -1487,7 +1525,7 @@ static int __expire_dbus_activation(__alarm_info_t *alarm_info) __expired_alarm_t *expire_info; char alarm_id_str[32] = { 0, }; - if (alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) { + if (alarm_info->base_info.alarm_type & ALARM_TYPE_WITHCB) { __alarm_remove_from_list(alarm_info->uid, alarm_info->alarm_id, NULL); LOGW("[alarm-server]:This alarm_type is WITHCB"); return -2; @@ -1525,11 +1563,15 @@ static int __expire_dbus_activation(__alarm_info_t *alarm_info) } else { /* Case #3-3. The process was killed && non-app type(daemon) * Expiration noti is sent by DBus. it makes the process alive. (dbus auto activation) */ - if (alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) { + if (alarm_info->base_info.alarm_type & ALARM_TYPE_WITHCB) { char *cmdline = _get_cmdline_from_pid(alarm_info->pid); if (!cmdline || strcmp(cmdline, alarm_info->app_unique_name) != 0) { __alarm_remove_from_list(alarm_info->uid, alarm_info->alarm_id, NULL); LOGW("[alarm-server]:This alarm_type is WITHCB, the process was killed."); + + if (cmdline) + free(cmdline); + return -2; } @@ -1539,7 +1581,7 @@ static int __expire_dbus_activation(__alarm_info_t *alarm_info) LOGD("before alarm_send_noti_to_application for daemon"); _alarm_send_noti_to_application_by_dbus(destination_app_service_name, - alarm_info->alarm_id, alarm_info->alarm_info.msec, alarm_info->uid); /* dbus auto activation */ + alarm_info->alarm_id, alarm_info->base_info.msec, alarm_info->uid); /* dbus auto activation */ LOGD("after _alarm_send_noti_to_application_by_dbus for daemon"); } @@ -1599,9 +1641,10 @@ void _alarm_expired() _save_alarm_info_log("EXPIRED", __alarm_info); - DO_AFTER_ALARM_EXPIRE(__alarm_info->pid, __alarm_info->app_unique_name); + if (using_rtc) + DO_AFTER_ALARM_EXPIRE(__alarm_info->pid, __alarm_info->app_unique_name); - if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) { + if (__alarm_info->base_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) { __alarm_remove_from_list(__alarm_info->uid, __alarm_info->alarm_id, NULL); } else { _alarm_set_next_duetime(__alarm_info); @@ -1680,20 +1723,20 @@ static int __on_app_enable_cb(uid_t target_uid, int req_id, __alarm_info_t *entry = NULL; bool is_restored = false; - if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) { + if (key && strcmp(key, "end") == 0 && val && strcmp(val, "ok") == 0) { SECURE_LOGD("Enable appid(%s)", appid); for (gs_iter = g_disabled_alarm_list; gs_iter != NULL; ) { entry = (__alarm_info_t *)gs_iter->data; gs_iter = g_slist_next(gs_iter); - if (strncmp(appid, entry->app_unique_name, strlen(appid)) == 0) { + if (strcmp(appid, entry->app_unique_name) == 0) { _alarm_set_next_duetime(entry); SECURE_LOGD("Restore alarm_id(%d) duetime(%d) appid(%s)", entry->alarm_id, (int)(entry->due_time), appid); alarm_context.alarms = g_slist_append(alarm_context.alarms, entry); g_disabled_alarm_list = g_slist_remove(g_disabled_alarm_list, entry); - if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + if (!(entry->base_info.alarm_type & ALARM_TYPE_VOLATILE)) _update_db_for_disabled_alarm(entry->alarm_id, false); is_restored = true; } @@ -1720,14 +1763,14 @@ static int __on_app_disable_cb(uid_t target_uid, int req_id, __alarm_info_t *entry = NULL; bool is_disabled = false; - if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) { + if (key && strcmp(key, "end") == 0 && val && strcmp(val, "ok") == 0) { SECURE_LOGD("Disable appid(%s)", appid); for (gs_iter = alarm_context.alarms; gs_iter != NULL; ) { entry = (__alarm_info_t *)gs_iter->data; gs_iter = g_slist_next(gs_iter); - if (strncmp(appid, entry->app_unique_name, strlen(appid)) == 0) { - if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + if (strcmp(appid, entry->app_unique_name) == 0) { + if (!(entry->base_info.alarm_type & ALARM_TYPE_VOLATILE)) _update_db_for_disabled_alarm(entry->alarm_id, true); g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, entry); alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry); @@ -1754,10 +1797,10 @@ static int __on_app_installed(uid_t target_uid, int req_id, const char *pkg_type __alarm_info_t *entry = NULL; bool is_restored = false; - if (GET_POWER_SAVING_MODE() == -1) + if (using_rtc && GET_POWER_SAVING_MODE() == -1) return ALARMMGR_RESULT_SUCCESS; - if ((key && strncmp(key, "end", 3) != 0) || (val && strncmp(val, "ok", 2) != 0)) + if ((key && strcmp(key, "end") != 0) || (val && strcmp(val, "ok") != 0)) return ALARMMGR_RESULT_SUCCESS; if (g_slist_length(g_disabled_alarm_list) == 0) @@ -1770,13 +1813,13 @@ static int __on_app_installed(uid_t target_uid, int req_id, const char *pkg_type const char *callee_pkgid = entry->callee_pkgid; gs_iter = g_slist_next(gs_iter); - if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) || - (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0)) { + if ((caller_pkgid && strcmp(pkgid, caller_pkgid) == 0) || + (callee_pkgid && strcmp(pkgid, callee_pkgid) == 0)) { _alarm_set_next_duetime(entry); alarm_context.alarms = g_slist_append(alarm_context.alarms, entry); g_disabled_alarm_list = g_slist_remove(g_disabled_alarm_list, entry); - if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + if (!(entry->base_info.alarm_type & ALARM_TYPE_VOLATILE)) _update_db_for_disabled_alarm(entry->alarm_id, false); is_restored = true; } @@ -1798,32 +1841,32 @@ static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_ty { GSList *gs_iter = NULL; __alarm_info_t *entry = NULL; - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; bool is_deleted = false; - int is_power_saving_mode; + int is_power_saving_mode = 0; SECURE_LOGD("pkg_type(%s), pkgid(%s), key(%s), value(%s)", pkg_type, pkgid, key, val); - if ((key && strncmp(key, "end", 3) != 0) || (val && strncmp(val, "ok", 2) != 0)) + if ((key && strcmp(key, "end") != 0) || (val && strcmp(val, "ok") != 0)) return ALARMMGR_RESULT_SUCCESS; - is_power_saving_mode = GET_POWER_SAVING_MODE(); + if (using_rtc) + is_power_saving_mode = GET_POWER_SAVING_MODE(); for (gs_iter = alarm_context.alarms; gs_iter != NULL;) { entry = (__alarm_info_t *)gs_iter->data; const char *caller_pkgid = entry->caller_pkgid; const char *callee_pkgid = entry->callee_pkgid; - int pid = _get_pid_from_appid(entry->app_unique_name, entry->uid); gs_iter = g_slist_next(gs_iter); - if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) || - (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0)) { + if ((caller_pkgid && strcmp(pkgid, caller_pkgid) == 0) || + (callee_pkgid && strcmp(pkgid, callee_pkgid) == 0)) { if (_remove_from_scheduled_alarm_list(entry->uid, entry->alarm_id)) is_deleted = true; - alarm_info = &entry->alarm_info; - if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { + base_info = &entry->base_info; + if (!(base_info->alarm_type & ALARM_TYPE_VOLATILE)) { if (is_power_saving_mode == 1) _update_db_for_disabled_alarm(entry->alarm_id, true); else @@ -1835,9 +1878,6 @@ static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_ty g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, entry); alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry); } else { - if (g_hash_table_remove(caller_appid_cache_table, GINT_TO_POINTER(pid)) == true) - LOGD("Remove cachd data of pid[%d]", pid); - LOGD("Remove pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id); alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry); _release_alarm_info_t(entry); @@ -1854,26 +1894,24 @@ static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_ty return ALARMMGR_RESULT_SUCCESS; } -static long __get_proper_interval(long interval, int alarm_type) +static time_t __get_proper_interval(time_t interval) { - GSList *gs_iter = NULL; - __alarm_info_t *entry = NULL; - long maxInterval = 60; + time_t adjusted_interval; - for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { - entry = (__alarm_info_t *)gs_iter->data; - if (entry->alarm_info.alarm_type & ALARM_TYPE_PERIOD) { - if (entry->alarm_info.mode.u_interval.interval <= interval && - entry->alarm_info.mode.u_interval.interval > maxInterval) - maxInterval = entry->alarm_info.mode.u_interval.interval; - } + if (interval < INEXACT_INTERVAL_QUANTUM) { + adjusted_interval = INEXACT_INTERVAL_QUANTUM; + } else if (interval % INEXACT_INTERVAL_QUANTUM == 0) { + adjusted_interval = interval; + } else { + long quotient = interval / INEXACT_INTERVAL_QUANTUM; + long remainder = interval % INEXACT_INTERVAL_QUANTUM; + adjusted_interval = remainder > INEXACT_INTERVAL_QUANTUM / 2 ? + quotient * INEXACT_INTERVAL_QUANTUM + INEXACT_INTERVAL_QUANTUM : + quotient * INEXACT_INTERVAL_QUANTUM; } - while ((maxInterval * 2 <= interval && maxInterval < LONG_MAX / 2) || - (alarm_type & ALARM_TYPE_INEXACT && maxInterval < MIN_INEXACT_INTERVAL)) - maxInterval *= 2; - - return maxInterval; + LOGE("adjusted_interval : %ld", adjusted_interval); + return adjusted_interval; } static gboolean __alarm_expired_directly(gpointer user_data) @@ -1947,7 +1985,7 @@ void __reschedule_alarms_with_newtime(time_t cur_time, time_t new_time, double d return; } -static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id) +static int __check_modifiable(uid_t uid, pid_t pid, const gchar *sender, int alarm_id) { bool caller_is_app = false; char app_name[MAX_APP_ID_LEN] = { 0 }; @@ -1955,7 +1993,7 @@ static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id) __alarm_info_t *entry = NULL; char *caller_pkgid = NULL; - if (__get_cached_unique_name(pid, app_name, sizeof(app_name), + if (__get_cached_unique_name(pid, sender, app_name, sizeof(app_name), &caller_is_app, uid) == false) return ERR_ALARM_SYSTEM_FAIL; @@ -1993,7 +2031,7 @@ static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id) int alarm_manager_alarm_set_rtc_time(GVariant *parameters) { - if (_APPFW_FEATURE_WAKEUP_USING_RTC) { + if (using_rtc) { int retval = 0; struct tm tm, *alarm_tm = NULL; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; @@ -2047,7 +2085,7 @@ int alarm_manager_alarm_set_rtc_time(GVariant *parameters) static int accrue_nsec = 0; /* To check a millisecond part of current time at changing the system time(sec) */ -int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid) +int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid, const gchar *sender) { double diff_time = 0.0; struct timespec cur_time; @@ -2066,9 +2104,9 @@ int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid) clock_gettime(CLOCK_REALTIME, &cur_time); accrue_nsec += (cur_time.tv_nsec / MILLION); /* Accrue the nanosecond to compensate the time */ - if (accrue_nsec > (BILLION / 2)) { /* Over 500ms */ + if (accrue_nsec > 500) { /* Over 500ms */ diff_time = difftime(new_time, cur_time.tv_sec) - 1; - accrue_nsec -= BILLION; + accrue_nsec -= 1000; } else { diff_time = difftime(new_time, cur_time.tv_sec); } @@ -2086,14 +2124,15 @@ int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid) __reschedule_alarms_with_newtime(cur_time.tv_sec, new_time, diff_time); - __get_cached_unique_name(pid, sender_id, MAX_APP_ID_LEN, NULL, 5001); + __get_cached_unique_name(pid, sender, sender_id, MAX_APP_ID_LEN, NULL, 5001); snprintf(log_message, sizeof(log_message), "requested by %s (pid %d)", sender_id, pid); _save_module_log("SET TIME END", log_message); return ALARMMGR_RESULT_SUCCESS;; } -int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, pid_t pid) +int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, + pid_t pid, const gchar *sender) { double diff_time = 0.0; struct timespec cur_time = {0,}; @@ -2158,7 +2197,7 @@ int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, pi LOGD("Requested(%ld.%09ld) Delay(%ld.%09ld) Sleep(%09ld)", req_sec, req_nsec, delay.tv_sec, delay.tv_nsec, sleep_time.tv_nsec); __reschedule_alarms_with_newtime(cur_time.tv_sec, real_newtime, diff_time); - __get_cached_unique_name(pid, sender_id, MAX_APP_ID_LEN, NULL, 5001); + __get_cached_unique_name(pid, sender, sender_id, MAX_APP_ID_LEN, NULL, 5001); snprintf(log_message, sizeof(log_message), "requested by %s (pid %d)", sender_id, pid); _save_module_log("SET TIME PROPAGATION END", log_message); @@ -2175,6 +2214,7 @@ int alarm_manager_alarm_set_timezone(GVariant* parameters) char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; char *tzpath_str; time_t cur_time; + int dirfd = -1; g_variant_get(parameters, "(&s)", &tzpath_str); @@ -2186,10 +2226,18 @@ int alarm_manager_alarm_set_timezone(GVariant* parameters) goto done; } - retval = lstat(TIMEZONE_INFO_LINK_PATH, &statbuf); + dirfd = open(TIMEZONE_INFO_LINK_DIR_PATH, O_DIRECTORY); + if (dirfd < 0) { + LOGE("open(%s) failed: %d", TIMEZONE_INFO_LINK_DIR_PATH, errno); + return_code = ERR_ALARM_SYSTEM_FAIL; + goto done; + } + + retval = fstatat(dirfd, TIMEZONE_INFO_LINK_FILE_NAME, &statbuf, + AT_SYMLINK_NOFOLLOW); if (retval == 0 || (retval == -1 && errno != ENOENT)) { /* unlink the current link */ - if (unlink(TIMEZONE_INFO_LINK_PATH) < 0) { + if (unlinkat(dirfd, TIMEZONE_INFO_LINK_FILE_NAME, 0) < 0) { LOGE("unlink() is failed."); return_code = ERR_ALARM_SYSTEM_FAIL; goto done; @@ -2197,14 +2245,16 @@ int alarm_manager_alarm_set_timezone(GVariant* parameters) } /* create a new symlink when the /opt/etc/localtime is empty. */ - if (symlink(tzpath_str, TIMEZONE_INFO_LINK_PATH) < 0) { + if (symlinkat(tzpath_str, dirfd, TIMEZONE_INFO_LINK_FILE_NAME) < 0) { LOGE("Failed to create an symlink of %s.", tzpath_str); return_code = ERR_ALARM_SYSTEM_FAIL; goto done; } tzset(); - DO_AFTER_TIMEZONE_SET(); + + if (using_rtc) + DO_AFTER_TIMEZONE_SET(); /* Rescheduling alarms */ _alarm_disable_timer(); @@ -2228,6 +2278,9 @@ int alarm_manager_alarm_set_timezone(GVariant* parameters) bundle_free(b); done: + if (dirfd >= 0) + close(dirfd); + if (return_code == ALARMMGR_RESULT_SUCCESS) strncpy(log_tag, "SET TIMEZONE", sizeof(log_tag) - 1); else @@ -2239,9 +2292,10 @@ done: return return_code; } -int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id) +int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid, + const gchar *sender, int *alarm_id) { - alarm_info_t alarm_info; + base_info_t base_info; int return_code = ALARMMGR_RESULT_SUCCESS; int _alarm_id = 0; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; @@ -2294,32 +2348,34 @@ int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid bundle_free(b); } - alarm_info.start.year = start_year; - alarm_info.start.month = start_month; - alarm_info.start.day = start_day; - alarm_info.start.hour = start_hour; - alarm_info.start.min = start_min; - alarm_info.start.sec = start_sec; + base_info.start.year = start_year; + base_info.start.month = start_month; + base_info.start.day = start_day; + base_info.start.hour = start_hour; + base_info.start.min = start_min; + base_info.start.sec = start_sec; - alarm_info.end.year = end_year; - alarm_info.end.month = end_month; - alarm_info.end.day = end_day; + base_info.end.year = end_year; + base_info.end.month = end_month; + base_info.end.day = end_day; - alarm_info.mode.u_interval.day_of_week = mode_day_of_week; - alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; + base_info.mode.u_interval.day_of_week = mode_day_of_week; + base_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; - alarm_info.alarm_type = alarm_type; - alarm_info.reserved_info = reserved_info; + base_info.msec = 0; + base_info.alarm_type = alarm_type; + base_info.reserved_info = reserved_info; - if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) { - alarm_info.alarm_type |= ALARM_TYPE_PERIOD; - alarm_info.mode.u_interval.interval = - __get_proper_interval(mode_interval, alarm_info.alarm_type); + if ((base_info.alarm_type & ALARM_TYPE_INEXACT)) { + base_info.alarm_type |= ALARM_TYPE_PERIOD; + base_info.mode.u_interval.interval = + __get_proper_interval(mode_interval); } else if (mode_interval <= 0) { - alarm_info.mode.u_interval.interval = 0; + base_info.mode.u_interval.interval = 0; } - if (!__alarm_create_appsvc(&alarm_info, &_alarm_id, mode_interval, uid, pid, bundle_data, &return_code)) { + if (!__alarm_create_appsvc(&base_info, &_alarm_id, mode_interval, uid, pid, + sender, bundle_data, &return_code)) { LOGE("Unable to create alarm! return_code[%d]", return_code); strncpy(log_tag, "FAIL: CREATE SVC", sizeof(log_tag) - 1); snprintf(log_message, sizeof(log_message), @@ -2336,9 +2392,9 @@ int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid } int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid, - int *alarm_id) + const gchar *sender, int *alarm_id) { - alarm_info_t alarm_info; + base_info_t base_info; int return_code = ALARMMGR_RESULT_SUCCESS; int _alarm_id = 0; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; @@ -2360,32 +2416,34 @@ int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid, mode_interval = (time_t)tmp_mode_interval; reserved_info = (time_t)tmp_reserved_info; - alarm_info.start.year = start_year; - alarm_info.start.month = start_month; - alarm_info.start.day = start_day; - alarm_info.start.hour = start_hour; - alarm_info.start.min = start_min; - alarm_info.start.sec = start_sec; + base_info.start.year = start_year; + base_info.start.month = start_month; + base_info.start.day = start_day; + base_info.start.hour = start_hour; + base_info.start.min = start_min; + base_info.start.sec = start_sec; - alarm_info.end.year = end_year; - alarm_info.end.month = end_month; - alarm_info.end.day = end_day; + base_info.end.year = end_year; + base_info.end.month = end_month; + base_info.end.day = end_day; - alarm_info.mode.u_interval.day_of_week = mode_day_of_week; - alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; + base_info.mode.u_interval.day_of_week = mode_day_of_week; + base_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; - alarm_info.alarm_type = alarm_type; - alarm_info.reserved_info = reserved_info; + base_info.msec = 0; + base_info.alarm_type = alarm_type; + base_info.reserved_info = reserved_info; - if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) { - alarm_info.alarm_type |= ALARM_TYPE_PERIOD; - alarm_info.mode.u_interval.interval = - __get_proper_interval(mode_interval, alarm_info.alarm_type); + if ((base_info.alarm_type & ALARM_TYPE_INEXACT)) { + base_info.alarm_type |= ALARM_TYPE_PERIOD; + base_info.mode.u_interval.interval = + __get_proper_interval(mode_interval); } else if (mode_interval <= 0) { - alarm_info.mode.u_interval.interval = 0; + base_info.mode.u_interval.interval = 0; } - if (!__alarm_create_noti(&alarm_info, &_alarm_id, mode_interval, uid, pid, noti_data, &return_code)) { + if (!__alarm_create_noti(&base_info, &_alarm_id, mode_interval, uid, pid, + sender, noti_data, &return_code)) { LOGE("Unable to create alarm! return_code[%d]", return_code); strncpy(log_tag, "FAIL: CREATE NOTI", sizeof(log_tag) - 1); snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", @@ -2400,9 +2458,10 @@ int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid, return return_code; } -int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id) +int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, + const gchar *sender, int *alarm_id) { - alarm_info_t alarm_info; + base_info_t base_info; int return_code = ALARMMGR_RESULT_SUCCESS; int _alarm_id = 0; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; @@ -2431,31 +2490,31 @@ int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, int * reserved_info = (time_t)tmp_reserved_info; - alarm_info.start.year = start_year; - alarm_info.start.month = start_month; - alarm_info.start.day = start_day; - alarm_info.start.hour = start_hour; - alarm_info.start.min = start_min; - alarm_info.start.sec = start_sec; + base_info.start.year = start_year; + base_info.start.month = start_month; + base_info.start.day = start_day; + base_info.start.hour = start_hour; + base_info.start.min = start_min; + base_info.start.sec = start_sec; - alarm_info.msec = msec; + base_info.msec = msec; - alarm_info.end.year = end_year; - alarm_info.end.month = end_month; - alarm_info.end.day = end_day; + base_info.end.year = end_year; + base_info.end.month = end_month; + base_info.end.day = end_day; - alarm_info.mode.u_interval.day_of_week = mode_day_of_week; - alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; + base_info.mode.u_interval.day_of_week = mode_day_of_week; + base_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; - alarm_info.alarm_type = alarm_type; - alarm_info.reserved_info = reserved_info; + base_info.alarm_type = alarm_type; + base_info.reserved_info = reserved_info; if (strcmp(reserved_service_name, "null") == 0) _reserved_service_name = NULL; if (strcmp(reserved_service_name_mod, "null") == 0) _reserved_service_name_mod = NULL; - if (!__alarm_create(&alarm_info, &_alarm_id, uid, pid, QUANTUMIZE, 0, 0, app_service_name, app_service_name_mod, + if (!__alarm_create(&base_info, &_alarm_id, uid, pid, sender, QUANTUMIZE, 0, 0, app_service_name, app_service_name_mod, _reserved_service_name, _reserved_service_name_mod, &return_code)) { LOGE("Unable to create alarm! return_code[%d]", return_code); strncpy(log_tag, "FAIL: CREATE", sizeof(log_tag) - 1); @@ -2482,9 +2541,9 @@ time_t _get_periodic_alarm_standard_time(void) } int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid, - pid_t pid, int *alarm_id) + pid_t pid, const gchar *sender, int *alarm_id) { - alarm_info_t alarm_info; + base_info_t base_info; int return_code = ALARMMGR_RESULT_SUCCESS; int _alarm_id = 0; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; @@ -2500,48 +2559,49 @@ int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid, struct tm standard_tm; time_t standard_time = _get_periodic_alarm_standard_time(); + tzset(); localtime_r(&standard_time, &standard_tm); - alarm_info.reserved_info = standard_time; + base_info.reserved_info = standard_time; - alarm_info.start.year = standard_tm.tm_year + 1900; - alarm_info.start.month = standard_tm.tm_mon + 1; - alarm_info.start.day = standard_tm.tm_mday; - alarm_info.start.hour = standard_tm.tm_hour; - alarm_info.start.min = standard_tm.tm_min; - alarm_info.start.sec = standard_tm.tm_sec; + base_info.start.year = standard_tm.tm_year + 1900; + base_info.start.month = standard_tm.tm_mon + 1; + base_info.start.day = standard_tm.tm_mday; + base_info.start.hour = standard_tm.tm_hour; + base_info.start.min = standard_tm.tm_min; + base_info.start.sec = standard_tm.tm_sec; - alarm_info.msec = 0; + base_info.msec = 0; - alarm_info.end.year = 0; - alarm_info.end.month = 0; - alarm_info.end.day = 0; + base_info.end.year = 0; + base_info.end.month = 0; + base_info.end.day = 0; - alarm_info.alarm_type = ALARM_TYPE_VOLATILE; - alarm_info.alarm_type |= ALARM_TYPE_RELATIVE; - alarm_info.alarm_type |= ALARM_TYPE_WITHCB; - alarm_info.alarm_type |= ALARM_TYPE_PERIOD; + base_info.alarm_type = ALARM_TYPE_VOLATILE; + base_info.alarm_type |= ALARM_TYPE_RELATIVE; + base_info.alarm_type |= ALARM_TYPE_WITHCB; + base_info.alarm_type |= ALARM_TYPE_PERIOD; if (interval <= 0) { - alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE; - alarm_info.mode.u_interval.interval = 0; + base_info.mode.repeat = ALARM_REPEAT_MODE_ONCE; + base_info.mode.u_interval.interval = 0; } else { - alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT; + base_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT; if (is_ref) - alarm_info.mode.u_interval.interval = interval * 60; + base_info.mode.u_interval.interval = (time_t)interval * 60; else - alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60, alarm_info.alarm_type); + base_info.mode.u_interval.interval = __get_proper_interval(interval * 60); } - if (!__alarm_create(&alarm_info, &_alarm_id, uid, pid, (periodic_method_e)method, interval * 60, is_ref, - app_service_name, app_service_name_mod, - NULL, NULL, &return_code)) { + if (!__alarm_create(&base_info, &_alarm_id, uid, pid, sender, + (periodic_method_e)method, interval * 60, is_ref, app_service_name, + app_service_name_mod, NULL, NULL, &return_code)) { LOGE("Unable to create alarm! return_code[%d]", return_code); strncpy(log_tag, "FAIL: CREAT PERIOD", sizeof(log_tag) - 1); snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", - _alarm_id, uid, pid, alarm_info.start.year, alarm_info.start.month, - alarm_info.start.day, alarm_info.start.hour, - alarm_info.start.min, alarm_info.start.sec); + _alarm_id, uid, pid, base_info.start.year, base_info.start.month, + base_info.start.day, base_info.start.hour, + base_info.start.min, base_info.start.sec); _save_module_log(log_tag, log_message); return_code = ERR_ALARM_SYSTEM_FAIL; } else { @@ -2552,7 +2612,8 @@ int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid, return return_code; } -int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid) +int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid, + const gchar *sender) { int return_code = ALARMMGR_RESULT_SUCCESS; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; @@ -2561,7 +2622,7 @@ int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid) g_variant_get(parameters, "(i)", &alarm_id); - return_code = __check_modifiable(uid, pid, alarm_id); + return_code = __check_modifiable(uid, pid, sender, alarm_id); if (return_code != ALARMMGR_RESULT_SUCCESS) return return_code; @@ -2580,16 +2641,17 @@ int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid) return return_code; } -int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid) +int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid, + const gchar *sender) { GSList *gs_iter = NULL; char app_name[MAX_APP_ID_LEN] = { 0 }; - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; __alarm_info_t *entry = NULL; bool is_deleted = false; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; - if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false) { + if (__get_cached_unique_name(pid, sender, app_name, sizeof(app_name), NULL, uid) == false) { snprintf(log_message, sizeof(log_message), "pid: %d. Can not get the unique_name.", pid); _save_module_log("FAIL: DELETE ALL", log_message); return ERR_ALARM_SYSTEM_FAIL; @@ -2602,12 +2664,12 @@ int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid) entry = (__alarm_info_t*)gs_iter->data; const char *tmp_appname = entry->app_unique_name; SECURE_LOGD("Try to remove app_name[%s], alarm_id[%d]\n", tmp_appname, entry->alarm_id); - if (tmp_appname && strncmp(app_name, tmp_appname, strlen(tmp_appname)) == 0) { + if (tmp_appname && strcmp(app_name, tmp_appname) == 0) { if (_remove_from_scheduled_alarm_list(uid, entry->alarm_id)) is_deleted = true; - alarm_info = &entry->alarm_info; - if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { + base_info = &entry->base_info; + if (!(base_info->alarm_type & ALARM_TYPE_VOLATILE)) { if (!_delete_alarms(entry->alarm_id)) SECURE_LOGE("_delete_alarms() is failed. pid[%d], alarm_id[%d]", pid, entry->alarm_id); } @@ -2636,10 +2698,10 @@ int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid) return ALARMMGR_RESULT_SUCCESS; } -int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid) +int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid, const gchar *sender) { int return_code = ALARMMGR_RESULT_SUCCESS; - alarm_info_t alarm_info; + base_info_t base_info; char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; int alarm_id; @@ -2658,28 +2720,29 @@ int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid) mode_interval = (time_t)tmp_mode_interval; reserved_info = (time_t)tmp_reserved_info; - return_code = __check_modifiable(uid, pid, alarm_id); + return_code = __check_modifiable(uid, pid, sender, alarm_id); if (return_code != ALARMMGR_RESULT_SUCCESS) return return_code; - alarm_info.start.year = start_year; - alarm_info.start.month = start_month; - alarm_info.start.day = start_day; - alarm_info.start.hour = start_hour; - alarm_info.start.min = start_min; - alarm_info.start.sec = start_sec; + base_info.start.year = start_year; + base_info.start.month = start_month; + base_info.start.day = start_day; + base_info.start.hour = start_hour; + base_info.start.min = start_min; + base_info.start.sec = start_sec; - alarm_info.end.year = end_year; - alarm_info.end.month = end_month; - alarm_info.end.day = end_day; + base_info.end.year = end_year; + base_info.end.month = end_month; + base_info.end.day = end_day; - alarm_info.mode.u_interval.interval = mode_interval; - alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; + base_info.mode.u_interval.interval = mode_interval; + base_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat; - alarm_info.alarm_type = alarm_type; - alarm_info.reserved_info = reserved_info; + base_info.msec = 0; + base_info.alarm_type = alarm_type; + base_info.reserved_info = reserved_info; - if (!__alarm_update(uid, alarm_id, &alarm_info, + if (!__alarm_update(uid, alarm_id, &base_info, update_flag, &return_code)) { LOGE("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code); strncpy(log_tag, "FAIL: UPDATE", sizeof(log_tag) - 1); @@ -2691,7 +2754,8 @@ int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid) return return_code; } -int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids) +int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, + const gchar *sender, int *num_of_ids) { GSList *gs_iter = NULL; char app_name[MAX_APP_ID_LEN] = { 0 }; @@ -2700,7 +2764,7 @@ int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids) *num_of_ids = _num_of_ids; - if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false) + if (__get_cached_unique_name(pid, sender, app_name, sizeof(app_name), NULL, uid) == false) return ERR_ALARM_SYSTEM_FAIL; SECURE_LOGD("Called by process (uid:%d, pid:%d, unique_name:%s)", uid, pid, app_name); @@ -2709,7 +2773,7 @@ int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids) entry = (__alarm_info_t*)gs_iter->data; SECURE_LOGD("app_name=%s, app_unique_name=%s", app_name, entry->app_unique_name); if (entry->uid == uid && - strncmp(app_name, entry->app_unique_name, strlen(app_name)) == 0) { + strcmp(app_name, entry->app_unique_name) == 0) { (_num_of_ids)++; SECURE_LOGD("inc number of alarms of app (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, _num_of_ids); } @@ -2721,45 +2785,39 @@ int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids) } int alarm_manager_alarm_get_list_of_ids(GVariant *parameters, uid_t uid, - pid_t pid, GVariant **alarm_array, int *num_of_alarm) + pid_t pid, const gchar *sender, GVariantBuilder *alarm_array, int *num_of_alarm) { GSList *gs_iter = NULL; char app_name[MAX_APP_ID_LEN] = { 0 }; __alarm_info_t *entry = NULL; int index = 0; int max_number_of_ids; - GVariantBuilder *builder = NULL; - *alarm_array = g_variant_new("ai", NULL); + *num_of_alarm = 0; g_variant_get(parameters, "(i)", &max_number_of_ids); - if (max_number_of_ids <= 0) { SECURE_LOGE("called for uid(%d) pid(%d), but max_number_of_ids(%d) is less than 0.", uid, pid, max_number_of_ids); - *num_of_alarm = 0; return ALARMMGR_RESULT_SUCCESS; } - if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false) + if (__get_cached_unique_name(pid, sender, app_name, sizeof(app_name), NULL, uid) == false) return ERR_ALARM_SYSTEM_FAIL; SECURE_LOGD("Called by process (uid: %d, pid:%d, unique_name=%s).", uid, pid, app_name); - builder = g_variant_builder_new(G_VARIANT_TYPE("ai")); for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = (__alarm_info_t*)gs_iter->data; if (entry->uid == uid && - strncmp(app_name, (entry->app_unique_name), strlen(app_name)) == 0) { - g_variant_builder_add(builder, "i", entry->alarm_id); + strcmp(app_name, (entry->app_unique_name)) == 0) { + g_variant_builder_add(alarm_array, "(i)", entry->alarm_id); index++; SECURE_LOGE("called for alarmid(%d), but max_number_of_ids(%d) index %d.", entry->alarm_id, max_number_of_ids, index); } } - *alarm_array = g_variant_new("ai", builder); *num_of_alarm = index; - g_variant_builder_unref(builder); SECURE_LOGE("Called by uid (%d), pid (%d), but max_number_of_ids(%d).", uid, pid, index); return ALARMMGR_RESULT_SUCCESS; @@ -2833,11 +2891,11 @@ int alarm_manager_alarm_get_noti_info(GVariant *parameters, uid_t uid, gchar **n return return_code; } -int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, alarm_info_t *alarm_info) +int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, base_info_t *base_info) { GSList *gs_iter = NULL; __alarm_info_t *entry = NULL; - alarm_info_t *_alarm_info = NULL; + base_info_t *found_base_info = NULL; int alarm_id; g_variant_get(parameters, "(i)", &alarm_id); @@ -2846,30 +2904,30 @@ int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, alarm_info_t * for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = (__alarm_info_t*)gs_iter->data; if (entry->uid == uid && entry->alarm_id == alarm_id) { - _alarm_info = &(entry->alarm_info); + found_base_info = &(entry->base_info); break; } } - if (_alarm_info == NULL) { + if (found_base_info == NULL) { LOGE("The alarm(%d) is not found.", alarm_id); return ERR_ALARM_INVALID_ID; } else { LOGD("The alarm(%d) is found.", alarm_id); - alarm_info->start.year = _alarm_info->start.year; - alarm_info->start.month = _alarm_info->start.month; - alarm_info->start.day = _alarm_info->start.day; - alarm_info->start.hour = _alarm_info->start.hour; - alarm_info->start.min = _alarm_info->start.min; - alarm_info->start.sec = _alarm_info->start.sec; - alarm_info->end.year = _alarm_info->end.year; - alarm_info->end.month = _alarm_info->end.month; - alarm_info->end.day = _alarm_info->end.day; - alarm_info->mode.u_interval.day_of_week = - _alarm_info->mode.u_interval.day_of_week; - alarm_info->mode.repeat = _alarm_info->mode.repeat; - alarm_info->alarm_type = _alarm_info->alarm_type; - alarm_info->reserved_info = _alarm_info->reserved_info; + base_info->start.year = found_base_info->start.year; + base_info->start.month = found_base_info->start.month; + base_info->start.day = found_base_info->start.day; + base_info->start.hour = found_base_info->start.hour; + base_info->start.min = found_base_info->start.min; + base_info->start.sec = found_base_info->start.sec; + base_info->end.year = found_base_info->end.year; + base_info->end.month = found_base_info->end.month; + base_info->end.day = found_base_info->end.day; + base_info->mode.u_interval.day_of_week = + found_base_info->mode.u_interval.day_of_week; + base_info->mode.repeat = found_base_info->mode.repeat; + base_info->alarm_type = found_base_info->alarm_type; + base_info->reserved_info = found_base_info->reserved_info; } return ALARMMGR_RESULT_SUCCESS; @@ -2914,7 +2972,7 @@ int alarm_manager_alarm_set_global(GVariant *parameters, uid_t uid) { GSList *gs_iter = NULL; __alarm_info_t *entry = NULL; - alarm_info_t *alarm_info = NULL; + base_info_t *base_info = NULL; int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; char *callee_pkgid; @@ -2927,12 +2985,12 @@ int alarm_manager_alarm_set_global(GVariant *parameters, uid_t uid) for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = (__alarm_info_t*)gs_iter->data; if (entry->uid == uid && entry->alarm_id == alarm_id) { - alarm_info = &(entry->alarm_info); + base_info = &(entry->base_info); break; } } - if (alarm_info == NULL) { + if (base_info == NULL) { LOGE("The alarm(%d) is not found.", alarm_id); return ERR_ALARM_INVALID_ID; } else { @@ -3033,40 +3091,41 @@ static int __load_module(const char *path) plugin_handle = dlopen(path, RTLD_LAZY | RTLD_GLOBAL); if (!plugin_handle) { LOGE("Failed to load - %s", dlerror()); - return -1; + using_rtc = false; + return 0; + } else { + using_rtc = true; } - if (_APPFW_FEATURE_WAKEUP_USING_RTC) { - RTC_INIT = dlsym(plugin_handle, "RTC_INIT"); - if (!RTC_INIT) { - LOGE("Failed to find PLUGIN_INIT"); - goto out; - } + RTC_INIT = dlsym(plugin_handle, "RTC_INIT"); + if (!RTC_INIT) { + LOGE("Failed to find PLUGIN_INIT"); + goto out; + } - CLEAR_WAKEUP_RTC = dlsym(plugin_handle, "CLEAR_WAKEUP_RTC"); - if (!CLEAR_WAKEUP_RTC) { - LOGE("Failed to find CLEAR_WAKEUP_RTC"); - goto out; - } + CLEAR_WAKEUP_RTC = dlsym(plugin_handle, "CLEAR_WAKEUP_RTC"); + if (!CLEAR_WAKEUP_RTC) { + LOGE("Failed to find CLEAR_WAKEUP_RTC"); + goto out; + } - SET_WAKEUP_RTC = dlsym(plugin_handle, "SET_WAKEUP_RTC"); - if (!SET_WAKEUP_RTC) { - LOGE("Failed to find SET_WAKEUP_RTC"); - goto out; - } + SET_WAKEUP_RTC = dlsym(plugin_handle, "SET_WAKEUP_RTC"); + if (!SET_WAKEUP_RTC) { + LOGE("Failed to find SET_WAKEUP_RTC"); + goto out; + } - SET_WAKEUP_RTC_WITH_DATETIME = dlsym(plugin_handle, - "SET_WAKEUP_RTC_WITH_DATETIME"); - if (!SET_WAKEUP_RTC_WITH_DATETIME) { - LOGE("Failed to find SET_WAKEUP_RTC_WITH_DATETIME"); - goto out; - } + SET_WAKEUP_RTC_WITH_DATETIME = dlsym(plugin_handle, + "SET_WAKEUP_RTC_WITH_DATETIME"); + if (!SET_WAKEUP_RTC_WITH_DATETIME) { + LOGE("Failed to find SET_WAKEUP_RTC_WITH_DATETIME"); + goto out; + } - SET_SYSTIME_RTC = dlsym(plugin_handle, "SET_SYSTIME_RTC"); - if (!SET_SYSTIME_RTC) { - LOGE("Failed to find SET_SYSTIME_RTC"); - goto out; - } + SET_SYSTIME_RTC = dlsym(plugin_handle, "SET_SYSTIME_RTC"); + if (!SET_SYSTIME_RTC) { + LOGE("Failed to find SET_SYSTIME_RTC"); + goto out; } DO_AFTER_TIMEZONE_SET = dlsym(plugin_handle, "DO_AFTER_TIMEZONE_SET"); @@ -3110,12 +3169,9 @@ out: void _alarm_initialize() { -#if !(GLIB_CHECK_VERSION(2, 36, 0)) - g_type_init(); -#endif - - //For debug + time_t latest_settime; int expire_mode = ALARM_EXPIRE_MODE_NORMAL; + vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode); LOGD("alarm_expire_mode : %d", expire_mode); @@ -3140,6 +3196,7 @@ void _alarm_initialize() if (_initialize_db() == false) { LOGE("_initialize_db failed, " "alarm cannot be stored to database.\n"); + exit(1); } if (__load_module(PATH_LIB_ALARMMGR_PLUGIN) != 0) { @@ -3147,27 +3204,38 @@ void _alarm_initialize() exit(1); } - if (_APPFW_FEATURE_WAKEUP_USING_RTC) { + if (using_rtc) { if (RTC_INIT() != 0) { LOGE("rtc init failed"); + _save_module_log("FAIL: RTC_INIT", "alarm_manager won't use RTC"); + using_rtc = false; + } + + if (PS_MODE_INIT() != 0) { + LOGE("power saving mode init failed"); exit(1); } } - if (PS_MODE_INIT() != 0) { - LOGE("power saving mode init failed"); - exit(1); + if (_get_latest_settime(&latest_settime)) { + time_t current_time; + time(¤t_time); + if (current_time < latest_settime) { + LOGE("[RTC_RESET] RTC goes back into the past."); + _save_module_log("FAIL: RTC_RESET", "RTC goes back into the past."); + is_rtc_reset = true; + } } __initialize_alarm_list(); __initialize_noti(); if (!caller_appid_cache_table) { - caller_appid_cache_table = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, __free_cached_value); + caller_appid_cache_table = g_hash_table_new_full(g_str_hash, + g_str_equal, NULL, __free_cached_value); } - if (_APPFW_FEATURE_WAKEUP_USING_RTC) { + if (using_rtc) { tzset(); DO_AFTER_TIMEZONE_SET(); } diff --git a/server/alarm-service.conf.in b/server/alarm-service.conf.in index 7ffdafd..22a32d7 100755 --- a/server/alarm-service.conf.in +++ b/server/alarm-service.conf.in @@ -39,8 +39,8 @@ <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_get_next_duetime" privilege="http://tizen.org/privilege/alarm.get"/> <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_global" privilege="http://tizen.org/privilege/alarm.set"/> <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_get_global" privilege="http://tizen.org/privilege/alarm.get"/> - <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_time" privilege="http://tizen.org/privilege/alarm.set"/> - <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_time_with_propagation_delay" privilege="http://tizen.org/privilege/alarm.set"/> - <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_timezone" privilege="http://tizen.org/privilege/alarm.set"/> + <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_time" privilege="http://tizen.org/privilege/systemsettings.admin"/> + <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_time_with_propagation_delay" privilege="http://tizen.org/privilege/systemsettings.admin"/> + <check send_destination="org.tizen.alarm.manager" send_interface="org.tizen.alarm.manager" send_member="alarm_set_timezone" privilege="http://tizen.org/privilege/systemsettings.admin"/> </policy> </busconfig> diff --git a/server/plugin/platform/src/alarm-server-plugin.c b/server/plugin/platform/src/alarm-server-plugin.c index 8b78767..d41cef3 100644 --- a/server/plugin/platform/src/alarm-server-plugin.c +++ b/server/plugin/platform/src/alarm-server-plugin.c @@ -20,14 +20,13 @@ #include <errno.h> #include <dlog.h> #include <sys/ioctl.h> -#include <sys/stat.h> #include <linux/rtc.h> #include "plugin.h" static const char default_rtc[] = "/dev/rtc"; -int gfd = -1; -int is_psm = -1; +static int gfd = -1; +static int is_psm = -1; EXPORT int CLEAR_WAKEUP_RTC(void) { diff --git a/session-agent/CMakeLists.txt b/session-agent/CMakeLists.txt index a6417af..af47f5e 100644 --- a/session-agent/CMakeLists.txt +++ b/session-agent/CMakeLists.txt @@ -4,7 +4,7 @@ SET(AGENT "alarm_session_agent") SET(SRC agent.c) -PKG_CHECK_MODULES(agent_pkgs REQUIRED gio-2.0 glib-2.0 dlog bundle libsystemd-daemon) +PKG_CHECK_MODULES(agent_pkgs REQUIRED gio-2.0 glib-2.0 dlog bundle libsystemd) FOREACH(flag ${agent_pkgs_CFLAGS_OTHER}) IF(${flag} MATCHES "\\-D+") ADD_DEFINITIONS(${flag}) diff --git a/session-agent/agent.c b/session-agent/agent.c index 370c397..07644db 100755 --- a/session-agent/agent.c +++ b/session-agent/agent.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2016 - 2022 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include <stdio.h> #include <stdlib.h> -#include <stdbool.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/un.h> @@ -35,7 +35,7 @@ #define POLLFD_MAX 1 -GMainLoop *mainloop; +static GMainLoop *__mainloop; static int _sock_create(const char *path) { @@ -126,7 +126,7 @@ static void _send_noti(char *service_name, int alarm_id, int msec) conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &err); if (!conn) { - LOGE("connection error %s", err->message); + LOGE("connection error %s", err ? err->message : "unknown"); g_clear_error(&err); exit(-1); } @@ -151,10 +151,10 @@ static void _send_noti(char *service_name, int alarm_id, int msec) g_object_unref(conn); } -static void flush_data(int fd, uint32_t len) +static void flush_data(int fd, size_t len) { - int r; - uint32_t s; + ssize_t r; + size_t s; char buf[4096]; while (len > 0) { @@ -172,7 +172,7 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition, gpointer user_data) { int r; - int len; + size_t len; int alarm_id; int msec; int clifd; @@ -182,7 +182,7 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition, socklen_t addrlen; GVariant *gv; - addrlen = sizeof(sa); + addrlen = (socklen_t)sizeof(sa); clifd = accept(fd, (struct sockaddr *)&sa, &addrlen); if (clifd == -1) { LOGE("Accept: %d", errno); @@ -246,7 +246,7 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition, gboolean _timeout_handler(gpointer user_data) { - g_main_loop_quit(mainloop); + g_main_loop_quit(__mainloop); return G_SOURCE_REMOVE; } @@ -264,13 +264,13 @@ int main(int argc, char *argv[]) exit(0); } - mainloop = g_main_loop_new(NULL, FALSE); + __mainloop = g_main_loop_new(NULL, FALSE); g_unix_fd_add(sock_fd, G_IO_IN, _alarm_agent_main, NULL); g_timeout_add_seconds(100, _timeout_handler, NULL); - g_main_loop_run(mainloop); + g_main_loop_run(__mainloop); - g_main_loop_unref(mainloop); + g_main_loop_unref(__mainloop); close(sock_fd); return 0; diff --git a/tool/alarmmgr_add_periodic_alarm_withcb.c b/tool/alarmmgr_add_periodic_alarm_withcb.c index f4240d0..13ec596 100644 --- a/tool/alarmmgr_add_periodic_alarm_withcb.c +++ b/tool/alarmmgr_add_periodic_alarm_withcb.c @@ -48,10 +48,6 @@ int main(int argc, char** argv) GMainLoop *mainloop; int result; -#if !(GLIB_CHECK_VERSION(2, 36, 0)) - g_type_init(); -#endif - mainloop = g_main_loop_new(NULL, FALSE); result = alarmmgr_init("org.tizen.alarmmgr.periodic"); diff --git a/tool/alarmmgr_add_reference_periodic_alarm_withcb.c b/tool/alarmmgr_add_reference_periodic_alarm_withcb.c index c66f788..16b4e52 100644 --- a/tool/alarmmgr_add_reference_periodic_alarm_withcb.c +++ b/tool/alarmmgr_add_reference_periodic_alarm_withcb.c @@ -45,10 +45,6 @@ int main(int argc, char** argv) GMainLoop *mainloop; int result; -#if !(GLIB_CHECK_VERSION(2, 36, 0)) - g_type_init(); -#endif - mainloop = g_main_loop_new(NULL, FALSE); result = alarmmgr_init("org.tizen.alarmmgr.refperiodic"); diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 900a0be..84ce9aa 100755 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -1,15 +1,12 @@ -LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/server) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/mock) -ENABLE_TESTING() - -SET(GTEST_TEST "gtest-alarmmgr") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpie") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpie") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpie -std=c++17") + +ADD_DEFINITIONS("-DPLUGIN_LIB_DIR=\"${LIB_INSTALL_DIR}\"") FILE(GLOB GTEST_TEST_SRCS *.cpp) SET(GTEST_SERVER_SRCS ${CMAKE_SOURCE_DIR}/server/alarm-manager.c @@ -17,7 +14,7 @@ SET(GTEST_SERVER_SRCS ${CMAKE_SOURCE_DIR}/server/alarm-manager.c ${CMAKE_SOURCE_DIR}/server/alarm-manager-timer.c ${CMAKE_SOURCE_DIR}/server/alarm-manager-schedule.c ${CMAKE_SOURCE_DIR}/server/alarm-manager-dbus.c - ${CMAKE_SOURCE_DIR}/server/alarm-manager-db.c) + ${CMAKE_SOURCE_DIR}/server/alarm-manager-db.cc) AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/ GTEST_TEST_SRCS) AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/mock GTEST_TEST_SRCS) @@ -32,6 +29,4 @@ LINK_DIRECTORIES(${svr_pkgs_LIBRARY_DIRS}) ADD_EXECUTABLE(${GTEST_TEST} ${GTEST_TEST_SRCS} ${GTEST_SERVER_SRCS}) TARGET_LINK_LIBRARIES(${GTEST_TEST} ${gtest_pkgs_LIBRARIES} ${LIBRARY} ${svr_pkgs_LIBRARIES} alarm rt) -ADD_TEST(${GTEST_TEST} ${GTEST_TEST}) - -INSTALL(TARGETS ${GTEST_TEST} DESTINATION ${BIN_INSTALL_DIR}) +iNSTALL(TARGETS ${GTEST_TEST} DESTINATION bin) diff --git a/unittest/alarm_manager_unittest.cpp b/unittest/alarm_manager_unittest.cpp index 62d3607..f12030b 100755..100644 --- a/unittest/alarm_manager_unittest.cpp +++ b/unittest/alarm_manager_unittest.cpp @@ -1,5 +1,5 @@ /* -_all * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,415 +13,302 @@ _all * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved * See the License for the specific language governing permissions and * limitations under the License. */ + +#include <appsvc.h> +#include <bundle_cpp.h> #include <gmock/gmock.h> #include <gtest/gtest.h> -#include <unistd.h> #include <stdio.h> +#include <unistd.h> -#include <appsvc.h> - -#include "unittest.h" #include "alarm.h" #include "alarm-internal.h" -#include "mock/gio_fake.h" -#include "mock/glib_fake.h" -#include "mock/aul_fake.h" -#include "mock/notification_fake.h" -#include "mock/pkgmgr_info_fake.h" - -class AlarmServerTest : public ::testing::Test { - protected: - void SetUp() override { - } - - void TearDown() override { - } -}; - -int __aul_app_get_pkgid_bypid_for_uid_fake(int pid, char* pkgid, int size, - uid_t uid) -{ - return 0; -} - -static GDBusConnection* __g_bus_get_sync_fake(GBusType type, GCancellable *cancel, - GError **error) -{ - GDBusConnection *con = (GDBusConnection*)g_object_new(G_TYPE_OBJECT, NULL); - return con; -} - -static guint __g_dbus_connection_signal_subscribe_fake(GDBusConnection *con, const gchar* sender, - const gchar* interface, const gchar* member, const gchar* object, - const gchar* arg, GDBusSignalFlags flags, GDBusSignalCallback callback, - gpointer user_data, GDestroyNotify noti) -{ - return 1; -} - -static GDBusNodeInfo* __g_dbus_node_info_new_for_xml_fake(const gchar* xml, GError **error) -{ - GDBusNodeInfo *info = (GDBusNodeInfo*)g_object_new(G_TYPE_OBJECT, NULL); - return info; -} +#include "aul_mock.h" +#include "dbus_mock.h" +#include "pkgmgr_info_mock.h" +#include "test_fixture.h" +#include "tzplatform_config_mock.h" +#include "unittest.h" -static guint __g_bus_own_name_on_connection_fake(GDBusConnection *con, const gchar* name, - GBusNameOwnerFlags flags, GBusNameAcquiredCallback bus_name_acquired, - GBusNameLostCallback lost, gpointer user_data, GDestroyNotify noti) -{ - return 1; -} +using ::testing::_; +using ::testing::DoAll; +using ::testing::Return; +using ::testing::SetArgPointee; +using ::testing::Invoke; -gpointer __g_hash_table_lookup_fake(GHashTable *table, gconstpointer p) -{ - return NULL; -} - -int __pkgmgrinfo_pkginfo_get_usr_pkginfo_fake(const char *pkgid, uid_t uid, - pkgmgrinfo_pkginfo_h *handle) -{ - return 0; -} +namespace { -int __pkgmgrinfo_pkginfo_get_api_version_fake( - pkgmgrinfo_pkginfo_h handle, char **version) -{ - return 0; +GDBusConnection* __g_bus_get_sync_fake(GBusType type, GCancellable* cancel, + GError** error) { + GDBusConnection* con = (GDBusConnection*)g_object_new(G_TYPE_OBJECT, + nullptr); + return con; } -int __pkgmgrinfo_pkginfo_get_is_global_fake( - pkgmgrinfo_pkginfo_h handle, bool *is_global) -{ - *is_global = true; - return 0; +void __g_dbus_node_info_unref_fake(GDBusNodeInfo* info) { + if (info && info->interfaces) { + free(info->interfaces); + free(info); + } + info = nullptr; + return; } -int __pkgmgrinfo_appinfo_get_usr_appinfo_fake(const char *pkgid, uid_t uid, - pkgmgrinfo_pkginfo_h *handle) -{ - return 0; -} +GDBusNodeInfo* __g_dbus_node_info_new_for_xml_fake(const gchar* xml, + GError** error) { + GDBusNodeInfo* info = (GDBusNodeInfo*)malloc(sizeof(GDBusNodeInfo)); + if (!info) + return nullptr; -int __pkgmgrinfo_appinfo_get_component_type_fake(pkgmgrinfo_appinfo_h handle, char **type) -{ - return 0; -} + GDBusInterfaceInfo** interface = + (GDBusInterfaceInfo**)malloc(sizeof(GDBusInterfaceInfo*)); + if (!interface) { + free(info); + return nullptr; + } -int __pkgmgrinfo_pkginfo_destroy_fake(pkgmgrinfo_pkginfo_h handle) -{ - return 0; -} + info->ref_count = 10; + info->path = nullptr; + info->interfaces = interface; + info->nodes = nullptr; + info->annotations = nullptr; -int __pkgmgrinfo_appinfo_destroy_fake(pkgmgrinfo_appinfo_h handle) -{ - return 0; + return info; } -bundle *__bundle_decode_fake(const bundle_raw* raw, const int len) -{ - bundle *b; +class Mocks : virtual public ::testing::NiceMock<AulMock>, + virtual public ::testing::NiceMock<DbusMock>, + virtual public ::testing::NiceMock<PkgmgrInfoMock>, + virtual public ::testing::NiceMock<TzplatformConfigMock> {}; +} // namespace - b = bundle_create(); - bundle_add_str(b, "__APP_SVC_PKG_NAME__", "org.tizen.alarm"); +class AlarmServerTest : public TestFixture { + public: + AlarmServerTest() : TestFixture(std::make_unique<::Mocks>()) {} - return b; -} - -TEST_F(AlarmServerTest, alarm_manager_alarm_create_p) -{ - int ret; - int alarm_id; - GVariant *param = NULL; - gint64 reserved = 1; + virtual void SetUp() {} + virtual void TearDown() {} +}; - g_hash_table_lookup_fake.custom_fake = __g_hash_table_lookup_fake; - g_bus_get_sync_fake.custom_fake = __g_bus_get_sync_fake; - g_dbus_connection_signal_subscribe_fake.custom_fake = __g_dbus_connection_signal_subscribe_fake; - g_dbus_node_info_new_for_xml_fake.custom_fake = __g_dbus_node_info_new_for_xml_fake; - g_bus_own_name_on_connection_fake.custom_fake = __g_bus_own_name_on_connection_fake; +TEST_F(AlarmServerTest, alarm_manager_alarm_create_p) { + EXPECT_CALL(GetMock<TzplatformConfigMock>(), tzplatform_mkpath(_, _)) + .WillRepeatedly(Invoke([](enum tzplatform_variable id, + const char* path) { + return ".alarm_test.db"; + })); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_signal_subscribe(_, _, _, + _, _, _, _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); _alarm_initialize(); - param = g_variant_new("(ssiiiiiiiiiiiiixss)", + int alarm_id = 0; + gint64 reserved = 1; + GVariant* param = g_variant_new("(ssiiiiiiiiiiiiixss)", "app_service_name", "app_service_name_mod", 2019, 11, 1, 12, 59, 59, 400, 2020, 12, 29, 3, 1, 1, reserved, "reserved_service_name", "reserved_service_name_mod"); - - ret = alarm_manager_alarm_create(param, 5001, 1, &alarm_id); + int ret = alarm_manager_alarm_create(param, 5001, getpid(), "sender", + &alarm_id); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_create_appsvc_p) -{ - int ret; - int alarm_id; - GVariant *param = NULL; - bundle *b = NULL; - bundle_raw *b_data = NULL; - int len = 0; - gint64 reserved = 1; - - aul_app_get_pkgid_bypid_for_uid_fake.custom_fake = __aul_app_get_pkgid_bypid_for_uid_fake; - g_hash_table_lookup_fake.custom_fake = __g_hash_table_lookup_fake; - - pkgmgrinfo_pkginfo_get_usr_pkginfo_fake.custom_fake = - __pkgmgrinfo_pkginfo_get_usr_pkginfo_fake; - pkgmgrinfo_pkginfo_get_api_version_fake.custom_fake = - __pkgmgrinfo_pkginfo_get_api_version_fake; - - pkgmgrinfo_appinfo_get_usr_appinfo_fake.custom_fake = - __pkgmgrinfo_appinfo_get_usr_appinfo_fake; +TEST_F(AlarmServerTest, alarm_manager_alarm_create_appsvc_p) { + EXPECT_CALL(GetMock<PkgmgrInfoMock>(), + pkgmgrinfo_pkginfo_get_api_version(_, _)) + .WillRepeatedly(Invoke([](pkgmgrinfo_pkginfo_h handle, + char** version) -> int { + static char ver[] = "2.0"; + *version = ver; + return 0; + })); + EXPECT_CALL(GetMock<PkgmgrInfoMock>(), pkgmgrinfo_appinfo_get_pkgid(_, _)) + .WillRepeatedly(Invoke([](pkgmgrinfo_appinfo_h handle, + char **pkgid) -> int { + static char sPkgid[] = "org.tizen.alarm_unitest"; + *pkgid = sPkgid; + return 0; + })); - pkgmgrinfo_appinfo_get_component_type_fake.custom_fake = - __pkgmgrinfo_appinfo_get_component_type_fake; - pkgmgrinfo_appinfo_destroy_appinfo_fake.custom_fake = - __pkgmgrinfo_appinfo_destroy_fake; - - //bundle_decode_fake.custom_fake = __bundle_decode_fake; - - b = bundle_create(); - bundle_add_str(b, "__APP_SVC_PKG_NAME__", "org.tizen.alarm"); - bundle_encode(b, &b_data, &len); - - param = g_variant_new("(iiiiiiiiiixiixs)", + gint64 reserved = 1; + tizen_base::Bundle b = { {"__APP_SVC_PKG_NAME__", "org.tizen.alarm" } }; + auto raw = b.ToRaw(); + GVariant* param = g_variant_new("(iiiiiiiiiixiixs)", 2019, 11, 1, 12, 59, 59, 2020, 12, 29, 1, reserved, 1, 0, reserved, - (char *)b_data); - ret = alarm_manager_alarm_create_appsvc(param, 5001, 1, &alarm_id); - bundle_free(b); - if (b_data) - free(b_data); + reinterpret_cast<char*>(raw.first.get())); + int alarm_id = 0; + int ret = alarm_manager_alarm_create_appsvc(param, 5001, getpid(), "sender", + &alarm_id); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_create_periodic_p) -{ - int ret; - int alarm_id; - GVariant *param = NULL; - - param = g_variant_new("(ssiii)", +TEST_F(AlarmServerTest, alarm_manager_alarm_create_periodic_p) { + GVariant* param = g_variant_new("(ssiii)", "app_service_name", "app_service_name_mod", 1, 0, 1); - ret = alarm_manager_alarm_create_periodic(param, 5001, 1, &alarm_id); + int alarm_id = 0; + int ret = alarm_manager_alarm_create_periodic(param, 5001, getpid(), "sender", + &alarm_id); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_create_noti_p) -{ - int ret; +TEST_F(AlarmServerTest, alarm_manager_alarm_create_noti_p) { int alarm_id; - GVariant *param = NULL; gint64 reserved = 1; - - param = g_variant_new("(iiiiiiiiiixiixs)", + GVariant* param = g_variant_new("(iiiiiiiiiixiixs)", 2019, 11, 1, 12, 59, 59, 2020, 12, 29, 3, - 0, reserved, 1, 0, reserved, + reserved, 1, 0, reserved, "bundle"); - - - ret = alarm_manager_alarm_create_noti(param, 5001, 1, &alarm_id); + int ret = alarm_manager_alarm_create_noti(param, 5001, getpid(), "sender", + &alarm_id); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_delete_p) -{ - int ret; - GVariant *param = NULL; - - param = g_variant_new("(i)", 1); - - ret = alarm_manager_alarm_delete(param, 5001, 1); +TEST_F(AlarmServerTest, alarm_manager_alarm_delete_p) { + GVariant* param = g_variant_new("(i)", 1); + int ret = alarm_manager_alarm_delete(param, 5001, getpid(), "sender"); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_delete_all_p) -{ - int ret; - GVariant *param = NULL; - - ret = alarm_manager_alarm_delete_all(param, 5001, 1); +TEST_F(AlarmServerTest, alarm_manager_alarm_delete_all_p) { + GVariant* param = nullptr; + int ret = alarm_manager_alarm_delete_all(param, 5001, getpid(), "sender"); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_update_n) -{ - int ret; +TEST_F(AlarmServerTest, alarm_manager_alarm_update_n) { int alarm_id = 1; - GVariant *param = NULL; gint64 reserved = 1; - - param = g_variant_new("(iiiiiiiiiixiixi)", + GVariant* param = g_variant_new("(iiiiiiiiiixiixi)", alarm_id, 2019, 11, 1, 12, 59, 59, 2020, 12, 29, 0, reserved, 0, 0, reserved, 0); - - ret = alarm_manager_alarm_update(param, 5001, 1); + int ret = alarm_manager_alarm_update(param, 5001, getpid(), "sender"); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_number_of_ids_p) -{ - int ret; - int num_of_ids; - - ret = alarm_manager_alarm_get_number_of_ids(5001, 1, &num_of_ids); +TEST_F(AlarmServerTest, alarm_manager_alarm_get_number_of_ids_p) { + int num_of_ids = 0; + int ret = alarm_manager_alarm_get_number_of_ids(5001, getpid(), "sender", + &num_of_ids); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_list_of_ids_p) -{ - int ret; - int num_of_alarm; - GVariant *alarm_array = NULL; - GVariant *param = NULL; - - param = g_variant_new("(i)", 10); - - ret = alarm_manager_alarm_get_list_of_ids(param, 5001, 1, &alarm_array, - &num_of_alarm); +TEST_F(AlarmServerTest, alarm_manager_alarm_get_list_of_ids_p) { + int num_of_alarm = 0; + GVariantBuilder *alarm_array = nullptr; + GVariant* param = g_variant_new("(i)", 10); + int ret = alarm_manager_alarm_get_list_of_ids(param, 5001, getpid(), "sender", + alarm_array, &num_of_alarm); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_appsvc_info_n) -{ - int ret; - gchar *b_data = NULL; - GVariant *param = NULL; - - param = g_variant_new("(i)", 10); - - ret = alarm_manager_alarm_get_appsvc_info(param, 5001, &b_data); +TEST_F(AlarmServerTest, alarm_manager_alarm_get_appsvc_info_n) { + gchar *b_data = nullptr; + GVariant* param = g_variant_new("(i)", 10); + int ret = alarm_manager_alarm_get_appsvc_info(param, 5001, &b_data); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); + if (b_data) + free(b_data); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_noti_info_n) -{ - int ret; - gchar *b_data = NULL; - GVariant *param = NULL; - - param = g_variant_new("(i)", 10); +TEST_F(AlarmServerTest, alarm_manager_alarm_get_noti_info_n) { + gchar *b_data = nullptr; + GVariant* param = g_variant_new("(i)", 10); - ret = alarm_manager_alarm_get_noti_info(param, 5001, &b_data); + int ret = alarm_manager_alarm_get_noti_info(param, 5001, &b_data); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); + if (b_data) + free(b_data); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_info_n) -{ - int ret; - alarm_info_t info; - GVariant *param = NULL; - - param = g_variant_new("(i)", 10); - - ret = alarm_manager_alarm_get_info(param, 5001, &info); +TEST_F(AlarmServerTest, alarm_manager_alarm_get_info_n) { + base_info_t info; + GVariant* param = g_variant_new("(i)", 10); + int ret = alarm_manager_alarm_get_info(param, 5001, &info); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_next_duetime_n) -{ - int ret; +TEST_F(AlarmServerTest, alarm_manager_alarm_get_next_duetime_n) { time_t duetime; - GVariant *param = NULL; - - param = g_variant_new("(i)", 10); - - ret = alarm_manager_alarm_get_next_duetime(param, 5001, &duetime); + GVariant* param = g_variant_new("(i)", 10); + int ret = alarm_manager_alarm_get_next_duetime(param, 5001, &duetime); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_all_info_p) -{ - int ret; - char *db_path; - - ret = alarm_manager_alarm_get_all_info(5001, &db_path); +TEST_F(AlarmServerTest, alarm_manager_alarm_get_all_info_p) { + char* db_path = nullptr; + int ret = alarm_manager_alarm_get_all_info(5001, &db_path); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); + if (db_path) + free(db_path); } -TEST_F(AlarmServerTest, alarm_manager_alarm_set_rtc_time_n) -{ - int ret; - GVariant *param = NULL; - - param = g_variant_new("(iiiiii)", 2019, 11, 1, 12, 12, 12); - - ret = alarm_manager_alarm_set_rtc_time(param); +TEST_F(AlarmServerTest, alarm_manager_alarm_set_rtc_time_n) { + GVariant* param = g_variant_new("(iiiiii)", 2019, 11, 1, 12, 12, 12); + int ret = alarm_manager_alarm_set_rtc_time(param); EXPECT_EQ(ERR_ALARM_SYSTEM_FAIL, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_set_time_n) -{ - int ret; - GVariant *param = NULL; - - param = g_variant_new("(x)", 20190012); - - ret = alarm_manager_alarm_set_time(param, 1); +TEST_F(AlarmServerTest, alarm_manager_alarm_set_time_n) { + GVariant* param = g_variant_new("(x)", 20190012); + int ret = alarm_manager_alarm_set_time(param, getpid(), "sender"); EXPECT_EQ(ERR_ALARM_SYSTEM_FAIL, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_set_time_with_propagation_delay_n) -{ - int ret; - GVariant *param = NULL; - - param = g_variant_new("(xxxx)", 20190012, 2949294, 292929, 29299292); - - ret = alarm_manager_alarm_set_time_with_propagation_delay(param, 1); +TEST_F(AlarmServerTest, alarm_manager_alarm_set_time_with_propagation_delay_n) { + GVariant* param = g_variant_new("(xxxx)", 20190012, 2949294, 292929, + 29299292); + int ret = alarm_manager_alarm_set_time_with_propagation_delay(param, getpid(), + "sender"); EXPECT_EQ(ERR_ALARM_SYSTEM_FAIL, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_set_timezone_n) -{ - int ret; - GVariant *param = NULL; - - param = g_variant_new("(s)", "/usr/share/zoneinfo/Asia/Seoul"); - - ret = alarm_manager_alarm_set_timezone(param); +TEST_F(AlarmServerTest, alarm_manager_alarm_set_timezone_n) { + GVariant* param = g_variant_new("(s)", "/usr/share/zoneinfo/Asia/Seoul"); + int ret = alarm_manager_alarm_set_timezone(param); EXPECT_EQ(ERR_ALARM_SYSTEM_FAIL, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_set_global_n) -{ - int ret; - GVariant *param = NULL; - GVariant *param2 = NULL; +TEST_F(AlarmServerTest, alarm_manager_alarm_set_global) { + EXPECT_CALL(GetMock<PkgmgrInfoMock>(), pkgmgrinfo_pkginfo_is_global(_, _)) + .WillRepeatedly( + Invoke([](pkgmgrinfo_pkginfo_h, bool *is_global) -> int { + *is_global = true; + return 0; + })); + gint64 reserved = 1; int alarm_id; - - g_hash_table_lookup_fake.custom_fake = __g_hash_table_lookup_fake; - pkgmgrinfo_pkginfo_get_usr_pkginfo_fake.custom_fake = - __pkgmgrinfo_pkginfo_get_usr_pkginfo_fake; - pkgmgrinfo_pkginfo_is_global_fake.custom_fake = - __pkgmgrinfo_pkginfo_get_is_global_fake; - pkgmgrinfo_pkginfo_destroy_pkginfo_fake.custom_fake = - __pkgmgrinfo_pkginfo_destroy_fake; - - param = g_variant_new("(ssiiiiiiiiiiiiixss)", + GVariant* param = g_variant_new("(ssiiiiiiiiiiiiixss)", "app_service_name", "app_service_name_mod", 2019, 11, 1, 12, 59, 59, 400, 2020, 12, 29, 3, 1, 1, reserved, "reserved_service_name", "reserved_service_name_mod"); - - ret = alarm_manager_alarm_create(param, 5001, 1, &alarm_id); - param2 = g_variant_new("(ib)", alarm_id, true); - + int ret = alarm_manager_alarm_create(param, 5001, getpid(), "sender", &alarm_id); + GVariant* param2 = g_variant_new("(ib)", alarm_id, true); ret = alarm_manager_alarm_set_global(param2, 5001); - EXPECT_EQ(ERR_ALARM_SYSTEM_FAIL, ret); + EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmServerTest, alarm_manager_alarm_get_global_n) -{ - int ret; - GVariant *param = NULL; +TEST_F(AlarmServerTest, alarm_manager_alarm_get_global_n) { gboolean global; - - param = g_variant_new("(i)", 1); - - ret = alarm_manager_alarm_get_global(param, &global); + GVariant* param = g_variant_new("(i)", 1); + int ret = alarm_manager_alarm_get_global(param, &global); EXPECT_EQ(ERR_ALARM_INVALID_ID, ret); } + diff --git a/unittest/alarmlib_unittest.cpp b/unittest/alarmlib_unittest.cpp index dc01df1..66b9737 100755 --- a/unittest/alarmlib_unittest.cpp +++ b/unittest/alarmlib_unittest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,160 +13,158 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +#include <appsvc.h> +#include <bundle_cpp.h> #include <gmock/gmock.h> #include <gtest/gtest.h> -#include <unistd.h> #include <stdio.h> +#include <unistd.h> -#include <appsvc.h> - -#include "unittest.h" #include "alarm.h" -#include "mock/gio_fake.h" -#include "mock/glib_fake.h" -#include "mock/notification_fake.h" - -void __g_dbus_node_info_unref_fake(GDBusNodeInfo *info) -{ - free(info->interfaces); - free(info); - info = NULL; +#include "aul_mock.h" +#include "dbus_mock.h" +#include "glib_mock.h" +#include "notification_mock.h" +#include "pkgmgr_info_mock.h" +#include "test_fixture.h" +#include "unittest.h" + +using ::testing::_; +using ::testing::DoAll; +using ::testing::Return; +using ::testing::SetArgPointee; +using ::testing::Invoke; + +namespace { + +void __g_dbus_node_info_unref_fake(GDBusNodeInfo *info) { + if (info && info->interfaces) { + free(info->interfaces); + free(info); + } + info = nullptr; return; } GDBusConnection* __g_bus_get_sync_fake(GBusType type, - GCancellable *cancellable, GError **error) -{ - GDBusConnection *con = (GDBusConnection*)g_object_new(G_TYPE_OBJECT, NULL); + GCancellable* cancellable, GError** error) { + GDBusConnection* con = (GDBusConnection*)g_object_new(G_TYPE_OBJECT, nullptr); return con; } -GDBusProxy* __g_dbus_proxy_new_sync_fake(GDBusConnection *con, - GDBusProxyFlags flag, GDBusInterfaceInfo *info, const gchar *name, - const gchar *path, const gchar *interface, GCancellable *cancellable, - GError **error) -{ - GDBusProxy *proxy = (GDBusProxy*)g_object_new(G_TYPE_OBJECT, NULL); +GDBusProxy* __g_dbus_proxy_new_sync_fake(GDBusConnection* con, + GDBusProxyFlags flag, GDBusInterfaceInfo* info, const gchar* name, + const gchar* path, const gchar* interface, GCancellable* cancellable, + GError** error) { + GDBusProxy *proxy = (GDBusProxy*)g_object_new(G_TYPE_OBJECT, nullptr); return proxy; } -GDBusNodeInfo* __g_dbus_node_info_new_for_xml_fake(const gchar *xml, GError **error) -{ - GDBusNodeInfo *info = (GDBusNodeInfo*)malloc(sizeof(GDBusNodeInfo)); +GDBusNodeInfo* __g_dbus_node_info_new_for_xml_fake(const gchar* xml, GError** error) { + GDBusNodeInfo* info = (GDBusNodeInfo*)malloc(sizeof(GDBusNodeInfo)); + if (!info) + return nullptr; + + GDBusInterfaceInfo **interface = + (GDBusInterfaceInfo**)malloc(sizeof(GDBusInterfaceInfo*)); + if (!interface) { + free(info); + return nullptr; + } info->ref_count = 10; - info->path = NULL; - info->interfaces = (GDBusInterfaceInfo**)malloc(sizeof(GDBusInterfaceInfo)); - info->nodes = NULL; - info->annotations = NULL; + info->path = nullptr; + info->interfaces = interface; + info->nodes = nullptr; + info->annotations = nullptr; return info; } -guint __g_dbus_connection_register_object_fake(GDBusConnection *con, - const gchar *path, GDBusInterfaceInfo *info, - const GDBusInterfaceVTable *table, gpointer user_data, - GDestroyNotify user_data_free_func, GError **error) -{ - return 1; -} - -gboolean __g_dbus_connection_unregister_object_fake(GDBusConnection *con, - guint id) -{ - return true; -} +GVariant* __g_dbus_proxy_call_sync_fake_negative(GDBusProxy* proxy, const gchar* method, + GVariant* param, GDBusCallFlags flag, gint timeout, GCancellable* cancellable, + GError** error) { + GQuark quark = g_quark_from_static_string("test"); + *error = g_error_new(quark, G_DBUS_ERROR_ACCESS_DENIED, "Error"); -guint __g_bus_own_name_on_connection_fake(GDBusConnection *con, const gchar *name, - GBusNameOwnerFlags flag, GBusNameAcquiredCallback acquired_cb, - GBusNameLostCallback lost_cb, gpointer user_data, - GDestroyNotify user_data_free_func) -{ - return 1; + return nullptr; } -GVariant* __g_dbus_proxy_call_sync_fake_negative(GDBusProxy *proxy, const gchar* method, - GVariant *param, GDBusCallFlags flag, gint timeout, GCancellable *cancellable, - GError **error) -{ - GQuark quark = g_quark_from_static_string("test"); - *error = g_error_new(quark, G_DBUS_ERROR_ACCESS_DENIED, "Error"); +GVariant* __notification_ipc_make_gvariant_from_noti_fake(notification_h, + bool translate) { + GVariant* noti_gv = g_variant_new_string("test"); - return NULL; + return noti_gv; } -void __g_dbus_proxy_call_fake(GDBusProxy *proxy, const gchar* method, - GVariant *param, GDBusCallFlags flag, gint timeout, GCancellable *cancellable, - GAsyncReadyCallback cb, gpointer user_data) -{ - return; +int __pkgmgrinfo_pkginfo_get_api_version_fake(pkgmgrinfo_pkginfo_h handle, + char** version) { + *version = strdup("3.0"); + return 0; } -gsize __g_variant_get_size_fake(GVariant *var) -{ - int size = 1; - return (gsize)size; +int __handler(alarm_id_t alarm_id, void* user_param) { + return 0; } -GVariant* __notification_ipc_make_gvariant_from_noti_fake(notification_h, - bool translate) -{ - GVariant *noti_gv = NULL; - - noti_gv = g_variant_new_string("test"); - - return noti_gv; -} +class Mocks : virtual public ::testing::NiceMock<AulMock>, + virtual public ::testing::NiceMock<DbusMock>, + virtual public ::testing::NiceMock<GlibMock>, + virtual public ::testing::NiceMock<NotificationMock>, + virtual public ::testing::NiceMock<PkgmgrInfoMock> {}; -class AlarmLibTest : public ::testing::Test { - protected: - void SetUp() override { - alarm = alarmmgr_create_alarm(); +} // namesapce - g_bus_get_sync_fake.custom_fake = __g_bus_get_sync_fake; - g_dbus_proxy_new_sync_fake.custom_fake = __g_dbus_proxy_new_sync_fake; - g_dbus_node_info_unref_fake.custom_fake = __g_dbus_node_info_unref_fake; - } - void TearDown() override { - alarmmgr_free_alarm(alarm); - } +class AlarmLibTest : public TestFixture { + public: + AlarmLibTest() : TestFixture(std::make_unique<::Mocks>()) {} + void SetUp() override { + alarm_ = alarmmgr_create_alarm(); + } + void TearDown() override { + alarmmgr_free_alarm(alarm_); + } - alarm_entry_t *alarm; + protected: + alarm_entry_t* alarm_ = nullptr; }; -TEST_F(AlarmLibTest, alarmmgr_init_p) -{ - int ret; - char testapp[256] = "org.tizen.alarmmgrtestapp"; - - g_dbus_node_info_new_for_xml_fake.custom_fake = __g_dbus_node_info_new_for_xml_fake; - g_dbus_connection_register_object_fake.custom_fake = __g_dbus_connection_register_object_fake; - g_dbus_connection_unregister_object_fake.custom_fake = __g_dbus_connection_unregister_object_fake; - g_bus_own_name_on_connection_fake.custom_fake = __g_bus_own_name_on_connection_fake; - - ret = alarmmgr_init(testapp); +TEST_F(AlarmLibTest, alarmmgr_init_p) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_unregister_object(_, _)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); + + int ret = alarmmgr_init("org.tizen.alarmmgrtestapp"); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); alarmmgr_fini(); } -static int __handler(alarm_id_t alarm_id, void *user_param) -{ - return 0; -} - -TEST_F(AlarmLibTest, alarmmgr_set_cb_p) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_cb_p) { + int ret = alarmmgr_set_cb([](alarm_id_t alarm_id, void *user_param) -> int { + return 0; + }, nullptr); - ret = alarmmgr_set_cb(__handler, NULL); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmLibTest, alarmmgr_set_get_time_p) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_get_time_p) { alarm_date_t date; alarm_date_t get_date; @@ -177,464 +175,594 @@ TEST_F(AlarmLibTest, alarmmgr_set_get_time_p) date.min = 1; date.sec = 1; - ret = alarmmgr_set_time(alarm, date); + int ret = alarmmgr_set_time(alarm_, date); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_get_time(alarm, &get_date); + ret = alarmmgr_get_time(alarm_, &get_date); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); EXPECT_EQ(date.year, get_date.year); } -TEST_F(AlarmLibTest, alarmmgr_set_get_repeat_mode_p) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_get_repeat_mode_p) { alarm_repeat_mode_t get_mode; int interval; - ret = alarmmgr_set_repeat_mode(alarm, ALARM_REPEAT_MODE_REPEAT, 1000); + int ret = alarmmgr_set_repeat_mode(alarm_, ALARM_REPEAT_MODE_REPEAT, 1000); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_get_repeat_mode(alarm, &get_mode, &interval); + ret = alarmmgr_get_repeat_mode(alarm_, &get_mode, &interval); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); EXPECT_EQ(ALARM_REPEAT_MODE_REPEAT, get_mode); } -TEST_F(AlarmLibTest, alarmmgr_set_get_type_p) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_get_type_p) { int get_type; - ret = alarmmgr_set_type(alarm, ALARM_TYPE_VOLATILE); + int ret = alarmmgr_set_type(alarm_, ALARM_TYPE_VOLATILE); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_get_type(alarm, &get_type); + ret = alarmmgr_get_type(alarm_, &get_type); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); EXPECT_EQ(ALARM_TYPE_VOLATILE, get_type); } -TEST_F(AlarmLibTest, alarmmgr_add_alarm_appsvc_n) -{ - int ret; - alarm_id_t alarm_id; - - bundle *b; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - b = bundle_create(); - ASSERT_NE(b, nullptr); - - ret = appsvc_set_pkgname(b,"org.tizen.calendar"); +TEST_F(AlarmLibTest, alarmmgr_add_alarm_appsvc_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<PkgmgrInfoMock>(), + pkgmgrinfo_pkginfo_get_api_version(_, _)) + .WillRepeatedly(Invoke(__pkgmgrinfo_pkginfo_get_api_version_fake)); + + tizen_base::Bundle b; + int ret = appsvc_set_pkgname(b.GetHandle(),"org.tizen.setting"); EXPECT_EQ(0, ret); - ret = appsvc_set_operation(b, APPSVC_OPERATION_DEFAULT); + ret = appsvc_set_operation(b.GetHandle(), APPSVC_OPERATION_DEFAULT); EXPECT_EQ(0, ret); - ret = alarmmgr_add_alarm_appsvc(ALARM_TYPE_DEFAULT, 100, 0, (void *)b, - &alarm_id); + alarm_id_t alarm_id; + ret = alarmmgr_add_alarm_appsvc(ALARM_TYPE_DEFAULT, 100, 0, + b.GetHandle(), &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); - bundle_free(b); } -TEST_F(AlarmLibTest, alarmmgr_get_alarm_appsvc_n) -{ - int ret; - alarm_id_t alarm_id = 10; +TEST_F(AlarmLibTest, alarmmgr_get_alarm_appsvc_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - bundle *get_b; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - get_b = (bundle *)alarmmgr_get_alarm_appsvc_info(alarm_id, &ret); + int ret = -1; + alarm_id_t alarm_id = 10; + bundle* get_b = static_cast<bundle*>(alarmmgr_get_alarm_appsvc_info(alarm_id, + &ret)); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); - bundle_free(get_b); } +TEST_F(AlarmLibTest, alarmmgr_add_alarm_noti_n) { + EXPECT_CALL(GetMock<GlibMock>(), g_variant_get_size(_)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<NotificationMock>(), + notification_ipc_make_gvariant_from_noti(_, _)) + .WillRepeatedly(Invoke(__notification_ipc_make_gvariant_from_noti_fake)); -TEST_F(AlarmLibTest, alarmmgr_add_alarm_noti_n) -{ - int ret; alarm_id_t alarm_id; notification_h noti = nullptr; - - g_variant_get_size_fake.custom_fake = __g_variant_get_size_fake; - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - notification_ipc_make_gvariant_from_noti_fake.custom_fake = __notification_ipc_make_gvariant_from_noti_fake; - - ret = alarmmgr_add_alarm_noti(ALARM_TYPE_DEFAULT, 100, 0, noti, + int ret = alarmmgr_add_alarm_noti(ALARM_TYPE_DEFAULT, 100, 0, noti, &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } +TEST_F(AlarmLibTest, alarmmgr_get_alarm_noti_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); -TEST_F(AlarmLibTest, alarmmgr_get_alarm_noti_n) -{ - int ret; - notification_h get_noti; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_get_alarm_noti_info(1, &get_noti); + notification_h get_noti = nullptr; + int ret = alarmmgr_get_alarm_noti_info(1, &get_noti); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_set_rtc_time_n) -{ - int ret; - alarm_date_t date = {2020, 4, 5, 10, 10, 0}; +TEST_F(AlarmLibTest, alarmmgr_set_rtc_time_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_set_rtc_time(&date); + alarm_date_t date = {2020, 4, 5, 10, 10, 0}; + int ret = alarmmgr_set_rtc_time(&date); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_add_alarm_with_localtime_n) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_add_alarm_with_localtime_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_unregister_object(_, _)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); + alarm_id_t alarm_id; alarm_date_t test_time; - char testapp[256] = "org.tizen.alarmmgrtestapp"; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; test_time.year = 2022; test_time.month = 1; test_time.day = 1; - test_time.hour = 1; test_time.min = 1; test_time.sec = 5; - ret = alarmmgr_init(testapp); + alarmmgr_fini(); + int ret = alarmmgr_init("org.tizen.alarmmgrtestapp"); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_set_time(alarm,test_time); + ret = alarmmgr_set_time(alarm_,test_time); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_set_type(alarm, ALARM_TYPE_DEFAULT); + ret = alarmmgr_set_type(alarm_, ALARM_TYPE_DEFAULT); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_set_repeat_mode(alarm, ALARM_REPEAT_MODE_REPEAT, 1000); + ret = alarmmgr_set_repeat_mode(alarm_, ALARM_REPEAT_MODE_REPEAT, 1000); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_add_alarm_with_localtime(alarm, testapp, &alarm_id); + ret = alarmmgr_add_alarm_with_localtime(alarm_, "org.tizen.alarmmgrtestapp", + &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); alarmmgr_fini(); } -TEST_F(AlarmLibTest, alarmmgr_get_info_n) -{ - int ret; - alarm_entry_t get_alarm; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_get_info_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - ret = alarmmgr_get_info(1, &get_alarm); + alarm_entry_t get_alarm; + int ret = alarmmgr_get_info(1, &get_alarm); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_add_alarm_appsvc_with_localtime_n) -{ - int ret; - alarm_id_t alarm_id; - - bundle *b; +TEST_F(AlarmLibTest, alarmmgr_add_alarm_appsvc_with_localtime_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - alarm_date_t test_time; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - b = bundle_create(); - ASSERT_NE(b, nullptr); - - ret = appsvc_set_pkgname(b,"org.tizen.calendar"); + tizen_base::Bundle b; + int ret = appsvc_set_pkgname(b.GetHandle(),"org.tizen.calendar"); EXPECT_EQ(0, ret); - ret = appsvc_set_operation(b, APPSVC_OPERATION_DEFAULT); + ret = appsvc_set_operation(b.GetHandle(), APPSVC_OPERATION_DEFAULT); EXPECT_EQ(0, ret); + alarm_id_t alarm_id; + alarm_date_t test_time; + test_time.year = 2022; test_time.month = 1; test_time.day = 1; - test_time.hour = 1; test_time.min = 1; test_time.sec = 5; - ret = alarmmgr_set_time(alarm,test_time); + ret = alarmmgr_set_time(alarm_,test_time); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_set_type(alarm, ALARM_TYPE_DEFAULT); + ret = alarmmgr_set_type(alarm_, ALARM_TYPE_DEFAULT); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_add_alarm_appsvc_with_localtime(alarm, (void *)b, + ret = alarmmgr_add_alarm_appsvc_with_localtime(alarm_, b.GetHandle(), &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); - - bundle_free(b); } -TEST_F(AlarmLibTest, alarmmgr_add_alarm_noti_with_localtime_n) -{ - int ret; - alarm_id_t alarm_id; - notification_h noti = nullptr; - - notification_ipc_make_gvariant_from_noti_fake.custom_fake = __notification_ipc_make_gvariant_from_noti_fake; - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_set_repeat_mode(alarm, ALARM_REPEAT_MODE_REPEAT, 1000); +TEST_F(AlarmLibTest, alarmmgr_add_alarm_noti_with_localtime_n) { + EXPECT_CALL(GetMock<GlibMock>(), g_variant_get_size(_)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<NotificationMock>(), + notification_ipc_make_gvariant_from_noti(_, _)) + .WillRepeatedly(Invoke(__notification_ipc_make_gvariant_from_noti_fake)); + + int ret = alarmmgr_set_repeat_mode(alarm_, ALARM_REPEAT_MODE_REPEAT, 1000); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_add_alarm_noti_with_localtime(alarm, noti, &alarm_id); + alarm_id_t alarm_id; + notification_h noti = nullptr; + ret = alarmmgr_add_alarm_noti_with_localtime(alarm_, noti, &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_add_alarm_n) -{ - int ret; - alarm_id_t alarm_id; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_add_alarm_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - ret = alarmmgr_set_repeat_mode(alarm, ALARM_REPEAT_MODE_REPEAT, 1000); + int ret = alarmmgr_set_repeat_mode(alarm_, ALARM_REPEAT_MODE_REPEAT, 1000); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); + alarm_id_t alarm_id; ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, 100, 1000, "gtest-alarmmgr", &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_add_alarm_precision_n) -{ - int ret; - alarm_id_t alarm_id; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_add_alarm_precision_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - ret = alarmmgr_add_alarm_precision(ALARM_TYPE_VOLATILE, 100, 1000, + alarm_id_t alarm_id; + int ret = alarmmgr_add_alarm_precision(ALARM_TYPE_VOLATILE, 100, 1000, "gtest-alarmmgr", &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_add_get_alarm_withcb_n) -{ - int ret; - alarm_id_t alarm_id; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_add_get_alarm_withcb_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_unregister_object(_, _)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); - ret = alarmmgr_add_alarm_withcb(ALARM_TYPE_VOLATILE, 100, 1000, - __handler, NULL, &alarm_id); + alarmmgr_fini(); + alarm_id_t alarm_id; + int ret = alarmmgr_add_alarm_withcb(ALARM_TYPE_VOLATILE, 100, 1000, + __handler, nullptr, &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); + alarmmgr_fini(); } -TEST_F(AlarmLibTest, alarmmgr_add_get_alarm_withcb_precision_n) -{ - int ret; - alarm_id_t alarm_id; +TEST_F(AlarmLibTest, alarmmgr_add_get_alarm_withcb_precision_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_unregister_object(_, _)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_add_alarm_withcb_precision(ALARM_TYPE_VOLATILE, 100, 1000, - __handler, NULL, &alarm_id); + alarm_id_t alarm_id; + int ret = alarmmgr_add_alarm_withcb_precision(ALARM_TYPE_VOLATILE, 100, 1000, + __handler, nullptr, &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); + alarmmgr_fini(); } -TEST_F(AlarmLibTest, alarmmgr_remove_alarm_n) -{ - int ret; - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_remove_alarm_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - ret = alarmmgr_remove_alarm(1); + int ret = alarmmgr_remove_alarm(1); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_remove_all_n) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_remove_all_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_remove_all(); + int ret = alarmmgr_remove_all(); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -int enum_fn(alarm_id_t alarm_id, void *user_param) -{ - return 0; -} - -TEST_F(AlarmLibTest, alarmmgr_enum_alarm_ids_n) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_enum_alarm_ids_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_enum_alarm_ids(enum_fn, nullptr); + int ret = alarmmgr_enum_alarm_ids([](alarm_id_t alarm_id, + void *user_param) -> int { + return 0; + }, nullptr); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_get_next_duetime_n) -{ - int ret; - time_t next_time; +TEST_F(AlarmLibTest, alarmmgr_get_next_duetime_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_get_next_duetime(1, &next_time); + time_t next_time; + int ret = alarmmgr_get_next_duetime(1, &next_time); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -int handler(alarm_id_t alarm_id, void *user_param) -{ - return 0; -} +TEST_F(AlarmLibTest, alarmmgr_add_periodic_alarm_withcb_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_unregister_object(_, _)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); -TEST_F(AlarmLibTest, alarmmgr_add_periodic_alarm_withcb_n) -{ - int ret; alarm_id_t alarm_id; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_add_periodic_alarm_withcb(1000, CUT_OFF, handler, NULL, - &alarm_id); + int ret = alarmmgr_add_periodic_alarm_withcb(1000, CUT_OFF, + [](alarm_id_t alarm_id, void*) -> int { + return 0; + }, nullptr, &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); + alarmmgr_fini(); } -TEST_F(AlarmLibTest, alarmmgr_add_reference_periodic_alarm_withcb_n) -{ - int ret; - alarm_id_t alarm_id; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_add_reference_periodic_alarm_withcb_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_new_for_xml(_, _)) + .WillRepeatedly(Invoke(__g_dbus_node_info_new_for_xml_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_register_object(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_connection_unregister_object(_, _)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(GetMock<DbusMock>(), g_bus_own_name_on_connection(_, _, _, + _, _, _, _)) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_node_info_unref(_)) + .WillRepeatedly(Invoke(__g_dbus_node_info_unref_fake)); - ret = alarmmgr_add_reference_periodic_alarm_withcb(1000, handler, NULL, - &alarm_id); + alarm_id_t alarm_id; + int ret = alarmmgr_add_reference_periodic_alarm_withcb(1000, + [](alarm_id_t alarm_id, void*) -> int { + return 0; + }, nullptr, &alarm_id); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); + alarmmgr_fini(); } -TEST_F(AlarmLibTest, alarmmgr_set_systime_n) -{ - int ret; - time_t current_time; +TEST_F(AlarmLibTest, alarmmgr_set_systime_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + time_t current_time; time(¤t_time); - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_set_systime(current_time); + int ret = alarmmgr_set_systime(current_time); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_set_systime_with_propagation_delay_n) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_systime_with_propagation_delay_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + struct timespec newtime; struct timespec reqtime; - clock_gettime(CLOCK_REALTIME, &newtime); clock_gettime(CLOCK_REALTIME, &reqtime); - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_set_systime_with_propagation_delay(newtime, reqtime); + int ret = alarmmgr_set_systime_with_propagation_delay(newtime, reqtime); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -int set_time_cb(int result, void *user_param) -{ - return 0; -} +TEST_F(AlarmLibTest, alarmmgr_set_systime_async_p) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); -TEST_F(AlarmLibTest, alarmmgr_set_systime_async_p) -{ - int ret; time_t current_time; - - g_dbus_proxy_call_fake.custom_fake = __g_dbus_proxy_call_fake; - time(¤t_time); - - ret = alarmmgr_set_systime_async(current_time, set_time_cb, NULL); + int ret = alarmmgr_set_systime_async(current_time, + [](int result, void*) -> int { + return 0; + }, nullptr); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmLibTest, alarmmgr_set_systime_with_propagation_delay_async_p) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_systime_with_propagation_delay_async_p) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + struct timespec newtime; struct timespec reqtime; - - g_dbus_proxy_call_fake.custom_fake = __g_dbus_proxy_call_fake; - clock_gettime(CLOCK_REALTIME, &newtime); clock_gettime(CLOCK_REALTIME, &reqtime); - newtime.tv_sec += 100; reqtime.tv_sec += 100; - - ret = alarmmgr_set_systime_with_propagation_delay_async(newtime, - reqtime, set_time_cb, NULL); + int ret = alarmmgr_set_systime_with_propagation_delay_async(newtime, reqtime, + [](int result, void*) -> int { + return 0; + },nullptr); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); } -TEST_F(AlarmLibTest, alarmmgr_set_timezone_n) -{ - int ret; - char zone[] = "/usr/share/zoneinfo/Asia/Seoul"; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_set_timezone_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - ret = alarmmgr_set_timezone(zone); + char zone[] = "/usr/share/zoneinfo/Asia/Seoul"; + int ret = alarmmgr_set_timezone(zone); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_set_global_n) -{ - int ret; +TEST_F(AlarmLibTest, alarmmgr_set_global_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; - - ret = alarmmgr_set_global(1, true); + int ret = alarmmgr_set_global(1, true); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_get_global_n) -{ - int ret; - bool global; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_get_global_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); - ret = alarmmgr_get_global(1, &global); + bool global; + int ret = alarmmgr_get_global(1, &global); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } -TEST_F(AlarmLibTest, alarmmgr_update_alarm_n) -{ - int ret; - alarm_date_t test_time; - - g_dbus_proxy_call_sync_fake.custom_fake = __g_dbus_proxy_call_sync_fake_negative; +TEST_F(AlarmLibTest, alarmmgr_update_alarm_n) { + EXPECT_CALL(GetMock<DbusMock>(), g_bus_get_sync(_, _, _)) + .WillRepeatedly(Invoke(__g_bus_get_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_new_sync( + _, _, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_new_sync_fake)); + EXPECT_CALL(GetMock<DbusMock>(), g_dbus_proxy_call_sync(_, _, _, _, _, _, _)) + .WillRepeatedly(Invoke(__g_dbus_proxy_call_sync_fake_negative)); + alarm_date_t test_time; test_time.year = 2022; test_time.month = 1; test_time.day = 1; - test_time.hour = 1; test_time.min = 1; test_time.sec = 5; - ret = alarmmgr_set_time(alarm, test_time); + int ret = alarmmgr_set_time(alarm_, test_time); EXPECT_EQ(ALARMMGR_RESULT_SUCCESS, ret); - ret = alarmmgr_update_alarm(1, alarm, ALARM_UPDATE_FLAG_TIME); + ret = alarmmgr_update_alarm(1, alarm_, ALARM_UPDATE_FLAG_TIME); EXPECT_EQ(ERR_ALARM_NO_PERMISSION, ret); } diff --git a/unittest/unittest.cpp b/unittest/unittest.cpp index e214950..8d1f366 100755 --- a/unittest/unittest.cpp +++ b/unittest/unittest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,10 +19,37 @@ #include "unittest.h" -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); +#ifdef LOG_INTERNAL +#include <dlog.h> - return RUN_ALL_TESTS(); +extern "C" int __dlog_print(log_id_t log_id, int prio, const char *tag, const char *fmt, ...) { + printf("%s:", tag); + va_list ap; + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf("\n"); + + return 0; +} +#endif + +int main(int argc, char **argv) { + int ret = 0; + try { + ::testing::InitGoogleTest(&argc, argv); + } catch(...) { + std::cout << "Exception occured" << std::endl; + return 1; + } + + try { + return RUN_ALL_TESTS(); + } catch(const ::testing::internal::GoogleTestFailureException& e) { + std::cout << "GoogleTestFailureException occured:" << e.what() << std::endl; + ret = 1; + } + + return ret; } |