ceedling 1.2.0 → 1.2.2

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 (383) hide show
  1. checksums.yaml +4 -4
  2. data/GIT_COMMIT_SHA +1 -1
  3. data/README.md +57 -58
  4. data/Rakefile +5 -3
  5. data/assets/features/ceedling +1 -1
  6. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_typo.c +14 -0
  7. data/assets/fixtures/tests_with_duplicate_test_names/test_foo.c +21 -0
  8. data/bin/actionator.rb +6 -12
  9. data/bin/app_cfg.rb +35 -1
  10. data/bin/ceedling +13 -3
  11. data/bin/cli.rb +25 -6
  12. data/bin/cli_handler.rb +119 -73
  13. data/bin/cli_helper.rb +56 -78
  14. data/bin/installation_selector.rb +81 -0
  15. data/bin/launchinator.rb +69 -0
  16. data/bin/mixin_resolvinator.rb +26 -36
  17. data/bin/objects.yml +13 -0
  18. data/bin/path_validator.rb +25 -29
  19. data/bin/versionator.rb +47 -48
  20. data/ceedling.gemspec +19 -15
  21. data/docs/BreakingChanges.md +70 -1
  22. data/docs/Changelog.md +84 -3
  23. data/docs/KnownIssues.md +90 -4
  24. data/docs/ReleaseNotes.md +13 -0
  25. data/docs/overrides/main.html +11 -8
  26. data/lib/ceedling/build_log_writer.rb +33 -0
  27. data/lib/ceedling/config/build_root_policy.rb +70 -0
  28. data/lib/ceedling/config/configurator.rb +19 -18
  29. data/lib/ceedling/config/configurator_builder.rb +58 -28
  30. data/lib/ceedling/config/configurator_paths_validator.rb +179 -0
  31. data/lib/ceedling/config/configurator_plugins.rb +1 -1
  32. data/lib/ceedling/config/configurator_setup.rb +39 -41
  33. data/lib/ceedling/config/configurator_validator.rb +1 -110
  34. data/lib/ceedling/defaults.rb +4 -4
  35. data/lib/ceedling/dependencies/README.md +18 -16
  36. data/lib/ceedling/dependencies/dependency_cache_store.rb +20 -3
  37. data/lib/ceedling/dependencies/dependency_hasher.rb +35 -1
  38. data/lib/ceedling/filename_extension.rb +7 -1
  39. data/lib/ceedling/filesystem/FILE_TREE.md +253 -0
  40. data/lib/ceedling/filesystem/PATH_HANDLING.md +304 -0
  41. data/lib/ceedling/filesystem/README.md +41 -0
  42. data/lib/ceedling/filesystem/build_subpath.rb +102 -0
  43. data/lib/ceedling/filesystem/destination_collision.rb +25 -0
  44. data/lib/ceedling/{file_finder.rb → filesystem/file_finder.rb} +159 -104
  45. data/lib/ceedling/{file_finder_helper.rb → filesystem/file_finder_helper.rb} +36 -31
  46. data/lib/ceedling/filesystem/file_path_collection_utils.rb +183 -0
  47. data/lib/ceedling/{file_path_utils.rb → filesystem/file_path_utils.rb} +108 -97
  48. data/lib/ceedling/{file_system_wrapper.rb → filesystem/file_system_wrapper.rb} +6 -5
  49. data/lib/ceedling/filesystem/file_tree.rb +241 -0
  50. data/lib/ceedling/{file_wrapper.rb → filesystem/file_wrapper.rb} +65 -28
  51. data/lib/ceedling/filesystem/path_exclusions.rb +30 -0
  52. data/lib/ceedling/{path_matcher.rb → filesystem/path_matcher.rb} +27 -23
  53. data/lib/ceedling/{path_mirror.rb → filesystem/path_mirror.rb} +19 -18
  54. data/lib/ceedling/filesystem/path_spellings.rb +55 -0
  55. data/lib/ceedling/filesystem/project_paths.rb +184 -0
  56. data/lib/ceedling/filesystem/working_dir.rb +40 -0
  57. data/lib/ceedling/generators/generator.rb +5 -6
  58. data/lib/ceedling/generators/generator_partials.rb +1 -1
  59. data/lib/ceedling/generators/generator_test_results_backtrace.rb +7 -7
  60. data/lib/ceedling/handoff.rb +121 -0
  61. data/lib/ceedling/includes/include_factory.rb +3 -3
  62. data/lib/ceedling/includes/include_pathinator.rb +67 -10
  63. data/lib/ceedling/includes/includes.rb +1 -1
  64. data/lib/ceedling/installation.rb +92 -0
  65. data/lib/ceedling/library_resolver.rb +99 -0
  66. data/lib/ceedling/objects.yml +23 -2
  67. data/lib/ceedling/partials/partializer.rb +4 -4
  68. data/lib/ceedling/partials/partializer_config.rb +3 -1
  69. data/lib/ceedling/plugins/report_log_writer_plugin.rb +3 -5
  70. data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +1 -1
  71. data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +1 -1
  72. data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +1 -1
  73. data/lib/ceedling/rake_app/rakefile_component_resolver.rb +10 -17
  74. data/lib/ceedling/rake_app/test_task_name.rb +29 -0
  75. data/lib/ceedling/rakefile.rb +16 -1
  76. data/lib/ceedling/rakefiles/base/tasks_base.rake +1 -1
  77. data/lib/ceedling/rakefiles/release/rules_release.rake +4 -7
  78. data/lib/ceedling/rakefiles/tests/rules_tests.rake +3 -20
  79. data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +4 -30
  80. data/lib/ceedling/release_invoker/release_build_executor.rb +33 -44
  81. data/lib/ceedling/release_invoker/release_build_planner.rb +14 -6
  82. data/lib/ceedling/reportinator.rb +3 -4
  83. data/lib/ceedling/setupinator.rb +95 -87
  84. data/lib/ceedling/test_context_extractor.rb +5 -1
  85. data/lib/ceedling/test_invoker/PIPELINE.md +9 -7
  86. data/lib/ceedling/test_invoker/mock_locator.rb +60 -2
  87. data/lib/ceedling/test_invoker/partials_manager.rb +12 -0
  88. data/lib/ceedling/test_invoker/standin_headerinator.rb +22 -13
  89. data/lib/ceedling/test_invoker/test_build_executor.rb +42 -41
  90. data/lib/ceedling/test_invoker/test_build_planner.rb +37 -18
  91. data/lib/ceedling/test_invoker/test_build_setup.rb +17 -12
  92. data/lib/ceedling/test_invoker/test_build_validations.rb +16 -31
  93. data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +1 -1
  94. data/lib/ceedling/test_invoker/test_invoker.rb +6 -1
  95. data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +1 -1
  96. data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +40 -20
  97. data/lib/ceedling/tool_executor.rb +9 -3
  98. data/lib/ceedling/yaml_wrapper.rb +3 -2
  99. data/lib/version.rb +1 -1
  100. data/plugins/bullseye/bullseye.rake +6 -9
  101. data/plugins/bullseye/config/defaults_bullseye.rb +1 -1
  102. data/plugins/bullseye/lib/bullseye.rb +9 -7
  103. data/plugins/cppcheck/config/defaults_cppcheck.rb +1 -1
  104. data/plugins/dependencies/config/defaults.yml +6 -6
  105. data/plugins/dependencies/dependencies.rake +4 -1
  106. data/plugins/dependencies/lib/dependencies.rb +18 -8
  107. data/plugins/dependencies/lib/dependency_spec.rb +17 -5
  108. data/plugins/fff/lib/fff.rb +45 -39
  109. data/plugins/fff/spec/fff_cmock_wrapper_spec.rb +128 -0
  110. data/plugins/gcov/config/defaults_gcov.rb +1 -1
  111. data/plugins/gcov/gcov.rake +6 -9
  112. data/plugins/gcov/lib/console_reportinator.rb +4 -18
  113. data/plugins/gcov/lib/gcov.rb +9 -2
  114. data/plugins/gcov/lib/gcovr_reportinator.rb +8 -40
  115. data/plugins/gcov/lib/gcovr_thresholds.rb +74 -0
  116. data/plugins/gcov/lib/reportgenerator_reportinator.rb +1 -1
  117. data/plugins/module_generator/lib/module_generator.rb +3 -3
  118. data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +53 -80
  119. data/plugins/sanitize/lib/sanitize_records.rb +3 -6
  120. data/plugins/sanitize/sanitize.rake +6 -6
  121. data/plugins/valgrind/lib/valgrind.rb +14 -7
  122. data/plugins/valgrind/valgrind.rake +6 -6
  123. data/site-local/404.html +6 -20
  124. data/site-local/assets/javascripts/{bundle.d7400e89.min.js → bundle.c21346df.min.js} +3 -3
  125. data/site-local/assets/javascripts/{bundle.d7400e89.min.js.map → bundle.c21346df.min.js.map} +2 -2
  126. data/site-local/assets/javascripts/workers/{search.2c215733.min.js → search.a7633da7.min.js} +2 -2
  127. data/site-local/assets/javascripts/workers/{search.2c215733.min.js.map → search.a7633da7.min.js.map} +1 -1
  128. data/site-local/assets/stylesheets/main.57a0d79d.min.css +6 -0
  129. data/site-local/assets/stylesheets/main.57a0d79d.min.css.map +1 -0
  130. data/site-local/assets/stylesheets/palette.fb2fffe2.min.css +4 -0
  131. data/site-local/assets/stylesheets/palette.fb2fffe2.min.css.map +1 -0
  132. data/site-local/configuration/environment-vars.html +6 -20
  133. data/site-local/configuration/global-collections.html +6 -20
  134. data/site-local/configuration/index.html +6 -20
  135. data/site-local/configuration/loading.html +6 -20
  136. data/site-local/configuration/mixins.html +10 -24
  137. data/site-local/configuration/parallel-builds.html +6 -20
  138. data/site-local/configuration/project-file.html +8 -22
  139. data/site-local/configuration/reference/cexception.html +6 -20
  140. data/site-local/configuration/reference/cmock.html +8 -21
  141. data/site-local/configuration/reference/defines.html +16 -30
  142. data/site-local/configuration/reference/environment.html +10 -24
  143. data/site-local/configuration/reference/extension.html +6 -20
  144. data/site-local/configuration/reference/files.html +22 -30
  145. data/site-local/configuration/reference/flags.html +13 -27
  146. data/site-local/configuration/reference/index.html +6 -20
  147. data/site-local/configuration/reference/libraries.html +27 -23
  148. data/site-local/configuration/reference/mixins.html +6 -20
  149. data/site-local/configuration/reference/partials.html +6 -20
  150. data/site-local/configuration/reference/paths.html +38 -29
  151. data/site-local/configuration/reference/plugins.html +6 -20
  152. data/site-local/configuration/reference/project.html +32 -36
  153. data/site-local/configuration/reference/release-build.html +8 -20
  154. data/site-local/configuration/reference/test-build.html +6 -20
  155. data/site-local/configuration/reference/test-runner.html +6 -20
  156. data/site-local/configuration/reference/tools.html +27 -32
  157. data/site-local/configuration/reference/unity.html +6 -20
  158. data/site-local/configuration/which-ceedling.html +383 -37
  159. data/site-local/development/index.html +6 -20
  160. data/site-local/development/plugins/configuration.html +6 -20
  161. data/site-local/development/plugins/index.html +6 -20
  162. data/site-local/development/plugins/plugin-subclass.html +54 -68
  163. data/site-local/development/plugins/rake-tasks.html +8 -22
  164. data/site-local/development/releases.html +84 -29
  165. data/site-local/development/workflow.html +62 -71
  166. data/site-local/getting-started/builds.html +8 -20
  167. data/site-local/getting-started/command-line.html +62 -24
  168. data/site-local/getting-started/example-projects/cipher-quest.html +6 -20
  169. data/site-local/getting-started/example-projects/index.html +6 -20
  170. data/site-local/getting-started/example-projects/temp-sensor.html +6 -20
  171. data/site-local/getting-started/example-projects/wondrous-forest.html +6 -20
  172. data/site-local/getting-started/index.html +6 -20
  173. data/site-local/getting-started/installation.html +6 -20
  174. data/site-local/getting-started/quick-start.html +6 -20
  175. data/site-local/help.html +6 -20
  176. data/site-local/index.html +11 -24
  177. data/site-local/overview/build-system.html +6 -20
  178. data/site-local/overview/index.html +6 -20
  179. data/site-local/overview/test-environments.html +6 -20
  180. data/site-local/overview/tools-and-frameworks.html +6 -20
  181. data/site-local/plugins/beep.html +6 -20
  182. data/site-local/plugins/bullseye/index.html +13 -24
  183. data/site-local/plugins/bullseye/licensing.html +14 -28
  184. data/site-local/plugins/command-hooks.html +8 -22
  185. data/site-local/plugins/compile-commands-json-db.html +6 -20
  186. data/site-local/plugins/cppcheck.html +8 -22
  187. data/site-local/plugins/dependencies.html +16 -27
  188. data/site-local/plugins/fff.html +49 -32
  189. data/site-local/plugins/gcov/examples.html +7 -21
  190. data/site-local/plugins/gcov/gcovr.html +22 -33
  191. data/site-local/plugins/gcov/index.html +6 -20
  192. data/site-local/plugins/gcov/overview.html +9 -20
  193. data/site-local/plugins/gcov/reportgenerator.html +9 -23
  194. data/site-local/plugins/gcov/reporting.html +6 -20
  195. data/site-local/plugins/gcov/setup.html +8 -21
  196. data/site-local/plugins/gcov/tool-versions.html +6 -20
  197. data/site-local/plugins/gcov/troubleshooting.html +10 -24
  198. data/site-local/plugins/index.html +6 -20
  199. data/site-local/plugins/module-generator.html +21 -35
  200. data/site-local/plugins/report-build-warnings-log.html +53 -67
  201. data/site-local/plugins/report-tests-gtestlike-stdout.html +6 -20
  202. data/site-local/plugins/report-tests-ide-stdout.html +43 -57
  203. data/site-local/plugins/report-tests-log-factory.html +50 -64
  204. data/site-local/plugins/report-tests-pretty-stdout.html +7 -21
  205. data/site-local/plugins/report-tests-raw-output-log.html +9 -21
  206. data/site-local/plugins/report-tests-teamcity-stdout.html +20 -31
  207. data/site-local/plugins/sanitize.html +56 -65
  208. data/site-local/plugins/valgrind.html +49 -58
  209. data/site-local/project/index.html +6 -20
  210. data/site-local/project/release-history.html +6 -20
  211. data/site-local/project/sbom.html +6 -20
  212. data/site-local/project/upgrade.html +9 -20
  213. data/site-local/reference/build-directives.html +6 -20
  214. data/site-local/reference/command-line.html +15 -22
  215. data/site-local/reference/environment-vars.html +6 -20
  216. data/site-local/reference/gcov-plugin.html +6 -20
  217. data/site-local/reference/global-collections.html +6 -20
  218. data/site-local/reference/index.html +6 -20
  219. data/site-local/reference/partials-macros.html +6 -20
  220. data/site-local/reference/project-configuration.html +6 -20
  221. data/site-local/sitemap.xml.gz +0 -0
  222. data/site-local/snapshot/examples/cipher_quest/index.html +16 -30
  223. data/site-local/snapshot/examples/temp_sensor/index.html +8 -22
  224. data/site-local/snapshot/examples/wondrous_forest/index.html +6 -20
  225. data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +1 -1
  226. data/site-local/snapshot/plugins/gcov/config/defaults_gcov.rb +1 -1
  227. data/site-local/testing-guide/build-directives.html +14 -28
  228. data/site-local/testing-guide/conventions.html +66 -27
  229. data/site-local/testing-guide/frameworks.html +11 -25
  230. data/site-local/testing-guide/index.html +6 -20
  231. data/site-local/testing-guide/partials/configuration.html +8 -22
  232. data/site-local/testing-guide/partials/conventions.html +8 -22
  233. data/site-local/testing-guide/partials/directives.html +16 -30
  234. data/site-local/testing-guide/partials/example.html +14 -28
  235. data/site-local/testing-guide/partials/index.html +6 -20
  236. data/site-local/testing-guide/partials/overview.html +6 -20
  237. data/site-local/testing-guide/partials/variables.html +11 -25
  238. data/site-local/testing-guide/test-cases.html +13 -27
  239. data/site-local/testing-guide/test-sample.html +12 -26
  240. data/site-local/testing-guide/test-suite-anatomy.html +6 -20
  241. data/spec/integration/actionator_file_operations_spec.rb +91 -1
  242. data/spec/integration/compile_commands_json_db_spec.rb +1 -1
  243. data/spec/integration/configurator_pipeline_spec.rb +10 -0
  244. data/spec/integration/configurator_validation_spec.rb +1 -1
  245. data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +26 -0
  246. data/spec/integration/dependencies/dependency_tracker_core_spec.rb +62 -0
  247. data/spec/integration/launcher_handoff_spec.rb +297 -0
  248. data/spec/integration/mixin_loading_spec.rb +1 -1
  249. data/spec/integration/module_generator_spec.rb +3 -3
  250. data/spec/integration/nested_test_artifacts_spec.rb +99 -0
  251. data/spec/integration/partials_module_resolution_spec.rb +7 -4
  252. data/spec/integration/path_intake_scenarios_spec.rb +101 -0
  253. data/spec/integration/path_scenarios_spec.rb +322 -0
  254. data/spec/integration/quote_include_isolator_spec.rb +1 -1
  255. data/spec/integration/rake_task_registry_plugins_spec.rb +95 -0
  256. data/spec/integration/report_build_warnings_log_spec.rb +1 -1
  257. data/spec/integration/report_tests_log_factory_spec.rb +1 -1
  258. data/spec/integration/test_executable_manifest_spec.rb +1 -1
  259. data/spec/integration/test_includes_extractinator_spec.rb +2 -1
  260. data/spec/integration/test_naming_spec.rb +198 -0
  261. data/spec/integration/test_source_file_checks_spec.rb +166 -0
  262. data/spec/integration/tool_validator_spec.rb +1 -1
  263. data/spec/integration/upgrade_docs_spec.rb +84 -0
  264. data/spec/integration/vendor_copy_transient_io_retry_spec.rb +192 -75
  265. data/spec/support/file_tree_helper.rb +88 -0
  266. data/spec/support/integration/configurator_integration_helper.rb +10 -7
  267. data/spec/support/integration/dependency_tracker_integration_helper.rb +1 -1
  268. data/spec/support/integration/partials_generation_integration_helper.rb +2 -2
  269. data/spec/support/integration/path_scenario_harness.rb +173 -0
  270. data/spec/support/integration/spec_integration_helper.rb +1 -1
  271. data/spec/support/integration/test_includes_harness.rb +13 -2
  272. data/spec/support/spec_helper.rb +2 -0
  273. data/spec/support/system/spec_system_helper.rb +7 -6
  274. data/spec/support/system/system_context.rb +21 -3
  275. data/spec/support/working_dir_tracking.rb +49 -0
  276. data/spec/system/build_output_mirroring_spec.rb +2 -2
  277. data/spec/system/conditional_mock_includes_spec.rb +1 -1
  278. data/spec/system/delta_builds_spec.rb +137 -11
  279. data/spec/system/gcov_deployment_spec.rb +1 -0
  280. data/spec/system/header_include_path_validation_spec.rb +4 -4
  281. data/spec/system/launcher_handoff_spec.rb +82 -0
  282. data/spec/system/mock_include_folders_spec.rb +91 -0
  283. data/spec/system/parent_directory_reference_spec.rb +5 -3
  284. data/spec/system/path_handling_probes_spec.rb +192 -0
  285. data/spec/system/preprocessing_parameterized_tests_spec.rb +1 -1
  286. data/spec/system/rake_release_task_path_disambiguation_spec.rb +6 -6
  287. data/spec/system/rake_test_task_path_disambiguation_spec.rb +85 -0
  288. data/spec/system/special_path_characters_spec.rb +86 -0
  289. data/spec/system/support/common_test_cases.rb +23 -21
  290. data/spec/system/support/gcov_common_test_cases.rb +37 -9
  291. data/spec/system/support/sanitize_common_test_cases.rb +2 -2
  292. data/spec/system/support/valgrind_common_test_cases.rb +12 -12
  293. data/spec/system/test_pipeline_stop_points_spec.rb +4 -4
  294. data/spec/system/test_runner_system_include_spec.rb +1 -1
  295. data/spec/system/test_source_file_directive_spec.rb +34 -5
  296. data/spec/units/bin/actionator_spec.rb +14 -17
  297. data/spec/units/bin/app_cfg_spec.rb +47 -0
  298. data/spec/units/bin/cli_handler_spec.rb +284 -7
  299. data/spec/units/bin/cli_helper_spec.rb +126 -45
  300. data/spec/units/bin/installation_selector_spec.rb +114 -0
  301. data/spec/units/bin/launchinator_spec.rb +171 -0
  302. data/spec/units/bin/path_validator_spec.rb +10 -0
  303. data/spec/units/bin/versionator_spec.rb +38 -6
  304. data/spec/units/build_log_writer_spec.rb +57 -0
  305. data/spec/units/config/build_root_policy_spec.rb +61 -0
  306. data/spec/units/config/configurator_builder_spec.rb +37 -6
  307. data/spec/units/config/configurator_paths_validator_spec.rb +292 -0
  308. data/spec/units/config/configurator_setup_spec.rb +65 -103
  309. data/spec/units/config/configurator_spec.rb +37 -6
  310. data/spec/units/config/configurator_validator_spec.rb +1 -172
  311. data/spec/units/default_tools_quoting_spec.rb +83 -0
  312. data/spec/units/dependencies/dependency_cache_store_spec.rb +33 -2
  313. data/spec/units/dependencies/dependency_debug_tree_spec.rb +1 -1
  314. data/spec/units/dependencies/dependency_hasher_spec.rb +42 -1
  315. data/spec/units/dependencies/dependency_path_normalizer_spec.rb +1 -1
  316. data/spec/units/dependencies/dependency_tracker_spec.rb +3 -1
  317. data/spec/units/filename_extension_spec.rb +11 -0
  318. data/spec/units/filesystem/build_subpath_spec.rb +122 -0
  319. data/spec/units/filesystem/destination_collision_spec.rb +30 -0
  320. data/spec/units/{file_finder_helper_spec.rb → filesystem/file_finder_helper_spec.rb} +46 -1
  321. data/spec/units/{file_finder_spec.rb → filesystem/file_finder_spec.rb} +188 -22
  322. data/spec/units/{file_path_collection_utils_spec.rb → filesystem/file_path_collection_utils_spec.rb} +181 -1
  323. data/spec/units/{file_path_utils_spec.rb → filesystem/file_path_utils_spec.rb} +204 -87
  324. data/spec/units/filesystem/file_system_wrapper_spec.rb +33 -0
  325. data/spec/units/filesystem/file_tree_spec.rb +511 -0
  326. data/spec/units/filesystem/file_tree_windows_spec.rb +78 -0
  327. data/spec/units/{file_wrapper_spec.rb → filesystem/file_wrapper_spec.rb} +154 -32
  328. data/spec/units/{path_matcher_spec.rb → filesystem/path_matcher_spec.rb} +12 -1
  329. data/spec/units/{path_mirror_spec.rb → filesystem/path_mirror_spec.rb} +32 -4
  330. data/spec/units/filesystem/project_paths_spec.rb +147 -0
  331. data/spec/units/filesystem/working_dir_spec.rb +71 -0
  332. data/spec/units/generators/generator_spec.rb +12 -6
  333. data/spec/units/generators/generator_test_results_backtrace_spec.rb +50 -46
  334. data/spec/units/generators/generator_test_results_spec.rb +1 -1
  335. data/spec/units/handoff_spec.rb +205 -0
  336. data/spec/units/includes/include_factory_spec.rb +3 -3
  337. data/spec/units/includes/include_pathinator_spec.rb +46 -0
  338. data/spec/units/installation_spec.rb +228 -0
  339. data/spec/units/library_resolver_spec.rb +157 -0
  340. data/spec/units/mock_locator_spec.rb +76 -1
  341. data/spec/units/partials/partializer_config_spec.rb +7 -0
  342. data/spec/units/partials/partializer_spec.rb +1 -0
  343. data/spec/units/partials_manager_spec.rb +17 -0
  344. data/spec/units/plugins/bullseye_spec.rb +15 -2
  345. data/spec/units/plugins/console_reportinator_spec.rb +18 -20
  346. data/spec/units/plugins/dependencies_spec.rb +33 -7
  347. data/spec/units/plugins/dependency_spec_spec.rb +17 -0
  348. data/spec/units/plugins/gcov_spec.rb +28 -3
  349. data/spec/units/plugins/gcovr_reportinator_spec.rb +19 -47
  350. data/spec/units/plugins/gcovr_thresholds_spec.rb +95 -0
  351. data/spec/units/plugins/module_generator_spec.rb +5 -5
  352. data/spec/units/plugins/report_build_warnings_log_spec.rb +3 -3
  353. data/spec/units/plugins/report_log_writer_plugin_spec.rb +10 -1
  354. data/spec/units/plugins/report_tests_raw_output_log_spec.rb +13 -2
  355. data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +77 -3
  356. data/spec/units/plugins/reportgenerator_reportinator_spec.rb +1 -1
  357. data/spec/units/plugins/sanitize_records_spec.rb +3 -1
  358. data/spec/units/plugins/sanitize_spec.rb +1 -1
  359. data/spec/units/plugins/valgrind_spec.rb +23 -8
  360. data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +1 -1
  361. data/spec/units/rake_app/rakefile_component_resolver_spec.rb +21 -0
  362. data/spec/units/rake_app/test_task_name_spec.rb +47 -0
  363. data/spec/units/release_build_executor_spec.rb +53 -14
  364. data/spec/units/release_build_planner_spec.rb +15 -3
  365. data/spec/units/reportinator_spec.rb +5 -5
  366. data/spec/units/standin_headerinator_spec.rb +31 -1
  367. data/spec/units/test_build_executor_spec.rb +107 -5
  368. data/spec/units/test_build_planner_spec.rb +104 -2
  369. data/spec/units/test_build_setup_spec.rb +96 -12
  370. data/spec/units/test_context_extractor_spec.rb +25 -0
  371. data/spec/units/test_file_preprocessinator_spec.rb +17 -1
  372. data/spec/units/test_includes_extractinator_spec.rb +5 -1
  373. data/spec/units/test_invoker/objects_wiring_spec.rb +6 -3
  374. data/spec/units/test_invoker_spec.rb +14 -1
  375. data/spec/units/test_source_file_directive_resolver_spec.rb +38 -7
  376. data/spec/units/tool_executor_spec.rb +26 -0
  377. data/spec/units/yaml_wrapper_spec.rb +11 -0
  378. metadata +122 -33
  379. data/lib/ceedling/file_path_collection_utils.rb +0 -164
  380. data/site-local/assets/stylesheets/main.ec1eaa64.min.css +0 -1
  381. data/site-local/assets/stylesheets/main.ec1eaa64.min.css.map +0 -1
  382. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css +0 -1
  383. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css.map +0 -1
@@ -0,0 +1,292 @@
1
+ # =========================================================================
2
+ # Ceedling - Test-Centered Build System for C
3
+ # ThrowTheSwitch.org
4
+ # Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
5
+ # SPDX-License-Identifier: MIT
6
+ # =========================================================================
7
+
8
+ require 'spec_helper'
9
+ require 'config_yaml_helper'
10
+ require 'ceedling/config/configurator_paths_validator'
11
+ require 'ceedling/config/config_walkinator'
12
+ require 'ceedling/reportinator'
13
+
14
+ # Unit coverage for ConfiguratorPathsValidator through a doubled file layer. What these
15
+ # validations make of a real project tree is proven in
16
+ # spec/integration/configurator_validation_spec.rb.
17
+ describe ConfiguratorPathsValidator do
18
+ include ConfigYamlHelper
19
+
20
+ before(:each) do
21
+ @file_wrapper = double('file_wrapper')
22
+ @loginator = double('loginator', log: nil)
23
+
24
+ @validator = described_class.new(
25
+ {
26
+ config_walkinator: ConfigWalkinator.new,
27
+ file_wrapper: @file_wrapper,
28
+ loginator: @loginator,
29
+ reportinator: Reportinator.new
30
+ }
31
+ )
32
+ end
33
+
34
+ def existing(*paths)
35
+ allow(@file_wrapper).to receive(:exist?) { |path| paths.include?( path ) }
36
+ end
37
+
38
+ def directories(*paths)
39
+ allow(@file_wrapper).to receive(:directory?) { |path| paths.include?( path ) }
40
+ end
41
+
42
+ describe '#validate_path_list' do
43
+ let(:config) { config_from_yaml( ":paths:\n :test:\n - +:test/**\n - -:test/ignore\n - '**/generated'\n" ) }
44
+
45
+ it 'checks each path stripped of its aggregation decorator and glob' do
46
+ existing('test', 'test/ignore')
47
+ expect(@validator.validate_path_list( config, :paths, :test )).to be true
48
+ end
49
+
50
+ it 'skips a path that begins with a glob' do
51
+ existing('test', 'test/ignore')
52
+ @validator.validate_path_list( config, :paths, :test )
53
+ expect(@file_wrapper).to_not have_received(:exist?).with('')
54
+ end
55
+
56
+ it 'logs each path that does not exist' do
57
+ existing()
58
+ expect(@validator.validate_path_list( config, :paths, :test )).to be false
59
+ expect(@loginator).to have_received(:log).with("Config path :paths ↳ :test => 'test' does not exist in the filesystem.", Verbosity::ERRORS)
60
+ end
61
+
62
+ # The path handling audit around GH #1370: a `-:` entry may name nothing to leave out
63
+ it 'leaves a `-:` path to the entries validation' do
64
+ existing('test')
65
+ expect(@validator.validate_path_list( config, :paths, :test )).to be true
66
+ end
67
+
68
+ it 'fails a missing entry' do
69
+ expect(@validator.validate_path_list( config, :paths, :source )).to be false
70
+ end
71
+ end
72
+
73
+ # An entry naming no path, or wrapping its path in quotes, is rejected before any
74
+ # filesystem check. Both usually come from quoting only the path after a +: or -:
75
+ # decoration, so each rejection carries a hint about quoting.
76
+ shared_examples 'an entry that names no usable path' do |walk|
77
+ {
78
+ 'a bare subtractive decoration' => " - '-:'\n",
79
+ 'a bare additive decoration' => " - '+:'\n",
80
+ 'an empty string' => " - ''\n",
81
+ 'whitespace alone' => " - ' '\n",
82
+ 'a YAML null' => " -\n",
83
+ }.each_pair do |label, yaml|
84
+ it "rejects #{label} as naming no path, with a quoting hint" do
85
+ expect(validate( yaml )).to be false
86
+ expect(@loginator).to have_received(:log).with(/#{Regexp.escape(walk)} => '.*' names no path/, Verbosity::ERRORS)
87
+ expect(@loginator).to have_received(:log).with(/Quote the whole entry/, Verbosity::ERRORS)
88
+ end
89
+ end
90
+
91
+ # YAML reads an unquoted decoration with nothing after it as a one-key mapping
92
+ it 'rejects an entry YAML read as something other than a path, with a quoting hint' do
93
+ expect(validate( " - -:\n" )).to be false
94
+ expect(@loginator).to have_received(:log).with(/#{Regexp.escape(walk)} => '.*' is not a path \(YAML read it as a Hash\)/, Verbosity::ERRORS)
95
+ expect(@loginator).to have_received(:log).with(/Quote the whole entry/, Verbosity::ERRORS)
96
+ end
97
+
98
+ it 'rejects a path wrapped in quotes after its decoration, with a quoting hint' do
99
+ expect(validate( " - '-:\"src/a.c\"'\n" )).to be false
100
+ expect(@loginator).to have_received(:log).with(/#{Regexp.escape(walk)} => '-:"src\/a.c"' wraps its path in quotes/, Verbosity::ERRORS)
101
+ expect(@loginator).to have_received(:log).with(/Quote the whole entry/, Verbosity::ERRORS)
102
+ end
103
+ end
104
+
105
+ describe '#validate_paths_entries' do
106
+ def validate(yaml_list)
107
+ @validator.validate_paths_entries( config_from_yaml( ":paths:\n :source:\n#{yaml_list}" ), :source )
108
+ end
109
+
110
+ it 'accepts a glob that yields directories' do
111
+ existing; directories('src', 'src/a')
112
+ allow(@file_wrapper).to receive(:directory_listing).with('src/**/**').and_return(['src', 'src/a', 'src/a/x.c'])
113
+
114
+ expect(validate( " - src/**\n" )).to be true
115
+ end
116
+
117
+ it 'warns about and skips a path naming a file' do
118
+ existing('src/main.c'); directories
119
+
120
+ expect(validate( " - src/main.c\n" )).to be true
121
+ expect(@loginator).to have_received(:log).with(/'src\/main.c' is a filepath and will be ignored/, Verbosity::COMPLAIN)
122
+ end
123
+
124
+ it 'accepts a subdirectory glob of a directory that has no subdirectories' do
125
+ existing; directories
126
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
127
+
128
+ expect(validate( " - src/*\n" )).to be true
129
+ end
130
+
131
+ it 'logs a path that yields no directories' do
132
+ existing; directories
133
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
134
+
135
+ expect(validate( " - +:src/missing\n" )).to be false
136
+ expect(@loginator).to have_received(:log).with(/'src\/missing' yielded no directories/, Verbosity::ERRORS)
137
+ end
138
+
139
+ # The path handling audit around GH #1370: a `-:` entry names what a build leaves out
140
+ it 'accepts a `-:` path that names nothing, warning of it' do
141
+ existing; directories
142
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
143
+
144
+ expect(validate( " - -:src/missing\n" )).to be true
145
+ expect(@loginator).to have_received(:log).with(/'-:src\/missing' leaves out nothing; no directory matches it/, Verbosity::COMPLAIN)
146
+ end
147
+
148
+ it 'warns of a `-:` subdirectories glob whose directory does not exist' do
149
+ existing; directories
150
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
151
+
152
+ expect(validate( " - -:src/typo/**\n" )).to be true
153
+ expect(@loginator).to have_received(:log).with(/'-:src\/typo\/\*\*' leaves out nothing; no directory matches it/, Verbosity::COMPLAIN)
154
+ end
155
+
156
+ it 'warns of a `-:` glob that matches nothing below a directory that exists' do
157
+ existing( 'src' ); directories( 'src' )
158
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
159
+
160
+ expect(validate( " - -:src/nomatch*\n" )).to be true
161
+ expect(@loginator).to have_received(:log).with(/'-:src\/nomatch\*' leaves out nothing/, Verbosity::COMPLAIN)
162
+ end
163
+
164
+ it 'accepts a `-:` subdirectories glob of an existing directory without a word' do
165
+ existing( 'src/legacy' ); directories( 'src/legacy' )
166
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
167
+
168
+ expect(validate( " - -:src/legacy/**\n" )).to be true
169
+ expect(@loginator).to_not have_received(:log)
170
+ end
171
+
172
+ it 'accepts a `-:` path below the build root that names nothing, without a word' do
173
+ existing; directories
174
+ allow(@file_wrapper).to receive(:directory_listing).and_return([])
175
+
176
+ config = config_from_yaml( ":project:\n :build_root: build\n:paths:\n :source:\n - -:build/gen\n" )
177
+ expect(@validator.validate_paths_entries( config, :source )).to be true
178
+ expect(@loginator).to_not have_received(:log)
179
+ end
180
+
181
+ it 'escapes literal brackets before globbing' do
182
+ existing; directories('src/[legacy]')
183
+ allow(@file_wrapper).to receive(:directory_listing).with('src/\[legacy\]').and_return(['src/[legacy]'])
184
+
185
+ expect(validate( " - 'src/[legacy]'\n" )).to be true
186
+ end
187
+
188
+ it 'fails a missing entry' do
189
+ expect(@validator.validate_paths_entries( { paths: {} }, :source )).to be false
190
+ end
191
+
192
+ it_behaves_like 'an entry that names no usable path', ':paths ↳ :source'
193
+ end
194
+
195
+ describe '#validate_files_entries' do
196
+ def validate(yaml_list)
197
+ @validator.validate_files_entries( config_from_yaml( ":files:\n :source:\n#{yaml_list}" ), :source )
198
+ end
199
+
200
+ it 'accepts a glob that yields files' do
201
+ existing; directories
202
+ allow(@file_wrapper).to receive(:instantiate_file_list).with('src/*.c').and_return(['src/a.c'])
203
+
204
+ expect(validate( " - +:src/*.c\n" )).to be true
205
+ end
206
+
207
+ it 'warns about and skips a path naming a directory' do
208
+ existing('src'); directories('src')
209
+
210
+ expect(validate( " - src\n" )).to be true
211
+ expect(@loginator).to have_received(:log).with(/'src' is a directory path and will be ignored/, Verbosity::COMPLAIN)
212
+ end
213
+
214
+ it 'logs a glob that yields no files' do
215
+ existing; directories
216
+ allow(@file_wrapper).to receive(:instantiate_file_list).and_return([])
217
+
218
+ expect(validate( " - src/*.x\n" )).to be false
219
+ expect(@loginator).to have_received(:log).with(/'src\/\*.x' yielded no files/, Verbosity::ERRORS)
220
+ end
221
+
222
+ it 'accepts a `-:` glob that names no files, warning of it' do
223
+ existing; directories
224
+ allow(@file_wrapper).to receive(:instantiate_file_list).and_return([])
225
+
226
+ expect(validate( " - -:src/*.x\n" )).to be true
227
+ expect(@loginator).to have_received(:log).with(/'-:src\/\*.x' leaves out nothing; no file matches it/, Verbosity::COMPLAIN)
228
+ end
229
+
230
+ it 'escapes literal brackets before globbing' do
231
+ existing; directories
232
+ allow(@file_wrapper).to receive(:instantiate_file_list).with('src/\[legacy\]/*.c').and_return(['src/[legacy]/a.c'])
233
+
234
+ expect(validate( " - 'src/[legacy]/*.c'\n" )).to be true
235
+ end
236
+
237
+ it 'fails a missing entry' do
238
+ expect(@validator.validate_files_entries( { files: {} }, :source )).to be false
239
+ end
240
+
241
+ it_behaves_like 'an entry that names no usable path', ':files ↳ :source'
242
+ end
243
+
244
+ # The path handling audit around GH #1370: clobber empties the build root's test and
245
+ # release trees
246
+ describe '#validate_build_root' do
247
+ def validate(build_root, paths: " :source:\n - src/**\n", files: '')
248
+ yaml = ":project:\n :build_root: '#{build_root}'\n:paths:\n#{paths}"
249
+ yaml += ":files:\n#{files}" unless files.empty?
250
+ @validator.validate_build_root( config_from_yaml( yaml ) )
251
+ end
252
+
253
+ it 'accepts a build root of its own' do
254
+ expect(validate( 'build' )).to be true
255
+ end
256
+
257
+ {
258
+ '' => 'names no directory',
259
+ '.' => 'is the project directory or holds it',
260
+ '..' => 'is the project directory or holds it',
261
+ '/' => 'is the project directory or holds it'
262
+ }.each do |root, problem|
263
+ it "refuses a build root of '#{root}', which #{problem}" do
264
+ expect(validate( root )).to be false
265
+ expect(@loginator).to have_received(:log).with( ":project ↳ :build_root => '#{root}' #{problem}. Give the build its own directory, such as 'build'.", Verbosity::ERRORS )
266
+ end
267
+ end
268
+
269
+ it 'accepts a build root holding :paths and :files entries that add to a build, warning of each' do
270
+ expect(validate( 'gen', paths: " :source:\n - src/**\n - gen/**\n", files: " :source:\n - gen/out/a.c\n" )).to be true
271
+ expect(@loginator).to have_received(:log).with( ":paths ↳ :source => 'gen/**' lies in the build root 'gen'. Ceedling leaves out the directories it creates there.", Verbosity::COMPLAIN )
272
+ expect(@loginator).to have_received(:log).with( ":files ↳ :source => 'gen/out/a.c' lies in the build root 'gen'. Ceedling leaves out the directories it creates there.", Verbosity::COMPLAIN )
273
+ end
274
+
275
+ it 'accepts a build root holding only what `-:` entries name' do
276
+ expect(validate( 'build', paths: " :source:\n - src/**\n - -:build/gen\n" )).to be true
277
+ end
278
+ end
279
+
280
+ describe '#validate_filepath_simple' do
281
+ it 'accepts an existing path' do
282
+ existing('helper.h')
283
+ expect(@validator.validate_filepath_simple( 'helper.h', :cmock, :unity_helper_path )).to be true
284
+ end
285
+
286
+ it 'logs a missing path with the configuration walk it came from' do
287
+ existing
288
+ expect(@validator.validate_filepath_simple( 'helper.h', :cmock, :unity_helper_path )).to be false
289
+ expect(@loginator).to have_received(:log).with("Config path 'helper.h' associated with :cmock ↳ :unity_helper_path does not exist in the filesystem.", Verbosity::ERRORS)
290
+ end
291
+ end
292
+ end
@@ -20,6 +20,7 @@ describe ConfiguratorSetup do
20
20
  before(:each) do
21
21
  @configurator_builder = double('ConfiguratorBuilder')
22
22
  @configurator_validator = double('ConfiguratorValidator')
23
+ @paths_validator = double('ConfiguratorPathsValidator')
23
24
  @loginator = double('Loginator')
24
25
  @reportinator = Reportinator.new
25
26
  @file_wrapper = double('FileWrapper')
@@ -30,6 +31,7 @@ describe ConfiguratorSetup do
30
31
  {
31
32
  configurator_builder: @configurator_builder,
32
33
  configurator_validator: @configurator_validator,
34
+ configurator_paths_validator: @paths_validator,
33
35
  loginator: @loginator,
34
36
  reportinator: @reportinator,
35
37
  file_wrapper: @file_wrapper,
@@ -177,136 +179,96 @@ describe ConfiguratorSetup do
177
179
  end
178
180
  end
179
181
 
180
- # Issue #1292: a vendor destination (build/vendor/unity/src, etc.) occasionally turns
181
- # up as the wrong file/directory type, crashing the copy that populates it. These
182
- # examples cover the two fixes: unconditional copying (never skipped just because the
183
- # destination looks already populated -- an errant edit there must be overwritten, not
184
- # left standing) and self-healing a wrong-typed destination before that copy runs.
185
- context "#heal_vendor_path" do
186
- it "does nothing when neither the destination nor the marker file exist yet" do
187
- allow(@file_wrapper).to receive(:exist?).and_return(false)
188
-
189
- @setup.heal_vendor_path('/build/vendor/unity/src', 'unity.c')
190
-
191
- expect(@file_wrapper).to_not receive(:rm_rf)
192
- end
193
-
194
- it "does nothing when the destination is a directory and the marker is a plain file inside it" do
195
- allow(@file_wrapper).to receive(:exist?).with('/build/vendor/unity/src').and_return(true)
196
- allow(@file_wrapper).to receive(:directory?).with('/build/vendor/unity/src').and_return(true)
197
- allow(@file_wrapper).to receive(:exist?).with('/build/vendor/unity/src/unity.c').and_return(true)
198
- allow(@file_wrapper).to receive(:directory?).with('/build/vendor/unity/src/unity.c').and_return(false)
199
-
200
- @setup.heal_vendor_path('/build/vendor/unity/src', 'unity.c')
201
-
202
- expect(@file_wrapper).to_not receive(:rm_rf)
203
- end
204
-
205
- it "removes and logs a NOTICE when the destination itself is the wrong type (a file, not a directory)" do
206
- allow(@file_wrapper).to receive(:exist?).with('/build/vendor/unity/src').and_return(true)
207
- allow(@file_wrapper).to receive(:directory?).with('/build/vendor/unity/src').and_return(false)
208
- expect(@file_wrapper).to receive(:rm_rf).with('/build/vendor/unity/src')
209
- expect(@loginator).to receive(:log)
210
- .with(a_string_including('/build/vendor/unity/src'), Verbosity::COMPLAIN, LogLabels::NOTICE)
211
-
212
- @setup.heal_vendor_path('/build/vendor/unity/src', 'unity.c')
213
- end
214
-
215
- it "removes and logs a NOTICE when the marker file inside an otherwise-fine destination is the wrong type (Issue #1292's own reported shape: unity.c itself became a directory)" do
216
- allow(@file_wrapper).to receive(:exist?).with('/build/vendor/unity/src').and_return(true)
217
- allow(@file_wrapper).to receive(:directory?).with('/build/vendor/unity/src').and_return(true)
218
- allow(@file_wrapper).to receive(:exist?).with('/build/vendor/unity/src/unity.c').and_return(true)
219
- allow(@file_wrapper).to receive(:directory?).with('/build/vendor/unity/src/unity.c').and_return(true)
220
- expect(@file_wrapper).to receive(:rm_rf).with('/build/vendor/unity/src')
221
- expect(@loginator).to receive(:log)
222
- .with(a_string_including('/build/vendor/unity/src'), Verbosity::COMPLAIN, LogLabels::NOTICE)
223
-
224
- @setup.heal_vendor_path('/build/vendor/unity/src', 'unity.c')
225
- end
226
- end
227
-
182
+ # Only a build populates build/vendor, so a command that only reads the project, such as
183
+ # files:test or dumpconfig, leaves a concurrent build's files alone (GH #1361)
228
184
  context "#vendor_frameworks_and_support_files" do
229
185
  def flattened_config
230
186
  {
231
- unity_vendor_path: '/gem/vendor/unity',
187
+ unity_vendor_path: '/gem/vendor',
232
188
  project_build_vendor_unity_path: '/build/vendor/unity/src',
233
- cmock_vendor_path: '/gem/vendor/cmock',
189
+ cmock_vendor_path: '/gem/vendor',
234
190
  project_build_vendor_cmock_path: '/build/vendor/cmock/src',
235
- cexception_vendor_path: '/gem/vendor/c_exception',
191
+ cexception_vendor_path: '/gem/vendor',
236
192
  project_build_vendor_cexception_path: '/build/vendor/c_exception/lib',
193
+ project_build_vendor_ceedling_path: '/build/vendor/ceedling',
194
+ project_build_tests_root: '/build/test',
237
195
  project_use_mocks: true,
238
196
  project_use_exceptions: true,
239
- project_use_backtrace: false,
240
- project_use_partials: false,
197
+ project_use_backtrace: :gdb,
198
+ project_use_partials: true,
241
199
  }
242
200
  end
243
201
 
244
202
  before(:each) do
245
203
  allow(@file_wrapper).to receive(:exist?).and_return(false)
246
204
  allow(@file_wrapper).to receive(:rm_rf)
247
- allow(@file_wrapper).to receive(:cp_r_with_retry)
205
+ allow(@file_wrapper).to receive(:mkdir)
206
+ allow(@file_wrapper).to receive(:sync_tree)
207
+ allow(@file_wrapper).to receive(:sync_file)
248
208
  end
249
209
 
250
- it "copies the gdb backtrace script and the Partials header when those features are in use" do
251
- allow(@file_wrapper).to receive(:mkdir)
252
- allow(@file_wrapper).to receive(:cp_r)
253
- config = flattened_config.merge(
254
- project_use_backtrace: :gdb, project_build_tests_root: '/build/test',
255
- project_use_partials: true, project_build_vendor_ceedling_path: '/build/vendor/ceedling'
256
- )
210
+ def vendor(config = flattened_config, test_build: false, release_build: false)
211
+ @setup.vendor_frameworks_and_support_files( '/gem/lib', config, test_build: test_build, release_build: release_build )
212
+ end
257
213
 
258
- @setup.vendor_frameworks_and_support_files('/gem/lib', config)
214
+ def synced_trees
215
+ synced = []
216
+ allow(@file_wrapper).to receive(:sync_tree) { |source, destination| synced << [source, destination] }
217
+ yield
218
+ return synced
219
+ end
259
220
 
221
+ it "brings Unity, CMock, CException, the gdb backtrace script and the Partials header up to date for a test build" do
222
+ synced = synced_trees { vendor( test_build: true ) }
223
+
224
+ expect(synced).to eq( [
225
+ ['/gem/vendor/unity/src', '/build/vendor/unity/src'],
226
+ ['/gem/vendor/cmock/src', '/build/vendor/cmock/src'],
227
+ ['/gem/vendor/c_exception/lib', '/build/vendor/c_exception/lib']
228
+ ] )
260
229
  expect(@file_wrapper).to have_received(:mkdir).with('/build/test')
261
- expect(@file_wrapper).to have_received(:cp_r).with(File.join('/gem/lib', BACKTRACE_GDB_SCRIPT_FILE), '/build/test')
262
- expect(@file_wrapper).to have_received(:cp_r).with('/gem/lib/ceedling.h', '/build/vendor/ceedling')
230
+ expect(@file_wrapper).to have_received(:sync_file).with(File.join('/gem/lib', BACKTRACE_GDB_SCRIPT_FILE), '/build/test')
231
+ expect(@file_wrapper).to have_received(:sync_file).with('/gem/lib/ceedling.h', '/build/vendor/ceedling')
263
232
  end
264
233
 
265
- it "always copies Unity, CMock, and CException, regardless of whether the destination looks already populated" do
266
- # A prior run's destination "looking populated and uncorrupted" is exactly the
267
- # state a skip-check would trust -- simulate it directly (dest is a real
268
- # directory, its marker file is a real file, nothing corrupted) to prove there
269
- # is no such skip.
270
- allow(@file_wrapper).to receive(:exist?).and_return(true)
271
- allow(@file_wrapper).to receive(:directory?) do |path|
272
- !path.end_with?('.c') # marker files (unity.c, cmock.c, CException.c) are plain files; their parent dirs are directories
273
- end
234
+ it "leaves out CMock, CException, the backtrace script and the Partials header when a test build doesn't use them" do
235
+ config = flattened_config.merge( project_use_mocks: false, project_use_exceptions: false, project_use_backtrace: :simple, project_use_partials: false )
274
236
 
275
- @setup.vendor_frameworks_and_support_files('/gem/lib', flattened_config)
237
+ synced = synced_trees { vendor( config, test_build: true ) }
276
238
 
277
- expect(@file_wrapper).to have_received(:cp_r_with_retry)
278
- .with(a_string_including('/gem/vendor/unity'), '/build/vendor/unity/src')
279
- expect(@file_wrapper).to have_received(:cp_r_with_retry)
280
- .with(a_string_including('/gem/vendor/cmock'), '/build/vendor/cmock/src')
281
- expect(@file_wrapper).to have_received(:cp_r_with_retry)
282
- .with(a_string_including('/gem/vendor/c_exception'), '/build/vendor/c_exception/lib')
239
+ expect(synced).to eq( [['/gem/vendor/unity/src', '/build/vendor/unity/src']] )
240
+ expect(@file_wrapper).to_not have_received(:sync_file)
283
241
  end
284
242
 
285
- it "skips CMock and CException copying when the project doesn't use them" do
286
- config = flattened_config.merge(project_use_mocks: false, project_use_exceptions: false)
243
+ it "brings only CException up to date for a release build" do
244
+ synced = synced_trees { vendor( release_build: true ) }
245
+
246
+ expect(synced).to eq( [['/gem/vendor/c_exception/lib', '/build/vendor/c_exception/lib']] )
247
+ expect(@file_wrapper).to_not have_received(:sync_file)
248
+ end
287
249
 
288
- @setup.vendor_frameworks_and_support_files('/gem/lib', config)
250
+ it "copies nothing for a release build without exceptions" do
251
+ vendor( flattened_config.merge( project_use_exceptions: false ), release_build: true )
289
252
 
290
- expect(@file_wrapper).to have_received(:cp_r_with_retry)
291
- .with(a_string_including('/gem/vendor/unity'), '/build/vendor/unity/src')
292
- expect(@file_wrapper).to_not have_received(:cp_r_with_retry)
293
- .with(a_string_including('/gem/vendor/cmock'), anything)
294
- expect(@file_wrapper).to_not have_received(:cp_r_with_retry)
295
- .with(a_string_including('/gem/vendor/c_exception'), anything)
253
+ expect(@file_wrapper).to_not have_received(:sync_tree)
254
+ expect(@file_wrapper).to_not have_received(:sync_file)
296
255
  end
297
256
 
298
- it "heals a corrupted (wrong-typed) vendor destination before copying" do
299
- allow(@file_wrapper).to receive(:exist?).with('/build/vendor/unity/src').and_return(true)
300
- allow(@file_wrapper).to receive(:directory?).with('/build/vendor/unity/src').and_return(false)
301
- allow(@loginator).to receive(:log)
257
+ it "copies each framework once when a command builds both tests and a release" do
258
+ synced = synced_trees { vendor( test_build: true, release_build: true ) }
259
+
260
+ expect(synced.map( &:last )).to eq( ['/build/vendor/unity/src', '/build/vendor/cmock/src', '/build/vendor/c_exception/lib'] )
261
+ end
302
262
 
303
- @setup.vendor_frameworks_and_support_files('/gem/lib', flattened_config)
263
+ it "touches nothing beneath build/vendor for a command that builds nothing" do
264
+ vendor
304
265
 
305
- expect(@file_wrapper).to have_received(:rm_rf).with('/build/vendor/unity/src')
266
+ expect(@file_wrapper).to_not have_received(:sync_tree)
267
+ expect(@file_wrapper).to_not have_received(:sync_file)
268
+ expect(@file_wrapper).to_not have_received(:rm_rf)
306
269
  end
307
270
  end
308
271
 
309
- # The validations below log each problem they find and report overall validity
310
272
  context "configuration validation" do
311
273
  before(:each) do
312
274
  allow(@loginator).to receive(:log)
@@ -352,19 +314,19 @@ describe ConfiguratorSetup do
352
314
  end
353
315
 
354
316
  it "checks helper paths, plugin load paths, and every :paths and :files entry" do
355
- allow(@configurator_validator).to receive_messages(
317
+ allow(@paths_validator).to receive_messages(
356
318
  validate_filepath_simple: true, validate_path_list: true, validate_paths_entries: true, validate_files_entries: true
357
319
  )
358
320
 
359
321
  expect(@setup.validate_paths( config )).to be true
360
- expect(@configurator_validator).to have_received(:validate_filepath_simple).with('helper.h', :cmock, :unity_helper_path)
361
- expect(@configurator_validator).to have_received(:validate_filepath_simple).with('plugins', :plugins, :load_paths)
362
- expect(@configurator_validator).to have_received(:validate_paths_entries).with(config, :source)
363
- expect(@configurator_validator).to have_received(:validate_files_entries).with(config, :support)
322
+ expect(@paths_validator).to have_received(:validate_filepath_simple).with('helper.h', :cmock, :unity_helper_path)
323
+ expect(@paths_validator).to have_received(:validate_filepath_simple).with('plugins', :plugins, :load_paths)
324
+ expect(@paths_validator).to have_received(:validate_paths_entries).with(config, :source)
325
+ expect(@paths_validator).to have_received(:validate_files_entries).with(config, :support)
364
326
  end
365
327
 
366
328
  it "fails when any check fails" do
367
- allow(@configurator_validator).to receive_messages(
329
+ allow(@paths_validator).to receive_messages(
368
330
  validate_filepath_simple: true, validate_path_list: true, validate_paths_entries: true, validate_files_entries: false
369
331
  )
370
332
 
@@ -733,7 +695,7 @@ describe ConfiguratorSetup do
733
695
  context "#build_project_collections" do
734
696
  it "merges every path and file collection" do
735
697
  collections = [
736
- :expand_all_path_globs, :collect_vendor_paths, :collect_source_and_include_paths, :collect_source_include_vendor_paths,
698
+ :expand_all_path_globs, :collect_mirror_roots, :collect_vendor_paths, :collect_source_and_include_paths, :collect_source_include_vendor_paths,
737
699
  :collect_test_support_source_include_paths, :collect_test_support_source_include_vendor_paths, :collect_assembly,
738
700
  :collect_headers, :collect_release_build_input, :collect_existing_test_build_input,
739
701
  :collect_release_artifact_extra_link_objects, :collect_test_fixture_extra_link_objects, :collect_vendor_framework_sources
@@ -606,20 +606,42 @@ describe Configurator do
606
606
  expect( @configurator.get_cmock_config[:plugins] ).to eq( ['ignore', :ignore, 'expect_any_args'] )
607
607
  end
608
608
 
609
- it "normalizes plugins, helper paths, includes, and the mock prefix define when mocks are on" do
609
+ it "normalizes plugins and the mock prefix define when mocks are on" do
610
610
  config = cmock_config(true)
611
611
 
612
612
  @configurator.populate_cmock_config( config )
613
613
 
614
614
  expect( @configurator.get_cmock_config ).to include(
615
- plugins: [:ignore, :expect_any_args],
616
- unity_helper_path: ['support/unity_helper.h'],
617
- includes: ['unity_helper.h'],
618
- defines: ['CMOCK_MOCK_PREFIX=mock_']
615
+ plugins: [:ignore, :expect_any_args],
616
+ defines: ['CMOCK_MOCK_PREFIX=mock_']
619
617
  )
620
618
  end
621
619
  end
622
620
 
621
+ # The path handling audit around GH #1370: a helper's filename is taken from its path
622
+ # as standardized, so this runs after path standardizing
623
+ describe "#populate_cmock_helpers" do
624
+ def helper_config(use_mocks, helper)
625
+ { project: { use_mocks: use_mocks }, cmock: { unity_helper_path: helper, includes: ['unity_helper.h'] } }
626
+ end
627
+
628
+ it "lists a single helper path and includes each helper in every mock, once, by its filename" do
629
+ config = helper_config( true, 'support/unity_helper.h' )
630
+
631
+ @configurator.populate_cmock_helpers( config )
632
+
633
+ expect( config[:cmock] ).to include( unity_helper_path: ['support/unity_helper.h'], includes: ['unity_helper.h'] )
634
+ end
635
+
636
+ it "leaves the helpers alone when mocks are off" do
637
+ config = helper_config( false, 'support/unity_helper.h' )
638
+
639
+ @configurator.populate_cmock_helpers( config )
640
+
641
+ expect( config[:cmock][:unity_helper_path] ).to eq( 'support/unity_helper.h' )
642
+ end
643
+ end
644
+
623
645
  describe "#populate_exceptions_config" do
624
646
  it "enables exceptions when CMock uses its CException plugin" do
625
647
  config = { project: { use_exceptions: false }, cmock: { plugins: [:cexception] }, cexception: {} }
@@ -902,13 +924,22 @@ describe Configurator do
902
924
  flattened = { flat_a: 1, flat_environment: [ { cc: 'gcc' } ] }
903
925
  expect( @configurator_setup ).to have_received(:build_project_config).with( 'lib', 'logs', flattened ).ordered
904
926
  expect( @configurator_setup ).to have_received(:build_directory_structure).with( flattened ).ordered
905
- expect( @configurator_setup ).to have_received(:vendor_frameworks_and_support_files).with( 'lib', flattened ).ordered
927
+ expect( @configurator_setup ).to have_received(:vendor_frameworks_and_support_files).with( 'lib', flattened, test_build: false, release_build: false ).ordered
906
928
  expect( @configurator_setup ).to have_received(:build_project_collections).with( flattened ).ordered
907
929
  expect( @configurator_setup ).to have_received(:build_constants_and_accessors).with( flattened, anything ).ordered
908
930
  expect( @configurator_setup ).to have_received(:build_constants_and_accessors).with( { environment: [ { cc: 'gcc' } ] }, anything ).ordered
909
931
  expect( @configurator.project_config_hash ).to eq( flattened )
910
932
  end
911
933
 
934
+ it "copies the vendor files the requested build tasks need" do
935
+ @configurator.test_build_tasks = true
936
+ @configurator.release_build_tasks = true
937
+
938
+ @configurator.build( 'lib', 'logs', { a: 1 } )
939
+
940
+ expect( @configurator_setup ).to have_received(:vendor_frameworks_and_support_files).with( 'lib', { flat_a: 1 }, test_build: true, release_build: true )
941
+ end
942
+
912
943
  it "redefines an existing element and its constant" do
913
944
  @configurator.build( 'lib', 'logs', { a: 1 } )
914
945