Skip to content

releasing v3.1.1 #655

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Apr 29, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ env:
- DOCKHER_HUB_REPO="${DOCKER_BASE_TAG:-$UT3_DOCKER_REPO}"
#utPLSQL released version directory
- UTPLSQL_DIR="utPLSQL_latest_release"
- UTPLSQL_CLI_VERSION="3.0.4"
- SELFTESTING_BRANCH="develop"
- UTPLSQL_CLI_VERSION="3.1.0"
# Maven
- MAVEN_HOME=/usr/local/maven
- MAVEN_CFG=$HOME/.m2
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v3.1.0-develop
v3.1.1
3 changes: 3 additions & 0 deletions docs/userguide/coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ Using data collected from profiler and block coverage running parallel we are ab
For every line recorded by profiler if we have a partially covered same line in block coverage we will display that information
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.

utPLSQL installation automatically creates tables needed by `dbms_plsql_code_coverage` on databases in versions above 12c Release 1.
Due to security model of `dbms_plsql_code_coverage` package, utPLSQL grants access to those tables and creates synonyms for those tables.
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.

Sample output:
![Package Coverage Summary](../images/extended_coverage_html_summary.png)
Expand Down
6 changes: 4 additions & 2 deletions examples/RunExpectations.sql
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ set echo off
@@demo_expectations.pck

begin
ut_coverage.coverage_start_develop();
ut_coverage.coverage_start();
ut_coverage.set_develop_mode(true);
ut.run();
ut_coverage.coverage_stop_develop();
ut_coverage.set_develop_mode(false);
ut_coverage.coverage_stop();
end;
/

Expand Down
6 changes: 4 additions & 2 deletions old_tests/RunAll.sql
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ create table ut$test_table (val varchar2(1));

--Start coverage in develop mode (coverage for utPLSQL framework)
--Regular coverage excludes the framework
exec ut_coverage.coverage_start_develop();
exec ut_coverage.coverage_start();
exec ut_coverage.set_develop_mode(true);

@@lib/RunTest.sql ut_expectation_processor/who_called_expectation.parseStackTrace.sql
@@lib/RunTest.sql ut_expectation_processor/who_called_expectation.parseStackTraceWith0x.sql
Expand Down Expand Up @@ -449,7 +450,8 @@ begin
l_reporter.after_calling_run(l_test_run);
l_reporter.on_finalize(l_test_run);

ut_coverage.coverage_stop_develop();
ut_coverage.set_develop_mode(false);
ut_coverage.coverage_stop();

--run for the second time to get the coverage report
l_reporter := ut_coverage_html_reporter(a_project_name => 'utPLSQL v3');
Expand Down
2 changes: 1 addition & 1 deletion sonar-project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
sonar.projectKey=utPLSQL
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=utPLSQL
sonar.projectVersion=v3.1.0-develop
sonar.projectVersion=v3.1.1

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
Expand Down
88 changes: 62 additions & 26 deletions source/core/coverage/ut_coverage.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,26 @@ create or replace package body ut_coverage is
limitations under the License.
*/


type t_source_lines is table of binary_integer;
g_coverage_id tt_coverage_id_arr;
g_develop_mode boolean not null := false;
g_is_started boolean not null := false;

procedure set_develop_mode(a_develop_mode in boolean) is
begin
g_develop_mode := a_develop_mode;
end;

function get_coverage_id(a_coverage_type in varchar2) return integer is
begin
return g_coverage_id(a_coverage_type);
end;

function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skipped_lines varchar2 default 'Y') return varchar2 is
function is_develop_mode return boolean is
begin
return g_develop_mode;
end;

function get_cov_sources_sql(a_coverage_options ut_coverage_options) return varchar2 is
l_result varchar2(32767);
l_full_name varchar2(100);
l_view_name varchar2(200) := ut_metadata.get_dba_view('dba_source');
Expand All @@ -44,8 +60,7 @@ create or replace package body ut_coverage is
and regexp_like( t.text, '[A-Za-z0-9$#_]*(begin|declare|compound).*','i'))
) as line,
s.text, ]';
if a_skipped_lines = 'Y' then
l_result := l_result ||
l_result := l_result ||
q'[case
when
-- to avoid execution of regexp_like on every line
Expand All @@ -62,10 +77,7 @@ create or replace package body ut_coverage is
)
then 'Y'
end as to_be_skipped ]';
else
l_result := l_result || q'['N' as to_be_skipped ]';
end if;


l_result := l_result ||' from '||l_view_name||q'[ s]';

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

procedure populate_tmp_table(a_coverage_options in ut_coverage_options,a_sql in varchar2) is
procedure populate_tmp_table(a_coverage_options ut_coverage_options, a_sql in varchar2) is
pragma autonomous_transaction;
l_cov_sources_crsr sys_refcursor;
l_cov_sources_data ut_coverage_helper.t_coverage_sources_tmp_rows;
begin

if not ut_coverage_helper.is_tmp_table_populated() or ut_coverage_helper.is_develop_mode() then
if not ut_coverage_helper.is_tmp_table_populated() or is_develop_mode() then
ut_coverage_helper.cleanup_tmp_table();

l_cov_sources_crsr := get_cov_sources_cursor(a_coverage_options,a_sql);
Expand All @@ -140,33 +152,54 @@ create or replace package body ut_coverage is
* Public functions
*/
procedure coverage_start(a_coverage_options ut_coverage_options default null) is
l_run_comment varchar2(200) := 'utPLSQL Code coverage run '||ut_utils.to_string(systimestamp);
begin
ut_coverage_helper.coverage_start('utPLSQL Code coverage run '||ut_utils.to_string(systimestamp));
if not is_develop_mode() and not g_is_started then
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
ut_coverage_helper_block.coverage_start( l_run_comment, g_coverage_id(gc_block_coverage) );
$end
ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) );
coverage_pause();
g_is_started := true;
end if;
end;

procedure coverage_start_develop(a_coverage_options ut_coverage_options default null) is
procedure coverage_pause is
begin
ut_coverage_helper.coverage_start_develop;
if not is_develop_mode() then
ut_coverage_helper_profiler.coverage_pause();
end if;
end;

procedure coverage_pause is
procedure coverage_resume is
begin
ut_coverage_helper.coverage_pause();
ut_coverage_helper_profiler.coverage_resume();
end;

procedure coverage_resume is
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
begin
ut_coverage_helper.coverage_resume();
g_develop_mode := true;
g_is_started := true;
g_coverage_id(a_coverage_type) := a_coverage_id;
end;

procedure coverage_stop is
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr) is
begin
ut_coverage_helper.coverage_stop();
g_develop_mode := true;
g_is_started := true;
g_coverage_id := a_coverage_id;
end;

procedure coverage_stop_develop is
procedure coverage_stop is
begin
ut_coverage_helper.coverage_stop_develop();
if not is_develop_mode() then
g_is_started := false;
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
ut_coverage_helper_block.coverage_stop();
$end
ut_coverage_helper_profiler.coverage_stop();
g_is_started := false;
end if;
end;

function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
Expand All @@ -175,13 +208,16 @@ create or replace package body ut_coverage is
l_object ut_coverage.t_full_name;
l_line_no binary_integer;
begin
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
--prepare global temp table with sources
populate_tmp_table(a_coverage_options, get_cov_sources_sql(a_coverage_options));

-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
-- tmp table for block again.
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data(a_coverage_options => a_coverage_options);
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data( a_coverage_options, get_coverage_id(gc_proftab_coverage) );

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

-- Enrich profiler results with some of the block results
l_object := l_result_profiler_enrich.objects.first;
Expand Down
35 changes: 20 additions & 15 deletions source/core/coverage/ut_coverage.pks
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@ create or replace package ut_coverage authid current_user is
See the License for the specific language governing permissions and
limitations under the License.
*/
gc_proftab_coverage constant varchar2(32) := 'proftab';
gc_block_coverage constant varchar2(32) := 'block';

gc_proftab_coverage constant varchar2(32) := 'proftab';
gc_block_coverage constant varchar2(32) := 'block';
gc_extended_coverage constant varchar2(32) := 'extended';


type tt_coverage_id_arr is table of integer index by varchar2(30);

-- total run coverage information
subtype t_full_name is varchar2(4000);
subtype t_object_name is varchar2(250);
Expand Down Expand Up @@ -62,21 +64,24 @@ create or replace package ut_coverage authid current_user is
,uncovered_blocks binary_integer default null
,executions number(38, 0) := 0
,objects tt_program_units);

function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skipped_lines varchar2 default 'Y') return varchar2;

procedure populate_tmp_table(a_coverage_options ut_coverage_options, a_sql in varchar2);

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
function get_coverage_id(a_coverage_type in varchar2) return integer;

procedure set_develop_mode(a_develop_mode in boolean);

function is_develop_mode return boolean;

/***
* Allows overwriting of private global variable g_coverage_id
* Used internally, only for unit testing of the framework only
*/
procedure coverage_start_develop(a_coverage_options ut_coverage_options default null);
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2);

procedure coverage_stop;
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr);

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

procedure coverage_stop;

procedure coverage_pause;

Expand Down
10 changes: 4 additions & 6 deletions source/core/coverage/ut_coverage_block.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,23 @@ create or replace package body ut_coverage_block is
* Public functions
*/

function get_coverage_data(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage is
function get_coverage_data(a_coverage_options ut_coverage_options, a_coverage_id integer) 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;
l_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
ut_coverage.populate_tmp_table(a_coverage_options,ut_coverage.get_cov_sources_sql(a_coverage_options,'N'));


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_block.get_raw_coverage_data(l_source_object.owner, l_source_object.name);
l_line_calls := ut_coverage_helper_block.get_raw_coverage_data(l_source_object.owner, l_source_object.name, a_coverage_id);
--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
Expand Down Expand Up @@ -155,6 +153,6 @@ create or replace package body ut_coverage_block is

return l_result;
end get_coverage_data;

end;
/
2 changes: 1 addition & 1 deletion source/core/coverage/ut_coverage_block.pks
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ create or replace package ut_coverage_block authid current_user is
limitations under the License.
*/

function get_coverage_data(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage;
function get_coverage_data(a_coverage_options ut_coverage_options, a_coverage_id integer) return ut_coverage.t_coverage;

end;
/
Loading