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
Added tests for ut_executable.
Fixed issue with non-null serveroutput (empty_clob) created for every run.
Removed unused code from `ut_suite_builder`
  • Loading branch information
jgebal committed Jul 15, 2018
commit 2f39237b1edf119a8592988af9f7c6288e1d3fb9
18 changes: 10 additions & 8 deletions source/core/types/ut_executable.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,19 @@ create or replace type body ut_executable 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_output.get_line(line => l_line, status => l_status);
if l_status != 1 then
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);
end if;
while l_status != 1 loop
if l_line is not null then
ut_utils.append_to_clob(self.serveroutput, l_line);
end if;

dbms_lob.writeappend(self.serveroutput,1,chr(10));
dbms_output.get_line(line => l_line, status => l_status);
if l_status != 1 then
dbms_lob.writeappend(self.serveroutput,1,chr(10));
end if;
end loop;
end save_dbms_output;
begin
Expand All @@ -116,7 +118,7 @@ create or replace type body ut_executable is
' l_error_backtrace varchar2(32767);' || chr(10) ||
'begin' || chr(10) ||
' begin' || chr(10) ||
' ' || ut_metadata.form_name(self.owner_name, self.object_name, self.procedure_name) || ';' || chr(10) ||
' ' || self.form_name() || ';' || chr(10) ||
' exception' || chr(10) ||
' when others then ' || chr(10) ||
' l_error_stack := dbms_utility.format_error_stack;' || chr(10) ||
Expand Down
15 changes: 0 additions & 15 deletions source/core/ut_suite_builder.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -307,21 +307,6 @@ create or replace package body ut_suite_builder is
return l_result;
end;

procedure add_executable(
a_executables in out nocopy ut_executables,
a_owner t_object_name,
a_package_name t_object_name,
a_procedure_name t_object_name,
a_executable_type ut_utils.t_executable_type
) is
begin
if a_executables is null then
a_executables := ut_executables();
end if;
a_executables.extend;
a_executables(a_executables.last) := ut_executable(a_owner, a_package_name, a_procedure_name, a_executable_type);
end;

function add_executables(
a_owner t_object_name,
a_package_name t_object_name,
Expand Down
4 changes: 2 additions & 2 deletions test/api/test_ut_run.pks
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ create or replace package test_ut_run is
--%aftertest(drop_test_suite)
procedure raise_in_invalid_state;

--%test(ut.run - run invalid package and fail expectation)
--%test(ut.run - Does not execute suite when specified package is not valid)
--%beforetest(compile_invalid_package)
--%aftertest(drop_invalid_package)
procedure run_in_invalid_state;
procedure compile_invalid_package;
procedure drop_invalid_package;

--%test( Invalidate package specs via rebuild but still execute package)
--%test(Invalidate package specs via rebuild but still execute package)
--%beforetest(generate_invalid_spec)
--%aftertest(drop_test_package)
procedure run_and_revalidate_specs;
Expand Down
157 changes: 132 additions & 25 deletions test/core/test_ut_executable.pkb
Original file line number Diff line number Diff line change
@@ -1,56 +1,163 @@
create or replace package body test_ut_executable is

--%suite(ut_executable)
--%suitepath(utplsql.core)
g_dbms_output_text varchar2(30) := 'Some output from procedure';

--%beforeall
procedure create_dummy_package is
procedure exec_schema_package_proc is
l_executable ut3.ut_executable;
l_test ut3.ut_test;
l_result boolean;
begin
null;
--Arrange
l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable');
l_executable := ut3.ut_executable_test( null, 'test_ut_executable', 'passing_proc', ut3.ut_utils.gc_test_execute );
--Act
l_result := l_executable.do_execute(l_test);
--Assert
ut.expect(l_result).to_be_true;
ut.expect(l_executable.serveroutput).to_be_null;
ut.expect(l_executable.get_error_stack_trace()).to_be_null;
end;

--%afterall
procedure drop_dummy_package is
procedure exec_package_proc_output is
l_executable ut3.ut_executable;
l_test ut3.ut_test;
l_result boolean;
begin
null;
--Arrange
l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable');
l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'output_proc', ut3.ut_utils.gc_test_execute );
--Act
l_result := l_executable.do_execute(l_test);
--Assert
ut.expect(l_result).to_be_true;
ut.expect(l_executable.serveroutput).to_equal(to_clob(g_dbms_output_text));
ut.expect(l_executable.get_error_stack_trace()).to_be_null;
end;

--%context(do_execute)
procedure exec_failing_proc is
l_executable ut3.ut_executable;
l_test ut3.ut_test;
l_result boolean;
begin
--Arrange
l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable');
l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'throwing_proc', ut3.ut_utils.gc_test_execute );
--Act
l_result := l_executable.do_execute(l_test);
--Assert
ut.expect(l_result).to_be_false;
ut.expect(l_executable.serveroutput).to_be_null;
ut.expect(l_executable.get_error_stack_trace()).to_be_like('ORA-06501: PL/SQL: program error%');
end;

--%test(Executes procedure in current schema when user was not provided)
procedure exec_schema_package_proc is
procedure create_state_dependant_pkg is
pragma autonomous_transaction;
begin
null;
execute immediate q'[
create or replace package stateful_package as
g_state varchar2(1) := 'A';
end;
]';
execute immediate q'[
create or replace package state_dependant_pkg as
procedure run;
end;
]';
execute immediate q'[
create or replace package body state_dependant_pkg as
procedure run is
x varchar2(30);
begin
if stateful_package.g_state = 'A' then
dbms_output.put_line('stateful_package.g_state = "A"');
end if;
end;
end;
]';
end;

--%test(Executes procedure and saves dbms_output)
procedure exec_package_proc is
procedure modify_stateful_package is
l_job_name varchar2(30) := 'recreate_stateful_package';
l_cnt integer := 1;
pragma autonomous_transaction;
begin
null;
dbms_scheduler.create_job(
job_name => l_job_name,
job_type => 'PLSQL_BLOCK',
job_action => q'/
begin
execute immediate q'[
create or replace package stateful_package as
g_state varchar2(3) := 'abc';
end;]';
end;/',
start_date => localtimestamp,
enabled => TRUE,
auto_drop => TRUE,
comments => 'one-time job'
);
dbms_lock.sleep(0.4);
while l_cnt > 0 loop
select count(1) into l_cnt
from dba_scheduler_running_jobs srj
where srj.job_name = l_job_name;
end loop;
end;

--%test(Executes a procedure raising exception, saves dbms_output and exception stack trace)
procedure exec_failing_proc is
procedure drop_state_dependant_pkg is
pragma autonomous_transaction;
begin
null;
execute immediate 'drop package state_dependant_pkg';
execute immediate 'drop package stateful_package';
end;

--%test(Sets state invalidation flag when executed procedure in a state-invalidated package, saves dbms_output and exception stack trace)

procedure exec_invalid_state_proc is
l_executable ut3.ut_executable;
l_test ut3.ut_test;
l_result boolean;
begin
null;
end;
--Arrange
l_test := ut3.ut_test(a_object_name => 'state_dependant_pkg',a_name => 'state_dependant_pkg');
l_executable := ut3.ut_executable_test( user, 'state_dependant_pkg', 'run', ut3.ut_utils.gc_test_execute );
l_result := l_executable.do_execute(l_test);
ut.expect(l_result).to_be_true;

--%endcontext
modify_stateful_package;

--%context(form_name)
l_test := ut3.ut_test(a_object_name => 'state_dependant_pkg',a_name => 'state_dependant_pkg');
l_executable := ut3.ut_executable_test( user, 'state_dependant_pkg', 'run', ut3.ut_utils.gc_test_execute );
--Act
l_result := l_executable.do_execute(l_test);
--Assert
ut.expect(l_result).to_be_false;
ut.expect(l_executable.serveroutput).to_be_null;
ut.expect(l_executable.get_error_stack_trace()).to_be_like('ORA-04061: existing state of package "UT3_TESTER.STATEFUL_PACKAGE" has been invalidated%');
ut.expect(ut3.ut_expectation_processor.invalidation_exception_found()).to_be_true;
end;

--%test(Builds a name for the executable test)
procedure form_name is
begin
ut.expect(ut3.ut_executable_test( user, 'package', 'proc', null ).form_name()).to_equal(user||'.package.proc');
ut.expect(ut3.ut_executable_test( null, 'package', 'proc', null ).form_name()).to_equal('package.proc');
ut.expect(ut3.ut_executable_test( null, 'proc', null, null ).form_name()).to_equal('proc');
ut.expect(ut3.ut_executable_test( user, 'proc', null, null ).form_name()).to_equal(user||'.proc');
end;

procedure passing_proc is
begin
null;
end;
--%endcontext

procedure output_proc is
begin
dbms_output.put_line(g_dbms_output_text);
end;

procedure throwing_proc is
begin
raise program_error;
end;

end;
/
26 changes: 13 additions & 13 deletions test/core/test_ut_executable.pks
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,39 @@ create or replace package test_ut_executable is
--%suite(ut_executable)
--%suitepath(utplsql.core)

--%beforeall
procedure create_dummy_package;

--%afterall
procedure drop_dummy_package;

--%context(do_execute)

--%test(Executes procedure in current schema when user was not provided)
--%disabled
procedure exec_schema_package_proc;

--%test(Executes procedure and saves dbms_output)
--%disabled
procedure exec_package_proc;
procedure exec_package_proc_output;

--%test(Executes a procedure raising exception, saves dbms_output and exception stack trace)
--%disabled
procedure exec_failing_proc;

--%test(Sets state invalidation flag when executed procedure in a state-invalidated package, saves dbms_output and exception stack trace)
--%disabled
--%test(Sets state invalid flag when package-state invalidated and saves exception stack trace)
--%beforetest(create_state_dependant_pkg)
--%aftertest(drop_state_dependant_pkg)
procedure exec_invalid_state_proc;

procedure create_state_dependant_pkg;
procedure drop_state_dependant_pkg;

--%endcontext

--%context(form_name)

--%test(Builds a name for the executable test)
--%disabled
procedure form_name;

--%endcontext

procedure passing_proc;

procedure output_proc;

procedure throwing_proc;

end;
/