Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bee9c22

Browse files
committed
Added handling of CDATA in failure messages for XML reporters.
1 parent 02b89bd commit bee9c22

12 files changed

Lines changed: 105 additions & 120 deletions

source/reporters/ut_junit_reporter.tpb

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ create or replace type body ut_junit_reporter is
2323
end;
2424

2525
overriding member procedure after_calling_run(self in out nocopy ut_junit_reporter, a_run in ut_run) is
26-
c_cddata_tag_start constant varchar2(30) := '<![CDATA[';
27-
c_cddata_tag_end constant varchar2(10) := ']]>';
26+
c_cdata_start_tag constant varchar2(30) := '<![CDATA[';
27+
c_cdata_end_tag constant varchar2(10) := ']]>';
28+
c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>';
2829
l_suite_id integer := 0;
2930
l_tests_count integer := a_run.results_count.disabled_count + a_run.results_count.success_count +
3031
a_run.results_count.failure_count + a_run.results_count.errored_count;
@@ -37,7 +38,7 @@ create or replace type body ut_junit_reporter is
3738
procedure print_test_elements(a_test ut_test) is
3839
l_results ut_varchar2_rows := ut_varchar2_rows();
3940
l_lines ut_varchar2_list;
40-
l_output clob;
41+
l_output clob;
4142
begin
4243
ut_utils.append_to_list(
4344
l_results,
@@ -51,26 +52,31 @@ create or replace type body ut_junit_reporter is
5152
end if;
5253
if a_test.result = ut_utils.gc_error then
5354
ut_utils.append_to_list( l_results, '<error>');
54-
ut_utils.append_to_list( l_results, c_cddata_tag_start);
55+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
5556
ut_utils.append_to_list( l_results, ut_utils.convert_collection(a_test.get_error_stack_traces()) );
56-
ut_utils.append_to_list( l_results, c_cddata_tag_end);
57+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
5758
ut_utils.append_to_list( l_results, '</error>');
5859
elsif a_test.result > ut_utils.gc_success then
5960
ut_utils.append_to_list( l_results, '<failure>');
60-
ut_utils.append_to_list( l_results, c_cddata_tag_start);
61+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
6162
for i in 1 .. a_test.failed_expectations.count loop
62-
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.failed_expectations(i).get_result_lines()));
63+
l_lines := a_test.failed_expectations(i).get_result_lines();
64+
for j in 1 .. l_lines.count loop
65+
--Encapsulate nested CDATA in results
66+
ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) );
67+
end loop;
68+
ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) );
6369
end loop;
64-
ut_utils.append_to_list( l_results, c_cddata_tag_end);
70+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
6571
ut_utils.append_to_list( l_results, '</failure>');
6672
end if;
6773
-- TODO - decide if we need/want to use the <system-err/> tag too
6874
l_output := a_test.get_serveroutputs();
6975
if l_output is not null then
7076
ut_utils.append_to_list( l_results, '<system-out>');
71-
ut_utils.append_to_list( l_results, c_cddata_tag_start);
72-
ut_utils.append_to_list( l_results, l_output);
73-
ut_utils.append_to_list( l_results, c_cddata_tag_end );
77+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
78+
ut_utils.append_to_list( l_results, replace( l_output, c_cdata_end_tag, c_cdata_end_tag_wrap ) );
79+
ut_utils.append_to_list( l_results, c_cdata_end_tag );
7480
ut_utils.append_to_list( l_results, '</system-out>' );
7581
else
7682
ut_utils.append_to_list( l_results, '<system-out/>');
@@ -115,9 +121,9 @@ create or replace type body ut_junit_reporter is
115121
l_data := l_suite.get_serveroutputs();
116122
if l_data is not null and l_data != empty_clob() then
117123
ut_utils.append_to_list( l_results, '<system-out>');
118-
ut_utils.append_to_list( l_results, c_cddata_tag_start);
119-
ut_utils.append_to_list( l_results, l_data);
120-
ut_utils.append_to_list( l_results, c_cddata_tag_end);
124+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
125+
ut_utils.append_to_list( l_results, replace( l_data, c_cdata_end_tag, c_cdata_end_tag_wrap ) );
126+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
121127
ut_utils.append_to_list( l_results, '</system-out>');
122128
else
123129
ut_utils.append_to_list( l_results, '<system-out/>');
@@ -126,9 +132,9 @@ create or replace type body ut_junit_reporter is
126132
l_errors := l_suite.get_error_stack_traces();
127133
if l_errors is not empty then
128134
ut_utils.append_to_list( l_results, '<system-err>');
129-
ut_utils.append_to_list( l_results, c_cddata_tag_start);
130-
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(l_errors));
131-
ut_utils.append_to_list( l_results, c_cddata_tag_end);
135+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
136+
ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(l_errors), c_cdata_end_tag, c_cdata_end_tag_wrap ) );
137+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
132138
ut_utils.append_to_list( l_results, '</system-err>');
133139
else
134140
ut_utils.append_to_list( l_results, '<system-err/>');

source/reporters/ut_sonar_test_reporter.tpb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,33 @@ create or replace type body ut_sonar_test_reporter is
4343
end;
4444

4545
procedure print_test_results(a_test ut_test) is
46-
l_results ut_varchar2_rows := ut_varchar2_rows();
47-
l_lines ut_varchar2_list;
46+
c_cdata_start_tag constant varchar2(30) := '<![CDATA[';
47+
c_cdata_end_tag constant varchar2(10) := ']]>';
48+
c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>';
49+
l_results ut_varchar2_rows := ut_varchar2_rows();
50+
l_lines ut_varchar2_list;
4851
begin
4952
ut_utils.append_to_list( l_results, '<testCase name="'||dbms_xmlgen.convert(a_test.name)||'" duration="'||round(a_test.execution_time()*1000,0)||'" >');
5053
if a_test.result = ut_utils.gc_disabled then
5154
ut_utils.append_to_list( l_results, '<skipped message="skipped"/>');
5255
elsif a_test.result = ut_utils.gc_error then
5356
ut_utils.append_to_list( l_results, '<error message="encountered errors">');
54-
ut_utils.append_to_list( l_results, '<![CDATA[');
57+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
5558
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.get_error_stack_traces()));
56-
ut_utils.append_to_list( l_results, ']]>');
59+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
5760
ut_utils.append_to_list( l_results, '</error>');
5861
elsif a_test.result > ut_utils.gc_success then
5962
ut_utils.append_to_list( l_results, '<failure message="some expectations have failed">');
60-
ut_utils.append_to_list( l_results, '<![CDATA[');
63+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
6164
for i in 1 .. a_test.failed_expectations.count loop
62-
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.failed_expectations(i).get_result_lines()));
65+
l_lines := a_test.failed_expectations(i).get_result_lines();
66+
for j in 1 .. l_lines.count loop
67+
--Encapsulate nested CDATA in results
68+
ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) );
69+
end loop;
70+
ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) );
6371
end loop;
64-
ut_utils.append_to_list( l_results, ']]>');
72+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
6573
ut_utils.append_to_list( l_results, '</failure>');
6674
end if;
6775
ut_utils.append_to_list( l_results, '</testCase>');

source/reporters/ut_tfs_junit_reporter.tpb

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ create or replace type body ut_tfs_junit_reporter is
2828
end;
2929

3030
member procedure junit_version_one(self in out nocopy ut_tfs_junit_reporter,a_run in ut_run) is
31+
c_cdata_start_tag constant varchar2(30) := '<![CDATA[';
32+
c_cdata_end_tag constant varchar2(10) := ']]>';
33+
c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>';
3134
l_suite_id integer := 0;
3235
l_tests_count integer := a_run.results_count.disabled_count + a_run.results_count.success_count +
3336
a_run.results_count.failure_count + a_run.results_count.errored_count;
@@ -69,20 +72,23 @@ create or replace type body ut_tfs_junit_reporter is
6972

7073
if a_test.result = ut_utils.gc_error then
7174
ut_utils.append_to_list( l_results, '<error type="error" message="Error while executing '||a_test.name||'">');
72-
ut_utils.append_to_list( l_results, '<![CDATA[');
75+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
7376
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.get_error_stack_traces()));
74-
ut_utils.append_to_list( l_results, ']]>');
77+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
7578
ut_utils.append_to_list( l_results, '</error>');
7679
-- Do not count error as failure
7780
elsif a_test.result = ut_utils.gc_failure then
7881
ut_utils.append_to_list( l_results, '<failure type="failure" message="Test '||a_test.name||' failed">');
82+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
7983
for i in 1 .. a_test.failed_expectations.count loop
8084
l_lines := a_test.failed_expectations(i).get_result_lines();
8185
for j in 1 .. l_lines.count loop
82-
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(l_lines(j)));
86+
--Encapsulate nested CDATA in results
87+
ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) );
8388
end loop;
84-
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(a_test.failed_expectations(i).caller_info));
89+
ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) );
8590
end loop;
91+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
8692
ut_utils.append_to_list( l_results, '</failure>');
8793
end if;
8894

@@ -120,9 +126,9 @@ create or replace type body ut_tfs_junit_reporter is
120126
l_outputs := l_suite.get_serveroutputs();
121127
if l_outputs is not null and l_outputs != empty_clob() then
122128
ut_utils.append_to_list( l_results, '<system-out>');
123-
ut_utils.append_to_list( l_results, '<![CDATA[');
129+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
124130
ut_utils.append_to_list( l_results, l_outputs);
125-
ut_utils.append_to_list( l_results, ']]>');
131+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
126132
ut_utils.append_to_list( l_results, '</system-out>');
127133
else
128134
ut_utils.append_to_list( l_results, '<system-out/>');
@@ -131,9 +137,9 @@ create or replace type body ut_tfs_junit_reporter is
131137
l_errors := l_suite.get_error_stack_traces();
132138
if l_errors is not empty then
133139
ut_utils.append_to_list( l_results, '<system-err>');
134-
ut_utils.append_to_list( l_results, '<![CDATA[');
140+
ut_utils.append_to_list( l_results, c_cdata_start_tag);
135141
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(l_errors));
136-
ut_utils.append_to_list( l_results, ']]>');
142+
ut_utils.append_to_list( l_results, c_cdata_end_tag);
137143
ut_utils.append_to_list( l_results, '</system-err>');
138144
else
139145
ut_utils.append_to_list( l_results, '<system-err/>');

test/ut3_user/reporters.pkb

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,24 @@ as
110110
dbms_output.put_line('<!afterall!>');
111111
end;
112112

113-
end;]';
114-
113+
end;]';
114+
115+
execute immediate q'[create or replace package check_fail_escape is
116+
--%suitepath(core)
117+
--%suite(Check JUNIT XML failure is escaped)
118+
119+
--%test(Fail Miserably)
120+
procedure fail_miserably;
121+
122+
end;]';
123+
124+
execute immediate q'[create or replace package body check_fail_escape is
125+
procedure fail_miserably is
126+
begin
127+
ut3.ut.expect('test').to_equal('<![CDATA[some stuff]]>');
128+
end;
129+
end;]';
130+
115131
end;
116132

117133
procedure reporters_setup is
@@ -122,6 +138,7 @@ end;]';
122138
procedure drop_test_helper_package is
123139
begin
124140
execute immediate 'drop package test_reporters';
141+
execute immediate 'drop package check_fail_escape';
125142
end;
126143

127144
procedure reporters_cleanup is
@@ -146,5 +163,24 @@ end;]';
146163
ut.expect(l_actual).to_be_like('<?xml version="1.0" encoding="'||upper(a_client_character_set)||'"?>%');
147164
end;
148165

166+
procedure check_xml_failure_escaped(
167+
a_reporter ut3.ut_output_reporter_base
168+
) is
169+
l_results ut3.ut_varchar2_list;
170+
l_actual clob;
171+
begin
172+
--Act
173+
select *
174+
bulk collect into l_results
175+
from table( ut3.ut.run( 'check_fail_escape', a_reporter ) );
176+
l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results);
177+
--Assert
178+
ut.expect(l_actual).to_be_like('%<![CDATA['
179+
||q'[%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]]]><![CDATA[>' (varchar2)%]'
180+
||q'[at "UT3$USER#.CHECK_FAIL_ESCAPE.FAIL_MISERABLY", line % ut3.ut.expect('test').to_equal('<![CDATA[some stuff]]]]><![CDATA[>');]'
181+
||'%]]>%'
182+
);
183+
end;
184+
149185
end reporters;
150186
/

test/ut3_user/reporters.pks

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,9 @@ create or replace package reporters is
1414
a_client_character_set varchar2
1515
);
1616

17+
procedure check_xml_failure_escaped(
18+
a_reporter ut3.ut_output_reporter_base
19+
);
20+
1721
end reporters;
1822
/

test/ut3_user/reporters/test_documentation_reporter.pkb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
create or replace package body test_documentation_reporter as procedure report_produces_expected_out is l_results ut3.ut_varchar2_list; l_actual clob; l_expected varchar2(32767):=q'[%org utplsql tests helpers A suite for testing different outcomes from reporters <!beforeall!> A description of some context passing_test [% sec] <!beforeeach!> <!beforetest!> <!passing test!> <!aftertest!> <!aftereach!> a test with failing assertion [% sec] (FAILED - 1) <!beforeeach!> <!failing test!> <!aftereach!> a test raising unhandled exception [% sec] (FAILED - 2) <!beforeeach!> <!erroring test!> <!aftereach!> a disabled test [0 sec] (DISABLED) <!afterall!>%Failures:% 1) failing_test "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3$USER#.TEST_REPORTERS%", line 36 ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] ');%% 2) erroring_test ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "UT3$USER#.TEST_REPORTERS", line 44% ORA-06512: at line 6Finished in % seconds4 tests, 1 failed, 1 errored, 1 disabled, 0 warning(s)%]'; begin select * bulk collect into l_results from table( ut3.ut.run( 'test_reporters', ut3.ut_documentation_reporter() ) ); l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like(l_expected); end; procedure check_encoding_included is begin reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); end;end;/
1+
create or replace package body test_documentation_reporter as procedure report_produces_expected_out is l_results ut3.ut_varchar2_list; l_actual clob; l_expected varchar2(32767):=q'[%org utplsql tests helpers A suite for testing different outcomes from reporters <!beforeall!> A description of some context passing_test [% sec] <!beforeeach!> <!beforetest!> <!passing test!> <!aftertest!> <!aftereach!> a test with failing assertion [% sec] (FAILED - 1) <!beforeeach!> <!failing test!> <!aftereach!> a test raising unhandled exception [% sec] (FAILED - 2) <!beforeeach!> <!erroring test!> <!aftereach!> a disabled test [0 sec] (DISABLED) <!afterall!>%Failures:% 1) failing_test "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3$USER#.TEST_REPORTERS%", line 36 ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] ');%% 2) erroring_test ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "UT3$USER#.TEST_REPORTERS", line 44% ORA-06512: at line 6Finished in % seconds4 tests, 1 failed, 1 errored, 1 disabled, 0 warning(s)%]'; begin select * bulk collect into l_results from table( ut3.ut.run( 'test_reporters', ut3.ut_documentation_reporter() ) ); l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like(l_expected); end;end;/

test/ut3_user/reporters/test_junit_reporter.pkb

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,6 @@ create or replace package body test_junit_reporter as
7272
execute immediate q'[create or replace package body Tst_Fix_Case_Sensitive as
7373
procedure bUgFiX is begin ut.expect(1).to_equal(1); end;
7474
end;]';
75-
76-
execute immediate q'[create or replace package check_fail_escape is
77-
--%suitepath(core)
78-
--%suite(checkfailedescape)
79-
--%displayname(Check JUNIT XML failure is escaped)
80-
81-
--%test(Fail Miserably)
82-
procedure fail_miserably;
83-
84-
end;]';
85-
86-
execute immediate q'[create or replace package body check_fail_escape is
87-
procedure fail_miserably is
88-
begin
89-
ut3.ut.expect('test').to_equal('<![CDATA[some stuff]]>');
90-
end;
91-
end;]';
9275

9376
end;
9477

@@ -134,19 +117,6 @@ create or replace package body test_junit_reporter as
134117
ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%');
135118
end;
136119

137-
procedure reports_failed_line is
138-
l_results ut3.ut_varchar2_list;
139-
l_actual clob;
140-
begin
141-
--Act
142-
select *
143-
bulk collect into l_results
144-
from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter()));
145-
l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results);
146-
--Assert
147-
ut.expect(l_actual).to_be_like('%at &quot;%.CHECK_JUNIT_REPORTING%&quot;, line %');
148-
end;
149-
150120
procedure check_classname_suite is
151121
l_results ut3.ut_varchar2_list;
152122
l_actual clob;
@@ -302,13 +272,7 @@ create or replace package body test_junit_reporter as
302272
l_results ut3.ut_varchar2_list;
303273
l_actual clob;
304274
begin
305-
--Act
306-
select *
307-
bulk collect into l_results
308-
from table(ut3.ut.run('check_fail_escape',ut3.ut_junit_reporter()));
309-
l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results);
310-
--Assert
311-
ut.expect(l_actual).to_be_like('%Actual: &apos;test&apos; (varchar2) was expected to equal: &apos;&lt;![CDATA[some stuff]]&gt;&apos; (varchar2)%');
275+
reporters.check_xml_failure_escaped(ut3.ut_junit_reporter());
312276
end;
313277

314278
procedure check_classname_is_populated is
@@ -345,7 +309,6 @@ create or replace package body test_junit_reporter as
345309
execute immediate 'drop package check_junit_rep_suitepath';
346310
execute immediate 'drop package tst_package_junit_nodesc';
347311
execute immediate 'drop package tst_package_junit_nosuite';
348-
execute immediate 'drop package check_fail_escape';
349312
execute immediate 'drop package Tst_Fix_Case_Sensitive';
350313
end;
351314

test/ut3_user/reporters/test_junit_reporter.pks

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ create or replace package test_junit_reporter as
1515
--%test(Xunit Backward Compatibility - Reports only failed expectations and exceptions)
1616
procedure reports_xunit_only_fail_or_err;
1717

18-
--%test(Reports failed line of test)
19-
procedure reports_failed_line;
20-
2118
--%test(Check that classname is returned correct suite)
2219
procedure check_classname_suite;
2320

0 commit comments

Comments
 (0)