ceedling 0.28.2 → 0.28.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/assets/ceedling +3 -0
- data/assets/ceedling.cmd +1 -0
- data/assets/default_gitignore +5 -0
- data/assets/project_with_guts.yml +1 -0
- data/assets/project_with_guts_gcov.yml +3 -0
- data/assets/test_example_file_verbose.c +12 -0
- data/bin/ceedling +30 -6
- data/docs/CeedlingPacket.md +135 -23
- data/docs/CeedlingPacket.odt +0 -0
- data/examples/blinky/rakefile.rb +2 -1
- data/lib/ceedling/configurator.rb +7 -5
- data/lib/ceedling/configurator_builder.rb +10 -7
- data/lib/ceedling/configurator_plugins.rb +29 -24
- data/lib/ceedling/configurator_setup.rb +0 -1
- data/lib/ceedling/defaults.rb +7 -2
- data/lib/ceedling/dependinator.rb +10 -2
- data/lib/ceedling/file_finder.rb +57 -49
- data/lib/ceedling/file_path_utils.rb +12 -4
- data/lib/ceedling/file_wrapper.rb +4 -0
- data/lib/ceedling/generator.rb +4 -3
- data/lib/ceedling/generator_test_results.rb +15 -13
- data/lib/ceedling/plugin_manager.rb +18 -18
- data/lib/ceedling/plugin_reportinator.rb +3 -2
- data/lib/ceedling/plugin_reportinator_helper.rb +2 -3
- data/lib/ceedling/preprocessinator_extractor.rb +2 -2
- data/lib/ceedling/preprocessinator_includes_handler.rb +5 -0
- data/lib/ceedling/rakefile.rb +1 -0
- data/lib/ceedling/release_invoker_helper.rb +5 -2
- data/lib/ceedling/rules_release.rake +2 -1
- data/lib/ceedling/rules_tests.rake +18 -9
- data/lib/ceedling/rules_tests_deep_dependencies.rake +2 -2
- data/lib/ceedling/task_invoker.rb +15 -3
- data/lib/ceedling/tasks_vendor.rake +3 -3
- data/lib/ceedling/test_invoker.rb +39 -12
- data/lib/ceedling/test_invoker_helper.rb +5 -1
- data/lib/ceedling/tool_executor.rb +8 -4
- data/lib/ceedling/version.rb +1 -1
- data/out.fail +21 -0
- data/plugins/beep/README.md +22 -0
- data/plugins/beep/lib/beep.rb +40 -0
- data/plugins/bullseye/bullseye.rake +43 -36
- data/plugins/bullseye/config/defaults.yml +4 -0
- data/plugins/bullseye/lib/bullseye.rb +27 -5
- data/plugins/command_hooks/lib/command_hooks.rb +3 -0
- data/plugins/gcov/README.md +34 -1
- data/plugins/gcov/config/defaults.yml +3 -3
- data/plugins/gcov/gcov.rake +7 -5
- data/plugins/gcov/lib/gcov.rb +3 -1
- data/plugins/gcov/lib/gcov_constants.rb +2 -0
- data/plugins/junit_tests_report/lib/junit_tests_report.rb +12 -9
- data/plugins/module_generator/lib/module_generator.rb +14 -1
- data/plugins/module_generator/module_generator.rake +21 -4
- data/plugins/raw_output_report/lib/raw_output_report.rb +41 -0
- data/spec/gcov/gcov_deployment_spec.rb +1 -1
- data/spec/gcov/gcov_test_cases_spec.rb +2 -2
- data/spec/generator_test_results_spec.rb +5 -0
- data/spec/preprocessinator_includes_handler_spec.rb +1 -0
- data/spec/spec_system_helper.rb +178 -4
- data/spec/support/test_example.fail +1 -0
- data/spec/support/test_example.pass +1 -0
- data/spec/support/test_example_empty.pass +1 -0
- data/spec/support/test_example_ignore.pass +1 -0
- data/spec/support/test_example_mangled.pass +1 -0
- data/spec/support/test_example_with_time.pass +22 -0
- data/spec/system/deployment_spec.rb +33 -0
- data/vendor/cmock/README.md +4 -3
- data/vendor/cmock/docs/CMock_Summary.md +1 -1
- data/vendor/cmock/lib/cmock_config.rb +4 -0
- data/vendor/cmock/lib/cmock_generator.rb +5 -2
- data/vendor/cmock/lib/cmock_generator_plugin_array.rb +4 -4
- data/vendor/cmock/lib/cmock_generator_plugin_callback.rb +9 -11
- data/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +0 -1
- data/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +2 -3
- data/vendor/cmock/lib/cmock_generator_plugin_ignore_arg.rb +2 -4
- data/vendor/cmock/lib/cmock_generator_plugin_return_thru_ptr.rb +0 -2
- data/vendor/cmock/lib/cmock_generator_utils.rb +16 -3
- data/vendor/cmock/lib/cmock_header_parser.rb +59 -34
- data/vendor/cmock/release/build.info +1 -1
- data/vendor/cmock/release/version.info +1 -1
- data/vendor/cmock/scripts/create_makefile.rb +17 -2
- data/vendor/cmock/src/cmock.c +13 -7
- data/vendor/cmock/test/test_helper.rb +11 -10
- data/vendor/cmock/test/unit/cmock_config_test.rb +4 -2
- data/vendor/cmock/test/unit/cmock_generator_main_test.rb +10 -4
- data/vendor/cmock/test/unit/cmock_generator_plugin_array_test.rb +20 -12
- data/vendor/cmock/test/unit/cmock_generator_plugin_expect_a_test.rb +2 -2
- data/vendor/cmock/test/unit/cmock_generator_plugin_expect_b_test.rb +2 -2
- data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_arg_test.rb +3 -3
- data/vendor/cmock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb +8 -6
- data/vendor/cmock/test/unit/cmock_generator_utils_test.rb +27 -10
- data/vendor/cmock/test/unit/cmock_header_parser_test.rb +108 -20
- data/vendor/cmock/vendor/c_exception/Gemfile +4 -0
- data/vendor/cmock/vendor/c_exception/Gemfile.lock +12 -0
- data/vendor/cmock/vendor/c_exception/LICENSE.txt +30 -0
- data/vendor/cmock/vendor/c_exception/README.md +162 -0
- data/vendor/cmock/vendor/c_exception/Rakefile +42 -0
- data/vendor/cmock/vendor/c_exception/docs/CException.md +292 -0
- data/vendor/cmock/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md +207 -0
- data/vendor/cmock/vendor/c_exception/lib/CException.c +46 -0
- data/vendor/cmock/vendor/c_exception/lib/CException.h +110 -0
- data/vendor/cmock/vendor/c_exception/makefile +24 -0
- data/vendor/cmock/vendor/c_exception/release/build.info +2 -0
- data/vendor/cmock/vendor/c_exception/release/version.info +2 -0
- data/vendor/cmock/vendor/c_exception/test/CExceptionConfig.h +46 -0
- data/vendor/cmock/vendor/c_exception/test/TestException.c +391 -0
- data/vendor/cmock/vendor/c_exception/test/TestException_Runner.c +67 -0
- data/vendor/cmock/vendor/unity/README.md +231 -0
- data/vendor/cmock/vendor/unity/auto/colour_prompt.rb +118 -0
- data/vendor/cmock/vendor/unity/auto/colour_reporter.rb +39 -0
- data/vendor/cmock/vendor/unity/auto/generate_config.yml +36 -0
- data/vendor/cmock/vendor/unity/auto/generate_module.rb +308 -0
- data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +457 -0
- data/vendor/cmock/vendor/unity/auto/parse_output.rb +323 -0
- data/vendor/cmock/vendor/unity/auto/stylize_as_junit.rb +252 -0
- data/vendor/cmock/vendor/unity/auto/test_file_filter.rb +25 -0
- data/vendor/cmock/vendor/unity/auto/type_sanitizer.rb +6 -0
- data/vendor/cmock/vendor/unity/auto/unity_test_summary.py +139 -0
- data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +136 -0
- data/vendor/cmock/vendor/unity/auto/unity_to_junit.py +146 -0
- data/vendor/cmock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +206 -0
- data/vendor/cmock/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf +0 -0
- data/vendor/cmock/vendor/unity/docs/UnityAssertionsReference.md +779 -0
- data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +433 -0
- data/vendor/cmock/vendor/unity/docs/UnityGettingStartedGuide.md +192 -0
- data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +260 -0
- data/vendor/cmock/vendor/unity/docs/license.txt +21 -0
- data/vendor/cmock/vendor/unity/examples/example_1/makefile +71 -0
- data/vendor/cmock/vendor/unity/examples/example_1/readme.txt +5 -0
- data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.c +24 -0
- data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.h +3 -0
- data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.c +11 -0
- data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.h +2 -0
- data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode.c +62 -0
- data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode2.c +31 -0
- data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
- data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
- data/vendor/cmock/vendor/unity/examples/example_2/makefile +70 -0
- data/vendor/cmock/vendor/unity/examples/example_2/readme.txt +5 -0
- data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.c +24 -0
- data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.h +3 -0
- data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.c +11 -0
- data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.h +2 -0
- data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode.c +64 -0
- data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode2.c +33 -0
- data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +9 -0
- data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +11 -0
- data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/all_tests.c +12 -0
- data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.c +10 -0
- data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.h +12 -0
- data/vendor/cmock/vendor/unity/examples/example_3/rakefile.rb +43 -0
- data/vendor/cmock/vendor/unity/examples/example_3/rakefile_helper.rb +249 -0
- data/vendor/cmock/vendor/unity/examples/example_3/readme.txt +13 -0
- data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.c +24 -0
- data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.h +3 -0
- data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.c +11 -0
- data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.h +2 -0
- data/vendor/cmock/vendor/unity/examples/example_3/target_gcc_32.yml +46 -0
- data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode.c +62 -0
- data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode2.c +31 -0
- data/vendor/cmock/vendor/unity/examples/unity_config.h +247 -0
- data/vendor/cmock/vendor/unity/extras/eclipse/error_parsers.txt +26 -0
- data/vendor/cmock/vendor/unity/extras/fixture/rakefile.rb +48 -0
- data/vendor/cmock/vendor/unity/extras/fixture/rakefile_helper.rb +178 -0
- data/vendor/cmock/vendor/unity/extras/fixture/readme.txt +9 -0
- data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.c +436 -0
- data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.h +83 -0
- data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_internals.h +51 -0
- data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_malloc_overrides.h +47 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/Makefile +75 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/main/AllTests.c +22 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/template_fixture_tests.c +39 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_Test.c +543 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +57 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/unity_output_Spy.c +57 -0
- data/vendor/cmock/vendor/unity/extras/fixture/test/unity_output_Spy.h +17 -0
- data/vendor/cmock/vendor/unity/release/build.info +2 -0
- data/vendor/cmock/vendor/unity/release/version.info +2 -0
- data/vendor/cmock/vendor/unity/src/unity.c +1572 -0
- data/vendor/cmock/vendor/unity/src/unity.h +503 -0
- data/vendor/cmock/vendor/unity/src/unity_internals.h +924 -0
- data/vendor/cmock/vendor/unity/test/Makefile +68 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_cmd.c +61 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_def.c +57 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.c +55 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.h +15 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_cmd.c +80 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_def.c +76 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.c +75 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.h +13 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new1.c +89 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new2.c +89 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_param.c +77 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run1.c +89 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run2.c +89 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_yaml.c +90 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_new1.c +67 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_new2.c +70 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_param.c +58 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_run1.c +67 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_run2.c +70 -0
- data/vendor/cmock/vendor/unity/test/expectdata/testsample_yaml.c +71 -0
- data/vendor/cmock/vendor/unity/test/rakefile +125 -0
- data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +260 -0
- data/vendor/cmock/vendor/unity/test/spec/generate_module_existing_file_spec.rb +158 -0
- data/vendor/cmock/vendor/unity/test/targets/clang_file.yml +78 -0
- data/vendor/cmock/vendor/unity/test/targets/clang_strict.yml +78 -0
- data/vendor/cmock/vendor/unity/test/targets/gcc_32.yml +49 -0
- data/vendor/cmock/vendor/unity/test/targets/gcc_64.yml +50 -0
- data/vendor/cmock/vendor/unity/test/targets/gcc_auto_limits.yml +47 -0
- data/vendor/cmock/vendor/unity/test/targets/gcc_auto_stdint.yml +59 -0
- data/vendor/cmock/vendor/unity/test/targets/gcc_manual_math.yml +47 -0
- data/vendor/cmock/vendor/unity/test/targets/hitech_picc18.yml +101 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_arm_v4.yml +90 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5.yml +80 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5_3.yml +80 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +94 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_cortexm3_v5.yml +84 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_msp430.yml +95 -0
- data/vendor/cmock/vendor/unity/test/targets/iar_sh2a_v6.yml +86 -0
- data/vendor/cmock/vendor/unity/test/testdata/CException.h +11 -0
- data/vendor/cmock/vendor/unity/test/testdata/Defs.h +8 -0
- data/vendor/cmock/vendor/unity/test/testdata/cmock.h +14 -0
- data/vendor/cmock/vendor/unity/test/testdata/mockMock.h +13 -0
- data/vendor/cmock/vendor/unity/test/testdata/testRunnerGenerator.c +186 -0
- data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +70 -0
- data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +195 -0
- data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +1252 -0
- data/vendor/cmock/vendor/unity/test/tests/testparameterized.c +113 -0
- data/vendor/cmock/vendor/unity/test/tests/testunity.c +5371 -0
- data/vendor/unity/auto/generate_test_runner.rb +30 -10
- data/vendor/unity/auto/parse_output.rb +212 -109
- data/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +9 -10
- data/vendor/unity/docs/UnityAssertionsReference.md +11 -2
- data/vendor/unity/docs/UnityConfigurationGuide.md +90 -55
- data/vendor/unity/docs/UnityGettingStartedGuide.md +6 -5
- data/vendor/unity/docs/UnityHelperScriptsGuide.md +23 -5
- data/vendor/unity/examples/unity_config.h +8 -0
- data/vendor/unity/extras/fixture/src/unity_fixture.c +4 -0
- data/vendor/unity/extras/fixture/src/unity_fixture.h +1 -1
- data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
- data/vendor/unity/release/build.info +1 -1
- data/vendor/unity/release/version.info +1 -1
- data/vendor/unity/src/unity.c +64 -57
- data/vendor/unity/src/unity.h +111 -7
- data/vendor/unity/src/unity_internals.h +173 -73
- data/vendor/unity/test/Makefile +5 -1
- data/vendor/unity/test/testdata/testRunnerGenerator.c +4 -1
- data/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +4 -1
- data/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +4 -1
- data/vendor/unity/test/tests/testparameterized.c +5 -2
- data/vendor/unity/test/tests/testunity.c +34 -0
- metadata +150 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# ==========================================
|
|
2
|
+
# Unity Project - A Test Framework for C
|
|
3
|
+
# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
|
|
4
|
+
# [Released under MIT License. Please refer to license.txt for details]
|
|
5
|
+
# ==========================================
|
|
6
|
+
|
|
7
|
+
require'yaml'
|
|
8
|
+
|
|
9
|
+
module RakefileHelpers
|
|
10
|
+
class TestFileFilter
|
|
11
|
+
def initialize(all_files = false)
|
|
12
|
+
@all_files = all_files
|
|
13
|
+
|
|
14
|
+
return false unless @all_files
|
|
15
|
+
return false unless File.exist?('test_file_filter.yml')
|
|
16
|
+
|
|
17
|
+
filters = YAML.load_file('test_file_filter.yml')
|
|
18
|
+
@all_files = filters[:all_files]
|
|
19
|
+
@only_files = filters[:only_files]
|
|
20
|
+
@exclude_files = filters[:exclude_files]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_accessor :all_files, :only_files, :exclude_files
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#! python3
|
|
2
|
+
# ==========================================
|
|
3
|
+
# Unity Project - A Test Framework for C
|
|
4
|
+
# Copyright (c) 2015 Alexander Mueller / XelaRellum@web.de
|
|
5
|
+
# [Released under MIT License. Please refer to license.txt for details]
|
|
6
|
+
# Based on the ruby script by Mike Karlesky, Mark VanderVoord, Greg Williams
|
|
7
|
+
# ==========================================
|
|
8
|
+
import sys
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
from glob import glob
|
|
12
|
+
|
|
13
|
+
class UnityTestSummary:
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.report = ''
|
|
16
|
+
self.total_tests = 0
|
|
17
|
+
self.failures = 0
|
|
18
|
+
self.ignored = 0
|
|
19
|
+
|
|
20
|
+
def run(self):
|
|
21
|
+
# Clean up result file names
|
|
22
|
+
results = []
|
|
23
|
+
for target in self.targets:
|
|
24
|
+
results.append(target.replace('\\', '/'))
|
|
25
|
+
|
|
26
|
+
# Dig through each result file, looking for details on pass/fail:
|
|
27
|
+
failure_output = []
|
|
28
|
+
ignore_output = []
|
|
29
|
+
|
|
30
|
+
for result_file in results:
|
|
31
|
+
lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n')))
|
|
32
|
+
if len(lines) == 0:
|
|
33
|
+
raise Exception("Empty test result file: %s" % result_file)
|
|
34
|
+
|
|
35
|
+
details = self.get_details(result_file, lines)
|
|
36
|
+
failures = details['failures']
|
|
37
|
+
ignores = details['ignores']
|
|
38
|
+
if len(failures) > 0: failure_output.append('\n'.join(failures))
|
|
39
|
+
if len(ignores) > 0: ignore_output.append('n'.join(ignores))
|
|
40
|
+
tests,failures,ignored = self.parse_test_summary('\n'.join(lines))
|
|
41
|
+
self.total_tests += tests
|
|
42
|
+
self.failures += failures
|
|
43
|
+
self.ignored += ignored
|
|
44
|
+
|
|
45
|
+
if self.ignored > 0:
|
|
46
|
+
self.report += "\n"
|
|
47
|
+
self.report += "--------------------------\n"
|
|
48
|
+
self.report += "UNITY IGNORED TEST SUMMARY\n"
|
|
49
|
+
self.report += "--------------------------\n"
|
|
50
|
+
self.report += "\n".join(ignore_output)
|
|
51
|
+
|
|
52
|
+
if self.failures > 0:
|
|
53
|
+
self.report += "\n"
|
|
54
|
+
self.report += "--------------------------\n"
|
|
55
|
+
self.report += "UNITY FAILED TEST SUMMARY\n"
|
|
56
|
+
self.report += "--------------------------\n"
|
|
57
|
+
self.report += '\n'.join(failure_output)
|
|
58
|
+
|
|
59
|
+
self.report += "\n"
|
|
60
|
+
self.report += "--------------------------\n"
|
|
61
|
+
self.report += "OVERALL UNITY TEST SUMMARY\n"
|
|
62
|
+
self.report += "--------------------------\n"
|
|
63
|
+
self.report += "{total_tests} TOTAL TESTS {failures} TOTAL FAILURES {ignored} IGNORED\n".format(total_tests = self.total_tests, failures=self.failures, ignored=self.ignored)
|
|
64
|
+
self.report += "\n"
|
|
65
|
+
|
|
66
|
+
return self.report
|
|
67
|
+
|
|
68
|
+
def set_targets(self, target_array):
|
|
69
|
+
self.targets = target_array
|
|
70
|
+
|
|
71
|
+
def set_root_path(self, path):
|
|
72
|
+
self.root = path
|
|
73
|
+
|
|
74
|
+
def usage(self, err_msg=None):
|
|
75
|
+
print("\nERROR: ")
|
|
76
|
+
if err_msg:
|
|
77
|
+
print(err_msg)
|
|
78
|
+
print("\nUsage: unity_test_summary.py result_file_directory/ root_path/")
|
|
79
|
+
print(" result_file_directory - The location of your results files.")
|
|
80
|
+
print(" Defaults to current directory if not specified.")
|
|
81
|
+
print(" Should end in / if specified.")
|
|
82
|
+
print(" root_path - Helpful for producing more verbose output if using relative paths.")
|
|
83
|
+
sys.exit(1)
|
|
84
|
+
|
|
85
|
+
def get_details(self, result_file, lines):
|
|
86
|
+
results = { 'failures': [], 'ignores': [], 'successes': [] }
|
|
87
|
+
for line in lines:
|
|
88
|
+
parts = line.split(':')
|
|
89
|
+
if len(parts) == 5:
|
|
90
|
+
src_file,src_line,test_name,status,msg = parts
|
|
91
|
+
elif len(parts) == 4:
|
|
92
|
+
src_file,src_line,test_name,status = parts
|
|
93
|
+
msg = ''
|
|
94
|
+
else:
|
|
95
|
+
continue
|
|
96
|
+
if len(self.root) > 0:
|
|
97
|
+
line_out = "%s%s" % (self.root, line)
|
|
98
|
+
else:
|
|
99
|
+
line_out = line
|
|
100
|
+
if status == 'IGNORE':
|
|
101
|
+
results['ignores'].append(line_out)
|
|
102
|
+
elif status == 'FAIL':
|
|
103
|
+
results['failures'].append(line_out)
|
|
104
|
+
elif status == 'PASS':
|
|
105
|
+
results['successes'].append(line_out)
|
|
106
|
+
return results
|
|
107
|
+
|
|
108
|
+
def parse_test_summary(self, summary):
|
|
109
|
+
m = re.search(r"([0-9]+) Tests ([0-9]+) Failures ([0-9]+) Ignored", summary)
|
|
110
|
+
if not m:
|
|
111
|
+
raise Exception("Couldn't parse test results: %s" % summary)
|
|
112
|
+
|
|
113
|
+
return int(m.group(1)), int(m.group(2)), int(m.group(3))
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == '__main__':
|
|
117
|
+
uts = UnityTestSummary()
|
|
118
|
+
try:
|
|
119
|
+
#look in the specified or current directory for result files
|
|
120
|
+
if len(sys.argv) > 1:
|
|
121
|
+
targets_dir = sys.argv[1]
|
|
122
|
+
else:
|
|
123
|
+
targets_dir = './'
|
|
124
|
+
targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*')))
|
|
125
|
+
if len(targets) == 0:
|
|
126
|
+
raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir)
|
|
127
|
+
uts.set_targets(targets)
|
|
128
|
+
|
|
129
|
+
#set the root path
|
|
130
|
+
if len(sys.argv) > 2:
|
|
131
|
+
root_path = sys.argv[2]
|
|
132
|
+
else:
|
|
133
|
+
root_path = os.path.split(__file__)[0]
|
|
134
|
+
uts.set_root_path(root_path)
|
|
135
|
+
|
|
136
|
+
#run the summarizer
|
|
137
|
+
print(uts.run())
|
|
138
|
+
except Exception as e:
|
|
139
|
+
uts.usage(e)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# ==========================================
|
|
2
|
+
# Unity Project - A Test Framework for C
|
|
3
|
+
# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
|
|
4
|
+
# [Released under MIT License. Please refer to license.txt for details]
|
|
5
|
+
# ==========================================
|
|
6
|
+
|
|
7
|
+
# !/usr/bin/ruby
|
|
8
|
+
#
|
|
9
|
+
# unity_test_summary.rb
|
|
10
|
+
#
|
|
11
|
+
require 'fileutils'
|
|
12
|
+
require 'set'
|
|
13
|
+
|
|
14
|
+
class UnityTestSummary
|
|
15
|
+
include FileUtils::Verbose
|
|
16
|
+
|
|
17
|
+
attr_reader :report, :total_tests, :failures, :ignored
|
|
18
|
+
attr_writer :targets, :root
|
|
19
|
+
|
|
20
|
+
def initialize(_opts = {})
|
|
21
|
+
@report = ''
|
|
22
|
+
@total_tests = 0
|
|
23
|
+
@failures = 0
|
|
24
|
+
@ignored = 0
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def run
|
|
28
|
+
# Clean up result file names
|
|
29
|
+
results = @targets.map { |target| target.tr('\\', '/') }
|
|
30
|
+
|
|
31
|
+
# Dig through each result file, looking for details on pass/fail:
|
|
32
|
+
failure_output = []
|
|
33
|
+
ignore_output = []
|
|
34
|
+
|
|
35
|
+
results.each do |result_file|
|
|
36
|
+
lines = File.readlines(result_file).map(&:chomp)
|
|
37
|
+
|
|
38
|
+
raise "Empty test result file: #{result_file}" if lines.empty?
|
|
39
|
+
|
|
40
|
+
output = get_details(result_file, lines)
|
|
41
|
+
failure_output << output[:failures] unless output[:failures].empty?
|
|
42
|
+
ignore_output << output[:ignores] unless output[:ignores].empty?
|
|
43
|
+
tests, failures, ignored = parse_test_summary(lines)
|
|
44
|
+
@total_tests += tests
|
|
45
|
+
@failures += failures
|
|
46
|
+
@ignored += ignored
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if @ignored > 0
|
|
50
|
+
@report += "\n"
|
|
51
|
+
@report += "--------------------------\n"
|
|
52
|
+
@report += "UNITY IGNORED TEST SUMMARY\n"
|
|
53
|
+
@report += "--------------------------\n"
|
|
54
|
+
@report += ignore_output.flatten.join("\n")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if @failures > 0
|
|
58
|
+
@report += "\n"
|
|
59
|
+
@report += "--------------------------\n"
|
|
60
|
+
@report += "UNITY FAILED TEST SUMMARY\n"
|
|
61
|
+
@report += "--------------------------\n"
|
|
62
|
+
@report += failure_output.flatten.join("\n")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@report += "\n"
|
|
66
|
+
@report += "--------------------------\n"
|
|
67
|
+
@report += "OVERALL UNITY TEST SUMMARY\n"
|
|
68
|
+
@report += "--------------------------\n"
|
|
69
|
+
@report += "#{@total_tests} TOTAL TESTS #{@failures} TOTAL FAILURES #{@ignored} IGNORED\n"
|
|
70
|
+
@report += "\n"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def usage(err_msg = nil)
|
|
74
|
+
puts "\nERROR: "
|
|
75
|
+
puts err_msg if err_msg
|
|
76
|
+
puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/"
|
|
77
|
+
puts ' result_file_directory - The location of your results files.'
|
|
78
|
+
puts ' Defaults to current directory if not specified.'
|
|
79
|
+
puts ' Should end in / if specified.'
|
|
80
|
+
puts ' root_path - Helpful for producing more verbose output if using relative paths.'
|
|
81
|
+
exit 1
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
protected
|
|
85
|
+
|
|
86
|
+
def get_details(_result_file, lines)
|
|
87
|
+
results = { failures: [], ignores: [], successes: [] }
|
|
88
|
+
lines.each do |line|
|
|
89
|
+
_src_file, _src_line, _test_name, status, _msg = line.split(/:/)
|
|
90
|
+
line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\')
|
|
91
|
+
case status
|
|
92
|
+
when 'IGNORE' then results[:ignores] << line_out
|
|
93
|
+
when 'FAIL' then results[:failures] << line_out
|
|
94
|
+
when 'PASS' then results[:successes] << line_out
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
results
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def parse_test_summary(summary)
|
|
101
|
+
raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ }
|
|
102
|
+
[Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def here
|
|
106
|
+
File.expand_path(File.dirname(__FILE__))
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
if $0 == __FILE__
|
|
111
|
+
|
|
112
|
+
# parse out the command options
|
|
113
|
+
opts, args = ARGV.partition { |v| v =~ /^--\w+/ }
|
|
114
|
+
opts.map! { |v| v[2..-1].to_sym }
|
|
115
|
+
|
|
116
|
+
# create an instance to work with
|
|
117
|
+
uts = UnityTestSummary.new(opts)
|
|
118
|
+
|
|
119
|
+
begin
|
|
120
|
+
# look in the specified or current directory for result files
|
|
121
|
+
args[0] ||= './'
|
|
122
|
+
targets = "#{ARGV[0].tr('\\', '/')}**/*.test*"
|
|
123
|
+
results = Dir[targets]
|
|
124
|
+
raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty?
|
|
125
|
+
uts.targets = results
|
|
126
|
+
|
|
127
|
+
# set the root path
|
|
128
|
+
args[1] ||= Dir.pwd + '/'
|
|
129
|
+
uts.root = ARGV[1]
|
|
130
|
+
|
|
131
|
+
# run the summarizer
|
|
132
|
+
puts uts.run
|
|
133
|
+
rescue StandardError => e
|
|
134
|
+
uts.usage e.message
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
from glob import glob
|
|
4
|
+
|
|
5
|
+
from pyparsing import *
|
|
6
|
+
from junit_xml import TestSuite, TestCase
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class UnityTestSummary:
|
|
10
|
+
def __init__(self):
|
|
11
|
+
self.report = ''
|
|
12
|
+
self.total_tests = 0
|
|
13
|
+
self.failures = 0
|
|
14
|
+
self.ignored = 0
|
|
15
|
+
self.targets = 0
|
|
16
|
+
self.root = None
|
|
17
|
+
self.test_suites = dict()
|
|
18
|
+
|
|
19
|
+
def run(self):
|
|
20
|
+
# Clean up result file names
|
|
21
|
+
results = []
|
|
22
|
+
for target in self.targets:
|
|
23
|
+
results.append(target.replace('\\', '/'))
|
|
24
|
+
|
|
25
|
+
# Dig through each result file, looking for details on pass/fail:
|
|
26
|
+
for result_file in results:
|
|
27
|
+
lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n')))
|
|
28
|
+
if len(lines) == 0:
|
|
29
|
+
raise Exception("Empty test result file: %s" % result_file)
|
|
30
|
+
|
|
31
|
+
# define an expression for your file reference
|
|
32
|
+
entry_one = Combine(
|
|
33
|
+
oneOf(list(alphas)) + ':/' +
|
|
34
|
+
Word(alphanums + '_-./'))
|
|
35
|
+
|
|
36
|
+
entry_two = Word(printables + ' ', excludeChars=':')
|
|
37
|
+
entry = entry_one | entry_two
|
|
38
|
+
|
|
39
|
+
delimiter = Literal(':').suppress()
|
|
40
|
+
tc_result_line = Group(entry.setResultsName('tc_file_name') + delimiter + entry.setResultsName(
|
|
41
|
+
'tc_line_nr') + delimiter + entry.setResultsName('tc_name') + delimiter + entry.setResultsName(
|
|
42
|
+
'tc_status') + Optional(
|
|
43
|
+
delimiter + entry.setResultsName('tc_msg'))).setResultsName("tc_line")
|
|
44
|
+
|
|
45
|
+
eol = LineEnd().suppress()
|
|
46
|
+
sol = LineStart().suppress()
|
|
47
|
+
blank_line = sol + eol
|
|
48
|
+
|
|
49
|
+
tc_summary_line = Group(Word(nums).setResultsName("num_of_tests") + "Tests" + Word(nums).setResultsName(
|
|
50
|
+
"num_of_fail") + "Failures" + Word(nums).setResultsName("num_of_ignore") + "Ignored").setResultsName(
|
|
51
|
+
"tc_summary")
|
|
52
|
+
tc_end_line = Or(Literal("FAIL"), Literal('Ok')).setResultsName("tc_result")
|
|
53
|
+
|
|
54
|
+
# run it and see...
|
|
55
|
+
pp1 = tc_result_line | Optional(tc_summary_line | tc_end_line)
|
|
56
|
+
pp1.ignore(blank_line | OneOrMore("-"))
|
|
57
|
+
|
|
58
|
+
result = list()
|
|
59
|
+
for l in lines:
|
|
60
|
+
result.append((pp1.parseString(l)).asDict())
|
|
61
|
+
# delete empty results
|
|
62
|
+
result = filter(None, result)
|
|
63
|
+
|
|
64
|
+
tc_list = list()
|
|
65
|
+
for r in result:
|
|
66
|
+
if 'tc_line' in r:
|
|
67
|
+
tmp_tc_line = r['tc_line']
|
|
68
|
+
|
|
69
|
+
# get only the file name which will be used as the classname
|
|
70
|
+
file_name = tmp_tc_line['tc_file_name'].split('\\').pop().split('/').pop().rsplit('.', 1)[0]
|
|
71
|
+
tmp_tc = TestCase(name=tmp_tc_line['tc_name'], classname=file_name)
|
|
72
|
+
if 'tc_status' in tmp_tc_line:
|
|
73
|
+
if str(tmp_tc_line['tc_status']) == 'IGNORE':
|
|
74
|
+
if 'tc_msg' in tmp_tc_line:
|
|
75
|
+
tmp_tc.add_skipped_info(message=tmp_tc_line['tc_msg'],
|
|
76
|
+
output=r'[File]={0}, [Line]={1}'.format(
|
|
77
|
+
tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr']))
|
|
78
|
+
else:
|
|
79
|
+
tmp_tc.add_skipped_info(message=" ")
|
|
80
|
+
elif str(tmp_tc_line['tc_status']) == 'FAIL':
|
|
81
|
+
if 'tc_msg' in tmp_tc_line:
|
|
82
|
+
tmp_tc.add_failure_info(message=tmp_tc_line['tc_msg'],
|
|
83
|
+
output=r'[File]={0}, [Line]={1}'.format(
|
|
84
|
+
tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr']))
|
|
85
|
+
else:
|
|
86
|
+
tmp_tc.add_failure_info(message=" ")
|
|
87
|
+
|
|
88
|
+
tc_list.append((str(result_file), tmp_tc))
|
|
89
|
+
|
|
90
|
+
for k, v in tc_list:
|
|
91
|
+
try:
|
|
92
|
+
self.test_suites[k].append(v)
|
|
93
|
+
except KeyError:
|
|
94
|
+
self.test_suites[k] = [v]
|
|
95
|
+
ts = []
|
|
96
|
+
for suite_name in self.test_suites:
|
|
97
|
+
ts.append(TestSuite(suite_name, self.test_suites[suite_name]))
|
|
98
|
+
|
|
99
|
+
with open('result.xml', 'w') as f:
|
|
100
|
+
TestSuite.to_file(f, ts, prettyprint='True', encoding='utf-8')
|
|
101
|
+
|
|
102
|
+
return self.report
|
|
103
|
+
|
|
104
|
+
def set_targets(self, target_array):
|
|
105
|
+
self.targets = target_array
|
|
106
|
+
|
|
107
|
+
def set_root_path(self, path):
|
|
108
|
+
self.root = path
|
|
109
|
+
|
|
110
|
+
@staticmethod
|
|
111
|
+
def usage(err_msg=None):
|
|
112
|
+
print("\nERROR: ")
|
|
113
|
+
if err_msg:
|
|
114
|
+
print(err_msg)
|
|
115
|
+
print("\nUsage: unity_test_summary.py result_file_directory/ root_path/")
|
|
116
|
+
print(" result_file_directory - The location of your results files.")
|
|
117
|
+
print(" Defaults to current directory if not specified.")
|
|
118
|
+
print(" Should end in / if specified.")
|
|
119
|
+
print(" root_path - Helpful for producing more verbose output if using relative paths.")
|
|
120
|
+
sys.exit(1)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
if __name__ == '__main__':
|
|
124
|
+
uts = UnityTestSummary()
|
|
125
|
+
try:
|
|
126
|
+
# look in the specified or current directory for result files
|
|
127
|
+
if len(sys.argv) > 1:
|
|
128
|
+
targets_dir = sys.argv[1]
|
|
129
|
+
else:
|
|
130
|
+
targets_dir = './'
|
|
131
|
+
targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*')))
|
|
132
|
+
if len(targets) == 0:
|
|
133
|
+
raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir)
|
|
134
|
+
uts.set_targets(targets)
|
|
135
|
+
|
|
136
|
+
# set the root path
|
|
137
|
+
if len(sys.argv) > 2:
|
|
138
|
+
root_path = sys.argv[2]
|
|
139
|
+
else:
|
|
140
|
+
root_path = os.path.split(__file__)[0]
|
|
141
|
+
uts.set_root_path(root_path)
|
|
142
|
+
|
|
143
|
+
# run the summarizer
|
|
144
|
+
print(uts.run())
|
|
145
|
+
except Exception as e:
|
|
146
|
+
UnityTestSummary.usage(e)
|