ceedling 0.28.2 → 0.28.3
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|