Skip to content

Commit d227172

Browse files
committed
Fixed block coverage privileges issue
Refactored code.
1 parent 4857d62 commit d227172

19 files changed

+153
-233
lines changed
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
begin
22
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
33
dbms_plsql_code_coverage.create_coverage_tables(force_it => true);
4-
$else
5-
null;
64
$end
75
end;
86
/

source/core/coverage/ut_coverage.pkb

Lines changed: 63 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,26 @@ create or replace package body ut_coverage is
1616
limitations under the License.
1717
*/
1818

19-
20-
type t_source_lines is table of binary_integer;
19+
g_coverage_id tt_coverage_id_arr;
20+
g_develop_mode boolean not null := false;
21+
g_is_started boolean not null := false;
22+
23+
procedure set_develop_mode(a_develop_mode in boolean) is
24+
begin
25+
g_develop_mode := a_develop_mode;
26+
end;
27+
28+
function get_coverage_id(a_coverage_type in varchar2) return integer is
29+
begin
30+
return g_coverage_id(a_coverage_type);
31+
end;
2132

22-
function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skipped_lines varchar2 default 'Y') return varchar2 is
33+
function is_develop_mode return boolean is
34+
begin
35+
return g_develop_mode;
36+
end;
37+
38+
function get_cov_sources_sql(a_coverage_options ut_coverage_options) return varchar2 is
2339
l_result varchar2(32767);
2440
l_full_name varchar2(100);
2541
l_view_name varchar2(200) := ut_metadata.get_dba_view('dba_source');
@@ -44,8 +60,7 @@ create or replace package body ut_coverage is
4460
and regexp_like( t.text, '[A-Za-z0-9$#_]*(begin|declare|compound).*','i'))
4561
) as line,
4662
s.text, ]';
47-
if a_skipped_lines = 'Y' then
48-
l_result := l_result ||
63+
l_result := l_result ||
4964
q'[case
5065
when
5166
-- to avoid execution of regexp_like on every line
@@ -62,10 +77,7 @@ create or replace package body ut_coverage is
6277
)
6378
then 'Y'
6479
end as to_be_skipped ]';
65-
else
66-
l_result := l_result || q'['N' as to_be_skipped ]';
67-
end if;
68-
80+
6981
l_result := l_result ||' from '||l_view_name||q'[ s]';
7082

7183
if a_coverage_options.file_mappings is not empty then
@@ -96,7 +108,7 @@ create or replace package body ut_coverage is
96108
l_skip_objects ut_object_names;
97109
l_sql varchar2(32767);
98110
begin
99-
if not ut_coverage_helper.is_develop_mode() then
111+
if not is_develop_mode() then
100112
--skip all the utplsql framework objects and all the unit test packages that could potentially be reported by coverage.
101113
l_skip_objects := ut_utils.get_utplsql_objects_list() multiset union all coalesce(a_coverage_options.exclude_objects, ut_object_names());
102114
end if;
@@ -111,13 +123,13 @@ create or replace package body ut_coverage is
111123
return l_cursor;
112124
end;
113125

114-
procedure populate_tmp_table(a_coverage_options in ut_coverage_options,a_sql in varchar2) is
126+
procedure populate_tmp_table(a_coverage_options ut_coverage_options, a_sql in varchar2) is
115127
pragma autonomous_transaction;
116128
l_cov_sources_crsr sys_refcursor;
117129
l_cov_sources_data ut_coverage_helper.t_coverage_sources_tmp_rows;
118130
begin
119131

120-
if not ut_coverage_helper.is_tmp_table_populated() or ut_coverage_helper.is_develop_mode() then
132+
if not ut_coverage_helper.is_tmp_table_populated() or is_develop_mode() then
121133
ut_coverage_helper.cleanup_tmp_table();
122134

123135
l_cov_sources_crsr := get_cov_sources_cursor(a_coverage_options,a_sql);
@@ -140,33 +152,55 @@ create or replace package body ut_coverage is
140152
* Public functions
141153
*/
142154
procedure coverage_start(a_coverage_options ut_coverage_options default null) is
155+
l_run_comment varchar2(200) := 'utPLSQL Code coverage run '||ut_utils.to_string(systimestamp);
143156
begin
144-
ut_coverage_helper.coverage_start('utPLSQL Code coverage run '||ut_utils.to_string(systimestamp));
157+
if not is_develop_mode() and not g_is_started then
158+
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
159+
ut_coverage_helper_block.coverage_start( l_run_comment, g_coverage_id(gc_block_coverage) );
160+
-- g_coverage_id(gc_block_coverage) := dbms_plsql_code_coverage.start_coverage( l_run_comment );
161+
$end
162+
ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) );
163+
coverage_pause();
164+
g_is_started := true;
165+
end if;
145166
end;
146167

147-
procedure coverage_start_develop(a_coverage_options ut_coverage_options default null) is
168+
procedure coverage_pause is
148169
begin
149-
ut_coverage_helper.coverage_start_develop;
170+
if not is_develop_mode() then
171+
ut_coverage_helper_profiler.coverage_pause();
172+
end if;
150173
end;
151174

152-
procedure coverage_pause is
175+
procedure coverage_resume is
153176
begin
154-
ut_coverage_helper.coverage_pause();
177+
ut_coverage_helper_profiler.coverage_resume();
155178
end;
156179

157-
procedure coverage_resume is
180+
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
158181
begin
159-
ut_coverage_helper.coverage_resume();
182+
g_develop_mode := true;
183+
g_is_started := true;
184+
g_coverage_id(a_coverage_type) := a_coverage_id;
160185
end;
161186

162-
procedure coverage_stop is
187+
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr) is
163188
begin
164-
ut_coverage_helper.coverage_stop();
189+
g_develop_mode := true;
190+
g_is_started := true;
191+
g_coverage_id := a_coverage_id;
165192
end;
166193

167-
procedure coverage_stop_develop is
194+
procedure coverage_stop is
168195
begin
169-
ut_coverage_helper.coverage_stop_develop();
196+
if not is_develop_mode() then
197+
g_is_started := false;
198+
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
199+
ut_coverage_helper_block.coverage_stop();
200+
$end
201+
ut_coverage_helper_profiler.coverage_stop();
202+
g_is_started := false;
203+
end if;
170204
end;
171205

172206
function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
@@ -175,13 +209,16 @@ create or replace package body ut_coverage is
175209
l_object ut_coverage.t_full_name;
176210
l_line_no binary_integer;
177211
begin
178-
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
212+
--prepare global temp table with sources
213+
populate_tmp_table(a_coverage_options, get_cov_sources_sql(a_coverage_options));
214+
215+
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
179216
-- tmp table for block again.
180-
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data(a_coverage_options => a_coverage_options);
217+
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data( a_coverage_options, get_coverage_id(gc_proftab_coverage) );
181218

182219
-- If block coverage available we will use it.
183220
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
184-
l_result_block := ut_coverage_block.get_coverage_data(a_coverage_options => a_coverage_options);
221+
l_result_block := ut_coverage_block.get_coverage_data( a_coverage_options, get_coverage_id(gc_block_coverage) );
185222

186223
-- Enrich profiler results with some of the block results
187224
l_object := l_result_profiler_enrich.objects.first;

source/core/coverage/ut_coverage.pks

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ create or replace package ut_coverage authid current_user is
1515
See the License for the specific language governing permissions and
1616
limitations under the License.
1717
*/
18-
19-
gc_proftab_coverage constant varchar2(32) := 'proftab';
20-
gc_block_coverage constant varchar2(32) := 'block';
18+
19+
gc_proftab_coverage constant varchar2(32) := 'proftab';
20+
gc_block_coverage constant varchar2(32) := 'block';
2121
gc_extended_coverage constant varchar2(32) := 'extended';
22-
22+
23+
type tt_coverage_id_arr is table of integer index by varchar2(30);
24+
2325
-- total run coverage information
2426
subtype t_full_name is varchar2(4000);
2527
subtype t_object_name is varchar2(250);
@@ -62,21 +64,24 @@ create or replace package ut_coverage authid current_user is
6264
,uncovered_blocks binary_integer default null
6365
,executions number(38, 0) := 0
6466
,objects tt_program_units);
65-
66-
function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skipped_lines varchar2 default 'Y') return varchar2;
67-
68-
procedure populate_tmp_table(a_coverage_options ut_coverage_options, a_sql in varchar2);
69-
70-
procedure coverage_start(a_coverage_options ut_coverage_options default null);
7167

72-
/*
73-
* Start coverage in develop mode, where all internal calls to utPLSQL itself are also included
68+
function get_coverage_id(a_coverage_type in varchar2) return integer;
69+
70+
procedure set_develop_mode(a_develop_mode in boolean);
71+
72+
function is_develop_mode return boolean;
73+
74+
/***
75+
* Allows overwriting of private global variable g_coverage_id
76+
* Used internally, only for unit testing of the framework only
7477
*/
75-
procedure coverage_start_develop(a_coverage_options ut_coverage_options default null);
78+
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2);
7679

77-
procedure coverage_stop;
80+
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr);
7881

79-
procedure coverage_stop_develop;
82+
procedure coverage_start(a_coverage_options ut_coverage_options default null);
83+
84+
procedure coverage_stop;
8085

8186
procedure coverage_pause;
8287

source/core/coverage/ut_coverage_block.pkb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,23 @@ create or replace package body ut_coverage_block is
2323
* Public functions
2424
*/
2525

26-
function get_coverage_data(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage is
26+
function get_coverage_data(a_coverage_options ut_coverage_options, a_coverage_id integer) return ut_coverage.t_coverage is
2727
l_line_calls ut_coverage_helper.t_unit_line_calls;
2828
l_result ut_coverage.t_coverage;
2929
l_new_unit ut_coverage.t_unit_coverage;
3030
l_line_no binary_integer;
3131
l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
3232
l_source_object ut_coverage_helper.t_tmp_table_object;
3333
begin
34-
--prepare global temp table with sources
35-
ut_coverage.populate_tmp_table(a_coverage_options,ut_coverage.get_cov_sources_sql(a_coverage_options,'N'));
36-
34+
3735
l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
3836
loop
3937
fetch l_source_objects_crsr
4038
into l_source_object;
4139
exit when l_source_objects_crsr%notfound;
4240

4341
--get coverage data
44-
l_line_calls := ut_coverage_helper_block.get_raw_coverage_data(l_source_object.owner, l_source_object.name);
42+
l_line_calls := ut_coverage_helper_block.get_raw_coverage_data(l_source_object.owner, l_source_object.name, a_coverage_id);
4543
--if there is coverage, we need to filter out the garbage (badly indicated data)
4644
if l_line_calls.count > 0 then
4745
--remove lines that should not be indicted as meaningful
@@ -155,6 +153,6 @@ create or replace package body ut_coverage_block is
155153

156154
return l_result;
157155
end get_coverage_data;
158-
156+
159157
end;
160158
/

source/core/coverage/ut_coverage_block.pks

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ create or replace package ut_coverage_block authid current_user is
1616
limitations under the License.
1717
*/
1818

19-
function get_coverage_data(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage;
19+
function get_coverage_data(a_coverage_options ut_coverage_options, a_coverage_id integer) return ut_coverage.t_coverage;
2020

2121
end;
2222
/

source/core/coverage/ut_coverage_helper.pkb

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ create or replace package body ut_coverage_helper is
1717
*/
1818

1919

20-
g_develop_mode boolean not null := false;
21-
g_is_started boolean not null := false;
22-
2320

2421
type t_proftab_row is record (
2522
line binary_integer,
@@ -35,108 +32,6 @@ create or replace package body ut_coverage_helper is
3532

3633
type t_block_rows is table of t_block_row;
3734

38-
procedure set_coverage_status(a_started in boolean) is
39-
begin
40-
g_is_started := a_started;
41-
end;
42-
43-
procedure set_develop_mode(a_develop_mode in boolean) is
44-
begin
45-
g_develop_mode := a_develop_mode;
46-
end;
47-
48-
function get_coverage_id(a_coverage_type in varchar2) return integer is
49-
begin
50-
return g_coverage_id(a_coverage_type);
51-
end;
52-
53-
function is_develop_mode return boolean is
54-
begin
55-
return g_develop_mode;
56-
end;
57-
58-
procedure coverage_start_internal(a_run_comment varchar2) is
59-
begin
60-
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
61-
ut_coverage_helper_block.coverage_start(a_run_comment => a_run_comment ,a_coverage_id => g_coverage_id(ut_coverage.gc_block_coverage) );
62-
ut_coverage_helper_profiler.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id(ut_coverage.gc_proftab_coverage));
63-
coverage_pause();
64-
$else
65-
ut_coverage_helper_profiler.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id(ut_coverage.gc_proftab_coverage));
66-
coverage_pause();
67-
$end
68-
69-
g_is_started := true;
70-
end;
71-
72-
procedure coverage_start(a_run_comment varchar2) is
73-
begin
74-
if not g_is_started then
75-
g_develop_mode := false;
76-
coverage_start_internal(a_run_comment);
77-
end if;
78-
end;
79-
80-
procedure coverage_start_develop is
81-
begin
82-
if not g_is_started then
83-
g_develop_mode := true;
84-
coverage_start_internal('utPLSQL Code coverage run in development MODE '||ut_utils.to_string(systimestamp));
85-
end if;
86-
end;
87-
88-
procedure coverage_pause is
89-
begin
90-
if not g_develop_mode then
91-
ut_coverage_helper_profiler.coverage_pause();
92-
end if;
93-
end;
94-
95-
procedure coverage_resume is
96-
begin
97-
ut_coverage_helper_profiler.coverage_resume();
98-
end;
99-
100-
procedure coverage_stop is
101-
begin
102-
if not g_develop_mode then
103-
g_is_started := false;
104-
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
105-
ut_coverage_helper_profiler.coverage_stop();
106-
ut_coverage_helper_block.coverage_stop();
107-
$else
108-
ut_coverage_helper_profiler.coverage_stop();
109-
$end
110-
end if;
111-
end;
112-
113-
procedure coverage_stop_develop is
114-
begin
115-
g_develop_mode := false;
116-
g_is_started := false;
117-
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
118-
ut_coverage_helper_profiler.coverage_stop();
119-
ut_coverage_helper_block.coverage_stop();
120-
$else
121-
ut_coverage_helper_profiler.coverage_stop();
122-
$end
123-
124-
end;
125-
126-
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
127-
begin
128-
g_develop_mode := true;
129-
g_is_started := true;
130-
g_coverage_id(a_coverage_type) := a_coverage_id;
131-
end;
132-
133-
procedure mock_coverage_id(a_coverage_id g_coverage_arr) is
134-
begin
135-
g_develop_mode := true;
136-
g_is_started := true;
137-
g_coverage_id := a_coverage_id;
138-
end;
139-
14035
procedure insert_into_tmp_table(a_data t_coverage_sources_tmp_rows) is
14136
begin
14237
forall i in 1 .. a_data.count

0 commit comments

Comments
 (0)