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.
- checksums.yaml +4 -4
- data/GIT_COMMIT_SHA +1 -1
- data/README.md +57 -58
- data/Rakefile +5 -3
- data/assets/features/ceedling +1 -1
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_typo.c +14 -0
- data/assets/fixtures/tests_with_duplicate_test_names/test_foo.c +21 -0
- data/bin/actionator.rb +6 -12
- data/bin/app_cfg.rb +35 -1
- data/bin/ceedling +13 -3
- data/bin/cli.rb +25 -6
- data/bin/cli_handler.rb +119 -73
- data/bin/cli_helper.rb +56 -78
- data/bin/installation_selector.rb +81 -0
- data/bin/launchinator.rb +69 -0
- data/bin/mixin_resolvinator.rb +26 -36
- data/bin/objects.yml +13 -0
- data/bin/path_validator.rb +25 -29
- data/bin/versionator.rb +47 -48
- data/ceedling.gemspec +19 -15
- data/docs/BreakingChanges.md +70 -1
- data/docs/Changelog.md +84 -3
- data/docs/KnownIssues.md +90 -4
- data/docs/ReleaseNotes.md +13 -0
- data/docs/overrides/main.html +11 -8
- data/lib/ceedling/build_log_writer.rb +33 -0
- data/lib/ceedling/config/build_root_policy.rb +70 -0
- data/lib/ceedling/config/configurator.rb +19 -18
- data/lib/ceedling/config/configurator_builder.rb +58 -28
- data/lib/ceedling/config/configurator_paths_validator.rb +179 -0
- data/lib/ceedling/config/configurator_plugins.rb +1 -1
- data/lib/ceedling/config/configurator_setup.rb +39 -41
- data/lib/ceedling/config/configurator_validator.rb +1 -110
- data/lib/ceedling/defaults.rb +4 -4
- data/lib/ceedling/dependencies/README.md +18 -16
- data/lib/ceedling/dependencies/dependency_cache_store.rb +20 -3
- data/lib/ceedling/dependencies/dependency_hasher.rb +35 -1
- data/lib/ceedling/filename_extension.rb +7 -1
- data/lib/ceedling/filesystem/FILE_TREE.md +253 -0
- data/lib/ceedling/filesystem/PATH_HANDLING.md +304 -0
- data/lib/ceedling/filesystem/README.md +41 -0
- data/lib/ceedling/filesystem/build_subpath.rb +102 -0
- data/lib/ceedling/filesystem/destination_collision.rb +25 -0
- data/lib/ceedling/{file_finder.rb → filesystem/file_finder.rb} +159 -104
- data/lib/ceedling/{file_finder_helper.rb → filesystem/file_finder_helper.rb} +36 -31
- data/lib/ceedling/filesystem/file_path_collection_utils.rb +183 -0
- data/lib/ceedling/{file_path_utils.rb → filesystem/file_path_utils.rb} +108 -97
- data/lib/ceedling/{file_system_wrapper.rb → filesystem/file_system_wrapper.rb} +6 -5
- data/lib/ceedling/filesystem/file_tree.rb +241 -0
- data/lib/ceedling/{file_wrapper.rb → filesystem/file_wrapper.rb} +65 -28
- data/lib/ceedling/filesystem/path_exclusions.rb +30 -0
- data/lib/ceedling/{path_matcher.rb → filesystem/path_matcher.rb} +27 -23
- data/lib/ceedling/{path_mirror.rb → filesystem/path_mirror.rb} +19 -18
- data/lib/ceedling/filesystem/path_spellings.rb +55 -0
- data/lib/ceedling/filesystem/project_paths.rb +184 -0
- data/lib/ceedling/filesystem/working_dir.rb +40 -0
- data/lib/ceedling/generators/generator.rb +5 -6
- data/lib/ceedling/generators/generator_partials.rb +1 -1
- data/lib/ceedling/generators/generator_test_results_backtrace.rb +7 -7
- data/lib/ceedling/handoff.rb +121 -0
- data/lib/ceedling/includes/include_factory.rb +3 -3
- data/lib/ceedling/includes/include_pathinator.rb +67 -10
- data/lib/ceedling/includes/includes.rb +1 -1
- data/lib/ceedling/installation.rb +92 -0
- data/lib/ceedling/library_resolver.rb +99 -0
- data/lib/ceedling/objects.yml +23 -2
- data/lib/ceedling/partials/partializer.rb +4 -4
- data/lib/ceedling/partials/partializer_config.rb +3 -1
- data/lib/ceedling/plugins/report_log_writer_plugin.rb +3 -5
- data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +1 -1
- data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +1 -1
- data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +1 -1
- data/lib/ceedling/rake_app/rakefile_component_resolver.rb +10 -17
- data/lib/ceedling/rake_app/test_task_name.rb +29 -0
- data/lib/ceedling/rakefile.rb +16 -1
- data/lib/ceedling/rakefiles/base/tasks_base.rake +1 -1
- data/lib/ceedling/rakefiles/release/rules_release.rake +4 -7
- data/lib/ceedling/rakefiles/tests/rules_tests.rake +3 -20
- data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +4 -30
- data/lib/ceedling/release_invoker/release_build_executor.rb +33 -44
- data/lib/ceedling/release_invoker/release_build_planner.rb +14 -6
- data/lib/ceedling/reportinator.rb +3 -4
- data/lib/ceedling/setupinator.rb +95 -87
- data/lib/ceedling/test_context_extractor.rb +5 -1
- data/lib/ceedling/test_invoker/PIPELINE.md +9 -7
- data/lib/ceedling/test_invoker/mock_locator.rb +60 -2
- data/lib/ceedling/test_invoker/partials_manager.rb +12 -0
- data/lib/ceedling/test_invoker/standin_headerinator.rb +22 -13
- data/lib/ceedling/test_invoker/test_build_executor.rb +42 -41
- data/lib/ceedling/test_invoker/test_build_planner.rb +37 -18
- data/lib/ceedling/test_invoker/test_build_setup.rb +17 -12
- data/lib/ceedling/test_invoker/test_build_validations.rb +16 -31
- data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +1 -1
- data/lib/ceedling/test_invoker/test_invoker.rb +6 -1
- data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +1 -1
- data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +40 -20
- data/lib/ceedling/tool_executor.rb +9 -3
- data/lib/ceedling/yaml_wrapper.rb +3 -2
- data/lib/version.rb +1 -1
- data/plugins/bullseye/bullseye.rake +6 -9
- data/plugins/bullseye/config/defaults_bullseye.rb +1 -1
- data/plugins/bullseye/lib/bullseye.rb +9 -7
- data/plugins/cppcheck/config/defaults_cppcheck.rb +1 -1
- data/plugins/dependencies/config/defaults.yml +6 -6
- data/plugins/dependencies/dependencies.rake +4 -1
- data/plugins/dependencies/lib/dependencies.rb +18 -8
- data/plugins/dependencies/lib/dependency_spec.rb +17 -5
- data/plugins/fff/lib/fff.rb +45 -39
- data/plugins/fff/spec/fff_cmock_wrapper_spec.rb +128 -0
- data/plugins/gcov/config/defaults_gcov.rb +1 -1
- data/plugins/gcov/gcov.rake +6 -9
- data/plugins/gcov/lib/console_reportinator.rb +4 -18
- data/plugins/gcov/lib/gcov.rb +9 -2
- data/plugins/gcov/lib/gcovr_reportinator.rb +8 -40
- data/plugins/gcov/lib/gcovr_thresholds.rb +74 -0
- data/plugins/gcov/lib/reportgenerator_reportinator.rb +1 -1
- data/plugins/module_generator/lib/module_generator.rb +3 -3
- data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +53 -80
- data/plugins/sanitize/lib/sanitize_records.rb +3 -6
- data/plugins/sanitize/sanitize.rake +6 -6
- data/plugins/valgrind/lib/valgrind.rb +14 -7
- data/plugins/valgrind/valgrind.rake +6 -6
- data/site-local/404.html +6 -20
- data/site-local/assets/javascripts/{bundle.d7400e89.min.js → bundle.c21346df.min.js} +3 -3
- data/site-local/assets/javascripts/{bundle.d7400e89.min.js.map → bundle.c21346df.min.js.map} +2 -2
- data/site-local/assets/javascripts/workers/{search.2c215733.min.js → search.a7633da7.min.js} +2 -2
- data/site-local/assets/javascripts/workers/{search.2c215733.min.js.map → search.a7633da7.min.js.map} +1 -1
- data/site-local/assets/stylesheets/main.57a0d79d.min.css +6 -0
- data/site-local/assets/stylesheets/main.57a0d79d.min.css.map +1 -0
- data/site-local/assets/stylesheets/palette.fb2fffe2.min.css +4 -0
- data/site-local/assets/stylesheets/palette.fb2fffe2.min.css.map +1 -0
- data/site-local/configuration/environment-vars.html +6 -20
- data/site-local/configuration/global-collections.html +6 -20
- data/site-local/configuration/index.html +6 -20
- data/site-local/configuration/loading.html +6 -20
- data/site-local/configuration/mixins.html +10 -24
- data/site-local/configuration/parallel-builds.html +6 -20
- data/site-local/configuration/project-file.html +8 -22
- data/site-local/configuration/reference/cexception.html +6 -20
- data/site-local/configuration/reference/cmock.html +8 -21
- data/site-local/configuration/reference/defines.html +16 -30
- data/site-local/configuration/reference/environment.html +10 -24
- data/site-local/configuration/reference/extension.html +6 -20
- data/site-local/configuration/reference/files.html +22 -30
- data/site-local/configuration/reference/flags.html +13 -27
- data/site-local/configuration/reference/index.html +6 -20
- data/site-local/configuration/reference/libraries.html +27 -23
- data/site-local/configuration/reference/mixins.html +6 -20
- data/site-local/configuration/reference/partials.html +6 -20
- data/site-local/configuration/reference/paths.html +38 -29
- data/site-local/configuration/reference/plugins.html +6 -20
- data/site-local/configuration/reference/project.html +32 -36
- data/site-local/configuration/reference/release-build.html +8 -20
- data/site-local/configuration/reference/test-build.html +6 -20
- data/site-local/configuration/reference/test-runner.html +6 -20
- data/site-local/configuration/reference/tools.html +27 -32
- data/site-local/configuration/reference/unity.html +6 -20
- data/site-local/configuration/which-ceedling.html +383 -37
- data/site-local/development/index.html +6 -20
- data/site-local/development/plugins/configuration.html +6 -20
- data/site-local/development/plugins/index.html +6 -20
- data/site-local/development/plugins/plugin-subclass.html +54 -68
- data/site-local/development/plugins/rake-tasks.html +8 -22
- data/site-local/development/releases.html +84 -29
- data/site-local/development/workflow.html +62 -71
- data/site-local/getting-started/builds.html +8 -20
- data/site-local/getting-started/command-line.html +62 -24
- data/site-local/getting-started/example-projects/cipher-quest.html +6 -20
- data/site-local/getting-started/example-projects/index.html +6 -20
- data/site-local/getting-started/example-projects/temp-sensor.html +6 -20
- data/site-local/getting-started/example-projects/wondrous-forest.html +6 -20
- data/site-local/getting-started/index.html +6 -20
- data/site-local/getting-started/installation.html +6 -20
- data/site-local/getting-started/quick-start.html +6 -20
- data/site-local/help.html +6 -20
- data/site-local/index.html +11 -24
- data/site-local/overview/build-system.html +6 -20
- data/site-local/overview/index.html +6 -20
- data/site-local/overview/test-environments.html +6 -20
- data/site-local/overview/tools-and-frameworks.html +6 -20
- data/site-local/plugins/beep.html +6 -20
- data/site-local/plugins/bullseye/index.html +13 -24
- data/site-local/plugins/bullseye/licensing.html +14 -28
- data/site-local/plugins/command-hooks.html +8 -22
- data/site-local/plugins/compile-commands-json-db.html +6 -20
- data/site-local/plugins/cppcheck.html +8 -22
- data/site-local/plugins/dependencies.html +16 -27
- data/site-local/plugins/fff.html +49 -32
- data/site-local/plugins/gcov/examples.html +7 -21
- data/site-local/plugins/gcov/gcovr.html +22 -33
- data/site-local/plugins/gcov/index.html +6 -20
- data/site-local/plugins/gcov/overview.html +9 -20
- data/site-local/plugins/gcov/reportgenerator.html +9 -23
- data/site-local/plugins/gcov/reporting.html +6 -20
- data/site-local/plugins/gcov/setup.html +8 -21
- data/site-local/plugins/gcov/tool-versions.html +6 -20
- data/site-local/plugins/gcov/troubleshooting.html +10 -24
- data/site-local/plugins/index.html +6 -20
- data/site-local/plugins/module-generator.html +21 -35
- data/site-local/plugins/report-build-warnings-log.html +53 -67
- data/site-local/plugins/report-tests-gtestlike-stdout.html +6 -20
- data/site-local/plugins/report-tests-ide-stdout.html +43 -57
- data/site-local/plugins/report-tests-log-factory.html +50 -64
- data/site-local/plugins/report-tests-pretty-stdout.html +7 -21
- data/site-local/plugins/report-tests-raw-output-log.html +9 -21
- data/site-local/plugins/report-tests-teamcity-stdout.html +20 -31
- data/site-local/plugins/sanitize.html +56 -65
- data/site-local/plugins/valgrind.html +49 -58
- data/site-local/project/index.html +6 -20
- data/site-local/project/release-history.html +6 -20
- data/site-local/project/sbom.html +6 -20
- data/site-local/project/upgrade.html +9 -20
- data/site-local/reference/build-directives.html +6 -20
- data/site-local/reference/command-line.html +15 -22
- data/site-local/reference/environment-vars.html +6 -20
- data/site-local/reference/gcov-plugin.html +6 -20
- data/site-local/reference/global-collections.html +6 -20
- data/site-local/reference/index.html +6 -20
- data/site-local/reference/partials-macros.html +6 -20
- data/site-local/reference/project-configuration.html +6 -20
- data/site-local/sitemap.xml.gz +0 -0
- data/site-local/snapshot/examples/cipher_quest/index.html +16 -30
- data/site-local/snapshot/examples/temp_sensor/index.html +8 -22
- data/site-local/snapshot/examples/wondrous_forest/index.html +6 -20
- data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +1 -1
- data/site-local/snapshot/plugins/gcov/config/defaults_gcov.rb +1 -1
- data/site-local/testing-guide/build-directives.html +14 -28
- data/site-local/testing-guide/conventions.html +66 -27
- data/site-local/testing-guide/frameworks.html +11 -25
- data/site-local/testing-guide/index.html +6 -20
- data/site-local/testing-guide/partials/configuration.html +8 -22
- data/site-local/testing-guide/partials/conventions.html +8 -22
- data/site-local/testing-guide/partials/directives.html +16 -30
- data/site-local/testing-guide/partials/example.html +14 -28
- data/site-local/testing-guide/partials/index.html +6 -20
- data/site-local/testing-guide/partials/overview.html +6 -20
- data/site-local/testing-guide/partials/variables.html +11 -25
- data/site-local/testing-guide/test-cases.html +13 -27
- data/site-local/testing-guide/test-sample.html +12 -26
- data/site-local/testing-guide/test-suite-anatomy.html +6 -20
- data/spec/integration/actionator_file_operations_spec.rb +91 -1
- data/spec/integration/compile_commands_json_db_spec.rb +1 -1
- data/spec/integration/configurator_pipeline_spec.rb +10 -0
- data/spec/integration/configurator_validation_spec.rb +1 -1
- data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +26 -0
- data/spec/integration/dependencies/dependency_tracker_core_spec.rb +62 -0
- data/spec/integration/launcher_handoff_spec.rb +297 -0
- data/spec/integration/mixin_loading_spec.rb +1 -1
- data/spec/integration/module_generator_spec.rb +3 -3
- data/spec/integration/nested_test_artifacts_spec.rb +99 -0
- data/spec/integration/partials_module_resolution_spec.rb +7 -4
- data/spec/integration/path_intake_scenarios_spec.rb +101 -0
- data/spec/integration/path_scenarios_spec.rb +322 -0
- data/spec/integration/quote_include_isolator_spec.rb +1 -1
- data/spec/integration/rake_task_registry_plugins_spec.rb +95 -0
- data/spec/integration/report_build_warnings_log_spec.rb +1 -1
- data/spec/integration/report_tests_log_factory_spec.rb +1 -1
- data/spec/integration/test_executable_manifest_spec.rb +1 -1
- data/spec/integration/test_includes_extractinator_spec.rb +2 -1
- data/spec/integration/test_naming_spec.rb +198 -0
- data/spec/integration/test_source_file_checks_spec.rb +166 -0
- data/spec/integration/tool_validator_spec.rb +1 -1
- data/spec/integration/upgrade_docs_spec.rb +84 -0
- data/spec/integration/vendor_copy_transient_io_retry_spec.rb +192 -75
- data/spec/support/file_tree_helper.rb +88 -0
- data/spec/support/integration/configurator_integration_helper.rb +10 -7
- data/spec/support/integration/dependency_tracker_integration_helper.rb +1 -1
- data/spec/support/integration/partials_generation_integration_helper.rb +2 -2
- data/spec/support/integration/path_scenario_harness.rb +173 -0
- data/spec/support/integration/spec_integration_helper.rb +1 -1
- data/spec/support/integration/test_includes_harness.rb +13 -2
- data/spec/support/spec_helper.rb +2 -0
- data/spec/support/system/spec_system_helper.rb +7 -6
- data/spec/support/system/system_context.rb +21 -3
- data/spec/support/working_dir_tracking.rb +49 -0
- data/spec/system/build_output_mirroring_spec.rb +2 -2
- data/spec/system/conditional_mock_includes_spec.rb +1 -1
- data/spec/system/delta_builds_spec.rb +137 -11
- data/spec/system/gcov_deployment_spec.rb +1 -0
- data/spec/system/header_include_path_validation_spec.rb +4 -4
- data/spec/system/launcher_handoff_spec.rb +82 -0
- data/spec/system/mock_include_folders_spec.rb +91 -0
- data/spec/system/parent_directory_reference_spec.rb +5 -3
- data/spec/system/path_handling_probes_spec.rb +192 -0
- data/spec/system/preprocessing_parameterized_tests_spec.rb +1 -1
- data/spec/system/rake_release_task_path_disambiguation_spec.rb +6 -6
- data/spec/system/rake_test_task_path_disambiguation_spec.rb +85 -0
- data/spec/system/special_path_characters_spec.rb +86 -0
- data/spec/system/support/common_test_cases.rb +23 -21
- data/spec/system/support/gcov_common_test_cases.rb +37 -9
- data/spec/system/support/sanitize_common_test_cases.rb +2 -2
- data/spec/system/support/valgrind_common_test_cases.rb +12 -12
- data/spec/system/test_pipeline_stop_points_spec.rb +4 -4
- data/spec/system/test_runner_system_include_spec.rb +1 -1
- data/spec/system/test_source_file_directive_spec.rb +34 -5
- data/spec/units/bin/actionator_spec.rb +14 -17
- data/spec/units/bin/app_cfg_spec.rb +47 -0
- data/spec/units/bin/cli_handler_spec.rb +284 -7
- data/spec/units/bin/cli_helper_spec.rb +126 -45
- data/spec/units/bin/installation_selector_spec.rb +114 -0
- data/spec/units/bin/launchinator_spec.rb +171 -0
- data/spec/units/bin/path_validator_spec.rb +10 -0
- data/spec/units/bin/versionator_spec.rb +38 -6
- data/spec/units/build_log_writer_spec.rb +57 -0
- data/spec/units/config/build_root_policy_spec.rb +61 -0
- data/spec/units/config/configurator_builder_spec.rb +37 -6
- data/spec/units/config/configurator_paths_validator_spec.rb +292 -0
- data/spec/units/config/configurator_setup_spec.rb +65 -103
- data/spec/units/config/configurator_spec.rb +37 -6
- data/spec/units/config/configurator_validator_spec.rb +1 -172
- data/spec/units/default_tools_quoting_spec.rb +83 -0
- data/spec/units/dependencies/dependency_cache_store_spec.rb +33 -2
- data/spec/units/dependencies/dependency_debug_tree_spec.rb +1 -1
- data/spec/units/dependencies/dependency_hasher_spec.rb +42 -1
- data/spec/units/dependencies/dependency_path_normalizer_spec.rb +1 -1
- data/spec/units/dependencies/dependency_tracker_spec.rb +3 -1
- data/spec/units/filename_extension_spec.rb +11 -0
- data/spec/units/filesystem/build_subpath_spec.rb +122 -0
- data/spec/units/filesystem/destination_collision_spec.rb +30 -0
- data/spec/units/{file_finder_helper_spec.rb → filesystem/file_finder_helper_spec.rb} +46 -1
- data/spec/units/{file_finder_spec.rb → filesystem/file_finder_spec.rb} +188 -22
- data/spec/units/{file_path_collection_utils_spec.rb → filesystem/file_path_collection_utils_spec.rb} +181 -1
- data/spec/units/{file_path_utils_spec.rb → filesystem/file_path_utils_spec.rb} +204 -87
- data/spec/units/filesystem/file_system_wrapper_spec.rb +33 -0
- data/spec/units/filesystem/file_tree_spec.rb +511 -0
- data/spec/units/filesystem/file_tree_windows_spec.rb +78 -0
- data/spec/units/{file_wrapper_spec.rb → filesystem/file_wrapper_spec.rb} +154 -32
- data/spec/units/{path_matcher_spec.rb → filesystem/path_matcher_spec.rb} +12 -1
- data/spec/units/{path_mirror_spec.rb → filesystem/path_mirror_spec.rb} +32 -4
- data/spec/units/filesystem/project_paths_spec.rb +147 -0
- data/spec/units/filesystem/working_dir_spec.rb +71 -0
- data/spec/units/generators/generator_spec.rb +12 -6
- data/spec/units/generators/generator_test_results_backtrace_spec.rb +50 -46
- data/spec/units/generators/generator_test_results_spec.rb +1 -1
- data/spec/units/handoff_spec.rb +205 -0
- data/spec/units/includes/include_factory_spec.rb +3 -3
- data/spec/units/includes/include_pathinator_spec.rb +46 -0
- data/spec/units/installation_spec.rb +228 -0
- data/spec/units/library_resolver_spec.rb +157 -0
- data/spec/units/mock_locator_spec.rb +76 -1
- data/spec/units/partials/partializer_config_spec.rb +7 -0
- data/spec/units/partials/partializer_spec.rb +1 -0
- data/spec/units/partials_manager_spec.rb +17 -0
- data/spec/units/plugins/bullseye_spec.rb +15 -2
- data/spec/units/plugins/console_reportinator_spec.rb +18 -20
- data/spec/units/plugins/dependencies_spec.rb +33 -7
- data/spec/units/plugins/dependency_spec_spec.rb +17 -0
- data/spec/units/plugins/gcov_spec.rb +28 -3
- data/spec/units/plugins/gcovr_reportinator_spec.rb +19 -47
- data/spec/units/plugins/gcovr_thresholds_spec.rb +95 -0
- data/spec/units/plugins/module_generator_spec.rb +5 -5
- data/spec/units/plugins/report_build_warnings_log_spec.rb +3 -3
- data/spec/units/plugins/report_log_writer_plugin_spec.rb +10 -1
- data/spec/units/plugins/report_tests_raw_output_log_spec.rb +13 -2
- data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +77 -3
- data/spec/units/plugins/reportgenerator_reportinator_spec.rb +1 -1
- data/spec/units/plugins/sanitize_records_spec.rb +3 -1
- data/spec/units/plugins/sanitize_spec.rb +1 -1
- data/spec/units/plugins/valgrind_spec.rb +23 -8
- data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +1 -1
- data/spec/units/rake_app/rakefile_component_resolver_spec.rb +21 -0
- data/spec/units/rake_app/test_task_name_spec.rb +47 -0
- data/spec/units/release_build_executor_spec.rb +53 -14
- data/spec/units/release_build_planner_spec.rb +15 -3
- data/spec/units/reportinator_spec.rb +5 -5
- data/spec/units/standin_headerinator_spec.rb +31 -1
- data/spec/units/test_build_executor_spec.rb +107 -5
- data/spec/units/test_build_planner_spec.rb +104 -2
- data/spec/units/test_build_setup_spec.rb +96 -12
- data/spec/units/test_context_extractor_spec.rb +25 -0
- data/spec/units/test_file_preprocessinator_spec.rb +17 -1
- data/spec/units/test_includes_extractinator_spec.rb +5 -1
- data/spec/units/test_invoker/objects_wiring_spec.rb +6 -3
- data/spec/units/test_invoker_spec.rb +14 -1
- data/spec/units/test_source_file_directive_resolver_spec.rb +38 -7
- data/spec/units/tool_executor_spec.rb +26 -0
- data/spec/units/yaml_wrapper_spec.rb +11 -0
- metadata +122 -33
- data/lib/ceedling/file_path_collection_utils.rb +0 -164
- data/site-local/assets/stylesheets/main.ec1eaa64.min.css +0 -1
- data/site-local/assets/stylesheets/main.ec1eaa64.min.css.map +0 -1
- data/site-local/assets/stylesheets/palette.ab4e12ef.min.css +0 -1
- 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
|
-
#
|
|
181
|
-
#
|
|
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
|
|
187
|
+
unity_vendor_path: '/gem/vendor',
|
|
232
188
|
project_build_vendor_unity_path: '/build/vendor/unity/src',
|
|
233
|
-
cmock_vendor_path: '/gem/vendor
|
|
189
|
+
cmock_vendor_path: '/gem/vendor',
|
|
234
190
|
project_build_vendor_cmock_path: '/build/vendor/cmock/src',
|
|
235
|
-
cexception_vendor_path: '/gem/vendor
|
|
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:
|
|
240
|
-
project_use_partials:
|
|
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(:
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
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(:
|
|
262
|
-
expect(@file_wrapper).to have_received(:
|
|
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 "
|
|
266
|
-
|
|
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
|
-
|
|
237
|
+
synced = synced_trees { vendor( config, test_build: true ) }
|
|
276
238
|
|
|
277
|
-
expect(
|
|
278
|
-
|
|
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 "
|
|
286
|
-
|
|
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
|
-
|
|
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).
|
|
291
|
-
|
|
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 "
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
263
|
+
it "touches nothing beneath build/vendor for a command that builds nothing" do
|
|
264
|
+
vendor
|
|
304
265
|
|
|
305
|
-
expect(@file_wrapper).
|
|
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(@
|
|
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(@
|
|
361
|
-
expect(@
|
|
362
|
-
expect(@
|
|
363
|
-
expect(@
|
|
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(@
|
|
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
|
|
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:
|
|
616
|
-
|
|
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
|
|