in src/umockcallrecorder.c [243:361]
int umockcallrecorder_add_actual_call(UMOCKCALLRECORDER_HANDLE umock_call_recorder, UMOCKCALL_HANDLE mock_call, UMOCKCALL_HANDLE* matched_call)
{
int result;
if ((umock_call_recorder == NULL) ||
(mock_call == NULL) ||
(matched_call == NULL))
{
/* Codes_SRS_UMOCKCALLRECORDER_01_019: [ If any of the arguments is NULL, umockcallrecorder_add_actual_call shall fail and return a non-zero value. ]*/
UMOCK_LOG("umockcallrecorder: Bad arguments in add actual call: umock_call_recorder = %p, mock_call = %p, matched_call = %p.",
umock_call_recorder, mock_call, matched_call);
result = MU_FAILURE;
}
else
{
size_t i;
unsigned int is_error = 0;
*matched_call = NULL;
/* Codes_SRS_UMOCKCALLRECORDER_01_071: [ If a lock was created for the call recorder, umockcallrecorder_add_actual_call acquire the lock in exclusive mode. ]*/
internal_lock_acquire_exclusive_if_needed(umock_call_recorder);
{
/* Codes_SRS_UMOCKCALLRECORDER_01_014: [ umockcallrecorder_add_actual_call shall check whether the call mock_call matches any of the expected calls maintained by umock_call_recorder. ]*/
/* Codes_SRS_UMOCK_C_LIB_01_115: [ umock_c shall compare calls in order. ]*/
for (i = 0; i < umock_call_recorder->expected_call_count; i++)
{
int ignore_all_calls = umockcall_get_ignore_all_calls(umock_call_recorder->expected_calls[i].umockcall);
if (ignore_all_calls < 0)
{
/* Codes_SRS_UMOCKCALLRECORDER_01_058: [ If getting ignore_all_calls by calling umockcall_get_ignore_all_calls fails, umockcallrecorder_add_actual_call shall fail and return a non-zero value. ]*/
UMOCK_LOG("umockcallrecorder: Cannot get the ignore_all_calls flag.");
is_error = 1;
break;
}
else
{
if ((umock_call_recorder->expected_calls[i].is_matched == 0) ||
/* Codes_SRS_UMOCKCALLRECORDER_01_057: [ If any expected call has ignore_all_calls set and the actual call is equal to it when comparing the 2 calls, then the call shall be considered matched and not added to the actual calls list. ]*/
(ignore_all_calls > 0))
{
/* Codes_SRS_UMOCKCALLRECORDER_01_017: [ Comparing the calls shall be done by calling umockcall_are_equal. ]*/
int are_equal_result = umockcall_are_equal(umock_call_recorder->expected_calls[i].umockcall, mock_call);
if (are_equal_result == 1)
{
/* Codes_SRS_UMOCKCALLRECORDER_01_016: [ If the call matches one of the expected calls, a handle to the matched call shall be filled into the matched_call argument. ]*/
*matched_call = umock_call_recorder->expected_calls[i].umockcall;
break;
}
/* Codes_SRS_UMOCKCALLRECORDER_01_021: [ If umockcall_are_equal fails, umockcallrecorder_add_actual_call shall fail and return a non-zero value. ]*/
else if (are_equal_result != 0)
{
is_error = 1;
break;
}
else
{
if (ignore_all_calls == 0)
{
i = umock_call_recorder->expected_call_count;
break;
}
}
}
}
}
if ((umock_call_recorder->actual_call_count == 0) && (i < umock_call_recorder->expected_call_count))
{
umock_call_recorder->expected_calls[i].is_matched = 1;
}
else
{
i = umock_call_recorder->expected_call_count;
}
if (is_error)
{
UMOCK_LOG("umockcallrecorder: Error in finding a matched call.");
result = MU_FAILURE;
}
else
{
if (i == umock_call_recorder->expected_call_count)
{
/* Codes_SRS_UMOCKCALLRECORDER_01_015: [ If the call does not match any of the expected calls, then umockcallrecorder_add_actual_call shall add the mock_call call to the actual call list maintained by umock_call_recorder. ]*/
/* an unexpected call */
UMOCKCALL_HANDLE* new_actual_calls = umockalloc_realloc(umock_call_recorder->actual_calls, sizeof(UMOCKCALL_HANDLE) * (umock_call_recorder->actual_call_count + 1));
if (new_actual_calls == NULL)
{
/* Codes_SRS_UMOCKCALLRECORDER_01_020: [ If allocating memory for the actual calls fails, umockcallrecorder_add_actual_call shall fail and return a non-zero value. ]*/
UMOCK_LOG("umockcallrecorder: Cannot allocate memory for actual calls.");
result = MU_FAILURE;
}
else
{
umock_call_recorder->actual_calls = new_actual_calls;
umock_call_recorder->actual_calls[umock_call_recorder->actual_call_count++] = mock_call;
/* Codes_SRS_UMOCKCALLRECORDER_01_018: [ When no error is encountered, umockcallrecorder_add_actual_call shall return 0. ]*/
result = 0;
}
}
else
{
umockcall_destroy(mock_call);
/* Codes_SRS_UMOCKCALLRECORDER_01_018: [ When no error is encountered, umockcallrecorder_add_actual_call shall return 0. ]*/
result = 0;
}
}
/* Codes_SRS_UMOCKCALLRECORDER_01_070: [ If a lock was created for the call recorder, umockcallrecorder_add_actual_call shall release the exclusive lock. ]*/
internal_lock_release_exclusive_if_needed(umock_call_recorder);
}
}
return result;
}