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

Skip to content

Commit eee6bbd

Browse files
committed
Refactored handling and passing error stack and backtrace in ut_executable and ut_test. Fixed failing tests, as now the manual rollback handling is working fine.
1 parent 7b395ac commit eee6bbd

5 files changed

Lines changed: 44 additions & 32 deletions

File tree

source/core/types/ut_executable.tpb

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
create or replace type body ut_executable is
22

3-
static function execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) return varchar2 is
3+
static procedure execute_call(
4+
a_owner varchar2, a_object varchar2, a_procedure_name varchar2,
5+
a_error_stack out nocopy varchar2, a_error_backtrace out nocopy varchar2
6+
) is
47
l_statement varchar2(4000);
58
l_status number;
69
l_cursor_number number;
7-
l_error_stack varchar2(4000);
810
l_owner varchar2(200) := a_owner;
911
l_object_name varchar2(200) := a_object;
1012
l_procedure_name varchar2(200) := a_procedure_name;
@@ -15,7 +17,8 @@ create or replace type body ut_executable is
1517

1618
l_statement :=
1719
'declare' || chr(10) ||
18-
' l_error_stack varchar2(4000);' || chr(10) ||
20+
' l_error_stack varchar2(32767);' || chr(10) ||
21+
' l_error_backtrace varchar2(32767);' || chr(10) ||
1922
'begin' || chr(10) ||
2023
' begin' || chr(10) ||
2124
' ' || ut_metadata.form_name(l_owner, l_object_name, l_procedure_name) || ';' || chr(10) ||
@@ -25,22 +28,24 @@ create or replace type body ut_executable is
2528
' if sqlcode = -04068 then' || chr(10) ||
2629
' raise;' || chr(10) ||
2730
' end if;' || chr(10) ||
28-
' l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace;' || chr(10) ||
31+
' l_error_stack := dbms_utility.format_error_stack;' || chr(10) ||
32+
' l_error_backtrace := dbms_utility.format_error_backtrace;' || chr(10) ||
2933
' end;' || chr(10) ||
30-
' :l_error_stack := l_error_stack;' || chr(10) ||
34+
' :a_error_stack := l_error_stack;' || chr(10) ||
35+
' :a_error_backtrace := l_error_backtrace;' || chr(10) ||
3136
'end;';
3237

3338
ut_utils.debug_log('ut_executable.execute_call l_statement: ' || l_statement);
3439

35-
3640
l_cursor_number := dbms_sql.open_cursor;
3741
dbms_sql.parse(l_cursor_number, statement => l_statement, language_flag => dbms_sql.native);
38-
dbms_sql.bind_variable(l_cursor_number, 'l_error_stack', l_error_stack, 8000);
42+
dbms_sql.bind_variable(l_cursor_number, 'a_error_stack', a_error_stack, 32767);
43+
dbms_sql.bind_variable(l_cursor_number, 'a_error_backtrace', a_error_backtrace, 32767);
44+
3945
l_status := dbms_sql.execute(l_cursor_number);
40-
dbms_sql.variable_value(l_cursor_number, 'l_error_stack', l_error_stack);
46+
dbms_sql.variable_value(l_cursor_number, 'a_error_stack', a_error_stack);
47+
dbms_sql.variable_value(l_cursor_number, 'a_error_backtrace', a_error_backtrace);
4148
dbms_sql.close_cursor(l_cursor_number);
42-
43-
return rtrim(l_error_stack,chr(10));
4449
end;
4550

4651
member function is_valid(a_proc_type varchar2) return boolean is
@@ -80,14 +85,15 @@ create or replace type body ut_executable is
8085
end;
8186

8287
member procedure do_execute(self in ut_executable) is
83-
l_exception_stack varchar2(32767);
88+
l_error_stack varchar2(32767);
89+
l_error_backtrace varchar2(32767);
8490
begin
85-
l_exception_stack := do_execute();
91+
do_execute(l_error_stack, l_error_backtrace);
8692
end do_execute;
8793

88-
member function do_execute(self in ut_executable) return varchar2 is
94+
member procedure do_execute(self in ut_executable, a_error_stack out nocopy varchar2, a_error_backtrace out nocopy varchar2) is
8995
begin
90-
return ut_executable.execute_call(self.owner_name, self.object_name, self.procedure_name);
96+
ut_executable.execute_call(self.owner_name, self.object_name, self.procedure_name, a_error_stack, a_error_backtrace);
9197
end do_execute;
9298

9399
end;

source/core/types/ut_executable.tps

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ create or replace type ut_executable force as object
44
object_name varchar2(32 char),
55
procedure_name varchar2(32 char),
66

7-
static function execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) return varchar2,
7+
static procedure execute_call(
8+
a_owner varchar2, a_object varchar2, a_procedure_name varchar2,
9+
a_error_stack out nocopy varchar2, a_error_backtrace out nocopy varchar2
10+
),
811
member function is_valid(a_proc_type varchar2) return boolean,
912
member function form_name return varchar2,
1013
member procedure do_execute(self in ut_executable),
11-
member function do_execute(self in ut_executable) return varchar2
14+
member procedure do_execute(self in ut_executable, a_error_stack out nocopy varchar2, a_error_backtrace out nocopy varchar2)
1215
) final
1316
/

source/core/types/ut_test.tpb

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,17 @@ create or replace type body ut_test is
3838
end is_valid;
3939

4040
overriding member procedure do_execute(self in out nocopy ut_test, a_reporter in out nocopy ut_reporter) is
41-
l_savepoint varchar2(30);
42-
l_failed boolean := false;
43-
function report_errors_from_call(a_exception_stack varchar2) return boolean is
41+
l_savepoint varchar2(30);
42+
l_errors_raised boolean := false;
43+
l_error_stack varchar2(32767);
44+
l_error_backtrace varchar2(32767);
45+
46+
function process_errors_from_call( a_error_stack varchar2, a_error_backtrace varchar2) return boolean is
47+
l_errors_stack_trace varchar2(32767) := rtrim(a_error_stack||a_error_backtrace, chr(10));
4448
begin
45-
if a_exception_stack is not null then
46-
ut_utils.debug_log('test method failed- ' ||a_exception_stack);
47-
ut_assert_processor.report_error( a_exception_stack );
49+
if l_errors_stack_trace is not null then
50+
ut_utils.debug_log('test method failed- ' ||l_errors_stack_trace );
51+
ut_assert_processor.report_error( l_errors_stack_trace );
4852
return true;
4953
else
5054
return false;
@@ -67,18 +71,21 @@ create or replace type body ut_test is
6771

6872
if self.setup is not null then
6973
a_reporter.before_test_setup(self);
70-
l_failed := report_errors_from_call( self.setup.do_execute() );
74+
self.setup.do_execute(l_error_stack, l_error_backtrace);
75+
l_errors_raised := process_errors_from_call( l_error_stack, l_error_backtrace );
7176
a_reporter.after_test_setup(self);
7277
end if;
7378

74-
if not l_failed then
79+
if not l_errors_raised then
7580
a_reporter.before_test_execute(self);
76-
l_failed := report_errors_from_call( self.test.do_execute() );
81+
self.test.do_execute(l_error_stack, l_error_backtrace);
82+
l_errors_raised := process_errors_from_call( l_error_stack, l_error_backtrace );
7783
a_reporter.after_test_execute(self);
7884

7985
if self.teardown is not null then
8086
a_reporter.before_test_teardown(self);
81-
l_failed := report_errors_from_call( self.teardown.do_execute() );
87+
self.teardown.do_execute(l_error_stack, l_error_backtrace);
88+
l_errors_raised := process_errors_from_call( l_error_stack, l_error_backtrace );
8289
a_reporter.after_test_teardown(self);
8390
end if;
8491

tests/ut_test/ut_test.Rollback_type.ManualOnFailure.sql

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ begin
2222
ut_assert_processor.clear_asserts;
2323

2424
--Assert
25-
--even if the manual mode is used and the feilure occurred all the changes in the test procedure are rollbacked by DB
26-
--http://asktom.oracle.com/pls/apex/f?p=100:12:0::NO::P12_ORIG,P12_PREV_PAGE,P12_QUESTION_ID:Y,1,9532007800346890501
27-
ut_assert.this(ut_transaction_control.count_rows('t')=0);
25+
ut_assert.this(ut_transaction_control.count_rows('t')>0);
2826

2927
if ut_assert_processor.get_aggregate_asserts_result = ut_utils.tr_success then
3028
:test_result := ut_utils.tr_success;

tests/ut_test_suite/ut_test_suite.Rollback_type.ManualOnFailure.sql

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ begin
2323
ut_assert_processor.clear_asserts;
2424

2525
--Assert
26-
--even if the manual mode is used and the feilure occurred all the changes in the test procedure are rollbacked by DB
27-
--http://asktom.oracle.com/pls/apex/f?p=100:12:0::NO::P12_ORIG,P12_PREV_PAGE,P12_QUESTION_ID:Y,1,9532007800346890501
28-
ut_assert.this(ut_transaction_control.count_rows('t')=0);
26+
ut_assert.this(ut_transaction_control.count_rows('t')>0);
2927
ut_assert.this(ut_transaction_control.count_rows('s')>0);
3028

3129
if ut_assert_processor.get_aggregate_asserts_result = ut_utils.tr_success then

0 commit comments

Comments
 (0)