Skip to content

Commit d455d0f

Browse files
committed
[UT] Add unit tests to cover extended debugger
Add UT to cover: - collect test_case results from crashing file and other files - collect test_case result filtered by --test_case from crashing file - collect test_case result filtered by --exclude_test_case from crashing file
1 parent 4223365 commit d455d0f

7 files changed

Lines changed: 297 additions & 4 deletions

File tree

assets/example_file.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@
33
int add_numbers(int a, int b) {
44
return a + b;
55
}
6+
7+
int difference_between_numbers(int a, int b) {
8+
return a - b;
9+
}

assets/example_file.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33

44
int add_numbers(int a, int b);
55

6+
int difference_between_numbers(int a, int b);
7+
68
#endif /* EXAMPLE_FILE_H */

spec/gcov/gcov_deployment_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
it { can_test_projects_with_gcov_with_compile_error }
3333
it { can_fetch_project_help_for_gcov }
3434
it { can_create_html_report }
35+
it { can_create_gcov_html_report_from_crashing_test_runner_with_enabled_debug_and_cmd_args_set_to_true_for_test_cases_not_causing_crash }
36+
it { can_create_gcov_html_report_from_crashing_test_runner_with_enabled_debug_and_cmd_args_set_to_true_with_zero_coverage }
37+
it { can_create_gcov_html_report_from_test_runner_with_enabled_debug_and_cmd_args_set_to_true_with_100_coverage_when_excluding_crashing_test_case }
3538
end
3639

3740

spec/gcov/gcov_test_cases_spec.rb

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,147 @@ def can_create_html_report
194194
end
195195
end
196196
end
197+
198+
def can_create_gcov_html_report_from_crashing_test_runner_with_enabled_debug_and_cmd_args_set_to_true_for_test_cases_not_causing_crash
199+
@c.with_context do
200+
Dir.chdir @proj_name do
201+
FileUtils.cp test_asset_path("example_file.h"), 'src/'
202+
FileUtils.cp test_asset_path("example_file.c"), 'src/'
203+
FileUtils.cp test_asset_path("test_example_file_sigsegv.c"), 'test/'
204+
FileUtils.cp test_asset_path("project_with_guts_gcov.yml"), 'project.yml'
205+
206+
add_line = false
207+
updated_prj_yml = []
208+
File.read('project.yml').split("\n").each do |line|
209+
if line =~ /\:project\:/
210+
add_line = true
211+
updated_prj_yml.append(line)
212+
else
213+
if add_line
214+
updated_prj_yml.append(' :use_backtrace_gdb_reporter: TRUE')
215+
add_line = false
216+
end
217+
updated_prj_yml.append(line)
218+
end
219+
end
220+
enable_unity_extra_args = "\n:test_runner:\n"\
221+
" :cmdline_args: true\n"
222+
223+
updated_prj_yml.insert(updated_prj_yml.length() -1, enable_unity_extra_args)
224+
225+
File.write('project.yml', updated_prj_yml.join("\n"), mode: 'w')
226+
227+
output = `bundle exec ruby -S ceedling gcov:all 2>&1`
228+
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
229+
gcov_html_report = `bundle exec ruby -S ceedling utils:gcov 2>&1`
230+
expect($?.exitstatus).to match(0)
231+
expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
232+
expect(output).to match(/Unit test failures./)
233+
expect(File.exist?('./build/gcov/results/test_example_file_sigsegv.fail'))
234+
output_rd = File.read('./build/gcov/results/test_example_file_sigsegv.fail')
235+
expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ )
236+
expect(output).to match(/TESTED:\s+2/)
237+
expect(output).to match(/PASSED:\s+1/)
238+
expect(output).to match(/FAILED:\s+1/)
239+
expect(output).to match(/IGNORED:\s+0/)
240+
expect(output).to match(/example_file.c Lines executed:50.00% of 4/)
241+
242+
expect(gcov_html_report).to match(/Creating gcov results report\(s\) in 'build\/artifacts\/gcov'\.\.\. Done/)
243+
expect(File.exist?('build/artifacts/gcov/GcovCoverageResults.html')).to eq true
244+
end
245+
end
246+
end
247+
248+
def can_create_gcov_html_report_from_crashing_test_runner_with_enabled_debug_and_cmd_args_set_to_true_with_zero_coverage
249+
@c.with_context do
250+
Dir.chdir @proj_name do
251+
FileUtils.cp test_asset_path("example_file.h"), 'src/'
252+
FileUtils.cp test_asset_path("example_file.c"), 'src/'
253+
FileUtils.cp test_asset_path("test_example_file_sigsegv.c"), 'test/'
254+
FileUtils.cp test_asset_path("project_with_guts_gcov.yml"), 'project.yml'
255+
256+
add_line = false
257+
updated_prj_yml = []
258+
File.read('project.yml').split("\n").each do |line|
259+
if line =~ /\:project\:/
260+
add_line = true
261+
updated_prj_yml.append(line)
262+
else
263+
if add_line
264+
updated_prj_yml.append(' :use_backtrace_gdb_reporter: TRUE')
265+
add_line = false
266+
end
267+
updated_prj_yml.append(line)
268+
end
269+
end
270+
enable_unity_extra_args = "\n:test_runner:\n"\
271+
" :cmdline_args: true\n"
272+
273+
updated_prj_yml.insert(updated_prj_yml.length() -1, enable_unity_extra_args)
274+
275+
File.write('project.yml', updated_prj_yml.join("\n"), mode: 'w')
276+
277+
output = `bundle exec ruby -S ceedling gcov:all --exclude_test_case=test_add_numbers_adds_numbers 2>&1`
278+
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
279+
gcov_html_report = `bundle exec ruby -S ceedling utils:gcov 2>&1`
280+
expect($?.exitstatus).to match(0)
281+
expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
282+
expect(output).to match(/Unit test failures./)
283+
expect(File.exist?('./build/gcov/results/test_example_file_sigsegv.fail'))
284+
output_rd = File.read('./build/gcov/results/test_example_file_sigsegv.fail')
285+
expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ )
286+
expect(output).to match(/TESTED:\s+1/)
287+
expect(output).to match(/PASSED:\s+0/)
288+
expect(output).to match(/FAILED:\s+1/)
289+
expect(output).to match(/IGNORED:\s+0/)
290+
expect(output).to match(/example_file.c Lines executed:0.00% of 4/)
291+
292+
expect(gcov_html_report).to match(/Creating gcov results report\(s\) in 'build\/artifacts\/gcov'\.\.\. Done/)
293+
expect(File.exist?('build/artifacts/gcov/GcovCoverageResults.html')).to eq true
294+
end
295+
end
296+
end
297+
298+
def can_create_gcov_html_report_from_test_runner_with_enabled_debug_and_cmd_args_set_to_true_with_100_coverage_when_excluding_crashing_test_case
299+
@c.with_context do
300+
Dir.chdir @proj_name do
301+
FileUtils.cp test_asset_path("example_file.h"), 'src/'
302+
FileUtils.cp test_asset_path("example_file.c"), 'src/'
303+
FileUtils.cp test_asset_path("test_example_file_sigsegv.c"), 'test/'
304+
FileUtils.cp test_asset_path("project_with_guts_gcov.yml"), 'project.yml'
305+
306+
add_line = false
307+
updated_prj_yml = File.read('project.yml').split("\n")
308+
enable_unity_extra_args = "\n:test_runner:\n"\
309+
" :cmdline_args: true\n"
310+
311+
updated_prj_yml.insert(updated_prj_yml.length() -1, enable_unity_extra_args)
312+
313+
File.write('project.yml', updated_prj_yml.join("\n"), mode: 'w')
314+
315+
add_test_case = "\nvoid test_difference_between_two_numbers(void)\n"\
316+
"{\n" \
317+
" TEST_ASSERT_EQUAL(0, difference_between_numbers(1,1));\n" \
318+
"}\n"
319+
320+
updated_test_file = File.read('test/test_example_file_sigsegv.c').split("\n")
321+
updated_test_file.insert(updated_test_file.length(), add_test_case)
322+
File.write('test/test_example_file_sigsegv.c', updated_test_file.join("\n"), mode: 'w')
323+
324+
output = `bundle exec ruby -S ceedling gcov:all --exclude_test_case=test_add_numbers_will_fail 2>&1`
325+
expect($?.exitstatus).to match(0)
326+
gcov_html_report = `bundle exec ruby -S ceedling utils:gcov 2>&1`
327+
expect($?.exitstatus).to match(0)
328+
expect(File.exist?('./build/gcov/results/test_example_file_sigsegv.pass'))
329+
expect(output).to match(/TESTED:\s+2/)
330+
expect(output).to match(/PASSED:\s+2/)
331+
expect(output).to match(/FAILED:\s+0/)
332+
expect(output).to match(/IGNORED:\s+0/)
333+
expect(output).to match(/example_file.c Lines executed:100.00% of 4/)
334+
335+
expect(gcov_html_report).to match(/Creating gcov results report\(s\) in 'build\/artifacts\/gcov'\.\.\. Done/)
336+
expect(File.exist?('build/artifacts/gcov/GcovCoverageResults.html')).to eq true
337+
end
338+
end
339+
end
197340
end

spec/generator_test_results_spec.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require 'ceedling/constants'
66
require 'ceedling/streaminator'
77
require 'ceedling/configurator'
8+
require 'ceedling/debugger_utils'
89

910
NORMAL_OUTPUT =
1011
"Verbose output one\n" +
@@ -61,8 +62,16 @@
6162
# these will always be used as is.
6263
@yaml_wrapper = YamlWrapper.new
6364
@sanity_checker = GeneratorTestResultsSanityChecker.new({:configurator => @configurator, :streaminator => @streaminator})
64-
65-
@generate_test_results = described_class.new({:configurator => @configurator, :generator_test_results_sanity_checker => @sanity_checker, :yaml_wrapper => @yaml_wrapper})
65+
@debugger_utils = DebuggerUtils.new({:configurator => @configurator, :tool_executor => nil, :unity_utils => nil})
66+
67+
@generate_test_results = described_class.new(
68+
{
69+
:configurator => @configurator,
70+
:generator_test_results_sanity_checker => @sanity_checker,
71+
:yaml_wrapper => @yaml_wrapper,
72+
:debugger_utils => @debugger_utils
73+
}
74+
)
6675
end
6776

6877
after(:each) do

spec/spec_system_helper.rb

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ def test_run_of_projects_fail_because_of_sigsegv_without_report
843843
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
844844
expect(output).to match(/Segmentation fault \(core dumped\)/)
845845
expect(output).to match(/No tests executed./)
846-
expect(!File.exists?('./build/test/results/test_add.fail'))
846+
expect(!File.exist?('./build/test/results/test_add.fail'))
847847
end
848848
end
849849
end
@@ -876,13 +876,142 @@ def test_run_of_projects_fail_because_of_sigsegv_with_report
876876
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
877877
expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
878878
expect(output).to match(/Unit test failures./)
879-
expect(File.exists?('./build/test/results/test_example_file_sigsegv.fail'))
879+
expect(File.exist?('./build/test/results/test_example_file_sigsegv.fail'))
880880
output_rd = File.read('./build/test/results/test_example_file_sigsegv.fail')
881881
expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ )
882882
end
883883
end
884884
end
885885

886+
def execute_all_test_cases_from_crashing_test_runner_and_return_test_report_with_failue_when_cmd_args_set_to_true
887+
@c.with_context do
888+
Dir.chdir @proj_name do
889+
FileUtils.cp test_asset_path("example_file.h"), 'src/'
890+
FileUtils.cp test_asset_path("example_file.c"), 'src/'
891+
FileUtils.cp test_asset_path("test_example_file_sigsegv.c"), 'test/'
892+
893+
add_line = false
894+
updated_prj_yml = []
895+
File.read('project.yml').split("\n").each do |line|
896+
if line =~ /\:project\:/
897+
add_line = true
898+
updated_prj_yml.append(line)
899+
else
900+
if add_line
901+
updated_prj_yml.append(' :use_backtrace_gdb_reporter: TRUE')
902+
add_line = false
903+
end
904+
updated_prj_yml.append(line)
905+
end
906+
end
907+
enable_unity_extra_args = "\n:test_runner:\n"\
908+
" :cmdline_args: true\n"
909+
910+
updated_prj_yml.insert(updated_prj_yml.length() -1, enable_unity_extra_args)
911+
912+
File.write('project.yml', updated_prj_yml.join("\n"), mode: 'w')
913+
914+
output = `bundle exec ruby -S ceedling test:all 2>&1`
915+
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
916+
expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
917+
expect(output).to match(/Unit test failures./)
918+
expect(File.exist?('./build/test/results/test_example_file_sigsegv.fail'))
919+
output_rd = File.read('./build/test/results/test_example_file_sigsegv.fail')
920+
expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ )
921+
expect(output).to match(/TESTED:\s+2/)
922+
expect(output).to match(/PASSED:\s+1/)
923+
expect(output).to match(/FAILED:\s+1/)
924+
expect(output).to match(/IGNORED:\s+0/)
925+
end
926+
end
927+
end
928+
929+
def execute_and_collect_debug_logs_from_crashing_test_case_defined_by_test_case_argument_with_enabled_debug_and_cmd_args_set_to_true
930+
@c.with_context do
931+
Dir.chdir @proj_name do
932+
FileUtils.cp test_asset_path("example_file.h"), 'src/'
933+
FileUtils.cp test_asset_path("example_file.c"), 'src/'
934+
FileUtils.cp test_asset_path("test_example_file_sigsegv.c"), 'test/'
935+
936+
add_line = false
937+
updated_prj_yml = []
938+
File.read('project.yml').split("\n").each do |line|
939+
if line =~ /\:project\:/
940+
add_line = true
941+
updated_prj_yml.append(line)
942+
else
943+
if add_line
944+
updated_prj_yml.append(' :use_backtrace_gdb_reporter: TRUE')
945+
add_line = false
946+
end
947+
updated_prj_yml.append(line)
948+
end
949+
end
950+
enable_unity_extra_args = "\n:test_runner:\n"\
951+
" :cmdline_args: true\n"
952+
953+
updated_prj_yml.insert(updated_prj_yml.length() -1, enable_unity_extra_args)
954+
955+
File.write('project.yml', updated_prj_yml.join("\n"), mode: 'w')
956+
957+
output = `bundle exec ruby -S ceedling test:all --test_case=test_add_numbers_will_fail 2>&1`
958+
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
959+
expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
960+
expect(output).to match(/Unit test failures./)
961+
expect(File.exist?('./build/test/results/test_example_file_sigsegv.fail'))
962+
output_rd = File.read('./build/test/results/test_example_file_sigsegv.fail')
963+
expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ )
964+
expect(output).to match(/TESTED:\s+1/)
965+
expect(output).to match(/PASSED:\s+0/)
966+
expect(output).to match(/FAILED:\s+1/)
967+
expect(output).to match(/IGNORED:\s+0/)
968+
end
969+
end
970+
end
971+
972+
def execute_and_collect_debug_logs_from_crashing_test_case_defined_by_exclude_test_case_argument_with_enabled_debug_and_cmd_args_set_to_true
973+
@c.with_context do
974+
Dir.chdir @proj_name do
975+
FileUtils.cp test_asset_path("example_file.h"), 'src/'
976+
FileUtils.cp test_asset_path("example_file.c"), 'src/'
977+
FileUtils.cp test_asset_path("test_example_file_sigsegv.c"), 'test/'
978+
979+
add_line = false
980+
updated_prj_yml = []
981+
File.read('project.yml').split("\n").each do |line|
982+
if line =~ /\:project\:/
983+
add_line = true
984+
updated_prj_yml.append(line)
985+
else
986+
if add_line
987+
updated_prj_yml.append(' :use_backtrace_gdb_reporter: TRUE')
988+
add_line = false
989+
end
990+
updated_prj_yml.append(line)
991+
end
992+
end
993+
enable_unity_extra_args = "\n:test_runner:\n"\
994+
" :cmdline_args: true\n"
995+
996+
updated_prj_yml.insert(updated_prj_yml.length() -1, enable_unity_extra_args)
997+
998+
File.write('project.yml', updated_prj_yml.join("\n"), mode: 'w')
999+
1000+
output = `bundle exec ruby -S ceedling test:all --exclude_test_case=add_numbers_adds_numbers 2>&1`
1001+
expect($?.exitstatus).to match(1) # Test should fail as sigsegv is called
1002+
expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
1003+
expect(output).to match(/Unit test failures./)
1004+
expect(File.exist?('./build/test/results/test_example_file_sigsegv.fail'))
1005+
output_rd = File.read('./build/test/results/test_example_file_sigsegv.fail')
1006+
expect(output_rd =~ /test_add_numbers_will_fail \(\) at test\/test_example_file_sigsegv.c\:14/ )
1007+
expect(output).to match(/TESTED:\s+1/)
1008+
expect(output).to match(/PASSED:\s+0/)
1009+
expect(output).to match(/FAILED:\s+1/)
1010+
expect(output).to match(/IGNORED:\s+0/)
1011+
end
1012+
end
1013+
end
1014+
8861015
def can_test_projects_with_success_when_space_appears_between_hash_and_include
8871016
# test case cover issue described in https://github.com/ThrowTheSwitch/Ceedling/issues/588
8881017
@c.with_context do

spec/system/deployment_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin_path_extension }
5050
it { test_run_of_projects_fail_because_of_sigsegv_without_report }
5151
it { test_run_of_projects_fail_because_of_sigsegv_with_report }
52+
it { execute_all_test_cases_from_crashing_test_runner_and_return_test_report_with_failue_when_cmd_args_set_to_true }
53+
it { execute_and_collect_debug_logs_from_crashing_test_case_defined_by_test_case_argument_with_enabled_debug_and_cmd_args_set_to_true }
54+
it { execute_and_collect_debug_logs_from_crashing_test_case_defined_by_exclude_test_case_argument_with_enabled_debug_and_cmd_args_set_to_true }
5255
it { can_run_single_test_with_full_test_case_name_from_test_file_with_success_cmdline_args_are_enabled }
5356
it { can_run_single_test_with_partiall_test_case_name_from_test_file_with_enabled_cmdline_args_success }
5457
it { exlcude_test_case_name_filter_works_and_only_one_test_case_is_executed }

0 commit comments

Comments
 (0)