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

Skip to content

Commit 7e47e45

Browse files
authored
Merge pull request #371 from Pazus/issue-364
Enriched warning message on implicit/explicit commit
2 parents f5597bb + 8662937 commit 7e47e45

13 files changed

Lines changed: 149 additions & 79 deletions

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# must be unique in a given SonarQube instance
2-
sonar.projectKey=utPLSQL:utPLSQL
2+
sonar.projectKey=utPLSQL
33
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
44
sonar.projectName=utPLSQL
55
sonar.projectVersion=v3.0.2

source/core/types/ut_executable.tpb

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,16 @@ create or replace type body ut_executable is
6666
end do_execute;
6767

6868
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean is
69-
l_statement varchar2(4000);
70-
l_status number;
71-
l_cursor_number number;
72-
l_owner varchar2(200) := self.owner_name;
73-
l_object_name varchar2(200) := self.object_name;
74-
l_procedure_name varchar2(200) := self.procedure_name;
69+
l_statement varchar2(4000);
70+
l_status number;
71+
l_cursor_number number;
72+
l_owner varchar2(200) := self.owner_name;
73+
l_object_name varchar2(200) := self.object_name;
74+
l_procedure_name varchar2(200) := self.procedure_name;
7575

7676
l_completed_without_errors boolean := true;
77-
77+
l_start_transaction_id varchar2(250);
78+
l_end_transaction_id varchar2(250);
7879
procedure save_dbms_output is
7980
l_status number;
8081
l_line varchar2(32767);
@@ -94,6 +95,7 @@ create or replace type body ut_executable is
9495
end save_dbms_output;
9596
begin
9697
if self.is_defined() then
98+
l_start_transaction_id := dbms_transaction.local_transaction_id(true);
9799
--listener - before call to executable
98100
a_listener.fire_before_event(self.associated_event_name, a_item);
99101

@@ -135,9 +137,15 @@ create or replace type body ut_executable is
135137

136138
l_completed_without_errors := (self.error_stack||self.error_backtrace) is null;
137139

138-
a_listener.fire_after_event(self.associated_event_name, a_item);
139140
--listener - after call to executable
141+
a_listener.fire_after_event(self.associated_event_name, a_item);
142+
143+
l_end_transaction_id := dbms_transaction.local_transaction_id();
144+
if l_start_transaction_id != l_end_transaction_id or l_end_transaction_id is null then
145+
a_item.add_transaction_invalidator(self.form_name());
146+
end if;
140147
end if;
148+
141149
return l_completed_without_errors;
142150
end do_execute;
143151

source/core/types/ut_logical_suite.tpb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,21 @@ create or replace type body ut_logical_suite as
115115
return null;
116116
end;
117117

118+
overriding member function get_transaction_invalidators return ut_varchar2_list is
119+
l_result ut_varchar2_list;
120+
l_child_results ut_varchar2_list;
121+
begin
122+
l_result := self.transaction_invalidators;
123+
for i in 1 .. self.items.count loop
124+
l_child_results := self.items(i).get_transaction_invalidators();
125+
for j in 1 .. l_child_results.count loop
126+
if l_child_results(j) not member of l_result then
127+
l_result.extend; l_result(l_result.last) := l_child_results(j);
128+
end if;
129+
end loop;
130+
end loop;
131+
return l_result;
132+
end;
133+
118134
end;
119135
/

source/core/types/ut_logical_suite.tps

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ create or replace type ut_logical_suite under ut_suite_item (
3333
overriding member function do_execute(self in out nocopy ut_logical_suite, a_listener in out nocopy ut_event_listener_base) return boolean,
3434
overriding member procedure calc_execution_result(self in out nocopy ut_logical_suite),
3535
overriding member procedure mark_as_errored(self in out nocopy ut_logical_suite, a_listener in out nocopy ut_event_listener_base, a_error_stack_trace varchar2),
36-
overriding member function get_error_stack_traces return ut_varchar2_list,
37-
overriding member function get_serveroutputs return clob
36+
overriding member function get_error_stack_traces return ut_varchar2_list,
37+
overriding member function get_serveroutputs return clob,
38+
overriding member function get_transaction_invalidators return ut_varchar2_list
3839
) not final
3940
/

source/core/types/ut_results_counter.tpb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ create or replace type body ut_results_counter as
2525
return;
2626
end;
2727

28-
constructor function ut_results_counter(self in out nocopy ut_results_counter, a_status integer) return self as result is
28+
member procedure set_counter_values(self in out nocopy ut_results_counter, a_status integer) is
2929
begin
3030
self.disabled_count := case when a_status = ut_utils.tr_disabled then 1 else 0 end;
3131
self.success_count := case when a_status = ut_utils.tr_success then 1 else 0 end;
3232
self.failure_count := case when a_status = ut_utils.tr_failure then 1 else 0 end;
3333
self.errored_count := case when a_status = ut_utils.tr_error then 1 else 0 end;
34-
self.warnings_count := 0;
35-
return;
3634
end;
3735

3836
member procedure sum_counter_values(self in out nocopy ut_results_counter, a_item ut_results_counter) is

source/core/types/ut_results_counter.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ create or replace type ut_results_counter as object(
2121
errored_count integer,
2222
warnings_count integer,
2323
constructor function ut_results_counter(self in out nocopy ut_results_counter) return self as result,
24-
constructor function ut_results_counter(self in out nocopy ut_results_counter, a_status integer) return self as result,
24+
member procedure set_counter_values(self in out nocopy ut_results_counter, a_status integer),
2525
member procedure sum_counter_values(self in out nocopy ut_results_counter, a_item ut_results_counter),
2626
member procedure increase_warning_count(self in out nocopy ut_results_counter),
2727
member function total_count return integer,

source/core/types/ut_suite_item.tpb

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,18 @@ create or replace type body ut_suite_item as
1616
limitations under the License.
1717
*/
1818

19-
member procedure init(
20-
self in out nocopy ut_suite_item, a_object_owner varchar2, a_object_name varchar2, a_name varchar2,
21-
a_description varchar2, a_path varchar2, a_rollback_type integer, a_disabled_flag boolean
22-
) is
19+
member procedure init(self in out nocopy ut_suite_item, a_object_owner varchar2, a_object_name varchar2, a_name varchar2, a_description varchar2, a_path varchar2, a_rollback_type integer, a_disabled_flag boolean) is
2320
begin
24-
self.object_owner := a_object_owner;
25-
self.object_name := lower(trim(a_object_name));
26-
self.name := lower(trim(a_name));
27-
self.description := a_description;
28-
self.path := nvl(lower(trim(a_path)), self.object_name);
21+
self.object_owner := a_object_owner;
22+
self.object_name := lower(trim(a_object_name));
23+
self.name := lower(trim(a_name));
24+
self.description := a_description;
25+
self.path := nvl(lower(trim(a_path)), self.object_name);
2926
self.rollback_type := a_rollback_type;
3027
self.disabled_flag := ut_utils.boolean_to_int(a_disabled_flag);
3128
self.results_count := ut_results_counter();
32-
self.warnings := ut_varchar2_list();
29+
self.warnings := ut_varchar2_list();
30+
self.transaction_invalidators := ut_varchar2_list();
3331
end;
3432

3533
member procedure set_disabled_flag(self in out nocopy ut_suite_item, a_disabled_flag boolean) is
@@ -67,7 +65,13 @@ create or replace type body ut_suite_item as
6765
end if;
6866
exception
6967
when ex_savepoint_not_exists then
70-
put_warning('Savepoint not established. Implicit commit might have occured.');
68+
put_warning(
69+
'Unable to perform automatic rollback after test'
70+
|| case when self_type like '%SUITE' then ' suite' end || '. '
71+
||'An implicit or explicit commit/rollback occurred in procedures:'||chr(10)
72+
||lower(ut_utils.indent_lines(ut_utils.table_to_clob(self.get_transaction_invalidators()), 2, true))||chr(10)
73+
||'Use the "--%rollback(manual)" annotation or remove commit/rollback/ddl statements that are causing the issue.'
74+
);
7175
end;
7276

7377
member function execution_time return number is
@@ -82,5 +86,18 @@ create or replace type body ut_suite_item as
8286
self.results_count.increase_warning_count;
8387
end;
8488

89+
member function get_transaction_invalidators return ut_varchar2_list is
90+
begin
91+
return transaction_invalidators;
92+
end;
93+
94+
member procedure add_transaction_invalidator(a_object_name varchar2) is
95+
begin
96+
if a_object_name not member of transaction_invalidators then
97+
transaction_invalidators.extend();
98+
transaction_invalidators(transaction_invalidators.last) := a_object_name;
99+
end if;
100+
end;
101+
85102
end;
86103
/

source/core/types/ut_suite_item.tps

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@ create or replace type ut_suite_item force under ut_suite_item_base (
1717
*/
1818

1919
results_count ut_results_counter,
20+
transaction_invalidators ut_varchar2_list,
2021
member procedure init(
2122
self in out nocopy ut_suite_item, a_object_owner varchar2, a_object_name varchar2, a_name varchar2,
2223
a_description varchar2, a_path varchar2, a_rollback_type integer, a_disabled_flag boolean),
2324
member procedure set_disabled_flag(self in out nocopy ut_suite_item, a_disabled_flag boolean),
2425
member function get_disabled_flag return boolean,
2526
member function create_savepoint_if_needed return varchar2,
2627
member procedure rollback_to_savepoint(self in out nocopy ut_suite_item, a_savepoint varchar2),
28+
member function get_transaction_invalidators return ut_varchar2_list,
29+
member procedure add_transaction_invalidator(a_object_name varchar2),
2730
/*
2831
Returns execution time in seconds (with miliseconds)
2932
*/

source/core/types/ut_test.tpb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ create or replace type body ut_test as
5858
if self.get_disabled_flag() then
5959
self.result := ut_utils.tr_disabled;
6060
ut_utils.debug_log('ut_test.execute - disabled');
61-
self.results_count := ut_results_counter(self.result);
61+
self.results_count.set_counter_values(self.result);
6262
self.end_time := self.start_time;
6363
else
6464
if self.is_valid() then
@@ -100,7 +100,7 @@ create or replace type body ut_test as
100100
end if;
101101
--expectation results need to be part of test results
102102
self.results := ut_expectation_processor.get_expectations_results();
103-
self.results_count := ut_results_counter(self.result);
103+
self.results_count.set_counter_values(self.result);
104104
end;
105105

106106
overriding member procedure mark_as_errored(self in out nocopy ut_test, a_listener in out nocopy ut_event_listener_base, a_error_stack_trace varchar2) is

source/core/ut_annotations.pkb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ create or replace package body ut_annotations as
7878
,'%(' || c_rgexp_identifier || ')'
7979
,modifier => 'i'
8080
,subexpression => 1));
81-
l_annotation_params_str := trim(regexp_substr(l_annotation_str, '\((.*?)\)$', subexpression => 1));
81+
l_annotation_params_str := trim(regexp_substr(l_annotation_str, '\((.*?)\)\s*$', subexpression => 1));
8282

8383
if l_annotation_params_str is not null then
8484

0 commit comments

Comments
 (0)