Skip to content

Commit db37f00

Browse files
authored
Merge pull request utPLSQL#655 from utPLSQL/release/v3.1.1
releasing v3.1.1
2 parents cf725fb + 3b892db commit db37f00

26 files changed

+185
-248
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ env:
4646
- DOCKHER_HUB_REPO="${DOCKER_BASE_TAG:-$UT3_DOCKER_REPO}"
4747
#utPLSQL released version directory
4848
- UTPLSQL_DIR="utPLSQL_latest_release"
49-
- UTPLSQL_CLI_VERSION="3.0.4"
49+
- SELFTESTING_BRANCH="develop"
50+
- UTPLSQL_CLI_VERSION="3.1.0"
5051
# Maven
5152
- MAVEN_HOME=/usr/local/maven
5253
- MAVEN_CFG=$HOME/.m2

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v3.1.0-develop
1+
v3.1.1

docs/userguide/coverage.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ Using data collected from profiler and block coverage running parallel we are ab
5858
For every line recorded by profiler if we have a partially covered same line in block coverage we will display that information
5959
presenting line as partially covered, displaying number of block and how many blocks been covered in that line.The feature will be automatically enabled in the Oracle database version 12.2 and higher, for older versions current profiler will be used.
6060

61+
utPLSQL installation automatically creates tables needed by `dbms_plsql_code_coverage` on databases in versions above 12c Release 1.
62+
Due to security model of `dbms_plsql_code_coverage` package, utPLSQL grants access to those tables and creates synonyms for those tables.
63+
The access and synonyms will be public when using the headless installation. This approach avoids complexity of forcing every user of utPLSQL framework to create tables on their own.
6164

6265
Sample output:
6366
![Package Coverage Summary](../images/extended_coverage_html_summary.png)

examples/RunExpectations.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ set echo off
1111
@@demo_expectations.pck
1212

1313
begin
14-
ut_coverage.coverage_start_develop();
14+
ut_coverage.coverage_start();
15+
ut_coverage.set_develop_mode(true);
1516
ut.run();
16-
ut_coverage.coverage_stop_develop();
17+
ut_coverage.set_develop_mode(false);
18+
ut_coverage.coverage_stop();
1719
end;
1820
/
1921

old_tests/RunAll.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ create table ut$test_table (val varchar2(1));
3434

3535
--Start coverage in develop mode (coverage for utPLSQL framework)
3636
--Regular coverage excludes the framework
37-
exec ut_coverage.coverage_start_develop();
37+
exec ut_coverage.coverage_start();
38+
exec ut_coverage.set_develop_mode(true);
3839

3940
@@lib/RunTest.sql ut_expectation_processor/who_called_expectation.parseStackTrace.sql
4041
@@lib/RunTest.sql ut_expectation_processor/who_called_expectation.parseStackTraceWith0x.sql
@@ -449,7 +450,8 @@ begin
449450
l_reporter.after_calling_run(l_test_run);
450451
l_reporter.on_finalize(l_test_run);
451452

452-
ut_coverage.coverage_stop_develop();
453+
ut_coverage.set_develop_mode(false);
454+
ut_coverage.coverage_stop();
453455

454456
--run for the second time to get the coverage report
455457
l_reporter := ut_coverage_html_reporter(a_project_name => 'utPLSQL v3');

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
sonar.projectKey=utPLSQL
33
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
44
sonar.projectName=utPLSQL
5-
sonar.projectVersion=v3.1.0-develop
5+
sonar.projectVersion=v3.1.1
66

77
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
88
# Since SonarQube 4.2, this property is optional if sonar.modules is set.

source/core/coverage/ut_coverage.pkb

Lines changed: 62 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,54 @@ 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+
$end
161+
ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) );
162+
coverage_pause();
163+
g_is_started := true;
164+
end if;
145165
end;
146166

147-
procedure coverage_start_develop(a_coverage_options ut_coverage_options default null) is
167+
procedure coverage_pause is
148168
begin
149-
ut_coverage_helper.coverage_start_develop;
169+
if not is_develop_mode() then
170+
ut_coverage_helper_profiler.coverage_pause();
171+
end if;
150172
end;
151173

152-
procedure coverage_pause is
174+
procedure coverage_resume is
153175
begin
154-
ut_coverage_helper.coverage_pause();
176+
ut_coverage_helper_profiler.coverage_resume();
155177
end;
156178

157-
procedure coverage_resume is
179+
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
158180
begin
159-
ut_coverage_helper.coverage_resume();
181+
g_develop_mode := true;
182+
g_is_started := true;
183+
g_coverage_id(a_coverage_type) := a_coverage_id;
160184
end;
161185

162-
procedure coverage_stop is
186+
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr) is
163187
begin
164-
ut_coverage_helper.coverage_stop();
188+
g_develop_mode := true;
189+
g_is_started := true;
190+
g_coverage_id := a_coverage_id;
165191
end;
166192

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

172205
function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
@@ -175,13 +208,16 @@ create or replace package body ut_coverage is
175208
l_object ut_coverage.t_full_name;
176209
l_line_no binary_integer;
177210
begin
178-
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
211+
--prepare global temp table with sources
212+
populate_tmp_table(a_coverage_options, get_cov_sources_sql(a_coverage_options));
213+
214+
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
179215
-- tmp table for block again.
180-
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data(a_coverage_options => a_coverage_options);
216+
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data( a_coverage_options, get_coverage_id(gc_proftab_coverage) );
181217

182218
-- If block coverage available we will use it.
183219
$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);
220+
l_result_block := ut_coverage_block.get_coverage_data( a_coverage_options, get_coverage_id(gc_block_coverage) );
185221

186222
-- Enrich profiler results with some of the block results
187223
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
/

0 commit comments

Comments
 (0)