diff --git a/lib/ceedling/debugger_utils.rb b/lib/ceedling/debugger_utils.rb index ec0ba84e..d1a44fd6 100644 --- a/lib/ceedling/debugger_utils.rb +++ b/lib/ceedling/debugger_utils.rb @@ -126,8 +126,9 @@ def gdb_output_collector(shell_result) # Concatenate test results from single test runs, which not crash # to create proper output for further parser - if test_output =~ /([\S]+):(\d+):([\S]+):(IGNORE|PASS|FAIL:)(.*)/ - test_output = "#{Regexp.last_match(1)}:#{Regexp.last_match(2)}:#{Regexp.last_match(3)}:#{Regexp.last_match(4)}#{Regexp.last_match(5)}" + m = test_output.match? /([\S]+):(\d+):([\S]+):(IGNORE|PASS|FAIL:)(.*)/ + if m + test_output = "#{m[1]}:#{m[2]}:#{m[3]}:#{m[4]}#{m[5]}" if test_output =~ /:PASS/ test_case_result_collector[:passed] += 1 elsif test_output =~ /:IGNORE/ @@ -137,27 +138,23 @@ def gdb_output_collector(shell_result) end else # <-- Parse Segmentatation Fault output section --> - - # Withdraw test_name from gdb output - test_name = if test_output =~ /<(.*)>/ - Regexp.last_match(1) - else - '' - end - - # Collect file_name and line in which Segmentation fault have his beginning - if test_output =~ /#{test_name}\s\(\)\sat\s(.*):(\d+)\n/ + + # Collect file_name and line in which Segmentation faulted test is beginning + m = test_output.match? /#{test_case_name}\s*\(\)\sat\s(.*):(\d+)\n/ + if m # Remove path from file_name - file_name = Regexp.last_match(1).to_s.split('/').last.split('\\').last + file_name = m[1].to_s.split('/').last.split('\\').last # Save line number - line = Regexp.last_match(2) + line = m[2] # Replace: # - '\n' by @new_line_tag to make gdb output flat # - ':' by @colon_tag to avoid test results problems # to enable parsing output for default generator_test_results regex test_output = test_output.gsub("\n", @new_line_tag).gsub(':', @colon_tag) - test_output = "#{file_name}:#{line}:#{test_name}:FAIL: #{test_output}" + test_output = "#{file_name}:#{line}:#{test_case_name}:FAIL: #{test_output}" + else + test_output = "ERR:1:#{test_case_name}:FAIL: Segmentation Fault" end # Mark test as failure diff --git a/lib/ceedling/rakefile.rb b/lib/ceedling/rakefile.rb index 38aa1017..f94a33ef 100644 --- a/lib/ceedling/rakefile.rb +++ b/lib/ceedling/rakefile.rb @@ -116,7 +116,7 @@ def test_failures_handler() @ceedling[:plugin_manager].print_plugin_failures ops_done = SystemWrapper.time_stopwatch_s() log_runtime( 'operations', start_time, ops_done, CEEDLING_APPCFG[:stopwatch] ) - test_failures_handler() if @ceedling[:task_invoker].test_invoked? + test_failures_handler() if (@ceedling[:task_invoker].test_invoked? || @ceedling[:task_invoker].invoked?(/^gcov:/)) rescue => ex ops_done = SystemWrapper.time_stopwatch_s() log_runtime( 'operations', start_time, ops_done, CEEDLING_APPCFG[:stopwatch] ) diff --git a/spec/gcov/gcov_test_cases_spec.rb b/spec/gcov/gcov_test_cases_spec.rb index f5e58580..310d0893 100644 --- a/spec/gcov/gcov_test_cases_spec.rb +++ b/spec/gcov/gcov_test_cases_spec.rb @@ -58,7 +58,7 @@ def can_test_projects_with_gcov_with_success FileUtils.cp test_asset_path("example_file.c"), 'src/' FileUtils.cp test_asset_path("test_example_file_success.c"), 'test/' - output = `bundle exec ruby -S ceedling gcov:all` + output = `bundle exec ruby -S ceedling gcov:all 2>&1` expect($?.exitstatus).to match(0) # Since a test either pass or are ignored, we return success here expect(output).to match(/TESTED:\s+\d/) expect(output).to match(/PASSED:\s+\d/) @@ -211,10 +211,10 @@ def can_create_gcov_html_report_from_crashing_test_runner_with_enabled_debug_and output_rd = File.read('./build/gcov/results/test_example_file_sigsegv.fail') expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ ) expect(output).to match(/TESTED:\s+2/) - expect(output).to match(/PASSED:\s+1/) - expect(output).to match(/FAILED:\s+1/) + expect(output).to match(/PASSED:\s+(?:0|1)/) + expect(output).to match(/FAILED:\s+(?:1|2)/) expect(output).to match(/IGNORED:\s+0/) - expect(output).to match(/example_file.c \| Lines executed:50.00% of 4/) + expect(output).to match(/example_file.c \| Lines executed:5?0.00% of 4/) expect(output).to match(/Generating HTML coverage report in 'build\/artifacts\/gcov\/gcovr'\.\.\./) expect(output).to match(/Done/) diff --git a/spec/system/deployment_spec.rb b/spec/system/deployment_spec.rb index ba42a6e2..b9ebcd25 100644 --- a/spec/system/deployment_spec.rb +++ b/spec/system/deployment_spec.rb @@ -195,7 +195,7 @@ it "should be testable" do @c.with_context do Dir.chdir "temp_sensor" do - @output = `bundle exec ruby -S ceedling test:all` + @output = `bundle exec ruby -S ceedling test:all 2>&1` expect(@output).to match(/TESTED:\s+47/) expect(@output).to match(/PASSED:\s+47/) end