1/* 2 Copyright (c) 2009-2017 Dave Gamble and cJSON contributors 3 4 Permission is hereby granted, free of charge, to any person obtaining a copy 5 of this software and associated documentation files (the "Software"), to deal 6 in the Software without restriction, including without limitation the rights 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 copies of the Software, and to permit persons to whom the Software is 9 furnished to do so, subject to the following conditions: 10 11 The above copyright notice and this permission notice shall be included in 12 all copies or substantial portions of the Software. 13 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 THE SOFTWARE. 21*/ 22 23#include <stdio.h> 24#include <stdlib.h> 25#include <string.h> 26 27#include "unity/examples/unity_config.h" 28#include "unity/src/unity.h" 29#include "common.h" 30 31static void * CJSON_CDECL failing_malloc(size_t size) 32{ 33 (void)size; 34 return NULL; 35} 36 37/* work around MSVC error C2322: '...' address of dillimport '...' is not static */ 38static void CJSON_CDECL normal_free(void *pointer) 39{ 40 free(pointer); 41} 42 43static cJSON_Hooks failing_hooks = { 44 failing_malloc, 45 normal_free 46}; 47 48static void cjson_add_null_should_add_null(void) 49{ 50 cJSON *root = cJSON_CreateObject(); 51 cJSON *null = NULL; 52 53 cJSON_AddNullToObject(root, "null"); 54 55 TEST_ASSERT_NOT_NULL(null = cJSON_GetObjectItemCaseSensitive(root, "null")); 56 TEST_ASSERT_EQUAL_INT(null->type, cJSON_NULL); 57 58 cJSON_Delete(root); 59} 60 61static void cjson_add_null_should_fail_with_null_pointers(void) 62{ 63 cJSON *root = cJSON_CreateObject(); 64 65 TEST_ASSERT_NULL(cJSON_AddNullToObject(NULL, "null")); 66 TEST_ASSERT_NULL(cJSON_AddNullToObject(root, NULL)); 67 68 cJSON_Delete(root); 69} 70 71static void cjson_add_null_should_fail_on_allocation_failure(void) 72{ 73 cJSON *root = cJSON_CreateObject(); 74 75 cJSON_InitHooks(&failing_hooks); 76 77 TEST_ASSERT_NULL(cJSON_AddNullToObject(root, "null")); 78 79 cJSON_InitHooks(NULL); 80 81 cJSON_Delete(root); 82} 83 84static void cjson_add_true_should_add_true(void) 85{ 86 cJSON *root = cJSON_CreateObject(); 87 cJSON *true_item = NULL; 88 89 cJSON_AddTrueToObject(root, "true"); 90 91 TEST_ASSERT_NOT_NULL(true_item = cJSON_GetObjectItemCaseSensitive(root, "true")); 92 TEST_ASSERT_EQUAL_INT(true_item->type, cJSON_True); 93 94 cJSON_Delete(root); 95} 96 97static void cjson_add_true_should_fail_with_null_pointers(void) 98{ 99 cJSON *root = cJSON_CreateObject(); 100 101 TEST_ASSERT_NULL(cJSON_AddTrueToObject(NULL, "true")); 102 TEST_ASSERT_NULL(cJSON_AddTrueToObject(root, NULL)); 103 104 cJSON_Delete(root); 105} 106 107static void cjson_add_true_should_fail_on_allocation_failure(void) 108{ 109 cJSON *root = cJSON_CreateObject(); 110 111 cJSON_InitHooks(&failing_hooks); 112 113 TEST_ASSERT_NULL(cJSON_AddTrueToObject(root, "true")); 114 115 cJSON_InitHooks(NULL); 116 117 cJSON_Delete(root); 118} 119 120static void cjson_create_int_array_should_fail_on_allocation_failure(void) 121{ 122 int numbers[] = {1, 2, 3}; 123 124 cJSON_InitHooks(&failing_hooks); 125 126 TEST_ASSERT_NULL(cJSON_CreateIntArray(numbers, 3)); 127 128 cJSON_InitHooks(NULL); 129} 130 131static void cjson_create_float_array_should_fail_on_allocation_failure(void) 132{ 133 float numbers[] = {1.0f, 2.0f, 3.0f}; 134 135 cJSON_InitHooks(&failing_hooks); 136 137 TEST_ASSERT_NULL(cJSON_CreateFloatArray(numbers, 3)); 138 139 cJSON_InitHooks(NULL); 140} 141 142static void cjson_create_double_array_should_fail_on_allocation_failure(void) 143{ 144 double numbers[] = {1.0, 2.0, 3.0}; 145 146 cJSON_InitHooks(&failing_hooks); 147 148 TEST_ASSERT_NULL(cJSON_CreateDoubleArray(numbers, 3)); 149 150 cJSON_InitHooks(NULL); 151} 152 153static void cjson_create_string_array_should_fail_on_allocation_failure(void) 154{ 155 const char* strings[] = {"1", "2", "3"}; 156 157 cJSON_InitHooks(&failing_hooks); 158 159 TEST_ASSERT_NULL(cJSON_CreateStringArray(strings, 3)); 160 161 cJSON_InitHooks(NULL); 162} 163 164static void cjson_add_false_should_add_false(void) 165{ 166 cJSON *root = cJSON_CreateObject(); 167 cJSON *false_item = NULL; 168 169 cJSON_AddFalseToObject(root, "false"); 170 171 TEST_ASSERT_NOT_NULL(false_item = cJSON_GetObjectItemCaseSensitive(root, "false")); 172 TEST_ASSERT_EQUAL_INT(false_item->type, cJSON_False); 173 174 cJSON_Delete(root); 175} 176 177static void cjson_add_false_should_fail_with_null_pointers(void) 178{ 179 cJSON *root = cJSON_CreateObject(); 180 181 TEST_ASSERT_NULL(cJSON_AddFalseToObject(NULL, "false")); 182 TEST_ASSERT_NULL(cJSON_AddFalseToObject(root, NULL)); 183 184 cJSON_Delete(root); 185} 186 187static void cjson_add_false_should_fail_on_allocation_failure(void) 188{ 189 cJSON *root = cJSON_CreateObject(); 190 191 cJSON_InitHooks(&failing_hooks); 192 193 TEST_ASSERT_NULL(cJSON_AddFalseToObject(root, "false")); 194 195 cJSON_InitHooks(NULL); 196 197 cJSON_Delete(root); 198} 199 200static void cjson_add_bool_should_add_bool(void) 201{ 202 cJSON *root = cJSON_CreateObject(); 203 cJSON *true_item = NULL; 204 cJSON *false_item = NULL; 205 206 /* true */ 207 cJSON_AddBoolToObject(root, "true", true); 208 TEST_ASSERT_NOT_NULL(true_item = cJSON_GetObjectItemCaseSensitive(root, "true")); 209 TEST_ASSERT_EQUAL_INT(true_item->type, cJSON_True); 210 211 /* false */ 212 cJSON_AddBoolToObject(root, "false", false); 213 TEST_ASSERT_NOT_NULL(false_item = cJSON_GetObjectItemCaseSensitive(root, "false")); 214 TEST_ASSERT_EQUAL_INT(false_item->type, cJSON_False); 215 216 cJSON_Delete(root); 217} 218 219static void cjson_add_bool_should_fail_with_null_pointers(void) 220{ 221 cJSON *root = cJSON_CreateObject(); 222 223 TEST_ASSERT_NULL(cJSON_AddBoolToObject(NULL, "false", false)); 224 TEST_ASSERT_NULL(cJSON_AddBoolToObject(root, NULL, false)); 225 226 cJSON_Delete(root); 227} 228 229static void cjson_add_bool_should_fail_on_allocation_failure(void) 230{ 231 cJSON *root = cJSON_CreateObject(); 232 233 cJSON_InitHooks(&failing_hooks); 234 235 TEST_ASSERT_NULL(cJSON_AddBoolToObject(root, "false", false)); 236 237 cJSON_InitHooks(NULL); 238 239 cJSON_Delete(root); 240} 241 242static void cjson_add_number_should_add_number(void) 243{ 244 cJSON *root = cJSON_CreateObject(); 245 cJSON *number = NULL; 246 247 cJSON_AddNumberToObject(root, "number", 42); 248 249 TEST_ASSERT_NOT_NULL(number = cJSON_GetObjectItemCaseSensitive(root, "number")); 250 251 TEST_ASSERT_EQUAL_INT(number->type, cJSON_Number); 252 TEST_ASSERT_EQUAL_DOUBLE(number->valuedouble, 42); 253 TEST_ASSERT_EQUAL_INT(number->valueint, 42); 254 255 cJSON_Delete(root); 256} 257 258static void cjson_add_number_should_fail_with_null_pointers(void) 259{ 260 cJSON *root = cJSON_CreateObject(); 261 262 TEST_ASSERT_NULL(cJSON_AddNumberToObject(NULL, "number", 42)); 263 TEST_ASSERT_NULL(cJSON_AddNumberToObject(root, NULL, 42)); 264 265 cJSON_Delete(root); 266} 267 268static void cjson_add_number_should_fail_on_allocation_failure(void) 269{ 270 cJSON *root = cJSON_CreateObject(); 271 272 cJSON_InitHooks(&failing_hooks); 273 274 TEST_ASSERT_NULL(cJSON_AddNumberToObject(root, "number", 42)); 275 276 cJSON_InitHooks(NULL); 277 278 cJSON_Delete(root); 279} 280 281#ifdef __CJSON_USE_INT64 282static void cjson_add_int64_number_should_add_int64_number(void) 283{ 284 cJSON *root = cJSON_CreateObject(); 285 cJSON *number = NULL; 286 287 cJSON_AddInt64NumberToObject(root, "number", 42LL); 288 289 TEST_ASSERT_NOT_NULL(number = cJSON_GetObjectItemCaseSensitive(root, "number")); 290 291 TEST_ASSERT_EQUAL_INT(number->type, cJSON_Number | cJSON_IsInt64); 292 TEST_ASSERT_EQUAL_DOUBLE(number->valuedouble, 42); 293 TEST_ASSERT_EQUAL_INT64(number->valueint, 42LL); 294 295 cJSON_Delete(root); 296} 297 298static void cjson_add_int64_number_should_fail_with_null_pointers(void) 299{ 300 cJSON *root = cJSON_CreateObject(); 301 302 TEST_ASSERT_NULL(cJSON_AddInt64NumberToObject(NULL, "number", 42LL)); 303 TEST_ASSERT_NULL(cJSON_AddInt64NumberToObject(root, NULL, 42LL)); 304 305 cJSON_Delete(root); 306} 307 308static void cjson_add_int64_number_should_fail_on_allocation_failure(void) 309{ 310 cJSON *root = cJSON_CreateObject(); 311 312 cJSON_InitHooks(&failing_hooks); 313 314 TEST_ASSERT_NULL(cJSON_AddInt64NumberToObject(root, "number", 42LL)); 315 316 cJSON_InitHooks(NULL); 317 318 cJSON_Delete(root); 319} 320#endif /* __CJSON_USE_INT64 */ 321 322static void cjson_add_string_should_add_string(void) 323{ 324 cJSON *root = cJSON_CreateObject(); 325 cJSON *string = NULL; 326 327 cJSON_AddStringToObject(root, "string", "Hello World!"); 328 329 TEST_ASSERT_NOT_NULL(string = cJSON_GetObjectItemCaseSensitive(root, "string")); 330 TEST_ASSERT_EQUAL_INT(string->type, cJSON_String); 331 TEST_ASSERT_EQUAL_STRING(string->valuestring, "Hello World!"); 332 333 cJSON_Delete(root); 334} 335 336static void cjson_add_string_should_fail_with_null_pointers(void) 337{ 338 cJSON *root = cJSON_CreateObject(); 339 340 TEST_ASSERT_NULL(cJSON_AddStringToObject(NULL, "string", "string")); 341 TEST_ASSERT_NULL(cJSON_AddStringToObject(root, NULL, "string")); 342 343 cJSON_Delete(root); 344} 345 346static void cjson_add_string_should_fail_on_allocation_failure(void) 347{ 348 cJSON *root = cJSON_CreateObject(); 349 350 cJSON_InitHooks(&failing_hooks); 351 352 TEST_ASSERT_NULL(cJSON_AddStringToObject(root, "string", "string")); 353 354 cJSON_InitHooks(NULL); 355 356 cJSON_Delete(root); 357} 358 359static void cjson_add_raw_should_add_raw(void) 360{ 361 cJSON *root = cJSON_CreateObject(); 362 cJSON *raw = NULL; 363 364 cJSON_AddRawToObject(root, "raw", "{}"); 365 366 TEST_ASSERT_NOT_NULL(raw = cJSON_GetObjectItemCaseSensitive(root, "raw")); 367 TEST_ASSERT_EQUAL_INT(raw->type, cJSON_Raw); 368 TEST_ASSERT_EQUAL_STRING(raw->valuestring, "{}"); 369 370 cJSON_Delete(root); 371} 372 373static void cjson_add_raw_should_fail_with_null_pointers(void) 374{ 375 cJSON *root = cJSON_CreateObject(); 376 377 TEST_ASSERT_NULL(cJSON_AddRawToObject(NULL, "raw", "{}")); 378 TEST_ASSERT_NULL(cJSON_AddRawToObject(root, NULL, "{}")); 379 380 cJSON_Delete(root); 381} 382 383static void cjson_add_raw_should_fail_on_allocation_failure(void) 384{ 385 cJSON *root = cJSON_CreateObject(); 386 387 cJSON_InitHooks(&failing_hooks); 388 389 TEST_ASSERT_NULL(cJSON_AddRawToObject(root, "raw", "{}")); 390 391 cJSON_InitHooks(NULL); 392 393 cJSON_Delete(root); 394} 395 396static void cJSON_add_object_should_add_object(void) 397{ 398 cJSON *root = cJSON_CreateObject(); 399 cJSON *object = NULL; 400 401 cJSON_AddObjectToObject(root, "object"); 402 TEST_ASSERT_NOT_NULL(object = cJSON_GetObjectItemCaseSensitive(root, "object")); 403 TEST_ASSERT_EQUAL_INT(object->type, cJSON_Object); 404 405 cJSON_Delete(root); 406} 407 408static void cjson_add_object_should_fail_with_null_pointers(void) 409{ 410 cJSON *root = cJSON_CreateObject(); 411 412 TEST_ASSERT_NULL(cJSON_AddObjectToObject(NULL, "object")); 413 TEST_ASSERT_NULL(cJSON_AddObjectToObject(root, NULL)); 414 415 cJSON_Delete(root); 416} 417 418static void cjson_add_object_should_fail_on_allocation_failure(void) 419{ 420 cJSON *root = cJSON_CreateObject(); 421 422 cJSON_InitHooks(&failing_hooks); 423 424 TEST_ASSERT_NULL(cJSON_AddObjectToObject(root, "object")); 425 426 cJSON_InitHooks(NULL); 427 428 cJSON_Delete(root); 429} 430 431static void cJSON_add_array_should_add_array(void) 432{ 433 cJSON *root = cJSON_CreateObject(); 434 cJSON *array = NULL; 435 436 cJSON_AddArrayToObject(root, "array"); 437 TEST_ASSERT_NOT_NULL(array = cJSON_GetObjectItemCaseSensitive(root, "array")); 438 TEST_ASSERT_EQUAL_INT(array->type, cJSON_Array); 439 440 cJSON_Delete(root); 441} 442 443static void cjson_add_array_should_fail_with_null_pointers(void) 444{ 445 cJSON *root = cJSON_CreateObject(); 446 447 TEST_ASSERT_NULL(cJSON_AddArrayToObject(NULL, "array")); 448 TEST_ASSERT_NULL(cJSON_AddArrayToObject(root, NULL)); 449 450 cJSON_Delete(root); 451} 452 453static void cjson_add_array_should_fail_on_allocation_failure(void) 454{ 455 cJSON *root = cJSON_CreateObject(); 456 457 cJSON_InitHooks(&failing_hooks); 458 459 TEST_ASSERT_NULL(cJSON_AddArrayToObject(root, "array")); 460 461 cJSON_InitHooks(NULL); 462 463 cJSON_Delete(root); 464} 465 466int CJSON_CDECL main(void) 467{ 468 UNITY_BEGIN(); 469 470 RUN_TEST(cjson_add_null_should_add_null); 471 RUN_TEST(cjson_add_null_should_fail_with_null_pointers); 472 RUN_TEST(cjson_add_null_should_fail_on_allocation_failure); 473 474 RUN_TEST(cjson_add_true_should_add_true); 475 RUN_TEST(cjson_add_true_should_fail_with_null_pointers); 476 RUN_TEST(cjson_add_true_should_fail_on_allocation_failure); 477 478 RUN_TEST(cjson_create_int_array_should_fail_on_allocation_failure); 479 RUN_TEST(cjson_create_float_array_should_fail_on_allocation_failure); 480 RUN_TEST(cjson_create_double_array_should_fail_on_allocation_failure); 481 RUN_TEST(cjson_create_string_array_should_fail_on_allocation_failure); 482 483 RUN_TEST(cjson_add_false_should_add_false); 484 RUN_TEST(cjson_add_false_should_fail_with_null_pointers); 485 RUN_TEST(cjson_add_false_should_fail_on_allocation_failure); 486 487 RUN_TEST(cjson_add_bool_should_add_bool); 488 RUN_TEST(cjson_add_bool_should_fail_with_null_pointers); 489 RUN_TEST(cjson_add_bool_should_fail_on_allocation_failure); 490 491 RUN_TEST(cjson_add_number_should_add_number); 492 RUN_TEST(cjson_add_number_should_fail_with_null_pointers); 493 RUN_TEST(cjson_add_number_should_fail_on_allocation_failure); 494 495#ifdef __CJSON_USE_INT64 496 RUN_TEST(cjson_add_int64_number_should_add_int64_number); 497 RUN_TEST(cjson_add_int64_number_should_fail_with_null_pointers); 498 RUN_TEST(cjson_add_int64_number_should_fail_on_allocation_failure); 499#endif /* __CJSON_USE_INT64 */ 500 501 RUN_TEST(cjson_add_string_should_add_string); 502 RUN_TEST(cjson_add_string_should_fail_with_null_pointers); 503 RUN_TEST(cjson_add_string_should_fail_on_allocation_failure); 504 505 RUN_TEST(cjson_add_raw_should_add_raw); 506 RUN_TEST(cjson_add_raw_should_fail_with_null_pointers); 507 RUN_TEST(cjson_add_raw_should_fail_on_allocation_failure); 508 509 RUN_TEST(cJSON_add_object_should_add_object); 510 RUN_TEST(cjson_add_object_should_fail_with_null_pointers); 511 RUN_TEST(cjson_add_object_should_fail_on_allocation_failure); 512 513 RUN_TEST(cJSON_add_array_should_add_array); 514 RUN_TEST(cjson_add_array_should_fail_with_null_pointers); 515 RUN_TEST(cjson_add_array_should_fail_on_allocation_failure); 516 517 return UNITY_END(); 518} 519