ceedling 0.28.2 → 0.28.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. checksums.yaml +4 -4
  2. data/assets/ceedling +3 -0
  3. data/assets/ceedling.cmd +1 -0
  4. data/assets/default_gitignore +5 -0
  5. data/assets/project_with_guts.yml +1 -0
  6. data/assets/project_with_guts_gcov.yml +3 -0
  7. data/assets/test_example_file_verbose.c +12 -0
  8. data/bin/ceedling +30 -6
  9. data/docs/CeedlingPacket.md +135 -23
  10. data/docs/CeedlingPacket.odt +0 -0
  11. data/examples/blinky/rakefile.rb +2 -1
  12. data/lib/ceedling/configurator.rb +7 -5
  13. data/lib/ceedling/configurator_builder.rb +10 -7
  14. data/lib/ceedling/configurator_plugins.rb +29 -24
  15. data/lib/ceedling/configurator_setup.rb +0 -1
  16. data/lib/ceedling/defaults.rb +7 -2
  17. data/lib/ceedling/dependinator.rb +10 -2
  18. data/lib/ceedling/file_finder.rb +57 -49
  19. data/lib/ceedling/file_path_utils.rb +12 -4
  20. data/lib/ceedling/file_wrapper.rb +4 -0
  21. data/lib/ceedling/generator.rb +4 -3
  22. data/lib/ceedling/generator_test_results.rb +15 -13
  23. data/lib/ceedling/plugin_manager.rb +18 -18
  24. data/lib/ceedling/plugin_reportinator.rb +3 -2
  25. data/lib/ceedling/plugin_reportinator_helper.rb +2 -3
  26. data/lib/ceedling/preprocessinator_extractor.rb +2 -2
  27. data/lib/ceedling/preprocessinator_includes_handler.rb +5 -0
  28. data/lib/ceedling/rakefile.rb +1 -0
  29. data/lib/ceedling/release_invoker_helper.rb +5 -2
  30. data/lib/ceedling/rules_release.rake +2 -1
  31. data/lib/ceedling/rules_tests.rake +18 -9
  32. data/lib/ceedling/rules_tests_deep_dependencies.rake +2 -2
  33. data/lib/ceedling/task_invoker.rb +15 -3
  34. data/lib/ceedling/tasks_vendor.rake +3 -3
  35. data/lib/ceedling/test_invoker.rb +39 -12
  36. data/lib/ceedling/test_invoker_helper.rb +5 -1
  37. data/lib/ceedling/tool_executor.rb +8 -4
  38. data/lib/ceedling/version.rb +1 -1
  39. data/out.fail +21 -0
  40. data/plugins/beep/README.md +22 -0
  41. data/plugins/beep/lib/beep.rb +40 -0
  42. data/plugins/bullseye/bullseye.rake +43 -36
  43. data/plugins/bullseye/config/defaults.yml +4 -0
  44. data/plugins/bullseye/lib/bullseye.rb +27 -5
  45. data/plugins/command_hooks/lib/command_hooks.rb +3 -0
  46. data/plugins/gcov/README.md +34 -1
  47. data/plugins/gcov/config/defaults.yml +3 -3
  48. data/plugins/gcov/gcov.rake +7 -5
  49. data/plugins/gcov/lib/gcov.rb +3 -1
  50. data/plugins/gcov/lib/gcov_constants.rb +2 -0
  51. data/plugins/junit_tests_report/lib/junit_tests_report.rb +12 -9
  52. data/plugins/module_generator/lib/module_generator.rb +14 -1
  53. data/plugins/module_generator/module_generator.rake +21 -4
  54. data/plugins/raw_output_report/lib/raw_output_report.rb +41 -0
  55. data/spec/gcov/gcov_deployment_spec.rb +1 -1
  56. data/spec/gcov/gcov_test_cases_spec.rb +2 -2
  57. data/spec/generator_test_results_spec.rb +5 -0
  58. data/spec/preprocessinator_includes_handler_spec.rb +1 -0
  59. data/spec/spec_system_helper.rb +178 -4
  60. data/spec/support/test_example.fail +1 -0
  61. data/spec/support/test_example.pass +1 -0
  62. data/spec/support/test_example_empty.pass +1 -0
  63. data/spec/support/test_example_ignore.pass +1 -0
  64. data/spec/support/test_example_mangled.pass +1 -0
  65. data/spec/support/test_example_with_time.pass +22 -0
  66. data/spec/system/deployment_spec.rb +33 -0
  67. data/vendor/cmock/README.md +4 -3
  68. data/vendor/cmock/docs/CMock_Summary.md +1 -1
  69. data/vendor/cmock/lib/cmock_config.rb +4 -0
  70. data/vendor/cmock/lib/cmock_generator.rb +5 -2
  71. data/vendor/cmock/lib/cmock_generator_plugin_array.rb +4 -4
  72. data/vendor/cmock/lib/cmock_generator_plugin_callback.rb +9 -11
  73. data/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +0 -1
  74. data/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +2 -3
  75. data/vendor/cmock/lib/cmock_generator_plugin_ignore_arg.rb +2 -4
  76. data/vendor/cmock/lib/cmock_generator_plugin_return_thru_ptr.rb +0 -2
  77. data/vendor/cmock/lib/cmock_generator_utils.rb +16 -3
  78. data/vendor/cmock/lib/cmock_header_parser.rb +59 -34
  79. data/vendor/cmock/release/build.info +1 -1
  80. data/vendor/cmock/release/version.info +1 -1
  81. data/vendor/cmock/scripts/create_makefile.rb +17 -2
  82. data/vendor/cmock/src/cmock.c +13 -7
  83. data/vendor/cmock/test/test_helper.rb +11 -10
  84. data/vendor/cmock/test/unit/cmock_config_test.rb +4 -2
  85. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +10 -4
  86. data/vendor/cmock/test/unit/cmock_generator_plugin_array_test.rb +20 -12
  87. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_a_test.rb +2 -2
  88. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_b_test.rb +2 -2
  89. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_arg_test.rb +3 -3
  90. data/vendor/cmock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb +8 -6
  91. data/vendor/cmock/test/unit/cmock_generator_utils_test.rb +27 -10
  92. data/vendor/cmock/test/unit/cmock_header_parser_test.rb +108 -20
  93. data/vendor/cmock/vendor/c_exception/Gemfile +4 -0
  94. data/vendor/cmock/vendor/c_exception/Gemfile.lock +12 -0
  95. data/vendor/cmock/vendor/c_exception/LICENSE.txt +30 -0
  96. data/vendor/cmock/vendor/c_exception/README.md +162 -0
  97. data/vendor/cmock/vendor/c_exception/Rakefile +42 -0
  98. data/vendor/cmock/vendor/c_exception/docs/CException.md +292 -0
  99. data/vendor/cmock/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md +207 -0
  100. data/vendor/cmock/vendor/c_exception/lib/CException.c +46 -0
  101. data/vendor/cmock/vendor/c_exception/lib/CException.h +110 -0
  102. data/vendor/cmock/vendor/c_exception/makefile +24 -0
  103. data/vendor/cmock/vendor/c_exception/release/build.info +2 -0
  104. data/vendor/cmock/vendor/c_exception/release/version.info +2 -0
  105. data/vendor/cmock/vendor/c_exception/test/CExceptionConfig.h +46 -0
  106. data/vendor/cmock/vendor/c_exception/test/TestException.c +391 -0
  107. data/vendor/cmock/vendor/c_exception/test/TestException_Runner.c +67 -0
  108. data/vendor/cmock/vendor/unity/README.md +231 -0
  109. data/vendor/cmock/vendor/unity/auto/colour_prompt.rb +118 -0
  110. data/vendor/cmock/vendor/unity/auto/colour_reporter.rb +39 -0
  111. data/vendor/cmock/vendor/unity/auto/generate_config.yml +36 -0
  112. data/vendor/cmock/vendor/unity/auto/generate_module.rb +308 -0
  113. data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +457 -0
  114. data/vendor/cmock/vendor/unity/auto/parse_output.rb +323 -0
  115. data/vendor/cmock/vendor/unity/auto/stylize_as_junit.rb +252 -0
  116. data/vendor/cmock/vendor/unity/auto/test_file_filter.rb +25 -0
  117. data/vendor/cmock/vendor/unity/auto/type_sanitizer.rb +6 -0
  118. data/vendor/cmock/vendor/unity/auto/unity_test_summary.py +139 -0
  119. data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +136 -0
  120. data/vendor/cmock/vendor/unity/auto/unity_to_junit.py +146 -0
  121. data/vendor/cmock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +206 -0
  122. data/vendor/cmock/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf +0 -0
  123. data/vendor/cmock/vendor/unity/docs/UnityAssertionsReference.md +779 -0
  124. data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +433 -0
  125. data/vendor/cmock/vendor/unity/docs/UnityGettingStartedGuide.md +192 -0
  126. data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +260 -0
  127. data/vendor/cmock/vendor/unity/docs/license.txt +21 -0
  128. data/vendor/cmock/vendor/unity/examples/example_1/makefile +71 -0
  129. data/vendor/cmock/vendor/unity/examples/example_1/readme.txt +5 -0
  130. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.c +24 -0
  131. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.h +3 -0
  132. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.c +11 -0
  133. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.h +2 -0
  134. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode.c +62 -0
  135. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode2.c +31 -0
  136. data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
  137. data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
  138. data/vendor/cmock/vendor/unity/examples/example_2/makefile +70 -0
  139. data/vendor/cmock/vendor/unity/examples/example_2/readme.txt +5 -0
  140. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.c +24 -0
  141. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.h +3 -0
  142. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.c +11 -0
  143. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.h +2 -0
  144. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode.c +64 -0
  145. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode2.c +33 -0
  146. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +9 -0
  147. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +11 -0
  148. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/all_tests.c +12 -0
  149. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.c +10 -0
  150. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.h +12 -0
  151. data/vendor/cmock/vendor/unity/examples/example_3/rakefile.rb +43 -0
  152. data/vendor/cmock/vendor/unity/examples/example_3/rakefile_helper.rb +249 -0
  153. data/vendor/cmock/vendor/unity/examples/example_3/readme.txt +13 -0
  154. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.c +24 -0
  155. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.h +3 -0
  156. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.c +11 -0
  157. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.h +2 -0
  158. data/vendor/cmock/vendor/unity/examples/example_3/target_gcc_32.yml +46 -0
  159. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode.c +62 -0
  160. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode2.c +31 -0
  161. data/vendor/cmock/vendor/unity/examples/unity_config.h +247 -0
  162. data/vendor/cmock/vendor/unity/extras/eclipse/error_parsers.txt +26 -0
  163. data/vendor/cmock/vendor/unity/extras/fixture/rakefile.rb +48 -0
  164. data/vendor/cmock/vendor/unity/extras/fixture/rakefile_helper.rb +178 -0
  165. data/vendor/cmock/vendor/unity/extras/fixture/readme.txt +9 -0
  166. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.c +436 -0
  167. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.h +83 -0
  168. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_internals.h +51 -0
  169. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_malloc_overrides.h +47 -0
  170. data/vendor/cmock/vendor/unity/extras/fixture/test/Makefile +75 -0
  171. data/vendor/cmock/vendor/unity/extras/fixture/test/main/AllTests.c +22 -0
  172. data/vendor/cmock/vendor/unity/extras/fixture/test/template_fixture_tests.c +39 -0
  173. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_Test.c +543 -0
  174. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +57 -0
  175. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_output_Spy.c +57 -0
  176. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_output_Spy.h +17 -0
  177. data/vendor/cmock/vendor/unity/release/build.info +2 -0
  178. data/vendor/cmock/vendor/unity/release/version.info +2 -0
  179. data/vendor/cmock/vendor/unity/src/unity.c +1572 -0
  180. data/vendor/cmock/vendor/unity/src/unity.h +503 -0
  181. data/vendor/cmock/vendor/unity/src/unity_internals.h +924 -0
  182. data/vendor/cmock/vendor/unity/test/Makefile +68 -0
  183. data/vendor/cmock/vendor/unity/test/expectdata/testsample_cmd.c +61 -0
  184. data/vendor/cmock/vendor/unity/test/expectdata/testsample_def.c +57 -0
  185. data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.c +55 -0
  186. data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.h +15 -0
  187. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_cmd.c +80 -0
  188. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_def.c +76 -0
  189. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.c +75 -0
  190. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.h +13 -0
  191. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new1.c +89 -0
  192. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new2.c +89 -0
  193. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_param.c +77 -0
  194. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run1.c +89 -0
  195. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run2.c +89 -0
  196. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_yaml.c +90 -0
  197. data/vendor/cmock/vendor/unity/test/expectdata/testsample_new1.c +67 -0
  198. data/vendor/cmock/vendor/unity/test/expectdata/testsample_new2.c +70 -0
  199. data/vendor/cmock/vendor/unity/test/expectdata/testsample_param.c +58 -0
  200. data/vendor/cmock/vendor/unity/test/expectdata/testsample_run1.c +67 -0
  201. data/vendor/cmock/vendor/unity/test/expectdata/testsample_run2.c +70 -0
  202. data/vendor/cmock/vendor/unity/test/expectdata/testsample_yaml.c +71 -0
  203. data/vendor/cmock/vendor/unity/test/rakefile +125 -0
  204. data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +260 -0
  205. data/vendor/cmock/vendor/unity/test/spec/generate_module_existing_file_spec.rb +158 -0
  206. data/vendor/cmock/vendor/unity/test/targets/clang_file.yml +78 -0
  207. data/vendor/cmock/vendor/unity/test/targets/clang_strict.yml +78 -0
  208. data/vendor/cmock/vendor/unity/test/targets/gcc_32.yml +49 -0
  209. data/vendor/cmock/vendor/unity/test/targets/gcc_64.yml +50 -0
  210. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_limits.yml +47 -0
  211. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_stdint.yml +59 -0
  212. data/vendor/cmock/vendor/unity/test/targets/gcc_manual_math.yml +47 -0
  213. data/vendor/cmock/vendor/unity/test/targets/hitech_picc18.yml +101 -0
  214. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v4.yml +90 -0
  215. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5.yml +80 -0
  216. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5_3.yml +80 -0
  217. data/vendor/cmock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +94 -0
  218. data/vendor/cmock/vendor/unity/test/targets/iar_cortexm3_v5.yml +84 -0
  219. data/vendor/cmock/vendor/unity/test/targets/iar_msp430.yml +95 -0
  220. data/vendor/cmock/vendor/unity/test/targets/iar_sh2a_v6.yml +86 -0
  221. data/vendor/cmock/vendor/unity/test/testdata/CException.h +11 -0
  222. data/vendor/cmock/vendor/unity/test/testdata/Defs.h +8 -0
  223. data/vendor/cmock/vendor/unity/test/testdata/cmock.h +14 -0
  224. data/vendor/cmock/vendor/unity/test/testdata/mockMock.h +13 -0
  225. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGenerator.c +186 -0
  226. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +70 -0
  227. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +195 -0
  228. data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +1252 -0
  229. data/vendor/cmock/vendor/unity/test/tests/testparameterized.c +113 -0
  230. data/vendor/cmock/vendor/unity/test/tests/testunity.c +5371 -0
  231. data/vendor/unity/auto/generate_test_runner.rb +30 -10
  232. data/vendor/unity/auto/parse_output.rb +212 -109
  233. data/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +9 -10
  234. data/vendor/unity/docs/UnityAssertionsReference.md +11 -2
  235. data/vendor/unity/docs/UnityConfigurationGuide.md +90 -55
  236. data/vendor/unity/docs/UnityGettingStartedGuide.md +6 -5
  237. data/vendor/unity/docs/UnityHelperScriptsGuide.md +23 -5
  238. data/vendor/unity/examples/unity_config.h +8 -0
  239. data/vendor/unity/extras/fixture/src/unity_fixture.c +4 -0
  240. data/vendor/unity/extras/fixture/src/unity_fixture.h +1 -1
  241. data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
  242. data/vendor/unity/release/build.info +1 -1
  243. data/vendor/unity/release/version.info +1 -1
  244. data/vendor/unity/src/unity.c +64 -57
  245. data/vendor/unity/src/unity.h +111 -7
  246. data/vendor/unity/src/unity_internals.h +173 -73
  247. data/vendor/unity/test/Makefile +5 -1
  248. data/vendor/unity/test/testdata/testRunnerGenerator.c +4 -1
  249. data/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +4 -1
  250. data/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +4 -1
  251. data/vendor/unity/test/tests/testparameterized.c +5 -2
  252. data/vendor/unity/test/tests/testunity.c +34 -0
  253. metadata +150 -2
@@ -0,0 +1,51 @@
1
+ /* Copyright (c) 2010 James Grenning and Contributed to Unity Project
2
+ * ==========================================
3
+ * Unity Project - A Test Framework for C
4
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
5
+ * [Released under MIT License. Please refer to license.txt for details]
6
+ * ========================================== */
7
+
8
+ #ifndef UNITY_FIXTURE_INTERNALS_H_
9
+ #define UNITY_FIXTURE_INTERNALS_H_
10
+
11
+ #ifdef __cplusplus
12
+ extern "C"
13
+ {
14
+ #endif
15
+
16
+ struct UNITY_FIXTURE_T
17
+ {
18
+ int Verbose;
19
+ unsigned int RepeatCount;
20
+ const char* NameFilter;
21
+ const char* GroupFilter;
22
+ };
23
+ extern struct UNITY_FIXTURE_T UnityFixture;
24
+
25
+ typedef void unityfunction(void);
26
+ void UnityTestRunner(unityfunction* setup,
27
+ unityfunction* testBody,
28
+ unityfunction* teardown,
29
+ const char* printableName,
30
+ const char* group,
31
+ const char* name,
32
+ const char* file, unsigned int line);
33
+
34
+ void UnityIgnoreTest(const char* printableName, const char* group, const char* name);
35
+ void UnityMalloc_StartTest(void);
36
+ void UnityMalloc_EndTest(void);
37
+ int UnityGetCommandLineOptions(int argc, const char* argv[]);
38
+ void UnityConcludeFixtureTest(void);
39
+
40
+ void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line);
41
+ void UnityPointer_UndoAllSets(void);
42
+ void UnityPointer_Init(void);
43
+ #ifndef UNITY_MAX_POINTERS
44
+ #define UNITY_MAX_POINTERS 5
45
+ #endif
46
+
47
+ #ifdef __cplusplus
48
+ }
49
+ #endif
50
+
51
+ #endif /* UNITY_FIXTURE_INTERNALS_H_ */
@@ -0,0 +1,47 @@
1
+ /* Copyright (c) 2010 James Grenning and Contributed to Unity Project
2
+ * ==========================================
3
+ * Unity Project - A Test Framework for C
4
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
5
+ * [Released under MIT License. Please refer to license.txt for details]
6
+ * ========================================== */
7
+
8
+ #ifndef UNITY_FIXTURE_MALLOC_OVERRIDES_H_
9
+ #define UNITY_FIXTURE_MALLOC_OVERRIDES_H_
10
+
11
+ #include <stddef.h>
12
+
13
+ #ifdef UNITY_EXCLUDE_STDLIB_MALLOC
14
+ /* Define this macro to remove the use of stdlib.h, malloc, and free.
15
+ * Many embedded systems do not have a heap or malloc/free by default.
16
+ * This internal unity_malloc() provides allocated memory deterministically from
17
+ * the end of an array only, unity_free() only releases from end-of-array,
18
+ * blocks are not coalesced, and memory not freed in LIFO order is stranded. */
19
+ #ifndef UNITY_INTERNAL_HEAP_SIZE_BYTES
20
+ #define UNITY_INTERNAL_HEAP_SIZE_BYTES 256
21
+ #endif
22
+ #endif
23
+
24
+ /* These functions are used by the Unity Fixture to allocate and release memory
25
+ * on the heap and can be overridden with platform-specific implementations.
26
+ * For example, when using FreeRTOS UNITY_FIXTURE_MALLOC becomes pvPortMalloc()
27
+ * and UNITY_FIXTURE_FREE becomes vPortFree(). */
28
+ #if !defined(UNITY_FIXTURE_MALLOC) || !defined(UNITY_FIXTURE_FREE)
29
+ #include <stdlib.h>
30
+ #define UNITY_FIXTURE_MALLOC(size) malloc(size)
31
+ #define UNITY_FIXTURE_FREE(ptr) free(ptr)
32
+ #else
33
+ extern void* UNITY_FIXTURE_MALLOC(size_t size);
34
+ extern void UNITY_FIXTURE_FREE(void* ptr);
35
+ #endif
36
+
37
+ #define malloc unity_malloc
38
+ #define calloc unity_calloc
39
+ #define realloc unity_realloc
40
+ #define free unity_free
41
+
42
+ void* unity_malloc(size_t size);
43
+ void* unity_calloc(size_t num, size_t size);
44
+ void* unity_realloc(void * oldMem, size_t size);
45
+ void unity_free(void * mem);
46
+
47
+ #endif /* UNITY_FIXTURE_MALLOC_OVERRIDES_H_ */
@@ -0,0 +1,75 @@
1
+ CC = gcc
2
+ ifeq ($(shell uname -s), Darwin)
3
+ CC = clang
4
+ endif
5
+ #DEBUG = -O0 -g
6
+ CFLAGS += -std=c99 -pedantic -Wall -Wextra -Werror
7
+ CFLAGS += $(DEBUG)
8
+ DEFINES = -D UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar
9
+ DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=UnityOutputCharSpy_OutputChar\(int\)
10
+ SRC = ../src/unity_fixture.c \
11
+ ../../../src/unity.c \
12
+ unity_fixture_Test.c \
13
+ unity_fixture_TestRunner.c \
14
+ unity_output_Spy.c \
15
+ main/AllTests.c
16
+
17
+ INC_DIR = -I../src -I../../../src/
18
+ BUILD_DIR = ../build
19
+ TARGET = ../build/fixture_tests.exe
20
+
21
+ all: default noStdlibMalloc 32bits
22
+
23
+ default: $(BUILD_DIR)
24
+ $(CC) $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -D UNITY_SUPPORT_64
25
+ @ echo "default build"
26
+ ./$(TARGET)
27
+
28
+ 32bits: $(BUILD_DIR)
29
+ $(CC) $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -m32
30
+ @ echo "32bits build"
31
+ ./$(TARGET)
32
+
33
+ noStdlibMalloc: $(BUILD_DIR)
34
+ $(CC) $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -D UNITY_EXCLUDE_STDLIB_MALLOC
35
+ @ echo "build with noStdlibMalloc"
36
+ ./$(TARGET)
37
+
38
+ C89: CFLAGS += -D UNITY_EXCLUDE_STDINT_H # C89 did not have type 'long long', <stdint.h>
39
+ C89: $(BUILD_DIR)
40
+ $(CC) $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -std=c89 && ./$(TARGET)
41
+ $(CC) $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -D UNITY_EXCLUDE_STDLIB_MALLOC -std=c89
42
+ ./$(TARGET)
43
+
44
+ $(BUILD_DIR):
45
+ mkdir -p $(BUILD_DIR)
46
+
47
+ clean:
48
+ rm -f $(TARGET) $(BUILD_DIR)/*.gc*
49
+
50
+ cov: $(BUILD_DIR)
51
+ cd $(BUILD_DIR) && \
52
+ $(CC) $(DEFINES) $(foreach i, $(SRC), ../test/$(i)) $(INC_DIR) -o $(TARGET) -fprofile-arcs -ftest-coverage
53
+ rm -f $(BUILD_DIR)/*.gcda
54
+ ./$(TARGET) > /dev/null ; ./$(TARGET) -v > /dev/null
55
+ cd $(BUILD_DIR) && \
56
+ gcov unity_fixture.c | head -3
57
+ grep '###' $(BUILD_DIR)/unity_fixture.c.gcov -C2 || true # Show uncovered lines
58
+
59
+ # These extended flags DO get included before any target build runs
60
+ CFLAGS += -Wbad-function-cast
61
+ CFLAGS += -Wcast-qual
62
+ CFLAGS += -Wconversion
63
+ CFLAGS += -Wformat=2
64
+ CFLAGS += -Wmissing-prototypes
65
+ CFLAGS += -Wold-style-definition
66
+ CFLAGS += -Wpointer-arith
67
+ CFLAGS += -Wshadow
68
+ CFLAGS += -Wstrict-overflow=5
69
+ CFLAGS += -Wstrict-prototypes
70
+ CFLAGS += -Wswitch-default
71
+ CFLAGS += -Wundef
72
+ CFLAGS += -Wno-error=undef # Warning only, this should not stop the build
73
+ CFLAGS += -Wunreachable-code
74
+ CFLAGS += -Wunused
75
+ CFLAGS += -fstrict-aliasing
@@ -0,0 +1,22 @@
1
+ /* Copyright (c) 2010 James Grenning and Contributed to Unity Project
2
+ * ==========================================
3
+ * Unity Project - A Test Framework for C
4
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
5
+ * [Released under MIT License. Please refer to license.txt for details]
6
+ * ========================================== */
7
+
8
+ #include "unity_fixture.h"
9
+
10
+ static void runAllTests(void)
11
+ {
12
+ RUN_TEST_GROUP(UnityFixture);
13
+ RUN_TEST_GROUP(UnityCommandOptions);
14
+ RUN_TEST_GROUP(LeakDetection);
15
+ RUN_TEST_GROUP(InternalMalloc);
16
+ }
17
+
18
+ int main(int argc, const char* argv[])
19
+ {
20
+ return UnityMain(argc, argv, runAllTests);
21
+ }
22
+
@@ -0,0 +1,39 @@
1
+ /* Copyright (c) 2010 James Grenning and Contributed to Unity Project
2
+ * ==========================================
3
+ * Unity Project - A Test Framework for C
4
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
5
+ * [Released under MIT License. Please refer to license.txt for details]
6
+ * ========================================== */
7
+
8
+ #include "unity_fixture.h"
9
+
10
+ static int data = -1;
11
+
12
+ TEST_GROUP(mygroup);
13
+
14
+ TEST_SETUP(mygroup)
15
+ {
16
+ data = 0;
17
+ }
18
+
19
+ TEST_TEAR_DOWN(mygroup)
20
+ {
21
+ data = -1;
22
+ }
23
+
24
+ TEST(mygroup, test1)
25
+ {
26
+ TEST_ASSERT_EQUAL_INT(0, data);
27
+ }
28
+
29
+ TEST(mygroup, test2)
30
+ {
31
+ TEST_ASSERT_EQUAL_INT(0, data);
32
+ data = 5;
33
+ }
34
+
35
+ TEST(mygroup, test3)
36
+ {
37
+ data = 7;
38
+ TEST_ASSERT_EQUAL_INT(7, data);
39
+ }
@@ -0,0 +1,543 @@
1
+ /* Copyright (c) 2010 James Grenning and Contributed to Unity Project
2
+ * ==========================================
3
+ * Unity Project - A Test Framework for C
4
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
5
+ * [Released under MIT License. Please refer to license.txt for details]
6
+ * ========================================== */
7
+
8
+ #include "unity_fixture.h"
9
+ #include "unity_output_Spy.h"
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+
13
+ TEST_GROUP(UnityFixture);
14
+
15
+ TEST_SETUP(UnityFixture)
16
+ {
17
+ }
18
+
19
+ TEST_TEAR_DOWN(UnityFixture)
20
+ {
21
+ }
22
+
23
+ static int* pointer1 = 0;
24
+ static int* pointer2 = (int*)2;
25
+ static int* pointer3 = (int*)3;
26
+ static int int1;
27
+ static int int2;
28
+ static int int3;
29
+ static int int4;
30
+
31
+ TEST(UnityFixture, PointerSetting)
32
+ {
33
+ TEST_ASSERT_POINTERS_EQUAL(pointer1, 0);
34
+ UT_PTR_SET(pointer1, &int1);
35
+ UT_PTR_SET(pointer2, &int2);
36
+ UT_PTR_SET(pointer3, &int3);
37
+ TEST_ASSERT_POINTERS_EQUAL(pointer1, &int1);
38
+ TEST_ASSERT_POINTERS_EQUAL(pointer2, &int2);
39
+ TEST_ASSERT_POINTERS_EQUAL(pointer3, &int3);
40
+ UT_PTR_SET(pointer1, &int4);
41
+ UnityPointer_UndoAllSets();
42
+ TEST_ASSERT_POINTERS_EQUAL(pointer1, 0);
43
+ TEST_ASSERT_POINTERS_EQUAL(pointer2, (int*)2);
44
+ TEST_ASSERT_POINTERS_EQUAL(pointer3, (int*)3);
45
+ }
46
+
47
+ TEST(UnityFixture, ForceMallocFail)
48
+ {
49
+ void* m;
50
+ void* mfails;
51
+ UnityMalloc_MakeMallocFailAfterCount(1);
52
+ m = malloc(10);
53
+ CHECK(m);
54
+ mfails = malloc(10);
55
+ TEST_ASSERT_POINTERS_EQUAL(0, mfails);
56
+ free(m);
57
+ }
58
+
59
+ TEST(UnityFixture, ReallocSmallerIsUnchanged)
60
+ {
61
+ void* m1 = malloc(10);
62
+ void* m2 = realloc(m1, 5);
63
+ TEST_ASSERT_POINTERS_EQUAL(m1, m2);
64
+ free(m2);
65
+ }
66
+
67
+ TEST(UnityFixture, ReallocSameIsUnchanged)
68
+ {
69
+ void* m1 = malloc(10);
70
+ void* m2 = realloc(m1, 10);
71
+ TEST_ASSERT_POINTERS_EQUAL(m1, m2);
72
+ free(m2);
73
+ }
74
+
75
+ TEST(UnityFixture, ReallocLargerNeeded)
76
+ {
77
+ void* m1 = malloc(10);
78
+ void* m2;
79
+ CHECK(m1);
80
+ strcpy((char*)m1, "123456789");
81
+ m2 = realloc(m1, 15);
82
+ /* CHECK(m1 != m2); //Depends on implementation */
83
+ STRCMP_EQUAL("123456789", m2);
84
+ free(m2);
85
+ }
86
+
87
+ TEST(UnityFixture, ReallocNullPointerIsLikeMalloc)
88
+ {
89
+ void* m = realloc(0, 15);
90
+ CHECK(m != 0);
91
+ free(m);
92
+ }
93
+
94
+ TEST(UnityFixture, ReallocSizeZeroFreesMemAndReturnsNullPointer)
95
+ {
96
+ void* m1 = malloc(10);
97
+ void* m2 = realloc(m1, 0);
98
+ TEST_ASSERT_POINTERS_EQUAL(0, m2);
99
+ }
100
+
101
+ TEST(UnityFixture, CallocFillsWithZero)
102
+ {
103
+ void* m = calloc(3, sizeof(char));
104
+ char* s = (char*)m;
105
+ CHECK(m);
106
+ TEST_ASSERT_BYTES_EQUAL(0, s[0]);
107
+ TEST_ASSERT_BYTES_EQUAL(0, s[1]);
108
+ TEST_ASSERT_BYTES_EQUAL(0, s[2]);
109
+ free(m);
110
+ }
111
+
112
+ static char *p1;
113
+ static char *p2;
114
+
115
+ TEST(UnityFixture, PointerSet)
116
+ {
117
+ char c1;
118
+ char c2;
119
+ char newC1;
120
+ char newC2;
121
+ p1 = &c1;
122
+ p2 = &c2;
123
+
124
+ UnityPointer_Init();
125
+ UT_PTR_SET(p1, &newC1);
126
+ UT_PTR_SET(p2, &newC2);
127
+ TEST_ASSERT_POINTERS_EQUAL(&newC1, p1);
128
+ TEST_ASSERT_POINTERS_EQUAL(&newC2, p2);
129
+ UnityPointer_UndoAllSets();
130
+ TEST_ASSERT_POINTERS_EQUAL(&c1, p1);
131
+ TEST_ASSERT_POINTERS_EQUAL(&c2, p2);
132
+ }
133
+
134
+ TEST(UnityFixture, FreeNULLSafety)
135
+ {
136
+ free(NULL);
137
+ }
138
+
139
+ TEST(UnityFixture, ConcludeTestIncrementsFailCount)
140
+ {
141
+ UNITY_UINT savedFails = Unity.TestFailures;
142
+ UNITY_UINT savedIgnores = Unity.TestIgnores;
143
+ UnityOutputCharSpy_Enable(1);
144
+ Unity.CurrentTestFailed = 1;
145
+ UnityConcludeFixtureTest(); /* Resets TestFailed for this test to pass */
146
+ Unity.CurrentTestIgnored = 1;
147
+ UnityConcludeFixtureTest(); /* Resets TestIgnored */
148
+ UnityOutputCharSpy_Enable(0);
149
+ TEST_ASSERT_EQUAL(savedFails + 1, Unity.TestFailures);
150
+ TEST_ASSERT_EQUAL(savedIgnores + 1, Unity.TestIgnores);
151
+ Unity.TestFailures = savedFails;
152
+ Unity.TestIgnores = savedIgnores;
153
+ }
154
+
155
+ /*------------------------------------------------------------ */
156
+
157
+ TEST_GROUP(UnityCommandOptions);
158
+
159
+ static int savedVerbose;
160
+ static unsigned int savedRepeat;
161
+ static const char* savedName;
162
+ static const char* savedGroup;
163
+
164
+ TEST_SETUP(UnityCommandOptions)
165
+ {
166
+ savedVerbose = UnityFixture.Verbose;
167
+ savedRepeat = UnityFixture.RepeatCount;
168
+ savedName = UnityFixture.NameFilter;
169
+ savedGroup = UnityFixture.GroupFilter;
170
+ }
171
+
172
+ TEST_TEAR_DOWN(UnityCommandOptions)
173
+ {
174
+ UnityFixture.Verbose = savedVerbose;
175
+ UnityFixture.RepeatCount= savedRepeat;
176
+ UnityFixture.NameFilter = savedName;
177
+ UnityFixture.GroupFilter = savedGroup;
178
+ }
179
+
180
+
181
+ static const char* noOptions[] = {
182
+ "testrunner.exe"
183
+ };
184
+
185
+ TEST(UnityCommandOptions, DefaultOptions)
186
+ {
187
+ UnityGetCommandLineOptions(1, noOptions);
188
+ TEST_ASSERT_EQUAL(0, UnityFixture.Verbose);
189
+ TEST_ASSERT_POINTERS_EQUAL(0, UnityFixture.GroupFilter);
190
+ TEST_ASSERT_POINTERS_EQUAL(0, UnityFixture.NameFilter);
191
+ TEST_ASSERT_EQUAL(1, UnityFixture.RepeatCount);
192
+ }
193
+
194
+ static const char* verbose[] = {
195
+ "testrunner.exe",
196
+ "-v"
197
+ };
198
+
199
+ TEST(UnityCommandOptions, OptionVerbose)
200
+ {
201
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(2, verbose));
202
+ TEST_ASSERT_EQUAL(1, UnityFixture.Verbose);
203
+ }
204
+
205
+ static const char* group[] = {
206
+ "testrunner.exe",
207
+ "-g", "groupname"
208
+ };
209
+
210
+ TEST(UnityCommandOptions, OptionSelectTestByGroup)
211
+ {
212
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(3, group));
213
+ STRCMP_EQUAL("groupname", UnityFixture.GroupFilter);
214
+ }
215
+
216
+ static const char* name[] = {
217
+ "testrunner.exe",
218
+ "-n", "testname"
219
+ };
220
+
221
+ TEST(UnityCommandOptions, OptionSelectTestByName)
222
+ {
223
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(3, name));
224
+ STRCMP_EQUAL("testname", UnityFixture.NameFilter);
225
+ }
226
+
227
+ static const char* repeat[] = {
228
+ "testrunner.exe",
229
+ "-r", "99"
230
+ };
231
+
232
+ TEST(UnityCommandOptions, OptionSelectRepeatTestsDefaultCount)
233
+ {
234
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(2, repeat));
235
+ TEST_ASSERT_EQUAL(2, UnityFixture.RepeatCount);
236
+ }
237
+
238
+ TEST(UnityCommandOptions, OptionSelectRepeatTestsSpecificCount)
239
+ {
240
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(3, repeat));
241
+ TEST_ASSERT_EQUAL(99, UnityFixture.RepeatCount);
242
+ }
243
+
244
+ static const char* multiple[] = {
245
+ "testrunner.exe",
246
+ "-v",
247
+ "-g", "groupname",
248
+ "-n", "testname",
249
+ "-r", "98"
250
+ };
251
+
252
+ TEST(UnityCommandOptions, MultipleOptions)
253
+ {
254
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(8, multiple));
255
+ TEST_ASSERT_EQUAL(1, UnityFixture.Verbose);
256
+ STRCMP_EQUAL("groupname", UnityFixture.GroupFilter);
257
+ STRCMP_EQUAL("testname", UnityFixture.NameFilter);
258
+ TEST_ASSERT_EQUAL(98, UnityFixture.RepeatCount);
259
+ }
260
+
261
+ static const char* dashRNotLast[] = {
262
+ "testrunner.exe",
263
+ "-v",
264
+ "-g", "gggg",
265
+ "-r",
266
+ "-n", "tttt",
267
+ };
268
+
269
+ TEST(UnityCommandOptions, MultipleOptionsDashRNotLastAndNoValueSpecified)
270
+ {
271
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(7, dashRNotLast));
272
+ TEST_ASSERT_EQUAL(1, UnityFixture.Verbose);
273
+ STRCMP_EQUAL("gggg", UnityFixture.GroupFilter);
274
+ STRCMP_EQUAL("tttt", UnityFixture.NameFilter);
275
+ TEST_ASSERT_EQUAL(2, UnityFixture.RepeatCount);
276
+ }
277
+
278
+ static const char* unknownCommand[] = {
279
+ "testrunner.exe",
280
+ "-v",
281
+ "-g", "groupname",
282
+ "-n", "testname",
283
+ "-r", "98",
284
+ "-z"
285
+ };
286
+ TEST(UnityCommandOptions, UnknownCommandIsIgnored)
287
+ {
288
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(9, unknownCommand));
289
+ TEST_ASSERT_EQUAL(1, UnityFixture.Verbose);
290
+ STRCMP_EQUAL("groupname", UnityFixture.GroupFilter);
291
+ STRCMP_EQUAL("testname", UnityFixture.NameFilter);
292
+ TEST_ASSERT_EQUAL(98, UnityFixture.RepeatCount);
293
+ }
294
+
295
+ TEST(UnityCommandOptions, GroupOrNameFilterWithoutStringFails)
296
+ {
297
+ TEST_ASSERT_EQUAL(1, UnityGetCommandLineOptions(3, unknownCommand));
298
+ TEST_ASSERT_EQUAL(1, UnityGetCommandLineOptions(5, unknownCommand));
299
+ TEST_ASSERT_EQUAL(1, UnityMain(3, unknownCommand, NULL));
300
+ }
301
+
302
+ TEST(UnityCommandOptions, GroupFilterReallyFilters)
303
+ {
304
+ UNITY_UINT saved = Unity.NumberOfTests;
305
+ TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(4, unknownCommand));
306
+ UnityIgnoreTest(NULL, "non-matching", NULL);
307
+ TEST_ASSERT_EQUAL(saved, Unity.NumberOfTests);
308
+ }
309
+
310
+ IGNORE_TEST(UnityCommandOptions, TestShouldBeIgnored)
311
+ {
312
+ TEST_FAIL_MESSAGE("This test should not run!");
313
+ }
314
+
315
+ /*------------------------------------------------------------ */
316
+
317
+ TEST_GROUP(LeakDetection);
318
+
319
+ TEST_SETUP(LeakDetection)
320
+ {
321
+ #ifdef UNITY_EXCLUDE_STDLIB_MALLOC
322
+ UnityOutputCharSpy_Create(200);
323
+ #else
324
+ UnityOutputCharSpy_Create(1000);
325
+ #endif
326
+ }
327
+
328
+ TEST_TEAR_DOWN(LeakDetection)
329
+ {
330
+ UnityOutputCharSpy_Destroy();
331
+ }
332
+
333
+ #define EXPECT_ABORT_BEGIN \
334
+ { \
335
+ jmp_buf TestAbortFrame; \
336
+ memcpy(TestAbortFrame, Unity.AbortFrame, sizeof(jmp_buf)); \
337
+ if (TEST_PROTECT()) \
338
+ {
339
+
340
+ #define EXPECT_ABORT_END \
341
+ } \
342
+ memcpy(Unity.AbortFrame, TestAbortFrame, sizeof(jmp_buf)); \
343
+ }
344
+
345
+ /* This tricky set of defines lets us see if we are using the Spy, returns 1 if true */
346
+ #ifdef __STDC_VERSION__
347
+
348
+ #if __STDC_VERSION__ >= 199901L
349
+ #define USING_SPY_AS(a) EXPAND_AND_USE_2ND(ASSIGN_VALUE(a), 0)
350
+ #define ASSIGN_VALUE(a) VAL_##a
351
+ #define VAL_UnityOutputCharSpy_OutputChar 0, 1
352
+ #define EXPAND_AND_USE_2ND(a, b) SECOND_PARAM(a, b, throwaway)
353
+ #define SECOND_PARAM(a, b, ...) b
354
+ #if USING_SPY_AS(UNITY_OUTPUT_CHAR)
355
+ #define USING_OUTPUT_SPY /* UNITY_OUTPUT_CHAR = UnityOutputCharSpy_OutputChar */
356
+ #endif
357
+ #endif /* >= 199901 */
358
+
359
+ #else /* __STDC_VERSION__ else */
360
+ #define UnityOutputCharSpy_OutputChar 42
361
+ #if UNITY_OUTPUT_CHAR == UnityOutputCharSpy_OutputChar /* Works if no -Wundef -Werror */
362
+ #define USING_OUTPUT_SPY
363
+ #endif
364
+ #undef UnityOutputCharSpy_OutputChar
365
+ #endif /* __STDC_VERSION__ */
366
+
367
+ TEST(LeakDetection, DetectsLeak)
368
+ {
369
+ #ifndef USING_OUTPUT_SPY
370
+ TEST_IGNORE_MESSAGE("Build with '-D UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar' to enable tests");
371
+ #else
372
+ void* m = malloc(10);
373
+ TEST_ASSERT_NOT_NULL(m);
374
+ UnityOutputCharSpy_Enable(1);
375
+ EXPECT_ABORT_BEGIN
376
+ UnityMalloc_EndTest();
377
+ EXPECT_ABORT_END
378
+ UnityOutputCharSpy_Enable(0);
379
+ Unity.CurrentTestFailed = 0;
380
+ CHECK(strstr(UnityOutputCharSpy_Get(), "This test leaks!"));
381
+ free(m);
382
+ #endif
383
+ }
384
+
385
+ TEST(LeakDetection, BufferOverrunFoundDuringFree)
386
+ {
387
+ #ifndef USING_OUTPUT_SPY
388
+ TEST_IGNORE();
389
+ #else
390
+ void* m = malloc(10);
391
+ char* s = (char*)m;
392
+ TEST_ASSERT_NOT_NULL(m);
393
+ s[10] = (char)0xFF;
394
+ UnityOutputCharSpy_Enable(1);
395
+ EXPECT_ABORT_BEGIN
396
+ free(m);
397
+ EXPECT_ABORT_END
398
+ UnityOutputCharSpy_Enable(0);
399
+ Unity.CurrentTestFailed = 0;
400
+ CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during free()"));
401
+ #endif
402
+ }
403
+
404
+ TEST(LeakDetection, BufferOverrunFoundDuringRealloc)
405
+ {
406
+ #ifndef USING_OUTPUT_SPY
407
+ TEST_IGNORE();
408
+ #else
409
+ void* m = malloc(10);
410
+ char* s = (char*)m;
411
+ TEST_ASSERT_NOT_NULL(m);
412
+ s[10] = (char)0xFF;
413
+ UnityOutputCharSpy_Enable(1);
414
+ EXPECT_ABORT_BEGIN
415
+ m = realloc(m, 100);
416
+ EXPECT_ABORT_END
417
+ UnityOutputCharSpy_Enable(0);
418
+ Unity.CurrentTestFailed = 0;
419
+ CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during realloc()"));
420
+ #endif
421
+ }
422
+
423
+ TEST(LeakDetection, BufferGuardWriteFoundDuringFree)
424
+ {
425
+ #ifndef USING_OUTPUT_SPY
426
+ TEST_IGNORE();
427
+ #else
428
+ void* m = malloc(10);
429
+ char* s = (char*)m;
430
+ TEST_ASSERT_NOT_NULL(m);
431
+ s[-1] = (char)0x00; /* Will not detect 0 */
432
+ s[-2] = (char)0x01;
433
+ UnityOutputCharSpy_Enable(1);
434
+ EXPECT_ABORT_BEGIN
435
+ free(m);
436
+ EXPECT_ABORT_END
437
+ UnityOutputCharSpy_Enable(0);
438
+ Unity.CurrentTestFailed = 0;
439
+ CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during free()"));
440
+ #endif
441
+ }
442
+
443
+ TEST(LeakDetection, BufferGuardWriteFoundDuringRealloc)
444
+ {
445
+ #ifndef USING_OUTPUT_SPY
446
+ TEST_IGNORE();
447
+ #else
448
+ void* m = malloc(10);
449
+ char* s = (char*)m;
450
+ TEST_ASSERT_NOT_NULL(m);
451
+ s[-1] = (char)0x0A;
452
+ UnityOutputCharSpy_Enable(1);
453
+ EXPECT_ABORT_BEGIN
454
+ m = realloc(m, 100);
455
+ EXPECT_ABORT_END
456
+ UnityOutputCharSpy_Enable(0);
457
+ Unity.CurrentTestFailed = 0;
458
+ CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during realloc()"));
459
+ #endif
460
+ }
461
+
462
+ TEST(LeakDetection, PointerSettingMax)
463
+ {
464
+ #ifndef USING_OUTPUT_SPY
465
+ TEST_IGNORE();
466
+ #else
467
+ int i;
468
+ for (i = 0; i < UNITY_MAX_POINTERS; i++) UT_PTR_SET(pointer1, &int1);
469
+ UnityOutputCharSpy_Enable(1);
470
+ EXPECT_ABORT_BEGIN
471
+ UT_PTR_SET(pointer1, &int1);
472
+ EXPECT_ABORT_END
473
+ UnityOutputCharSpy_Enable(0);
474
+ Unity.CurrentTestFailed = 0;
475
+ CHECK(strstr(UnityOutputCharSpy_Get(), "Too many pointers set"));
476
+ #endif
477
+ }
478
+
479
+ /*------------------------------------------------------------ */
480
+
481
+ TEST_GROUP(InternalMalloc);
482
+ #define TEST_ASSERT_MEMORY_ALL_FREE_LIFO_ORDER(first_mem_ptr, ptr) \
483
+ ptr = malloc(10); free(ptr); \
484
+ TEST_ASSERT_EQUAL_PTR_MESSAGE(first_mem_ptr, ptr, "Memory was stranded, free in LIFO order");
485
+
486
+
487
+ TEST_SETUP(InternalMalloc) { }
488
+ TEST_TEAR_DOWN(InternalMalloc) { }
489
+
490
+ TEST(InternalMalloc, MallocPastBufferFails)
491
+ {
492
+ #ifdef UNITY_EXCLUDE_STDLIB_MALLOC
493
+ void* m = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1);
494
+ void* n = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2);
495
+ free(m);
496
+ TEST_ASSERT_NOT_NULL(m);
497
+ TEST_ASSERT_NULL(n);
498
+ TEST_ASSERT_MEMORY_ALL_FREE_LIFO_ORDER(m, n);
499
+ #endif
500
+ }
501
+
502
+ TEST(InternalMalloc, CallocPastBufferFails)
503
+ {
504
+ #ifdef UNITY_EXCLUDE_STDLIB_MALLOC
505
+ void* m = calloc(1, UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1);
506
+ void* n = calloc(1, UNITY_INTERNAL_HEAP_SIZE_BYTES/2);
507
+ free(m);
508
+ TEST_ASSERT_NOT_NULL(m);
509
+ TEST_ASSERT_NULL(n);
510
+ TEST_ASSERT_MEMORY_ALL_FREE_LIFO_ORDER(m, n);
511
+ #endif
512
+ }
513
+
514
+ TEST(InternalMalloc, MallocThenReallocGrowsMemoryInPlace)
515
+ {
516
+ #ifdef UNITY_EXCLUDE_STDLIB_MALLOC
517
+ void* m = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1);
518
+ void* n = realloc(m, UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 9);
519
+ free(n);
520
+ TEST_ASSERT_NOT_NULL(m);
521
+ TEST_ASSERT_EQUAL(m, n);
522
+ TEST_ASSERT_MEMORY_ALL_FREE_LIFO_ORDER(m, n);
523
+ #endif
524
+ }
525
+
526
+ TEST(InternalMalloc, ReallocFailDoesNotFreeMem)
527
+ {
528
+ #ifdef UNITY_EXCLUDE_STDLIB_MALLOC
529
+ void* m = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2);
530
+ void* n1 = malloc(10);
531
+ void* out_of_mem = realloc(n1, UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1);
532
+ void* n2 = malloc(10);
533
+
534
+ free(n2);
535
+ if (out_of_mem == NULL) free(n1);
536
+ free(m);
537
+
538
+ TEST_ASSERT_NOT_NULL(m); /* Got a real memory location */
539
+ TEST_ASSERT_NULL(out_of_mem); /* The realloc should have failed */
540
+ TEST_ASSERT_NOT_EQUAL(n2, n1); /* If n1 != n2 then realloc did not free n1 */
541
+ TEST_ASSERT_MEMORY_ALL_FREE_LIFO_ORDER(m, n2);
542
+ #endif
543
+ }