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

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Refactoring of error/stdout/failure messages. Getting rid of odd depe…
…ndencies in the code.

Failure and error are now clearly separated.
  • Loading branch information
jgebal committed Mar 14, 2017
commit 5653ccf95916960eef7c78df4d87377f86523688
2 changes: 1 addition & 1 deletion source/api/ut.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ create or replace package body ut is

procedure fail(a_message in varchar2) is
begin
ut_assert_processor.report_error(a_message);
ut_assert_processor.report_failure(a_message);
end;

procedure run_autonomous(a_paths ut_varchar2_list, a_reporter ut_reporter_base, a_color_console integer) is
Expand Down
60 changes: 21 additions & 39 deletions source/core/types/ut_executable.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -33,32 +33,22 @@ create or replace type body ut_executable is
return self.procedure_name is not null and self.object_name is not null;
end;

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

if self.object_name is null then
l_result := false;
ut_assert_processor.report_error('Call params for ' || self.associated_event_name || ' are not valid: package is not defined');
end if;

if self.procedure_name is null then
l_result := false;
ut_assert_processor.report_error('Call params for ' || self.associated_event_name || ' are not valid: procedure is not defined');
end if;

if l_result and not ut_metadata.package_valid(self.owner_name, self.object_name) then
l_result := false;
ut_assert_processor.report_error('Call params for ' || self.associated_event_name ||
' are not valid: package does not exist or is invalid: ' ||nvl(self.owner_name, '<missing schema name>')||'.'||
nvl(self.object_name, '<missing package name>'));
end if;

if l_result and not ut_metadata.procedure_exists(self.owner_name, self.object_name, self.procedure_name) then
l_result := false;
ut_assert_processor.report_error('Call params for ' || self.associated_event_name || ' are not valid: package missing ' ||
' procedure ' || self.object_name || '.' ||
nvl(self.procedure_name, '<missing procedure name>'));
self.error_stack := l_message_part || 'package is not defined';
elsif not ut_metadata.package_valid(self.owner_name, self.object_name) then
self.error_stack := l_message_part || 'package does not exist or is invalid: ' ||upper(self.owner_name||'.'||self.object_name);
elsif self.procedure_name is null then
self.error_stack := l_message_part || 'procedure is not defined';
elsif not ut_metadata.procedure_exists(self.owner_name, self.object_name, self.procedure_name) then
self.error_stack := l_message_part || 'package missing procedure '
|| upper(self.owner_name || '.' || self.object_name || '.' ||self.procedure_name);
else
l_result := true;
end if;

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

l_completed_without_errors boolean := true;

function process_errors_from_call(a_error_stack varchar2, a_error_backtrace varchar2) return boolean is
l_errors_stack_trace varchar2(32767) := rtrim(a_error_stack||a_error_backtrace, chr(10));
begin
if l_errors_stack_trace is not null then
ut_utils.debug_log('test method failed- ' ||l_errors_stack_trace );
ut_assert_processor.report_error( l_errors_stack_trace );
return false;
else
return true;
end if;
end;

procedure save_dbms_output is
l_status number;
l_line varchar2(32767);
begin
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);

loop
dbms_output.get_line(line => l_line, status => l_status);
exit when l_status = 1;

dbms_lob.writeappend(lob_loc => self.serveroutput,
amount => length(l_line),
buffer => l_line);
Expand Down Expand Up @@ -153,16 +131,20 @@ create or replace type body ut_executable is
dbms_sql.variable_value(l_cursor_number, 'a_error_stack', self.error_stack);
dbms_sql.variable_value(l_cursor_number, 'a_error_backtrace', self.error_backtrace);
dbms_sql.close_cursor(l_cursor_number);

save_dbms_output;

l_completed_without_errors := process_errors_from_call(self.error_stack, self.error_backtrace);
l_completed_without_errors := (self.error_stack||self.error_backtrace is null);

a_listener.fire_after_event(self.associated_event_name, a_item);
--listener - after call to executable
end if;
return l_completed_without_errors;
end do_execute;

member function get_error_stack_trace return varchar2 is
begin
return rtrim(self.error_stack||self.error_backtrace, chr(10));
end;
end;
/
5 changes: 3 additions & 2 deletions source/core/types/ut_executable.tps
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ create or replace type ut_executable authid current_user as object(
error_stack varchar2(4000),
serveroutput clob,
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,
member function is_valid return boolean,
member function is_valid(self in out nocopy ut_executable) return boolean,
member function is_defined return boolean,
member function form_name return varchar2,
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),
Expand All @@ -35,6 +35,7 @@ create or replace type ut_executable authid current_user as object(
* returns true if executed without exceptions
* returns false if exceptions were raised
*/
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
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,
member function get_error_stack_trace return varchar2
) final
/
18 changes: 9 additions & 9 deletions source/core/types/ut_logical_suite.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ create or replace type body ut_logical_suite as
return;
end;

member function is_valid return boolean is
member function is_valid(self in out nocopy ut_logical_suite) return boolean is
begin
return true;
end;
Expand Down Expand Up @@ -58,9 +58,9 @@ create or replace type body ut_logical_suite as
l_completed_without_errors boolean;
begin
ut_utils.debug_log('ut_logical_suite.execute');
a_listener.fire_before_event(ut_utils.gc_suite,self);
self.start_time := current_timestamp;

a_listener.fire_before_event(ut_utils.gc_suite,self);
self.start_time := current_timestamp;

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

end if;

a_listener.fire_after_event(ut_utils.gc_suite,self);

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

self.result := l_result;
end;
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

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
begin
ut_utils.debug_log('ut_logical_suite.fail');
a_listener.fire_before_event(ut_utils.gc_suite, self);
self.start_time := current_timestamp;
for i in 1 .. self.items.count loop
-- execute the item (test or suite)
self.items(i).fail(a_listener,a_failure_msg);
self.items(i).mark_as_errored(a_listener, a_error_stack_trace);
end loop;
self.calc_execution_result();
self.end_time := self.start_time;
a_listener.fire_after_event(ut_utils.gc_suite, self);
end;
end;

end;
/
4 changes: 2 additions & 2 deletions source/core/types/ut_logical_suite.tps
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ create or replace type ut_logical_suite under ut_suite_item (
constructor function ut_logical_suite(
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
) return self as result,
member function is_valid return boolean,
member function is_valid(self in out nocopy ut_logical_suite) return boolean,
/**
* Finds the item in the suite by it's name and returns the item index
*/
member function item_index(a_name varchar2) return pls_integer,
member procedure add_item(self in out nocopy ut_logical_suite, a_item ut_suite_item),
overriding member function do_execute(self in out nocopy ut_logical_suite, a_listener in out nocopy ut_event_listener_base) return boolean,
overriding member procedure calc_execution_result(self in out nocopy ut_logical_suite),
overriding member procedure fail(self in out nocopy ut_logical_suite, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2)
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)
) not final
/
11 changes: 11 additions & 0 deletions source/core/types/ut_reporter_base.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,17 @@ create or replace type body ut_reporter_base is
ut_output_buffer.send_line(self,a_text);
end;

member procedure print_output(self in out nocopy ut_reporter_base, a_output clob) is
l_lines ut_varchar2_list;
begin
if a_output is not null and dbms_lob.getlength(a_output) > 0 then
l_lines := ut_utils.clob_to_table(a_output);
for i in 1 .. l_lines.count loop
self.print_text(l_lines(i));
end loop;
end if;
end;

-- run hooks
member procedure before_calling_run(self in out nocopy ut_reporter_base, a_run in ut_run) is
begin
Expand Down
2 changes: 2 additions & 0 deletions source/core/types/ut_reporter_base.tps
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ create or replace type ut_reporter_base authid current_user as object(

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

member procedure print_output(self in out nocopy ut_reporter_base, a_output clob),

-- run hooks
member procedure before_calling_run(self in out nocopy ut_reporter_base, a_run in ut_run),

Expand Down
1 change: 1 addition & 0 deletions source/core/types/ut_results_counter.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ create or replace type body ut_results_counter as
self.success_count := case when a_status = ut_utils.tr_success then 1 else 0 end;
self.failure_count := case when a_status = ut_utils.tr_failure then 1 else 0 end;
self.errored_count := case when a_status = ut_utils.tr_error then 1 else 0 end;
self.warnings_count := 0;
return;
end;

Expand Down
4 changes: 2 additions & 2 deletions source/core/types/ut_run.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,15 @@ create or replace type body ut_run as
self.result := l_result;
end;

overriding member procedure fail(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2) is
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
begin
ut_utils.debug_log('ut_run.fail');

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

for i in 1 .. self.items.count loop
self.items(i).fail(a_listener, a_failure_msg);
self.items(i).mark_as_errored(a_listener, a_error_stack_trace);
end loop;

self.calc_execution_result();
Expand Down
2 changes: 1 addition & 1 deletion source/core/types/ut_run.tps
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ create or replace type ut_run under ut_suite_item (
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,
overriding member function do_execute(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base) return boolean,
overriding member procedure calc_execution_result(self in out nocopy ut_run),
overriding member procedure fail(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base, a_failure_msg varchar2),
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),
member function get_run_schemes return ut_varchar2_list
)
/
29 changes: 22 additions & 7 deletions source/core/types/ut_suite.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ create or replace type body ut_suite as
return;
end;

overriding member function is_valid return boolean is
overriding member function is_valid(self in out nocopy ut_suite) return boolean is
l_is_valid boolean;
begin
l_is_valid :=
Expand All @@ -44,11 +44,10 @@ create or replace type body ut_suite as
l_item_savepoint varchar2(30);
l_suite_step_without_errors boolean;

procedure do_fail(a_prefix varchar2) is
l_results ut_assert_results := ut_assert_processor.get_asserts_results();
procedure propagate_error(a_error_stack_trace varchar2) is
begin
for i in 1..self.items.count loop
self.items(i).fail(a_listener, a_prefix||l_results(1).error_message);
self.items(i).mark_as_errored(a_listener, a_error_stack_trace);
end loop;
end;
begin
Expand All @@ -75,18 +74,18 @@ create or replace type body ut_suite as
self.items(i).do_execute(a_listener);
end loop;
else
do_fail('Beforeall procedure failed: '||chr(10));
propagate_error(self.before_all.get_error_stack_trace());
end if;

l_suite_step_without_errors := self.after_all.do_execute(self, a_listener);
if not l_suite_step_without_errors then
self.put_warning('Afterall procedure failed: '||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
self.put_warning(self.after_all.get_error_stack_trace());
end if;

self.rollback_to_savepoint(l_suite_savepoint);

else
do_fail(null);
propagate_error(ut_utils.table_to_clob(self.get_error_stack_traces()));
end if;

self.calc_execution_result();
Expand All @@ -98,5 +97,21 @@ create or replace type body ut_suite as
return l_suite_step_without_errors;
end;

overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list is
l_stack_traces ut_varchar2_list := ut_varchar2_list();
begin
self.add_stack_trace(l_stack_traces, self.before_all.get_error_stack_trace());
self.add_stack_trace(l_stack_traces, self.after_all.get_error_stack_trace());
return l_stack_traces;
end;

overriding member function get_serveroutputs return clob is
l_outputs clob;
begin
self.add_serveroutput(l_outputs, self.before_all.serveroutput );
self.add_serveroutput(l_outputs, self.after_all.serveroutput );
return l_outputs;
end;

end;
/
6 changes: 4 additions & 2 deletions source/core/types/ut_suite.tps
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ create or replace type ut_suite under ut_logical_suite (
a_rollback_type integer := null, a_ignore_flag boolean := false, a_before_all_proc_name varchar2 := null,
a_after_all_proc_name varchar2 := null
) return self as result,
overriding member function is_valid return boolean,
overriding member function is_valid(self in out nocopy ut_suite) return boolean,
/**
* Finds the item in the suite by it's name and returns the item index
*/
overriding member function do_execute(self in out nocopy ut_suite , a_listener in out nocopy ut_event_listener_base) return boolean
overriding member function do_execute(self in out nocopy ut_suite , a_listener in out nocopy ut_event_listener_base) return boolean,
overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list,
overriding member function get_serveroutputs return clob
)
/
Loading