Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

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?

UserRevisionLine numberNew 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 }