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

Skip to content

Commit cd0d954

Browse files
committed
Added test for ut_coverage_sonar_reporter
Added missing privileges to mock data in ut3 schema. Added ability to mock coverage.
1 parent 16e5a06 commit cd0d954

8 files changed

Lines changed: 177 additions & 11 deletions

File tree

.travis/install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ set feedback off
3030
3131
set feedback on
3232
--Needed for testing coverage outside of main UT3 schema.
33-
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, delete any table, create any table, drop any table, alter any table, select any dictionary to $UT3_TESTER;
33+
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;
3434
exit
3535
SQL

source/core/coverage/ut_coverage.pkb

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

19+
type t_source_lines is table of binary_integer;
20+
1921
-- The source query has two important transformations done in it.
2022
-- the flag: to_be_skipped ='Y' is set for a line of code that is badly reported by DBMS_PROFILER as executed 0 times.
2123
-- This includes lines that are:
@@ -157,13 +159,25 @@ create or replace package body ut_coverage is
157159
ut_coverage_helper.coverage_stop_develop();
158160
end;
159161

162+
function get_lines_to_skip(a_object_owner varchar2, a_object_name varchar2) return t_source_lines is
163+
l_result t_source_lines;
164+
begin
165+
select line
166+
bulk collect into l_result
167+
from ut_coverage_sources_tmp o
168+
where to_be_skipped = 'Y'
169+
and o.owner = a_object_owner
170+
and o.name = a_object_name;
171+
172+
return l_result;
173+
end;
174+
160175
function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
161176
l_line_calls ut_coverage_helper.unit_line_calls;
162177
l_result t_coverage;
163178
l_new_unit t_unit_coverage;
164179
l_skipped_objects ut_object_names := ut_object_names();
165-
166-
type t_source_lines is table of binary_integer;
180+
l_lines_to_skip t_source_lines;
167181
line_no binary_integer;
168182
begin
169183

@@ -178,24 +192,21 @@ create or replace package body ut_coverage is
178192
end if;
179193

180194
for src_object in (
181-
select o.owner, o.name, o.full_name, max(o.line) lines_count,
182-
cast(
183-
collect(decode(to_be_skipped, 'Y', to_char(line))) as ut_varchar2_list
184-
) to_be_skipped_list
195+
select o.owner, o.name, o.full_name, max(o.line) lines_count
185196
from ut_coverage_sources_tmp o
186197
group by o.owner, o.name, o.full_name
187198
) loop
188199

200+
l_lines_to_skip := get_lines_to_skip( src_object.owner, src_object.name );
201+
189202
--get coverage data
190203
l_line_calls := ut_coverage_helper.get_raw_coverage_data( src_object.owner, src_object.name );
191204

192205
--if there is coverage, we need to filter out the garbage (badly indicated data from dbms_profiler)
193206
if l_line_calls.count > 0 then
194207
--remove lines that should not be indicted as meaningful
195-
for i in 1 .. src_object.to_be_skipped_list.count loop
196-
if src_object.to_be_skipped_list(i) is not null then
197-
l_line_calls.delete(src_object.to_be_skipped_list(i));
198-
end if;
208+
for i in 1 .. l_lines_to_skip.count loop
209+
l_line_calls.delete(l_lines_to_skip(i));
199210
end loop;
200211
end if;
201212

source/core/coverage/ut_coverage_helper.pkb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,5 +109,13 @@ create or replace package body ut_coverage_helper is
109109
end loop;
110110
return l_results;
111111
end;
112+
113+
procedure mock_coverage_id(a_coverage_id integer) is
114+
begin
115+
if g_develop_mode and g_is_started then
116+
g_coverage_id := a_coverage_id;
117+
end if;
118+
end;
119+
112120
end;
113121
/

source/core/coverage/ut_coverage_helper.pks

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,11 @@ create or replace package ut_coverage_helper authid definer is
3838
procedure coverage_resume;
3939

4040
function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2) return unit_line_calls;
41+
42+
/***
43+
* Allows overwriting of private global variable g_coverage_id
44+
* Used internally, only for unit testing of the framework only
45+
*/
46+
procedure mock_coverage_id(a_coverage_id integer);
4147
end;
4248
/
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
create or replace package body test_coverage is
2+
3+
g_run_id integer;
4+
5+
function get_mock_run_id return integer is
6+
v_result integer;
7+
begin
8+
select min(runid) - 1 into v_result
9+
from ut3.plsql_profiler_runs;
10+
return v_result;
11+
end;
12+
13+
procedure create_dummy_coverage_package is
14+
begin
15+
execute immediate q'[create or replace package DUMMY_COVERAGE is
16+
procedure do_stuff;
17+
end;]';
18+
execute immediate q'[create or replace package body DUMMY_COVERAGE is
19+
procedure do_stuff is
20+
begin
21+
if 1 = 2 then
22+
dbms_output.put_line('should not get here');
23+
else
24+
dbms_output.put_line('should get here');
25+
end if;
26+
end;
27+
end;]';
28+
end;
29+
30+
procedure create_dummy_coverage_test is
31+
begin
32+
execute immediate q'[create or replace package TEST_DUMMY_COVERAGE is
33+
--%suite(dummy coverage test)
34+
35+
--%test
36+
procedure test_do_stuff;
37+
end;]';
38+
execute immediate q'[create or replace package body TEST_DUMMY_COVERAGE is
39+
procedure test_do_stuff is
40+
begin
41+
dummy_coverage.do_stuff;
42+
end;
43+
end;]';
44+
end;
45+
46+
procedure mock_coverage_data(a_run_id integer) is
47+
c_unit_id constant integer := 1;
48+
begin
49+
insert into ut3.plsql_profiler_runs ( runid, run_owner, run_date, run_comment)
50+
values(a_run_id, user, sysdate, 'unit testing utPLSQL');
51+
52+
insert into ut3.plsql_profiler_units ( runid, unit_number, unit_type, unit_owner, unit_name)
53+
values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3_TESTER', 'DUMMY_COVERAGE');
54+
55+
insert into ut3.plsql_profiler_data ( runid, unit_number, line#, total_occur, total_time)
56+
select a_run_id, c_unit_id, 4, 1, 1 from dual union all
57+
select a_run_id, c_unit_id, 5, 0, 0 from dual union all
58+
select a_run_id, c_unit_id, 7, 1, 1 from dual;
59+
end;
60+
61+
procedure setup_dummy_coverage is
62+
pragma autonomous_transaction;
63+
begin
64+
create_dummy_coverage_package();
65+
create_dummy_coverage_test();
66+
g_run_id := get_mock_run_id();
67+
ut3.ut_coverage_helper.mock_coverage_id(g_run_id);
68+
mock_coverage_data(g_run_id);
69+
commit;
70+
end;
71+
72+
procedure cleanup_dummy_coverage is
73+
pragma autonomous_transaction;
74+
begin
75+
execute immediate q'[drop package test_dummy_coverage]';
76+
execute immediate q'[drop package dummy_coverage]';
77+
delete from ut3.plsql_profiler_data where runid = g_run_id;
78+
delete from ut3.plsql_profiler_units where runid = g_run_id;
79+
delete from ut3.plsql_profiler_runs where runid = g_run_id;
80+
commit;
81+
end;
82+
83+
end;
84+
/
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
create or replace package test_coverage is
2+
3+
--%suite
4+
--%suitepath(utplsql.core)
5+
6+
--%beforeall
7+
procedure setup_dummy_coverage;
8+
9+
--%afterall
10+
procedure cleanup_dummy_coverage;
11+
12+
end;
13+
/
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
create or replace package body test_coverage_sonar_reporter is
2+
3+
procedure report_on_file is
4+
v_run_id integer;
5+
l_results ut3.ut_varchar2_list;
6+
l_expected clob;
7+
l_actual clob;
8+
begin
9+
--Arrange
10+
l_expected := '<coverage version="1">
11+
<file path="test/dummy_coverage.pkb">
12+
<lineToCover lineNumber="4" covered="true"/>
13+
<lineToCover lineNumber="5" covered="false"/>
14+
<lineToCover lineNumber="7" covered="true"/>
15+
</file>
16+
</coverage>';
17+
--Act
18+
select *
19+
bulk collect into l_results
20+
from table(
21+
ut3.ut.run(
22+
a_path => 'test_dummy_coverage',
23+
a_reporter=> ut3.ut_coverage_sonar_reporter( ),
24+
a_source_files => ut3.ut_varchar2_list( 'test/dummy_coverage.pkb' ),
25+
a_test_files => ut3.ut_varchar2_list( )
26+
)
27+
);
28+
l_actual := ut3.ut_utils.table_to_clob(l_results);
29+
--Assert
30+
ut.expect(l_actual).to_equal(l_expected);
31+
end;
32+
33+
end;
34+
/
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
create or replace package test_coverage_sonar_reporter is
2+
3+
--%suite(ut_coverge_sonar_reporter)
4+
--%suitepath(utplsql.core.test_coverage.reporters)
5+
6+
--%test(reports on a project file mapped to database object)
7+
procedure report_on_file;
8+
9+
end;
10+
/

0 commit comments

Comments
 (0)