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

Skip to content

Commit 28f7653

Browse files
committed
Statement Coverage First Commit
1 parent c0ca9d3 commit 28f7653

15 files changed

Lines changed: 496 additions & 22 deletions

source/core/coverage/ut_block_coverage_helper.pkb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ create or replace package body ut_block_coverage_helper is
4343
function block_results(a_object_owner varchar2, a_object_name varchar2) return t_block_rows is
4444
c_raw_coverage sys_refcursor;
4545
l_coverage_rows t_block_rows;
46-
l_coverage_id integer := ut_coverage_helper.get_coverage_id;
46+
l_coverage_id integer := ut_coverage_helper.get_coverage_id(ut_coverage.c_block_coverage);
4747
begin
48+
4849
open c_raw_coverage for q'[select ccb.line
4950
,count(ccb.block) totalblocks
5051
,sum(ccb.covered)
@@ -57,10 +58,10 @@ create or replace package body ut_block_coverage_helper is
5758
and ccu.name = :a_object_name
5859
group by ccb.line
5960
order by 1]' using l_coverage_id,a_object_owner,a_object_name;
60-
61+
6162
fetch c_raw_coverage bulk collect into l_coverage_rows;
6263
close c_raw_coverage;
63-
64+
6465
return l_coverage_rows;
6566
end;
6667

@@ -70,6 +71,7 @@ create or replace package body ut_block_coverage_helper is
7071

7172
begin
7273
l_tmp_data := block_results(a_object_owner => a_object_owner, a_object_name => a_object_name);
74+
7375
for i in 1 .. l_tmp_data.count loop
7476
l_results(l_tmp_data(i).line).blocks := l_tmp_data(i).blocks;
7577
l_results(l_tmp_data(i).line).covered_blocks := l_tmp_data(i).covered_blocks;

source/core/coverage/ut_coverage.pkb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,13 @@ create or replace package body ut_coverage is
106106

107107
if a_coverage_options.coverage_type = c_block_coverage then
108108
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
109-
return ut_coverage_block.get_coverage_data_block(a_coverage_options => a_coverage_options);
109+
return ut_coverage_block.get_coverage_data_block(a_coverage_options => a_coverage_options);
110110
$else
111111
return null;
112112
$end
113+
elsif a_coverage_options.coverage_type = c_extended_coverage then
114+
--Collect data for block and proftab and pass to extended for modifications.
115+
return ut_coverage_extended.get_extended_coverage(a_coverage_options => a_coverage_options);
113116
else
114117
return ut_coverage_proftab.get_coverage_data_profiler(a_coverage_options => a_coverage_options);
115118
end if;

source/core/coverage/ut_coverage.pks

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ create or replace package ut_coverage authid current_user is
1818

1919
c_proftab_coverage constant varchar2(32) := 'proftab';
2020
c_block_coverage constant varchar2(32) := 'block';
21-
21+
c_extended_coverage constant varchar2(32) := 'extended';
22+
2223
-- total run coverage information
2324
subtype t_full_name is varchar2(4000);
2425
subtype t_object_name is varchar2(250);

source/core/coverage/ut_coverage_block.pkb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ create or replace package body ut_coverage_block is
105105

106106
--get coverage data
107107
l_line_calls := ut_block_coverage_helper.get_raw_coverage_data_block(l_source_object.owner, l_source_object.name);
108-
109108
--if there is coverage, we need to filter out the garbage (badly indicated data)
110109
if l_line_calls.count > 0 then
111110
--remove lines that should not be indicted as meaningful
@@ -120,7 +119,7 @@ create or replace package body ut_coverage_block is
120119
if a_coverage_options.file_mappings is null or l_line_calls.count > 0 then
121120

122121
--populate total stats
123-
l_result.total_lines := l_result.total_lines + l_source_object.lines_count;
122+
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
124123

125124
--populate object level coverage stats
126125
if not l_result.objects.exists(l_source_object.full_name) then
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
create or replace package body ut_coverage_extended is
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2017 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
19+
function get_cov_sources_sql(a_coverage_options ut_coverage_options) return varchar2 is
20+
l_result varchar2(32767);
21+
l_full_name varchar2(100);
22+
l_view_name varchar2(200) := ut_metadata.get_dba_view('dba_source');
23+
begin
24+
if a_coverage_options.file_mappings is not null and a_coverage_options.file_mappings.count > 0 then
25+
l_full_name := 'f.file_name';
26+
else
27+
l_full_name := 'lower(s.owner||''.''||s.name)';
28+
end if;
29+
l_result := '
30+
select full_name, owner, name, line, to_be_skipped, text
31+
from (
32+
select '||l_full_name||q'[ as full_name,
33+
s.owner,
34+
s.name,
35+
s.line -
36+
coalesce(
37+
case when type!='TRIGGER' then 0 end,
38+
(select min(t.line) - 1
39+
from ]'||l_view_name||q'[ t
40+
where t.owner = s.owner and t.type = s.type and t.name = s.name
41+
and regexp_like( t.text, '[A-Za-z0-9$#_]*(begin|declare|compound).*','i'))
42+
) as line,
43+
s.text, 'N' as to_be_skipped
44+
from ]'||l_view_name||q'[ s]';
45+
46+
if a_coverage_options.file_mappings is not empty then
47+
l_result := l_result || '
48+
join table(:file_mappings) f
49+
on s.name = f.object_name
50+
and s.type = f.object_type
51+
and s.owner = f.object_owner
52+
where 1 = 1';
53+
elsif a_coverage_options.include_objects is not empty then
54+
l_result := l_result || '
55+
where (s.owner, s.name) in (select il.owner, il.name from table(:include_objects) il)';
56+
else
57+
l_result := l_result || '
58+
where s.owner in (select upper(t.column_value) from table(:l_schema_names) t)';
59+
end if;
60+
l_result := l_result || q'[
61+
and s.type not in ('PACKAGE', 'TYPE', 'JAVA SOURCE')
62+
--Exclude calls to utPLSQL framework, Unit Test packages and objects from a_exclude_list parameter of coverage reporter
63+
and (s.owner, s.name) not in (select el.owner, el.name from table(:l_skipped_objects) el)
64+
)
65+
where line > 0]';
66+
return l_result;
67+
end;
68+
69+
70+
/**
71+
* Public functions
72+
*/
73+
74+
/* Function extend coverage
75+
P - profiler line result, C - coverage line result, X-result
76+
Dla ka?dej linii:X=greatest(P,nvl(C,0))
77+
Czyli:
78+
If P is null - line is irrelevant
79+
If P or X > 0 - line is covered
80+
*/
81+
82+
83+
function get_extended_coverage(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage is
84+
l_result ut_coverage.t_coverage;
85+
l_result_block ut_coverage.t_coverage;
86+
l_result_profiler ut_coverage.t_coverage;
87+
l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
88+
l_source_object ut_coverage_helper.t_tmp_table_object;
89+
l_new_unit ut_coverage.t_unit_coverage;
90+
line_no binary_integer;
91+
begin
92+
l_result_block := ut_coverage_block.get_coverage_data_block(a_coverage_options => a_coverage_options);
93+
l_result_profiler:= ut_coverage_proftab.get_coverage_data_profiler(a_coverage_options => a_coverage_options);
94+
95+
96+
ut_coverage.populate_tmp_table(a_coverage_options,get_cov_sources_sql(a_coverage_options));
97+
98+
l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
99+
loop
100+
fetch l_source_objects_crsr
101+
into l_source_object;
102+
exit when l_source_objects_crsr%notfound;
103+
--check if we have a hits in any of reporters
104+
if l_result_block.total_lines > 0 or l_result_profiler.total_lines > 0 then
105+
--update total stats
106+
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
107+
l_result.total_blocks := l_result_block.total_blocks;
108+
l_result.uncovered_blocks := l_result_block.uncovered_blocks;
109+
l_result.covered_blocks := l_result_block.covered_blocks;
110+
l_result.partcovered_lines := l_result_block.partcovered_lines;
111+
112+
--populate object level coverage stats
113+
if not l_result.objects.exists(l_source_object.full_name) then
114+
l_result.objects(l_source_object.full_name) := l_new_unit;
115+
l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
116+
l_result.objects(l_source_object.full_name).name := l_source_object.name;
117+
l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
118+
l_result.objects(l_source_object.full_name).total_blocks := l_result_block.objects(l_source_object.full_name).total_blocks;
119+
l_result.objects(l_source_object.full_name).uncovered_blocks := l_result_block.objects(l_source_object.full_name).uncovered_blocks;
120+
l_result.objects(l_source_object.full_name).covered_blocks := l_result_block.objects(l_source_object.full_name).covered_blocks;
121+
l_result.objects(l_source_object.full_name).partcovered_lines := l_result_block.objects(l_source_object.full_name).partcovered_lines;
122+
end if;
123+
124+
line_no := coalesce(l_result_block.objects(l_source_object.full_name).lines.first,
125+
l_result_profiler.objects(l_source_object.full_name).lines.first);
126+
127+
if line_no is null then
128+
l_result.uncovered_lines := l_result.uncovered_lines + l_source_object.lines_count;
129+
l_result.objects(l_source_object.full_name).uncovered_lines := l_source_object.lines_count;
130+
else
131+
loop
132+
exit when line_no is null;
133+
-- object level stats
134+
135+
-- Failing on non existing data for block objects.Check if exists and then use it
136+
l_result.objects(l_source_object.full_name).lines(line_no).executions := greatest(l_result_block.objects(l_source_object.full_name).lines(line_no).executions,
137+
l_result_profiler.objects(l_source_object.full_name).lines(line_no).executions);
138+
l_result.objects(l_source_object.full_name).lines(line_no).no_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(line_no).no_blocks,0);
139+
l_result.objects(l_source_object.full_name).lines(line_no).covered_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(line_no).covered_blocks,0);
140+
l_result.objects(l_source_object.full_name).lines(line_no).partcove := l_result_block.objects(l_source_object.full_name).lines(line_no).partcove;
141+
-- total level stats
142+
143+
-- Recalculate total lines
144+
if l_result.objects(l_source_object.full_name).lines(line_no).executions > 0 then
145+
-- total level stats
146+
l_result.executions := l_result.executions + l_result.objects(l_source_object.full_name).lines(line_no).executions;
147+
l_result.covered_lines := l_result.covered_lines + 1;
148+
-- object level stats
149+
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
150+
.uncovered_lines + 1;
151+
elsif l_result.objects(l_source_object.full_name).lines(line_no).executions = 0 then
152+
-- total level stats
153+
l_result.uncovered_lines := l_result.uncovered_lines + 1;
154+
-- object level stats
155+
l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name)
156+
.uncovered_lines + 1;
157+
end if;
158+
159+
line_no := coalesce(l_result_block.objects(l_source_object.full_name).lines.next(line_no),
160+
l_result_profiler.objects(l_source_object.full_name).lines.next(line_no));
161+
162+
end loop;
163+
end if;
164+
end if;
165+
166+
end loop;
167+
close l_source_objects_crsr;
168+
return l_result;
169+
170+
end get_extended_coverage;
171+
172+
end;
173+
/
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
create or replace package ut_coverage_extended authid current_user is
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2017 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
19+
function get_extended_coverage(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage;
20+
21+
end;
22+
/

source/core/coverage/ut_coverage_helper.pkb

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ create or replace package body ut_coverage_helper is
5555
return g_coverage_type;
5656
end;
5757

58-
function get_coverage_id return integer is
58+
function get_coverage_id(a_coverage_type in varchar2) return integer is
5959
begin
60-
return g_coverage_id;
60+
return g_coverage_id(a_coverage_type);
6161
end;
6262

6363
function is_develop_mode return boolean is
@@ -70,12 +70,20 @@ create or replace package body ut_coverage_helper is
7070
set_coverage_type(a_coverage_type);
7171
if get_coverage_type = ut_coverage.c_block_coverage then
7272
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
73-
ut_block_coverage_helper.coverage_start(a_run_comment => a_run_comment ,a_coverage_id => g_coverage_id );
73+
ut_block_coverage_helper.coverage_start(a_run_comment => a_run_comment ,a_coverage_id => g_coverage_id(ut_coverage.c_block_coverage) );
74+
$else
75+
raise_application_error(ut_utils.gc_invalid_coverage_type,'Invalid coverage type requested. Please validate your Oracle install');
76+
$end
77+
elsif get_coverage_type = ut_coverage.c_extended_coverage then
78+
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
79+
ut_block_coverage_helper.coverage_start(a_run_comment => a_run_comment ,a_coverage_id => g_coverage_id(ut_coverage.c_block_coverage) );
80+
ut_proftab_helper.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id(ut_coverage.c_proftab_coverage));
81+
coverage_pause();
7482
$else
7583
raise_application_error(ut_utils.gc_invalid_coverage_type,'Invalid coverage type requested. Please validate your Oracle install');
7684
$end
7785
else
78-
ut_proftab_helper.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id);
86+
ut_proftab_helper.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id(ut_coverage.c_proftab_coverage));
7987
coverage_pause();
8088
end if;
8189
g_is_started := true;
@@ -127,6 +135,13 @@ create or replace package body ut_coverage_helper is
127135
$else
128136
null;
129137
$end
138+
elsif get_coverage_type = ut_coverage.c_extended_coverage then
139+
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
140+
ut_proftab_helper.coverage_stop();
141+
ut_block_coverage_helper.coverage_stop();
142+
$else
143+
null;
144+
$end
130145
else
131146
ut_proftab_helper.coverage_stop();
132147
end if;
@@ -143,6 +158,13 @@ create or replace package body ut_coverage_helper is
143158
$else
144159
null;
145160
$end
161+
elsif get_coverage_type = ut_coverage.c_extended_coverage then
162+
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
163+
ut_proftab_helper.coverage_stop();
164+
ut_block_coverage_helper.coverage_stop();
165+
$else
166+
null;
167+
$end
146168
else
147169
ut_proftab_helper.coverage_stop();
148170
end if;
@@ -152,7 +174,7 @@ create or replace package body ut_coverage_helper is
152174
begin
153175
g_develop_mode := true;
154176
g_is_started := true;
155-
g_coverage_id := a_coverage_id;
177+
g_coverage_id(g_coverage_type) := a_coverage_id;
156178
end;
157179

158180
procedure insert_into_tmp_table(a_data t_coverage_sources_tmp_rows) is

source/core/coverage/ut_coverage_helper.pks

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ create or replace package ut_coverage_helper authid definer is
1616
limitations under the License.
1717
*/
1818

19-
20-
g_coverage_id integer;
19+
type g_coverage_arr is table of integer index by varchar2(30);
20+
g_coverage_id g_coverage_arr;
21+
--g_coverage_id integer;
2122
g_coverage_type varchar2(32);
22-
23+
2324
function get_coverage_type return varchar2;
2425

25-
function get_coverage_id return integer;
26+
function get_coverage_id(a_coverage_type in varchar2) return integer;
2627

2728
procedure set_coverage_type(a_coverage_type in varchar2);
2829

source/core/coverage/ut_coverage_proftab.pkb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,7 @@ create or replace package body ut_coverage_proftab is
131131
if a_coverage_options.file_mappings is null or l_line_calls.count > 0 then
132132

133133
--populate total stats
134-
l_result.total_lines := l_result.total_lines + l_source_object.lines_count;
135-
134+
l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
136135
--populate object level coverage stats
137136
if not l_result.objects.exists(l_source_object.full_name) then
138137
l_result.objects(l_source_object.full_name) := l_new_unit;

source/core/coverage/ut_proftab_helper.pkb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ create or replace package body ut_proftab_helper is
5656
function proftab_results(a_object_owner varchar2, a_object_name varchar2) return t_proftab_rows is
5757
c_raw_coverage sys_refcursor;
5858
l_coverage_rows t_proftab_rows;
59-
l_coverage_id integer := ut_coverage_helper.get_coverage_id;
59+
l_coverage_id integer := ut_coverage_helper.get_coverage_id(ut_coverage.c_proftab_coverage);
6060
begin
6161
open c_raw_coverage for q'[select d.line#,
6262
case when sum(d.total_occur) = 0 and sum(d.total_time) > 0 then 1 else sum(d.total_occur) end total_occur

0 commit comments

Comments
 (0)