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

Skip to content

Commit 67bb12f

Browse files
committed
All tests will now get executed even if some of them fail due to package invalidation.
1 parent aedbbe7 commit 67bb12f

9 files changed

Lines changed: 181 additions & 4 deletions

File tree

.travis/install.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ set feedback on
3333
--Needed for testing coverage outside of main UT3 schema.
3434
grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary to $UT3_TESTER;
3535
revoke execute on dbms_crypto from $UT3_TESTER;
36+
grant create job to $UT3_TESTER;
3637
exit
3738
SQL

source/api/ut.pkb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ create or replace package body ut is
9494
ut_expectation_processor.report_failure(a_message);
9595
end;
9696

97+
procedure raise_if_packages_invalidated is
98+
e_package_invalidated exception;
99+
pragma exception_init (e_package_invalidated, -04068);
100+
begin
101+
if ut_expectation_processor.invalidation_exception_found() then
102+
ut_expectation_processor.reset_invalidation_exception();
103+
raise e_package_invalidated;
104+
end if;
105+
end;
106+
97107
procedure run_autonomous(
98108
a_paths ut_varchar2_list, a_reporter ut_reporter_base, a_color_console integer,
99109
a_coverage_schemes ut_varchar2_list := null, a_source_file_mappings ut_file_mappings, a_test_file_mappings ut_file_mappings,
@@ -149,6 +159,8 @@ create or replace package body ut is
149159
end loop;
150160
close l_lines;
151161
end if;
162+
raise_if_packages_invalidated();
163+
return;
152164
end;
153165

154166
function run(
@@ -174,6 +186,8 @@ create or replace package body ut is
174186
end loop;
175187
close l_lines;
176188
end if;
189+
raise_if_packages_invalidated();
190+
return;
177191
end;
178192

179193
function run(
@@ -198,6 +212,8 @@ create or replace package body ut is
198212
end loop;
199213
close l_lines;
200214
end if;
215+
raise_if_packages_invalidated();
216+
return;
201217
end;
202218

203219
function run(
@@ -222,6 +238,8 @@ create or replace package body ut is
222238
end loop;
223239
close l_lines;
224240
end if;
241+
raise_if_packages_invalidated();
242+
return;
225243
end;
226244

227245
function run(
@@ -247,6 +265,8 @@ create or replace package body ut is
247265
end loop;
248266
close l_lines;
249267
end if;
268+
raise_if_packages_invalidated();
269+
return;
250270
end;
251271

252272
function run(
@@ -272,6 +292,8 @@ create or replace package body ut is
272292
end loop;
273293
close l_lines;
274294
end if;
295+
raise_if_packages_invalidated();
296+
return;
275297
end;
276298

277299
procedure run(
@@ -288,6 +310,7 @@ create or replace package body ut is
288310
if l_reporter is of (ut_output_reporter_base) then
289311
treat(l_reporter as ut_output_reporter_base).lines_to_dbms_output();
290312
end if;
313+
raise_if_packages_invalidated();
291314
end;
292315

293316
procedure run(
@@ -304,6 +327,7 @@ create or replace package body ut is
304327
if l_reporter is of (ut_output_reporter_base) then
305328
treat(l_reporter as ut_output_reporter_base).lines_to_dbms_output();
306329
end if;
330+
raise_if_packages_invalidated();
307331
end;
308332

309333
procedure run(

source/api/ut_runner.pkb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ create or replace package body ut_runner is
7373
l_listener ut_event_listener;
7474
begin
7575
begin
76+
ut_expectation_processor.reset_invalidation_exception();
7677
ut_utils.save_dbms_output_to_cache();
7778

7879
ut_console_reporter_base.set_color_enabled(a_color_console);

source/core/types/ut_executable.tpb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ create or replace type body ut_executable is
114114
' l_error_stack := dbms_utility.format_error_stack;' || chr(10) ||
115115
' l_error_backtrace := dbms_utility.format_error_backtrace;' || chr(10) ||
116116
' --raise on ORA-04068, ORA-04061: existing state of packages has been discarded to avoid unrecoverable session exception' || chr(10) ||
117-
' if l_error_stack like ''%ORA-04068%'' or l_error_stack like ''%ORA-04061%'' then' || chr(10) ||
118-
' raise;' || chr(10) ||
119-
' end if;' || chr(10) ||
120117
' end;' || chr(10) ||
121118
' :a_error_stack := l_error_stack;' || chr(10) ||
122119
' :a_error_backtrace := l_error_backtrace;' || chr(10) ||
@@ -137,7 +134,9 @@ create or replace type body ut_executable is
137134
save_dbms_output;
138135

139136
l_completed_without_errors := (self.error_stack||self.error_backtrace) is null;
140-
137+
if self.error_stack like '%ORA-04068%' or self.error_stack like '%ORA-04061%' then
138+
ut_expectation_processor.set_invalidation_exception();
139+
end if;
141140
--listener - after call to executable
142141
a_listener.fire_after_event(self.associated_event_name, a_item);
143142

source/core/ut_expectation_processor.pkb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ create or replace package body ut_expectation_processor as
2626

2727
g_nulls_are_equal boolean_not_null := gc_default_nulls_are_equal;
2828

29+
g_package_invalidated boolean := false;
30+
2931
function nulls_are_equal return boolean is
3032
begin
3133
return g_nulls_are_equal;
@@ -171,5 +173,20 @@ create or replace package body ut_expectation_processor as
171173
return g_warnings;
172174
end;
173175

176+
function invalidation_exception_found return boolean is
177+
begin
178+
return g_package_invalidated;
179+
end;
180+
181+
procedure set_invalidation_exception is
182+
begin
183+
g_package_invalidated := true;
184+
end;
185+
186+
procedure reset_invalidation_exception is
187+
begin
188+
g_package_invalidated := false;
189+
end;
190+
174191
end;
175192
/

source/core/ut_expectation_processor.pks

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,9 @@ create or replace package ut_expectation_processor authid current_user as
5252

5353
function get_warnings return ut_varchar2_list;
5454

55+
function invalidation_exception_found return boolean;
56+
procedure set_invalidation_exception;
57+
procedure reset_invalidation_exception;
58+
5559
end;
5660
/

test/api/test_ut_run.pkb

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
create or replace package body test_ut_run is
2+
3+
procedure create_test_suite is
4+
pragma autonomous_transaction;
5+
begin
6+
execute immediate q'[
7+
create or replace package stateful_package as
8+
g_state varchar2(1) := 'A';
9+
end;
10+
]';
11+
execute immediate q'[
12+
create or replace package test_stateful as
13+
--%suite
14+
--%suitepath(test_state)
15+
16+
--%test
17+
procedure stateful_success;
18+
19+
--%test
20+
--%beforetest(recompile_in_background)
21+
procedure failing_stateful_test;
22+
23+
procedure recompile_in_background;
24+
25+
--%test
26+
procedure dummy_success;
27+
28+
end;
29+
]';
30+
execute immediate q'{
31+
create or replace package body test_stateful as
32+
33+
procedure stateful_success is
34+
begin
35+
ut3.ut.expect(stateful_package.g_state).to_equal('A');
36+
end;
37+
38+
procedure failing_stateful_test is
39+
begin
40+
ut3.ut.expect(stateful_package.g_state).to_equal('abc');
41+
end;
42+
43+
procedure dummy_success is
44+
begin
45+
ut3.ut.expect(1).to_equal(1);
46+
end;
47+
48+
procedure recompile_in_background is
49+
l_job_name varchar2(30) := 'recreate_stateful_package';
50+
l_cnt integer := 1;
51+
pragma autonomous_transaction;
52+
begin
53+
dbms_scheduler.create_job(
54+
job_name => l_job_name,
55+
job_type => 'PLSQL_BLOCK',
56+
job_action => q'/
57+
begin
58+
execute immediate q'[
59+
create or replace package stateful_package as
60+
g_state varchar2(3) := 'abc';
61+
end;]';
62+
end;/',
63+
start_date => sysdate,
64+
enabled => TRUE,
65+
auto_drop => TRUE,
66+
comments => 'one-time job'
67+
);
68+
dbms_lock.sleep(0.2);
69+
while l_cnt > 0 loop
70+
select count(1) into l_cnt
71+
from dba_scheduler_running_jobs srj
72+
where srj.job_name = l_job_name;
73+
end loop;
74+
end;
75+
end;
76+
}';
77+
78+
end;
79+
80+
procedure raise_in_invalid_state is
81+
l_results ut3.ut_varchar2_list;
82+
l_expected varchar2(32767);
83+
begin
84+
--Arrange
85+
l_expected := 'test_state
86+
test_stateful
87+
stateful_success [% sec]
88+
failing_stateful_test [% sec] (FAILED - 1)
89+
dummy_success [% sec]%
90+
Failures:%
91+
1) failing_stateful_test
92+
ORA-04061: existing state of package "UT3_TESTER.STATEFUL_PACKAGE" has been invalidated
93+
ORA-04065: not executed, altered or dropped package "UT3_TESTER.STATEFUL_PACKAGE"
94+
ORA-06508: PL/SQL: could not find program unit being called: "UT3_TESTER.STATEFUL_PACKAGE"
95+
ORA-06512: at "UT3_TESTER.TEST_STATEFUL", line 10%
96+
ORA-06512: at line 6%
97+
3 tests, 0 failed, 1 errored, 0 disabled, 0 warning(s)%';
98+
99+
--Act
100+
select * bulk collect into l_results from table(ut3.ut.run('test_stateful'));
101+
--Assert
102+
ut.fail('Expected exception but nothing was raised');
103+
exception
104+
when others then
105+
ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( l_expected );
106+
ut.expect(sqlcode).to_equal(-4068);
107+
end;
108+
109+
procedure drop_test_suite is
110+
pragma autonomous_transaction;
111+
begin
112+
execute immediate 'drop package stateful_package';
113+
execute immediate 'drop package test_stateful';
114+
end;
115+
116+
end;
117+
/

test/api/test_ut_run.pks

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
create or replace package test_ut_run is
2+
--%suite(ut_run)
3+
4+
procedure create_test_suite;
5+
procedure drop_test_suite;
6+
7+
--%test(ut.run - raises after completing all tests if a test fails with ORA-04068 or ORA-04061)
8+
--%beforetest(create_test_suite)
9+
--%aftertest(drop_test_suite)
10+
procedure raise_in_invalid_state;
11+
end;
12+
/

test/install_tests.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ whenever oserror exit failure rollback
1616
--Install tests
1717
@@core.pks
1818
@@api/test_ut_runner.pks
19+
@@api/test_ut_run.pks
1920
@@core/test_ut_utils.pks
2021
@@core/test_ut_suite.pks
2122
@@core/test_ut_test.pks
@@ -47,6 +48,7 @@ whenever oserror exit failure rollback
4748

4849
@@core.pkb
4950
@@api/test_ut_runner.pkb
51+
@@api/test_ut_run.pkb
5052
@@core/test_ut_utils.pkb
5153
@@core/test_ut_suite.pkb
5254
@@core/test_ut_test.pkb

0 commit comments

Comments
 (0)