Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
uamqp/deps/umock-c/src/umockcall.c@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- Committer:
- XinZhangMS
- Date:
- Thu Aug 23 06:52:14 2018 +0000
- Revision:
- 0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
XinZhangMS | 0:f7f1f0d76dd6 | 1 | // Copyright (c) Microsoft. All rights reserved. |
XinZhangMS | 0:f7f1f0d76dd6 | 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. |
XinZhangMS | 0:f7f1f0d76dd6 | 3 | |
XinZhangMS | 0:f7f1f0d76dd6 | 4 | #include <stddef.h> |
XinZhangMS | 0:f7f1f0d76dd6 | 5 | #include <string.h> |
XinZhangMS | 0:f7f1f0d76dd6 | 6 | #include "umockcall.h" |
XinZhangMS | 0:f7f1f0d76dd6 | 7 | #include "umockalloc.h" |
XinZhangMS | 0:f7f1f0d76dd6 | 8 | #include "umock_log.h" |
XinZhangMS | 0:f7f1f0d76dd6 | 9 | |
XinZhangMS | 0:f7f1f0d76dd6 | 10 | typedef struct UMOCKCALL_TAG |
XinZhangMS | 0:f7f1f0d76dd6 | 11 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 12 | char* function_name; |
XinZhangMS | 0:f7f1f0d76dd6 | 13 | void* umockcall_data; |
XinZhangMS | 0:f7f1f0d76dd6 | 14 | UMOCKCALL_DATA_COPY_FUNC umockcall_data_copy; |
XinZhangMS | 0:f7f1f0d76dd6 | 15 | UMOCKCALL_DATA_FREE_FUNC umockcall_data_free; |
XinZhangMS | 0:f7f1f0d76dd6 | 16 | UMOCKCALL_DATA_STRINGIFY_FUNC umockcall_data_stringify; |
XinZhangMS | 0:f7f1f0d76dd6 | 17 | UMOCKCALL_DATA_ARE_EQUAL_FUNC umockcall_data_are_equal; |
XinZhangMS | 0:f7f1f0d76dd6 | 18 | unsigned int fail_call : 1; |
XinZhangMS | 0:f7f1f0d76dd6 | 19 | unsigned int ignore_all_calls : 1; |
XinZhangMS | 0:f7f1f0d76dd6 | 20 | } UMOCKCALL; |
XinZhangMS | 0:f7f1f0d76dd6 | 21 | |
XinZhangMS | 0:f7f1f0d76dd6 | 22 | UMOCKCALL_HANDLE umockcall_create(const char* function_name, void* umockcall_data, UMOCKCALL_DATA_COPY_FUNC umockcall_data_copy, UMOCKCALL_DATA_FREE_FUNC umockcall_data_free, UMOCKCALL_DATA_STRINGIFY_FUNC umockcall_data_stringify, UMOCKCALL_DATA_ARE_EQUAL_FUNC umockcall_data_are_equal) |
XinZhangMS | 0:f7f1f0d76dd6 | 23 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 24 | UMOCKCALL* result; |
XinZhangMS | 0:f7f1f0d76dd6 | 25 | |
XinZhangMS | 0:f7f1f0d76dd6 | 26 | if ((function_name == NULL) || |
XinZhangMS | 0:f7f1f0d76dd6 | 27 | (umockcall_data == NULL) || |
XinZhangMS | 0:f7f1f0d76dd6 | 28 | (umockcall_data_copy == NULL) || |
XinZhangMS | 0:f7f1f0d76dd6 | 29 | (umockcall_data_free == NULL) || |
XinZhangMS | 0:f7f1f0d76dd6 | 30 | (umockcall_data_stringify == NULL) || |
XinZhangMS | 0:f7f1f0d76dd6 | 31 | (umockcall_data_are_equal == NULL)) |
XinZhangMS | 0:f7f1f0d76dd6 | 32 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 33 | /* Codes_SRS_UMOCKCALL_01_003: [ If any of the arguments are NULL, umockcall_create shall fail and return NULL. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 34 | UMOCK_LOG("umockcall: Cannot create call, invalid arguments: function_name = %p, umockcall_data = %p, umockcall_data_free = %p, umockcall_data_stringify = %p, umockcall_data_are_equal = %p.", |
XinZhangMS | 0:f7f1f0d76dd6 | 35 | function_name, umockcall_data, umockcall_data_free, umockcall_data_stringify, umockcall_data_are_equal); |
XinZhangMS | 0:f7f1f0d76dd6 | 36 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 37 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 38 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 39 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 40 | /* Codes_SRS_UMOCKCALL_01_001: [ umockcall_create shall create a new instance of a umock call and on success it shall return a non-NULL handle to it. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 41 | result = (UMOCKCALL*)umockalloc_malloc(sizeof(UMOCKCALL)); |
XinZhangMS | 0:f7f1f0d76dd6 | 42 | /* Codes_SRS_UMOCKCALL_01_002: [ If allocating memory for the umock call instance fails, umockcall_create shall return NULL. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 43 | if (result != NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 44 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 45 | size_t function_name_length = strlen(function_name); |
XinZhangMS | 0:f7f1f0d76dd6 | 46 | result->function_name = (char*)umockalloc_malloc(function_name_length + 1); |
XinZhangMS | 0:f7f1f0d76dd6 | 47 | if (result->function_name == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 48 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 49 | /* Codes_SRS_UMOCKCALL_01_002: [ If allocating memory for the umock call instance fails, umockcall_create shall return NULL. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 50 | UMOCK_LOG("umockcall: Cannot allocate memory for the call function name."); |
XinZhangMS | 0:f7f1f0d76dd6 | 51 | umockalloc_free(result); |
XinZhangMS | 0:f7f1f0d76dd6 | 52 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 53 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 54 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 55 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 56 | (void)memcpy(result->function_name, function_name, function_name_length + 1); |
XinZhangMS | 0:f7f1f0d76dd6 | 57 | result->umockcall_data = umockcall_data; |
XinZhangMS | 0:f7f1f0d76dd6 | 58 | result->umockcall_data_copy = umockcall_data_copy; |
XinZhangMS | 0:f7f1f0d76dd6 | 59 | result->umockcall_data_free = umockcall_data_free; |
XinZhangMS | 0:f7f1f0d76dd6 | 60 | result->umockcall_data_stringify = umockcall_data_stringify; |
XinZhangMS | 0:f7f1f0d76dd6 | 61 | result->umockcall_data_are_equal = umockcall_data_are_equal; |
XinZhangMS | 0:f7f1f0d76dd6 | 62 | result->fail_call = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 63 | result->ignore_all_calls = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 64 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 65 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 66 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 67 | |
XinZhangMS | 0:f7f1f0d76dd6 | 68 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 69 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 70 | |
XinZhangMS | 0:f7f1f0d76dd6 | 71 | void umockcall_destroy(UMOCKCALL_HANDLE umockcall) |
XinZhangMS | 0:f7f1f0d76dd6 | 72 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 73 | /* Codes_SRS_UMOCKCALL_01_005: [ If the umockcall argument is NULL then umockcall_destroy shall do nothing. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 74 | if (umockcall != NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 75 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 76 | /* Codes_SRS_UMOCKCALL_01_004: [ umockcall_destroy shall free a previously allocated umock call instance. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 77 | umockcall->umockcall_data_free(umockcall->umockcall_data); |
XinZhangMS | 0:f7f1f0d76dd6 | 78 | umockalloc_free(umockcall->function_name); |
XinZhangMS | 0:f7f1f0d76dd6 | 79 | umockalloc_free(umockcall); |
XinZhangMS | 0:f7f1f0d76dd6 | 80 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 81 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 82 | |
XinZhangMS | 0:f7f1f0d76dd6 | 83 | /* Codes_SRS_UMOCKCALL_01_006: [ umockcall_are_equal shall compare the two mock calls and return whether they are equal or not. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 84 | int umockcall_are_equal(UMOCKCALL_HANDLE left, UMOCKCALL_HANDLE right) |
XinZhangMS | 0:f7f1f0d76dd6 | 85 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 86 | int result; |
XinZhangMS | 0:f7f1f0d76dd6 | 87 | |
XinZhangMS | 0:f7f1f0d76dd6 | 88 | if (left == right) |
XinZhangMS | 0:f7f1f0d76dd6 | 89 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 90 | /* Codes_SRS_UMOCKCALL_01_024: [ If both left and right pointers are equal, umockcall_are_equal shall return 1. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 91 | result = 1; |
XinZhangMS | 0:f7f1f0d76dd6 | 92 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 93 | else if ((left == NULL) || (right == NULL)) |
XinZhangMS | 0:f7f1f0d76dd6 | 94 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 95 | /* Codes_SRS_UMOCKCALL_01_015: [ If only one of the left or right arguments are NULL, umockcall_are_equal shall return 0. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 96 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 97 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 98 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 99 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 100 | if (left->umockcall_data_are_equal != right->umockcall_data_are_equal) |
XinZhangMS | 0:f7f1f0d76dd6 | 101 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 102 | /* Codes_SRS_UMOCKCALL_01_014: [ If the two calls have different are_equal functions that have been passed to umockcall_create then the calls shall be considered different and 0 shall be returned. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 103 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 104 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 105 | else if (strcmp(left->function_name, right->function_name) != 0) |
XinZhangMS | 0:f7f1f0d76dd6 | 106 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 107 | /* Codes_SRS_UMOCKCALL_01_025: [ If the function name does not match for the 2 calls, umockcall_are_equal shall return 0. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 108 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 109 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 110 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 111 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 112 | /* Codes_SRS_UMOCKCALL_01_026: [ The call data shall be evaluated by calling the umockcall_data_are_equal function passed in umockcall_create while passing as arguments the umockcall_data associated with each call handle. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 113 | switch (left->umockcall_data_are_equal(left->umockcall_data, right->umockcall_data)) |
XinZhangMS | 0:f7f1f0d76dd6 | 114 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 115 | default: |
XinZhangMS | 0:f7f1f0d76dd6 | 116 | /* Codes_SRS_UMOCKCALL_01_029: [ If the underlying umockcall_data_are_equal fails (returns anything else than 0 or 1), then umockcall_are_equal shall fail and return -1. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 117 | UMOCK_LOG("umockcall: comparing call data failed."); |
XinZhangMS | 0:f7f1f0d76dd6 | 118 | result = -1; |
XinZhangMS | 0:f7f1f0d76dd6 | 119 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 120 | case 1: |
XinZhangMS | 0:f7f1f0d76dd6 | 121 | /* Codes_SRS_UMOCKCALL_01_027: [ If the underlying umockcall_data_are_equal returns 1, then umockcall_are_equal shall return 1. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 122 | result = 1; |
XinZhangMS | 0:f7f1f0d76dd6 | 123 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 124 | case 0: |
XinZhangMS | 0:f7f1f0d76dd6 | 125 | /* Codes_SRS_UMOCKCALL_01_028: [ If the underlying umockcall_data_are_equal returns 0, then umockcall_are_equal shall return 0. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 126 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 127 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 128 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 129 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 130 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 131 | |
XinZhangMS | 0:f7f1f0d76dd6 | 132 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 133 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 134 | |
XinZhangMS | 0:f7f1f0d76dd6 | 135 | char* umockcall_stringify(UMOCKCALL_HANDLE umockcall) |
XinZhangMS | 0:f7f1f0d76dd6 | 136 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 137 | char* result; |
XinZhangMS | 0:f7f1f0d76dd6 | 138 | |
XinZhangMS | 0:f7f1f0d76dd6 | 139 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 140 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 141 | /* Codes_SRS_UMOCKCALL_01_020: [ If the underlying umockcall_data_stringify call fails, umockcall_stringify shall fail and return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 142 | UMOCK_LOG("umockcall: NULL umockcall in stringify."); |
XinZhangMS | 0:f7f1f0d76dd6 | 143 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 144 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 145 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 146 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 147 | /* Codes_SRS_UMOCKCALL_01_019: [ To obtain the arguments string, umockcall_stringify shall call the umockcall_data_stringify function passed to umockcall_create and pass to it the umockcall_data pointer (also given in umockcall_create). ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 148 | char* stringified_args = umockcall->umockcall_data_stringify(umockcall->umockcall_data); |
XinZhangMS | 0:f7f1f0d76dd6 | 149 | if (stringified_args == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 150 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 151 | /* Codes_SRS_UMOCKCALL_01_020: [ If the underlying umockcall_data_stringify call fails, umockcall_stringify shall fail and return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 152 | UMOCK_LOG("umockcall: umockcall data stringify failed."); |
XinZhangMS | 0:f7f1f0d76dd6 | 153 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 154 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 155 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 156 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 157 | /* Codes_SRS_UMOCKCALL_01_016: [ umockcall_stringify shall return a string representation of the mock call in the form \[function_name(arguments)\]. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 158 | size_t function_name_length = strlen(umockcall->function_name); |
XinZhangMS | 0:f7f1f0d76dd6 | 159 | size_t stringified_args_length = strlen(stringified_args); |
XinZhangMS | 0:f7f1f0d76dd6 | 160 | |
XinZhangMS | 0:f7f1f0d76dd6 | 161 | /* 4 because () and [] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 162 | size_t call_length = function_name_length + stringified_args_length + 4; |
XinZhangMS | 0:f7f1f0d76dd6 | 163 | |
XinZhangMS | 0:f7f1f0d76dd6 | 164 | /* Codes_SRS_UMOCKCALL_01_018: [ The returned string shall be a newly allocated string and it is to be freed by the caller. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 165 | result = (char*)umockalloc_malloc(call_length + 1); |
XinZhangMS | 0:f7f1f0d76dd6 | 166 | /* Codes_SRS_UMOCKCALL_01_021: [ If not enough memory can be allocated for the string to be returned, umockcall_stringify shall fail and return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 167 | if (result != NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 168 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 169 | result[0] = '['; |
XinZhangMS | 0:f7f1f0d76dd6 | 170 | (void)memcpy(&result[1], umockcall->function_name, function_name_length); |
XinZhangMS | 0:f7f1f0d76dd6 | 171 | result[function_name_length + 1] = '('; |
XinZhangMS | 0:f7f1f0d76dd6 | 172 | (void)memcpy(&result[function_name_length + 2], stringified_args, stringified_args_length); |
XinZhangMS | 0:f7f1f0d76dd6 | 173 | result[function_name_length + stringified_args_length + 2] = ')'; |
XinZhangMS | 0:f7f1f0d76dd6 | 174 | result[function_name_length + stringified_args_length + 3] = ']'; |
XinZhangMS | 0:f7f1f0d76dd6 | 175 | result[function_name_length + stringified_args_length + 4] = '\0'; |
XinZhangMS | 0:f7f1f0d76dd6 | 176 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 177 | |
XinZhangMS | 0:f7f1f0d76dd6 | 178 | /* Codes_SRS_UMOCKCALL_01_030: [ umockcall_stringify shall free the string obtained from umockcall_data_stringify. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 179 | umockalloc_free(stringified_args); |
XinZhangMS | 0:f7f1f0d76dd6 | 180 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 181 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 182 | |
XinZhangMS | 0:f7f1f0d76dd6 | 183 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 184 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 185 | |
XinZhangMS | 0:f7f1f0d76dd6 | 186 | void* umockcall_get_call_data(UMOCKCALL_HANDLE umockcall) |
XinZhangMS | 0:f7f1f0d76dd6 | 187 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 188 | void* umockcall_data; |
XinZhangMS | 0:f7f1f0d76dd6 | 189 | |
XinZhangMS | 0:f7f1f0d76dd6 | 190 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 191 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 192 | UMOCK_LOG("umockcall: NULL umockcall in getting call data."); |
XinZhangMS | 0:f7f1f0d76dd6 | 193 | umockcall_data = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 194 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 195 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 196 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 197 | umockcall_data = umockcall->umockcall_data; |
XinZhangMS | 0:f7f1f0d76dd6 | 198 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 199 | |
XinZhangMS | 0:f7f1f0d76dd6 | 200 | return umockcall_data; |
XinZhangMS | 0:f7f1f0d76dd6 | 201 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 202 | |
XinZhangMS | 0:f7f1f0d76dd6 | 203 | /* Codes_SRS_UMOCKCALL_01_031: [ umockcall_clone shall clone a umock call and on success it shall return a handle to the newly cloned call. ] */ |
XinZhangMS | 0:f7f1f0d76dd6 | 204 | UMOCKCALL_HANDLE umockcall_clone(UMOCKCALL_HANDLE umockcall) |
XinZhangMS | 0:f7f1f0d76dd6 | 205 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 206 | UMOCKCALL_HANDLE result; |
XinZhangMS | 0:f7f1f0d76dd6 | 207 | |
XinZhangMS | 0:f7f1f0d76dd6 | 208 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 209 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 210 | /* Codes_SRS_UMOCKCALL_01_032: [ If umockcall is NULL, umockcall_clone shall return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 211 | UMOCK_LOG("umockcall_clone: NULL umockcall in getting call data."); |
XinZhangMS | 0:f7f1f0d76dd6 | 212 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 213 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 214 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 215 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 216 | result = (UMOCKCALL*)umockalloc_malloc(sizeof(UMOCKCALL)); |
XinZhangMS | 0:f7f1f0d76dd6 | 217 | if (result == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 218 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 219 | /* Codes_SRS_UMOCKCALL_01_043: [ If allocating memory for the new umock call fails, umockcall_clone shall return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 220 | UMOCK_LOG("umockcall_clone: Failed allocating memory for new copied call."); |
XinZhangMS | 0:f7f1f0d76dd6 | 221 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 222 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 223 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 224 | size_t function_name_length = strlen(umockcall->function_name); |
XinZhangMS | 0:f7f1f0d76dd6 | 225 | result->function_name = (char*)umockalloc_malloc(function_name_length + 1); |
XinZhangMS | 0:f7f1f0d76dd6 | 226 | if (result->function_name == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 227 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 228 | /* Codes_SRS_UMOCKCALL_01_036: [ If allocating memory for the function name fails, umockcall_clone shall return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 229 | UMOCK_LOG("umockcall_clone: Failed allocating memory for new copied call function name."); |
XinZhangMS | 0:f7f1f0d76dd6 | 230 | umockalloc_free(result); |
XinZhangMS | 0:f7f1f0d76dd6 | 231 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 232 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 233 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 234 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 235 | /* Codes_SRS_UMOCKCALL_01_035: [ umockcall_clone shall copy also the function name. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 236 | (void)memcpy(result->function_name, umockcall->function_name, function_name_length + 1); |
XinZhangMS | 0:f7f1f0d76dd6 | 237 | |
XinZhangMS | 0:f7f1f0d76dd6 | 238 | /* Codes_SRS_UMOCKCALL_01_033: [ The call data shall be cloned by calling the umockcall_data_copy function passed in umockcall_create and passing as argument the umockcall_data value passed in umockcall_create. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 239 | result->umockcall_data = umockcall->umockcall_data_copy(umockcall->umockcall_data); |
XinZhangMS | 0:f7f1f0d76dd6 | 240 | if (result->umockcall_data == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 241 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 242 | /* Codes_SRS_UMOCKCALL_01_034: [ If umockcall_data_copy fails then umockcall_clone shall return NULL. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 243 | UMOCK_LOG("umockcall_clone: Failed copying call data."); |
XinZhangMS | 0:f7f1f0d76dd6 | 244 | umockalloc_free(result->function_name); |
XinZhangMS | 0:f7f1f0d76dd6 | 245 | umockalloc_free(result); |
XinZhangMS | 0:f7f1f0d76dd6 | 246 | result = NULL; |
XinZhangMS | 0:f7f1f0d76dd6 | 247 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 248 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 249 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 250 | /* Codes_SRS_UMOCKCALL_01_037: [ umockcall_clone shall also copy all the functions passed to umockcall_create (umockcall_data_copy, umockcall_data_free, umockcall_data_are_equal, umockcall_data_stringify). ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 251 | result->umockcall_data_are_equal = umockcall->umockcall_data_are_equal; |
XinZhangMS | 0:f7f1f0d76dd6 | 252 | result->umockcall_data_copy = umockcall->umockcall_data_copy; |
XinZhangMS | 0:f7f1f0d76dd6 | 253 | result->umockcall_data_free = umockcall->umockcall_data_free; |
XinZhangMS | 0:f7f1f0d76dd6 | 254 | result->umockcall_data_stringify = umockcall->umockcall_data_stringify; |
XinZhangMS | 0:f7f1f0d76dd6 | 255 | result->ignore_all_calls = umockcall->ignore_all_calls; |
XinZhangMS | 0:f7f1f0d76dd6 | 256 | result->fail_call = umockcall->fail_call; |
XinZhangMS | 0:f7f1f0d76dd6 | 257 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 258 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 259 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 260 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 261 | |
XinZhangMS | 0:f7f1f0d76dd6 | 262 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 263 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 264 | |
XinZhangMS | 0:f7f1f0d76dd6 | 265 | int umockcall_set_fail_call(UMOCKCALL_HANDLE umockcall, int fail_call) |
XinZhangMS | 0:f7f1f0d76dd6 | 266 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 267 | int result; |
XinZhangMS | 0:f7f1f0d76dd6 | 268 | |
XinZhangMS | 0:f7f1f0d76dd6 | 269 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 270 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 271 | /* Codes_SRS_UMOCKCALL_01_039: [ If umockcall is NULL, umockcall_set_fail_call shall return a non-zero value. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 272 | UMOCK_LOG("umockcall_set_fail_call: NULL umockcall."); |
XinZhangMS | 0:f7f1f0d76dd6 | 273 | result = __LINE__; |
XinZhangMS | 0:f7f1f0d76dd6 | 274 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 275 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 276 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 277 | switch (fail_call) |
XinZhangMS | 0:f7f1f0d76dd6 | 278 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 279 | default: |
XinZhangMS | 0:f7f1f0d76dd6 | 280 | UMOCK_LOG("umockcall_set_fail_call: Invalid fail_call value: %d.", fail_call); |
XinZhangMS | 0:f7f1f0d76dd6 | 281 | result = __LINE__; |
XinZhangMS | 0:f7f1f0d76dd6 | 282 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 283 | case 0: |
XinZhangMS | 0:f7f1f0d76dd6 | 284 | /* Codes_SRS_UMOCKCALL_01_038: [ umockcall_set_fail_call shall store the fail_call value, associating it with the umockcall call instance. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 285 | umockcall->fail_call = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 286 | /* Codes_SRS_UMOCKCALL_01_044: [ On success umockcall_set_fail_call shall return 0. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 287 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 288 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 289 | case 1: |
XinZhangMS | 0:f7f1f0d76dd6 | 290 | /* Codes_SRS_UMOCKCALL_01_038: [ umockcall_set_fail_call shall store the fail_call value, associating it with the umockcall call instance. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 291 | umockcall->fail_call = 1; |
XinZhangMS | 0:f7f1f0d76dd6 | 292 | /* Codes_SRS_UMOCKCALL_01_044: [ On success umockcall_set_fail_call shall return 0. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 293 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 294 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 295 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 296 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 297 | |
XinZhangMS | 0:f7f1f0d76dd6 | 298 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 299 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 300 | |
XinZhangMS | 0:f7f1f0d76dd6 | 301 | int umockcall_get_fail_call(UMOCKCALL_HANDLE umockcall) |
XinZhangMS | 0:f7f1f0d76dd6 | 302 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 303 | int result; |
XinZhangMS | 0:f7f1f0d76dd6 | 304 | |
XinZhangMS | 0:f7f1f0d76dd6 | 305 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 306 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 307 | /* Codes_SRS_UMOCKCALL_01_042: [ If umockcall is NULL, umockcall_get_fail_call shall return -1. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 308 | UMOCK_LOG("NULL umokcall argument."); |
XinZhangMS | 0:f7f1f0d76dd6 | 309 | result = -1; |
XinZhangMS | 0:f7f1f0d76dd6 | 310 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 311 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 312 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 313 | /* Codes_SRS_UMOCKCALL_01_041: [ umockcall_get_fail_call shall retrieve the fail_call value, associated with the umockcall call instance. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 314 | result = umockcall->fail_call ? 1 : 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 315 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 316 | |
XinZhangMS | 0:f7f1f0d76dd6 | 317 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 318 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 319 | |
XinZhangMS | 0:f7f1f0d76dd6 | 320 | int umockcall_set_ignore_all_calls(UMOCKCALL_HANDLE umockcall, int ignore_all_calls) |
XinZhangMS | 0:f7f1f0d76dd6 | 321 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 322 | int result; |
XinZhangMS | 0:f7f1f0d76dd6 | 323 | |
XinZhangMS | 0:f7f1f0d76dd6 | 324 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 325 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 326 | /* Codes_SRS_UMOCKCALL_01_047: [ If umockcall is NULL, umockcall_set_ignore_all_calls shall return a non-zero value. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 327 | UMOCK_LOG("umockcall_set_fail_call: NULL umockcall."); |
XinZhangMS | 0:f7f1f0d76dd6 | 328 | result = __LINE__; |
XinZhangMS | 0:f7f1f0d76dd6 | 329 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 330 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 331 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 332 | switch (ignore_all_calls) |
XinZhangMS | 0:f7f1f0d76dd6 | 333 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 334 | default: |
XinZhangMS | 0:f7f1f0d76dd6 | 335 | /* Codes_SRS_UMOCKCALL_01_048: [ If a value different than 0 and 1 is passed as ignore_all_calls, umockcall_set_ignore_all_calls shall return a non-zero value. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 336 | UMOCK_LOG("umockcall_set_fail_call: Invalid ignore_all_calls value: %d.", ignore_all_calls); |
XinZhangMS | 0:f7f1f0d76dd6 | 337 | result = __LINE__; |
XinZhangMS | 0:f7f1f0d76dd6 | 338 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 339 | case 0: |
XinZhangMS | 0:f7f1f0d76dd6 | 340 | /* Codes_SRS_UMOCKCALL_01_045: [ umockcall_set_ignore_all_calls shall store the ignore_all_calls value, associating it with the umockcall call instance. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 341 | umockcall->ignore_all_calls = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 342 | /* Codes_SRS_UMOCKCALL_01_046: [ On success umockcall_set_ignore_all_calls shall return 0. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 343 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 344 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 345 | case 1: |
XinZhangMS | 0:f7f1f0d76dd6 | 346 | /* Codes_SRS_UMOCKCALL_01_045: [ umockcall_set_ignore_all_calls shall store the ignore_all_calls value, associating it with the umockcall call instance. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 347 | umockcall->ignore_all_calls = 1; |
XinZhangMS | 0:f7f1f0d76dd6 | 348 | /* Codes_SRS_UMOCKCALL_01_046: [ On success umockcall_set_ignore_all_calls shall return 0. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 349 | result = 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 350 | break; |
XinZhangMS | 0:f7f1f0d76dd6 | 351 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 352 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 353 | |
XinZhangMS | 0:f7f1f0d76dd6 | 354 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 355 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 356 | |
XinZhangMS | 0:f7f1f0d76dd6 | 357 | int umockcall_get_ignore_all_calls(UMOCKCALL_HANDLE umockcall) |
XinZhangMS | 0:f7f1f0d76dd6 | 358 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 359 | int result; |
XinZhangMS | 0:f7f1f0d76dd6 | 360 | |
XinZhangMS | 0:f7f1f0d76dd6 | 361 | if (umockcall == NULL) |
XinZhangMS | 0:f7f1f0d76dd6 | 362 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 363 | /* Codes_SRS_UMOCKCALL_01_050: [ If umockcall is NULL, umockcall_get_ignore_all_calls shall return -1. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 364 | UMOCK_LOG("NULL umokcall argument."); |
XinZhangMS | 0:f7f1f0d76dd6 | 365 | result = -1; |
XinZhangMS | 0:f7f1f0d76dd6 | 366 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 367 | else |
XinZhangMS | 0:f7f1f0d76dd6 | 368 | { |
XinZhangMS | 0:f7f1f0d76dd6 | 369 | /* Codes_SRS_UMOCKCALL_01_049: [ umockcall_get_ignore_all_calls shall retrieve the ignore_all_calls value, associated with the umockcall call instance. ]*/ |
XinZhangMS | 0:f7f1f0d76dd6 | 370 | result = umockcall->ignore_all_calls ? 1 : 0; |
XinZhangMS | 0:f7f1f0d76dd6 | 371 | } |
XinZhangMS | 0:f7f1f0d76dd6 | 372 | |
XinZhangMS | 0:f7f1f0d76dd6 | 373 | return result; |
XinZhangMS | 0:f7f1f0d76dd6 | 374 | } |