Skip to content

Commit 5653ccf

Browse files
committed
Refactoring of error/stdout/failure messages. Getting rid of odd dependencies in the code.
Failure and error are now clearly separated.
1 parent 7d42cae commit 5653ccf

21 files changed

Lines changed: 251 additions & 191 deletions

source/api/ut.pkb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ create or replace package body ut is
8484

8585
procedure fail(a_message in varchar2) is
8686
begin
87-
ut_assert_processor.report_error(a_message);
87+
ut_assert_processor.report_failure(a_message);
8888
end;
8989

9090
procedure run_autonomous(a_paths ut_varchar2_list, a_reporter ut_reporter_base, a_color_console integer) is

source/core/types/ut_executable.tpb

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,32 +33,22 @@ create or replace type body ut_executable is
3333
return self.procedure_name is not null and self.object_name is not null;
3434
end;
3535

36-
member function is_valid return boolean is
37-
l_result boolean := true;
36+
member function is_valid(self in out nocopy ut_executable) return boolean is
37+
l_result boolean := false;
38+
l_message_part varchar2(4000) := 'Call params for ' || self.associated_event_name || ' are not valid: ';
3839
begin
3940

4041
if self.object_name is null then
41-
l_result := false;
42-
ut_assert_processor.report_error('Call params for ' || self.associated_event_name || ' are not valid: package is not defined');
43-
end if;
44-
45-
if self.procedure_name is null then
46-
l_result := false;
47-
ut_assert_processor.report_error('Call params for ' || self.associated_event_name || ' are not valid: procedure is not defined');
48-
end if;
49-
50-
if l_result and not ut_metadata.package_valid(self.owner_name, self.object_name) then
51-
l_result := false;
52-
ut_assert_processor.report_error('Call params for ' || self.associated_event_name ||
53-
' are not valid: package does not exist or is invalid: ' ||nvl(self.owner_name, '<missing schema name>')||'.'||
54-
nvl(self.object_name, '<missing package name>'));
55-
end if;
56-
57-
if l_result and not ut_metadata.procedure_exists(self.owner_name, self.object_name, self.procedure_name) then
58-
l_result := false;
59-
ut_assert_processor.report_error('Call params for ' || self.associated_event_name || ' are not valid: package missing ' ||
60-
' procedure ' || self.object_name || '.' ||
61-
nvl(self.procedure_name, '<missing procedure name>'));
42+
self.error_stack := l_message_part || 'package is not defined';
43+
elsif not ut_metadata.package_valid(self.owner_name, self.object_name) then
44+
self.error_stack := l_message_part || 'package does not exist or is invalid: ' ||upper(self.owner_name||'.'||self.object_name);
45+
elsif self.procedure_name is null then
46+
self.error_stack := l_message_part || 'procedure is not defined';
47+
elsif not ut_metadata.procedure_exists(self.owner_name, self.object_name, self.procedure_name) then
48+
self.error_stack := l_message_part || 'package missing procedure '
49+
|| upper(self.owner_name || '.' || self.object_name || '.' ||self.procedure_name);
50+
else
51+
l_result := true;
6252
end if;
6353

6454
return l_result;
@@ -85,28 +75,16 @@ create or replace type body ut_executable is
8575

8676
l_completed_without_errors boolean := true;
8777

88-
function process_errors_from_call(a_error_stack varchar2, a_error_backtrace varchar2) return boolean is
89-
l_errors_stack_trace varchar2(32767) := rtrim(a_error_stack||a_error_backtrace, chr(10));
90-
begin
91-
if l_errors_stack_trace is not null then
92-
ut_utils.debug_log('test method failed- ' ||l_errors_stack_trace );
93-
ut_assert_processor.report_error( l_errors_stack_trace );
94-
return false;
95-
else
96-
return true;
97-
end if;
98-
end;
99-
10078
procedure save_dbms_output is
10179
l_status number;
10280
l_line varchar2(32767);
10381
begin
10482
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);
105-
83+
10684
loop
10785
dbms_output.get_line(line => l_line, status => l_status);
10886
exit when l_status = 1;
109-
87+
11088
dbms_lob.writeappend(lob_loc => self.serveroutput,
11189
amount => length(l_line),
11290
buffer => l_line);
@@ -153,16 +131,20 @@ create or replace type body ut_executable is
153131
dbms_sql.variable_value(l_cursor_number, 'a_error_stack', self.error_stack);
154132
dbms_sql.variable_value(l_cursor_number, 'a_error_backtrace', self.error_backtrace);
155133
dbms_sql.close_cursor(l_cursor_number);
156-
134+
157135
save_dbms_output;
158136

159-
l_completed_without_errors := process_errors_from_call(self.error_stack, self.error_backtrace);
137+
l_completed_without_errors := (self.error_stack||self.error_backtrace is null);
160138

161139
a_listener.fire_after_event(self.associated_event_name, a_item);
162140
--listener - after call to executable
163141
end if;
164142
return l_completed_without_errors;
165143
end do_execute;
166144

145+
member function get_error_stack_trace return varchar2 is
146+
begin
147+
return rtrim(self.error_stack||self.error_backtrace, chr(10));
148+
end;
167149
end;
168150
/

source/core/types/ut_executable.tps

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ create or replace type ut_executable authid current_user as object(
2626
error_stack varchar2(4000),
2727
serveroutput clob,
2828
constructor function ut_executable( self in out nocopy ut_executable, a_context ut_suite_item, a_procedure_name varchar2, a_associated_event_name varchar2) return self as result,
29-
member function is_valid return boolean,
29+
member function is_valid(self in out nocopy ut_executable) return boolean,
3030
member function is_defined return boolean,
3131
member function form_name return varchar2,
3232
member procedure 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),
@@ -35,6 +35,7 @@ create or replace type ut_executable authid current_user as object(
3535
* returns true if executed without exceptions
3636
* returns false if exceptions were raised
3737
*/
38-
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
38+
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,
39+
member function get_error_stack_trace return varchar2
3940
) final
4041
/

source/core/types/ut_logical_suite.tpb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ create or replace type body ut_logical_suite as
2626
return;
2727
end;
2828

29-
member function is_valid return boolean is
29+
member function is_valid(self in out nocopy ut_logical_suite) return boolean is
3030
begin
3131
return true;
3232
end;
@@ -58,9 +58,9 @@ create or replace type body ut_logical_suite as
5858
l_completed_without_errors boolean;
5959
begin
6060
ut_utils.debug_log('ut_logical_suite.execute');
61-
62-
a_listener.fire_before_event(ut_utils.gc_suite,self);
63-
self.start_time := current_timestamp;
61+
62+
a_listener.fire_before_event(ut_utils.gc_suite,self);
63+
self.start_time := current_timestamp;
6464

6565
if self.get_ignore_flag() then
6666
self.result := ut_utils.tr_ignore;
@@ -79,7 +79,7 @@ create or replace type body ut_logical_suite as
7979
self.end_time := current_timestamp;
8080

8181
end if;
82-
82+
8383
a_listener.fire_after_event(ut_utils.gc_suite,self);
8484

8585
return l_completed_without_errors;
@@ -100,20 +100,20 @@ create or replace type body ut_logical_suite as
100100

101101
self.result := l_result;
102102
end;
103-
104-
overriding member procedure fail(self in out nocopy ut_logical_suite, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2) is
103+
104+
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) is
105105
begin
106106
ut_utils.debug_log('ut_logical_suite.fail');
107107
a_listener.fire_before_event(ut_utils.gc_suite, self);
108108
self.start_time := current_timestamp;
109109
for i in 1 .. self.items.count loop
110110
-- execute the item (test or suite)
111-
self.items(i).fail(a_listener,a_failure_msg);
111+
self.items(i).mark_as_errored(a_listener, a_error_stack_trace);
112112
end loop;
113113
self.calc_execution_result();
114114
self.end_time := self.start_time;
115115
a_listener.fire_after_event(ut_utils.gc_suite, self);
116-
end;
116+
end;
117117

118118
end;
119119
/

source/core/types/ut_logical_suite.tps

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ create or replace type ut_logical_suite under ut_suite_item (
2424
constructor function ut_logical_suite(
2525
self in out nocopy ut_logical_suite,a_object_owner varchar2, a_object_name varchar2, a_name varchar2, a_description varchar2 := null, a_path varchar2
2626
) return self as result,
27-
member function is_valid return boolean,
27+
member function is_valid(self in out nocopy ut_logical_suite) return boolean,
2828
/**
2929
* Finds the item in the suite by it's name and returns the item index
3030
*/
3131
member function item_index(a_name varchar2) return pls_integer,
3232
member procedure add_item(self in out nocopy ut_logical_suite, a_item 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),
35-
overriding member procedure fail(self in out nocopy ut_logical_suite, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2)
35+
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)
3636
) not final
3737
/

source/core/types/ut_reporter_base.tpb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ create or replace type body ut_reporter_base is
2929
ut_output_buffer.send_line(self,a_text);
3030
end;
3131

32+
member procedure print_output(self in out nocopy ut_reporter_base, a_output clob) is
33+
l_lines ut_varchar2_list;
34+
begin
35+
if a_output is not null and dbms_lob.getlength(a_output) > 0 then
36+
l_lines := ut_utils.clob_to_table(a_output);
37+
for i in 1 .. l_lines.count loop
38+
self.print_text(l_lines(i));
39+
end loop;
40+
end if;
41+
end;
42+
3243
-- run hooks
3344
member procedure before_calling_run(self in out nocopy ut_reporter_base, a_run in ut_run) is
3445
begin

source/core/types/ut_reporter_base.tps

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ create or replace type ut_reporter_base authid current_user as object(
2222

2323
member procedure print_text(self in out nocopy ut_reporter_base, a_text varchar2),
2424

25+
member procedure print_output(self in out nocopy ut_reporter_base, a_output clob),
26+
2527
-- run hooks
2628
member procedure before_calling_run(self in out nocopy ut_reporter_base, a_run in ut_run),
2729

source/core/types/ut_results_counter.tpb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ create or replace type body ut_results_counter as
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;
3435
return;
3536
end;
3637

source/core/types/ut_run.tpb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,15 @@ create or replace type body ut_run as
6666
self.result := l_result;
6767
end;
6868

69-
overriding member procedure fail(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2) is
69+
overriding member procedure mark_as_errored(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base, a_error_stack_trace varchar2) is
7070
begin
7171
ut_utils.debug_log('ut_run.fail');
7272

7373
a_listener.fire_before_event(ut_utils.gc_run, self);
7474
self.start_time := current_timestamp;
7575

7676
for i in 1 .. self.items.count loop
77-
self.items(i).fail(a_listener, a_failure_msg);
77+
self.items(i).mark_as_errored(a_listener, a_error_stack_trace);
7878
end loop;
7979

8080
self.calc_execution_result();

source/core/types/ut_run.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ create or replace type ut_run under ut_suite_item (
2323
constructor function ut_run( self in out nocopy ut_run, a_items ut_suite_items, a_run_paths ut_varchar2_list := null) return self as result,
2424
overriding member function do_execute(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base) return boolean,
2525
overriding member procedure calc_execution_result(self in out nocopy ut_run),
26-
overriding member procedure fail(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2),
26+
overriding member procedure mark_as_errored(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base, a_error_stack_trace varchar2),
2727
member function get_run_schemes return ut_varchar2_list
2828
)
2929
/

0 commit comments

Comments
 (0)