Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
287590b
12.2 Stable :
lwasylow Mar 11, 2018
68768f8
12.2 Stable :
lwasylow Mar 13, 2018
76bf869
12.2 Stable :
lwasylow Mar 13, 2018
1f4f5f0
Tests 12.2 Coverage:
lwasylow Mar 14, 2018
90858eb
Added 12.2 coverage
lwasylow Mar 14, 2018
d77cf9a
Test 12.2 coverage
lwasylow Mar 14, 2018
4f83357
Added 12.2 Coverage
lwasylow Mar 14, 2018
ac40332
Added 12.2 Coverage
lwasylow Mar 14, 2018
5f74db9
Merge pull request #602 from lwasylow/12coveragestab2
lwasylow Mar 14, 2018
9d7f16c
Added conditional install of tests for 12.2 only - when block coverag…
jgebal Mar 15, 2018
20541b5
Refactoring coverage:
lwasylow Mar 18, 2018
ab7eb93
Coverage Refactoring:
lwasylow Mar 23, 2018
8dbb1a1
Merge pull request #614 from lwasylow/feature/12cblockcoverage
lwasylow Mar 25, 2018
e0b220d
Merge branch 'develop' into feature/12cblockcoverage
lwasylow Mar 25, 2018
2560f5b
Revert "Feature/12cblockcoverage"
lwasylow Mar 25, 2018
6fe32c5
Merge pull request #615 from utPLSQL/revert-614-feature/12cblockcoverage
lwasylow Mar 25, 2018
8235848
Refactor Coverage:
lwasylow Mar 25, 2018
78fdab5
Refactor Coverage:
lwasylow Mar 25, 2018
3a19341
Merge branch 'feature/12cblockcoverage' of github.com:lwasylow/utPLSQ…
lwasylow Mar 25, 2018
466e126
Update test local
lwasylow Mar 25, 2018
e968f76
Merge pull request #616 from lwasylow/feature/12cblockcoverage
lwasylow Mar 25, 2018
0f1d789
12.2 coverage
lwasylow Apr 3, 2018
faab0fe
Merge pull request #625 from lwasylow/feature/12cblockcoverage
lwasylow Apr 3, 2018
35e5e13
12.2 coverage
lwasylow Apr 3, 2018
1289e99
Merge branch 'feature/12cblockcoverage' of github.com:lwasylow/utPLSQ…
lwasylow Apr 3, 2018
d3ce10c
Merge pull request #626 from lwasylow/feature/12cblockcoverage
lwasylow Apr 3, 2018
c0ca9d3
Fixing error in package name
lwasylow Apr 3, 2018
f151a6e
Update test
lwasylow Apr 4, 2018
28f7653
Statement Coverage First Commit
lwasylow Apr 7, 2018
1f51049
Merge branch 'develop' of https://github.com/utPLSQL/utPLSQL into fea…
lwasylow Apr 7, 2018
9c87b06
Merge branch 'develop' of github.com:utPLSQL/utPLSQL into feature/12c…
lwasylow Apr 7, 2018
d8b8e87
Updated coverage with statement level information
lwasylow Apr 7, 2018
49b1b84
Move get_cov_sql function into common package to remove code duplication
lwasylow Apr 8, 2018
ab7eb24
Refactor Coverage to now enrich profile for partially covered lines u…
lwasylow Apr 8, 2018
36279fa
Update tests and fixed typo in original coverage reporter
lwasylow Apr 10, 2018
661ef74
Merge branch 'feature/12cblockcoverage' of https://github.com/utPLSQL…
lwasylow Apr 10, 2018
57f7a4f
Updated coverage
lwasylow Apr 11, 2018
3a2ff00
Merge branch 'develop' of https://github.com/utPLSQL/utPLSQL into fea…
lwasylow Apr 11, 2018
e6c2be2
Merge pull request #640 from lwasylow/feature/12cov_extended
lwasylow Apr 11, 2018
c9cb004
Fixes to conditional compilation
lwasylow Apr 11, 2018
a862b95
Fixes to new asso array during mock coverage id.
lwasylow Apr 11, 2018
57ee184
Merge pull request #641 from lwasylow/feature/12cblockcoverage
lwasylow Apr 11, 2018
4561795
Update test
lwasylow Apr 11, 2018
0556fbe
Update test
lwasylow Apr 11, 2018
b91e51d
Merge branch 'feature/12cblockcoverage' of github.com:utPLSQL/utPLSQL…
lwasylow Apr 11, 2018
d19f941
Update test/core/reporters/test_extended_coverage.pkb
lwasylow Apr 11, 2018
e2e1437
Updated html reporter to show a information about the partially cover…
lwasylow Apr 11, 2018
a112e36
Added support for block coverage in sonar and cobertura reporters.
jgebal Apr 14, 2018
f0e2653
Clean-up and removal of unnecessary reporters
lwasylow Apr 15, 2018
4458dff
Unify reporters
lwasylow Apr 15, 2018
2027421
Update test
lwasylow Apr 15, 2018
924eb9b
Update issue with part covered being zero.
lwasylow Apr 15, 2018
a111c6d
Update for test with timestamp
lwasylow Apr 15, 2018
2d6c7d3
Merge branch 'develop' into feature/12cblockcoverage
lwasylow Apr 16, 2018
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
12.2 Stable :
Add block coverage
  • Loading branch information
lwasylow committed Mar 13, 2018
commit 68768f8391c263f3fc2fcb3220a1db1e292e2c1c
5 changes: 5 additions & 0 deletions source/core/coverage/dbms_plssqlcode.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
begin
DBMS_PLSQL_CODE_COVERAGE.create_coverage_tables(
force_it => TRUE);
end;
/
155 changes: 146 additions & 9 deletions source/core/coverage/ut_coverage.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,17 @@ create or replace package body ut_coverage is
/**
* Public functions
*/
procedure coverage_start is
procedure coverage_start(a_coverage_options ut_coverage_options default null) is
l_coverage_type varchar2(10) := coalesce(a_coverage_options.coverage_type, 'proftab');
begin
set_coverage_type(a_coverage_type => l_coverage_type);
ut_coverage_helper.coverage_start('utPLSQL Code coverage run '||ut_utils.to_string(systimestamp));
end;

procedure coverage_start_develop is
procedure coverage_start_develop(a_coverage_options ut_coverage_options default null) is
l_coverage_type varchar2(10) := coalesce(a_coverage_options.coverage_type, 'proftab');
begin
set_coverage_type(a_coverage_type => l_coverage_type);
ut_coverage_helper.coverage_start_develop();
end;

Expand Down Expand Up @@ -238,18 +242,18 @@ create or replace package body ut_coverage is
loop
exit when line_no is null;

if l_line_calls(line_no) > 0 then
if l_line_calls(line_no).calls > 0 then
--total stats
l_result.covered_lines := l_result.covered_lines + 1;
l_result.executions := l_result.executions + l_line_calls(line_no);
l_result.executions := l_result.executions + l_line_calls(line_no).calls;
--object level stats
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name).covered_lines + 1;
l_result.objects(l_source_object.full_name).executions := l_result.objects(l_source_object.full_name).executions + l_line_calls(line_no);
elsif l_line_calls(line_no) = 0 then
l_result.objects(l_source_object.full_name).executions := l_result.objects(l_source_object.full_name).executions + l_line_calls(line_no).calls;
elsif l_line_calls(line_no).calls = 0 then
l_result.uncovered_lines := l_result.uncovered_lines + 1;
l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name).uncovered_lines + 1;
end if;
l_result.objects(l_source_object.full_name).lines(line_no).executions := l_line_calls(line_no);
l_result.objects(l_source_object.full_name).lines(line_no).executions := l_line_calls(line_no).calls;

line_no := l_line_calls.next(line_no);
end loop;
Expand All @@ -263,12 +267,145 @@ create or replace package body ut_coverage is
return l_result;
end get_coverage_data_profiler;

function get_coverage_data_block(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage is
l_line_calls ut_coverage_helper.t_unit_line_calls;
l_result ut_coverage.t_coverage;
l_new_unit ut_coverage.t_unit_coverage;
line_no binary_integer;
l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
l_source_object ut_coverage_helper.t_tmp_table_object;
begin
--prepare global temp table with sources
populate_tmp_table(a_coverage_options);

l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
loop
fetch l_source_objects_crsr
into l_source_object;
exit when l_source_objects_crsr%notfound;

--get coverage data
l_line_calls := ut_coverage_helper.get_raw_coverage_data_block(l_source_object.owner, l_source_object.name);

--if there is coverage, we need to filter out the garbage (badly indicated data)
if l_line_calls.count > 0 then
--remove lines that should not be indicted as meaningful
for i in 1 .. l_source_object.to_be_skipped_list.count loop
if l_source_object.to_be_skipped_list(i) is not null then
l_line_calls.delete(l_source_object.to_be_skipped_list(i));
end if;
end loop;
end if;

--if there are no file mappings or object was actually captured by profiler
if a_coverage_options.file_mappings is null or l_line_calls.count > 0 then

--populate total stats
l_result.total_lines := l_result.total_lines + l_source_object.lines_count;

--populate object level coverage stats
if not l_result.objects.exists(l_source_object.full_name) then
l_result.objects(l_source_object.full_name) := l_new_unit;
l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
l_result.objects(l_source_object.full_name).name := l_source_object.name;
l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
end if;
--map to results
line_no := l_line_calls.first;
if line_no is null then
l_result.uncovered_lines := l_result.uncovered_lines + l_source_object.lines_count;
l_result.objects(l_source_object.full_name).uncovered_lines := l_source_object.lines_count;
else
loop
exit when line_no is null;

--turn the block coverage into a line coverage format to allow for reading.
--whenever the linst is a part covered treat that line as a hit and execution but only part covered

--total stats
--Get total blocks ,blocks covered, blocks not covered this will be used for PCT calc
l_result.total_blocks := nvl(l_result.total_blocks, 0) + l_line_calls(line_no).blocks;
l_result.covered_blocks := nvl(l_result.covered_blocks, 0) + l_line_calls(line_no).covered_blocks;
l_result.uncovered_blocks := nvl(l_result.uncovered_blocks, 0) +
(l_line_calls(line_no).blocks - l_line_calls(line_no).covered_blocks);

--If line is partially covered add as part line cover and covered for line reporter
if l_line_calls(line_no).partcovered = 1 then
l_result.partcovered_lines := l_result.partcovered_lines + 1;
end if;

if l_line_calls(line_no).covered_blocks > 0 then
l_result.covered_lines := l_result.covered_lines + 1;
end if;

-- Use nvl as be default is null and screw the calcs
--Increase total blocks
l_result.objects(l_source_object.full_name).lines(line_no).no_blocks := l_line_calls(line_no).blocks;
l_result.objects(l_source_object.full_name).lines(line_no).covered_blocks := l_line_calls(line_no).covered_blocks;
l_result.objects(l_source_object.full_name).total_blocks := nvl(l_result.objects(l_source_object.full_name)
.total_blocks
,0) + l_line_calls(line_no).blocks;

--Total uncovered blocks is a line blocks minus covered blocsk
l_result.objects(l_source_object.full_name).uncovered_blocks := nvl(l_result.objects(l_source_object.full_name)
.uncovered_blocks
,0) +
(l_line_calls(line_no).blocks - l_line_calls(line_no)
.covered_blocks);

--If we have any covered blocks in line
if l_line_calls(line_no).covered_blocks > 0 then
--If any block is covered then we have a hit on that line
l_result.executions := l_result.executions + 1;
--object level stats
--If its part covered then mark it else treat as full cov
if l_line_calls(line_no).partcovered = 1 then
l_result.objects(l_source_object.full_name).partcovered_lines := l_result.objects(l_source_object.full_name)
.partcovered_lines + 1;
end if;
l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
.covered_lines + 1;

--How many blocks we covered
l_result.objects(l_source_object.full_name).covered_blocks := nvl(l_result.objects(l_source_object.full_name)
.covered_blocks
,0) + l_line_calls(line_no)
.covered_blocks;

--Object line executions
l_result.objects(l_source_object.full_name).executions := nvl(l_result.objects(l_source_object.full_name)
.executions
,0) + 1;

l_result.objects(l_source_object.full_name).lines(line_no).executions := 1;

--Whenever there is no covered block treat as uncovered (query returns only lines where the blocks are in code so we
--dont have a false results here when there is no blocks
elsif l_line_calls(line_no).covered_blocks = 0 then
l_result.uncovered_lines := l_result.uncovered_lines + 1;
l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name)
.uncovered_lines + 1;
l_result.objects(l_source_object.full_name).lines(line_no).executions := 0;
end if;
--increase part covered counter (+ 1/0)
l_result.objects(l_source_object.full_name).lines(line_no).partcove := l_line_calls(line_no).partcovered;
line_no := l_line_calls.next(line_no);
end loop;
end if;
end if;

end loop;

close l_source_objects_crsr;

return l_result;
end get_coverage_data_block;

function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
begin

if get_coverage_type = 'block' then
null;
--return get_coverage_data_block(a_coverage_options => a_coverage_options);
return get_coverage_data_block(a_coverage_options => a_coverage_options);
else
return get_coverage_data_profiler(a_coverage_options => a_coverage_options);
end if;
Expand Down
4 changes: 2 additions & 2 deletions source/core/coverage/ut_coverage.pks
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,12 @@ create or replace package ut_coverage authid current_user is

function get_coverage_type return varchar2;

procedure coverage_start;
procedure coverage_start(a_coverage_options ut_coverage_options default null);

/*
* Start coverage in develop mode, where all internal calls to utPLSQL itself are also included
*/
procedure coverage_start_develop;
procedure coverage_start_develop(a_coverage_options ut_coverage_options default null);

procedure coverage_stop;

Expand Down
44 changes: 41 additions & 3 deletions source/core/coverage/ut_coverage_helper.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ create or replace package body ut_coverage_helper is
begin
-- Make it dynamic to allow for block coverage.
if ut_coverage.get_coverage_type = 'block' then
null;
g_coverage_id := dbms_plsql_code_coverage.start_coverage(run_comment => a_run_comment);
else
dbms_profiler.start_profiler(run_comment => a_run_comment, run_number => g_coverage_id);
coverage_pause();
Expand Down Expand Up @@ -80,7 +80,7 @@ create or replace package body ut_coverage_helper is
if not g_develop_mode then
g_is_started := false;
if ut_coverage.get_coverage_type = 'block' then
null;
dbms_plsql_code_coverage.stop_coverage;
else
dbms_profiler.stop_profiler();
end if;
Expand Down Expand Up @@ -126,7 +126,45 @@ create or replace package body ut_coverage_helper is
and u.unit_type not in ('PACKAGE SPEC', 'TYPE SPEC', 'ANONYMOUS BLOCK')
group by d.line#;
for i in 1 .. l_tmp_data.count loop
l_results(l_tmp_data(i).line) := l_tmp_data(i).calls;
l_results(l_tmp_data(i).line).calls := l_tmp_data(i).calls;
end loop;
return l_results;
end;

function get_raw_coverage_data_block(a_object_owner varchar2, a_object_name varchar2) return t_unit_line_calls is
type coverage_row is record(
line binary_integer
,blocks binary_integer
,covered_blocks binary_integer);
type coverage_rows is table of coverage_row;
l_tmp_data coverage_rows;
l_results t_unit_line_calls;

begin
select ccb.line
,count(ccb.block) totalblocks
,sum(ccb.covered) as coveredblocks bulk collect
into l_tmp_data
from dbmspcc_units ccu
left outer join dbmspcc_blocks ccb
on ccu.run_id = ccb.run_id
and ccu.object_id = ccb.object_id
where ccu.owner = a_object_owner
and ccu.name = a_object_name
and ccu.run_id = g_coverage_id
group by ccb.line
order by 1;

for i in 1 .. l_tmp_data.count loop
l_results(l_tmp_data(i).line).blocks := l_tmp_data(i).blocks;
l_results(l_tmp_data(i).line).covered_blocks := l_tmp_data(i).covered_blocks;
l_results(l_tmp_data(i).line).partcovered := case
when (l_tmp_data(i).covered_blocks > 0) and
(l_tmp_data(i).blocks > l_tmp_data(i).covered_blocks) then
1
else
0
end;
end loop;
return l_results;
end;
Expand Down
12 changes: 11 additions & 1 deletion source/core/coverage/ut_coverage_helper.pks
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,15 @@ create or replace package ut_coverage_helper authid definer is

--table of line calls indexed by line number
--!!! this table is sparse!!!
type t_unit_line_calls is table of number(38,0) index by binary_integer;
--type t_unit_line_calls is table of number(38,0) index by binary_integer;

type t_unit_line_call is record(
blocks binary_integer default 0
,covered_blocks binary_integer default 0
,partcovered binary_integer default 0
,calls binary_integer default 0);

type t_unit_line_calls is table of t_unit_line_call index by binary_integer;

type t_coverage_sources_tmp_row is record (
full_name ut_coverage_sources_tmp.full_name%type,
Expand Down Expand Up @@ -60,6 +68,8 @@ create or replace package ut_coverage_helper authid definer is

function get_raw_coverage_data_profiler(a_object_owner varchar2, a_object_name varchar2) return t_unit_line_calls;

function get_raw_coverage_data_block(a_object_owner varchar2, a_object_name varchar2) return t_unit_line_calls;

/***
* Allows overwriting of private global variable g_coverage_id
* Used internally, only for unit testing of the framework only
Expand Down
2 changes: 1 addition & 1 deletion source/core/coverage/ut_coverage_reporter_base.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ create or replace type body ut_coverage_reporter_base is
overriding final member procedure before_calling_run(self in out nocopy ut_coverage_reporter_base, a_run ut_run) as
begin
(self as ut_output_reporter_base).before_calling_run(a_run);
ut_coverage.coverage_start();
ut_coverage.coverage_start(a_coverage_options => a_run.coverage_options);
end;

overriding final member procedure before_calling_before_all(self in out nocopy ut_coverage_reporter_base, a_suite in ut_logical_suite) is
Expand Down
6 changes: 6 additions & 0 deletions source/install.sql
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ alter session set current_schema = &&ut3_owner;
prompt Installing PLSQL profiler objects into &&ut3_owner schema
@@core/coverage/proftab.sql

prompt Installing PLSQL profiler objects into &&ut3_owner schema
@@core/coverage/proftab.sql

prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema
@@core/coverage/dbms_plssqlcode.sql

@@install_component.sql 'core/ut_file_mapper.pks'
@@install_component.sql 'core/ut_file_mapper.pkb'

Expand Down