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

Skip to content

Commit 5967a3a

Browse files
committed
Fixed test execution on 12.1.
Added wrapper procedures `purge_cache`, `rebuild_annotation_cache` in `ut_runner` Added tests for wrappers. Updated documentation for annotation cache calls.
1 parent 73c15a2 commit 5967a3a

7 files changed

Lines changed: 165 additions & 72 deletions

File tree

docs/userguide/annotations.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,26 @@ When processing the test suite `test_pkg` defined in [Example of annotated test
214214
rollback to savepoint 'beforeall'
215215
216216
```
217+
218+
# Annotation cache
219+
220+
utPLSQL needs to scan sources of package specifications to identify and parse annotations.
221+
To improve framework startup time, specially when dealing with database users owning large amount of packages the framework has build-in persistent cache for annotations.
222+
223+
Cache is checked for staleness and refreshed automatically on every run.
224+
The initial startup of utPLSQL for a schema will take longer than consecutive executions.
225+
226+
If you're in situation, where your database is controlled via CI/CD server and gets refreshed/wiped before each run of your tests,
227+
consider building upfront and creating the snapshot of our database after the cache was refreshed.
228+
229+
To build annotation cache without actually invoking any tests, call `ut_runner.rebuild_annotation_cache(a_object_owner, a_object_type)` sql block for every unit test owner that you want to have annotations cache prebuilt.
230+
231+
Example:
232+
```sql
233+
exec ut_runner.rebuild_annotation_cache('HR', 'PACKAGE');
234+
```
235+
236+
To purge annotations cache call:
237+
```sql
238+
exec ut_runner.purge_cache('HR', 'PACKAGE');
239+
```

source/api/ut_runner.pkb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,15 @@ create or replace package body ut_runner is
119119
);
120120
end;
121121

122+
procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2) is
123+
begin
124+
ut_annotation_manager.rebuild_annotation_cache(a_object_owner, a_object_type);
125+
end;
126+
127+
procedure purge_cache(a_object_owner varchar2, a_object_type varchar2) is
128+
begin
129+
ut_annotation_manager.purge_cache(a_object_owner, a_object_type);
130+
end;
131+
122132
end ut_runner;
123133
/

source/api/ut_runner.pks

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,24 @@ create or replace package ut_runner authid current_user is
5858
a_include_objects ut_varchar2_list := null, a_exclude_objects ut_varchar2_list := null, a_fail_on_errors boolean default false
5959
);
6060

61+
/**
62+
* Rebuilds annotation cache for a specified schema and object type.
63+
* The procedure is called internally by `get_annotated_objects` function.
64+
* It can be used to speedup initial execution of utPLSQL on a given schema
65+
* if it is executed before any call is made to `ut.run` or `ut_runner.run` procedure.
66+
*
67+
* @param a_object_owner owner of objects to get annotations for
68+
* @param a_object_type type of objects to get annotations for
69+
*/
70+
procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2);
71+
72+
/**
73+
* Removes cached information about annotations for objects of specified type and specified owner
74+
*
75+
* @param a_object_owner owner of objects to purge annotations for
76+
* @param a_object_type type of objects to purge annotations for
77+
*/
78+
procedure purge_cache(a_object_owner varchar2, a_object_type varchar2);
79+
6180
end ut_runner;
6281
/

test/ut_annotation_manager/test_annotation_manager.pkb

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -64,39 +64,6 @@ create or replace package body test_annotation_manager is
6464
commit;
6565
end;
6666

67-
procedure setup_cache is
68-
pragma autonomous_transaction;
69-
begin
70-
create_dummy_test_package();
71-
execute immediate q'[create or replace procedure dummy_test_procedure as
72-
--%some_annotation(some_text)
73-
--%rollback(manual)
74-
begin
75-
null;
76-
end;]';
77-
execute immediate q'[create or replace procedure ut3.dummy_test_procedure as
78-
--%some_annotation(some_text)
79-
--%rollback(manual)
80-
begin
81-
null;
82-
end;]';
83-
ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE');
84-
ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PROCEDURE');
85-
ut3.ut_annotation_manager.rebuild_annotation_cache('UT3','PROCEDURE');
86-
end;
87-
88-
procedure cleanup_cache is
89-
pragma autonomous_transaction;
90-
begin
91-
delete from ut3.ut_annotation_cache_info
92-
where object_type = 'PROCEDURE' and object_owner in ('UT3',user)
93-
or object_type = 'PACKAGE' and object_owner = user and object_name = 'DUMMY_TEST_PACKAGE';
94-
drop_dummy_test_package();
95-
execute immediate q'[drop procedure dummy_test_procedure]';
96-
execute immediate q'[drop procedure ut3.dummy_test_procedure]';
97-
end;
98-
99-
10067

10168
procedure add_new_package is
10269
l_actual_cache_id integer;
@@ -285,36 +252,5 @@ create or replace package body test_annotation_manager is
285252
ut.expect(l_actual).to_be_empty();
286253
end;
287254

288-
procedure test_purge_schema_type is
289-
l_actual sys_refcursor;
290-
begin
291-
292-
open l_actual for
293-
select * from ut3.ut_annotation_cache_info
294-
where object_owner = user and object_type = 'PROCEDURE';
295-
ut.expect(l_actual).not_to_be_empty();
296-
297-
--Act
298-
ut3.ut_annotation_cache_manager.purge_cache(user,'PROCEDURE');
299-
300-
--Assert
301-
open l_actual for
302-
select * from ut3.ut_annotation_cache_info
303-
where object_owner = user and object_type = 'PROCEDURE';
304-
--Cache purged for object owner/type
305-
ut.expect(l_actual).to_be_empty();
306-
open l_actual for
307-
select * from ut3.ut_annotation_cache_info
308-
where object_owner = user and object_type = 'PACKAGE';
309-
--Cache not purged for other types
310-
ut.expect(l_actual).not_to_be_empty();
311-
open l_actual for
312-
select * from ut3.ut_annotation_cache_info
313-
where object_owner != user and object_type = 'PROCEDURE';
314-
--Cache not purged for other owners
315-
ut.expect(l_actual).not_to_be_empty();
316-
317-
end;
318-
319255
end test_annotation_manager;
320256
/

test/ut_annotation_manager/test_annotation_manager.pks

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,5 @@ create or replace package test_annotation_manager is
4242
--%beforetest(create_dummy_test_package)
4343
procedure no_data_for_dropped_object;
4444

45-
procedure setup_cache;
46-
procedure cleanup_cache;
47-
48-
--%test(Purges cache for a given schema and object type)
49-
--%beforetest(setup_cache)
50-
--%aftertest(cleanup_cache)
51-
procedure test_purge_schema_type;
52-
5345
end test_annotation_manager;
5446
/

test/ut_runner/test_ut_runner.pkb

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,50 @@
11
create or replace package body test_ut_runner is
22

3+
procedure setup_cache_objects is
4+
pragma autonomous_transaction;
5+
begin
6+
execute immediate q'[create or replace package dummy_test_package as
7+
--%suite(dummy_test_suite)
8+
--%rollback(manual)
9+
10+
--%test(dummy_test)
11+
--%beforetest(some_procedure)
12+
procedure some_dummy_test_procedure;
13+
end;]';
14+
execute immediate q'[create or replace procedure dummy_test_procedure as
15+
--%some_annotation(some_text)
16+
--%rollback(manual)
17+
begin
18+
null;
19+
end;]';
20+
execute immediate q'[create or replace procedure ut3.dummy_test_procedure as
21+
--%some_annotation(some_text)
22+
--%rollback(manual)
23+
begin
24+
null;
25+
end;]';
26+
end;
27+
28+
procedure setup_cache is
29+
pragma autonomous_transaction;
30+
begin
31+
setup_cache_objects();
32+
ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE');
33+
ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PROCEDURE');
34+
ut3.ut_annotation_manager.rebuild_annotation_cache('UT3','PROCEDURE');
35+
end;
36+
37+
procedure cleanup_cache is
38+
pragma autonomous_transaction;
39+
begin
40+
delete from ut3.ut_annotation_cache_info
41+
where object_type = 'PROCEDURE' and object_owner in ('UT3',user)
42+
or object_type = 'PACKAGE' and object_owner = user and object_name = 'DUMMY_TEST_PACKAGE';
43+
execute immediate q'[drop package dummy_test_package]';
44+
execute immediate q'[drop procedure dummy_test_procedure]';
45+
execute immediate q'[drop procedure ut3.dummy_test_procedure]';
46+
end;
47+
348
procedure create_test_spec
449
as
550
pragma autonomous_transaction;
@@ -160,5 +205,58 @@ end;';
160205
drop_test_package();
161206
end;
162207

208+
procedure test_purge_cache_schema_type is
209+
l_actual sys_refcursor;
210+
begin
211+
212+
open l_actual for
213+
select * from ut3.ut_annotation_cache_info
214+
where object_owner = user and object_type = 'PROCEDURE';
215+
ut.expect(l_actual).not_to_be_empty();
216+
217+
--Act
218+
ut3.ut_runner.purge_cache(user,'PROCEDURE');
219+
220+
--Assert
221+
open l_actual for
222+
select * from ut3.ut_annotation_cache_info
223+
where object_owner = user and object_type = 'PROCEDURE';
224+
--Cache purged for object owner/type
225+
ut.expect(l_actual).to_be_empty();
226+
open l_actual for
227+
select * from ut3.ut_annotation_cache_info
228+
where object_owner = user and object_type = 'PACKAGE';
229+
--Cache not purged for other types
230+
ut.expect(l_actual).not_to_be_empty();
231+
open l_actual for
232+
select * from ut3.ut_annotation_cache_info
233+
where object_owner = 'UT3' and object_type = 'PROCEDURE';
234+
--Cache not purged for other owners
235+
ut.expect(l_actual).not_to_be_empty();
236+
237+
end;
238+
239+
procedure test_rebuild_cache_schema_type is
240+
l_actual integer;
241+
begin
242+
--Act
243+
ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE');
244+
--Assert
245+
select count(1) into l_actual
246+
from ut3.ut_annotation_cache_info i
247+
join ut3.ut_annotation_cache c on c.cache_id = i.cache_id
248+
where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE';
249+
--Rebuild cache for user/packages
250+
ut.expect(l_actual).to_equal(4);
251+
252+
select count(1) into l_actual
253+
from ut3.ut_annotation_cache_info i
254+
join ut3.ut_annotation_cache c on c.cache_id = i.cache_id
255+
where object_owner = 'UT3' and object_type = 'PROCEDURE';
256+
257+
--Did not rebuild cache for ut3/procedures
258+
ut.expect(l_actual).to_equal(0);
259+
end;
260+
163261
end;
164262
/

test/ut_runner/test_ut_runner.pks

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,20 @@ create or replace package test_ut_runner is
2828
--%test(does not consume dbms_output from before the run)
2929
procedure run_keep_dbms_output_buffer;
3030

31+
procedure setup_cache;
32+
procedure cleanup_cache;
33+
34+
--%test(Purges cache for a given schema and object type)
35+
--%beforetest(setup_cache)
36+
--%aftertest(cleanup_cache)
37+
procedure test_purge_cache_schema_type;
38+
39+
procedure setup_cache_objects;
40+
41+
--%test(Rebuilds cache for a given schema and object type)
42+
--%beforetest(setup_cache_objects)
43+
--%aftertest(cleanup_cache)
44+
procedure test_rebuild_cache_schema_type;
45+
3146
end;
3247
/

0 commit comments

Comments
 (0)