From d227172d82de43d925217f6fd0758157758a68e7 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Apr 2018 15:05:09 +0100 Subject: [PATCH 1/4] Fixed block coverage privileges issue Refactored code. --- source/core/coverage/dbms_plssqlcode.sql | 2 - source/core/coverage/ut_coverage.pkb | 89 ++++++++++----- source/core/coverage/ut_coverage.pks | 35 +++--- source/core/coverage/ut_coverage_block.pkb | 10 +- source/core/coverage/ut_coverage_block.pks | 2 +- source/core/coverage/ut_coverage_helper.pkb | 105 ------------------ source/core/coverage/ut_coverage_helper.pks | 36 ------ .../coverage/ut_coverage_helper_block.pkb | 22 ++-- .../coverage/ut_coverage_helper_block.pks | 4 +- .../coverage/ut_coverage_helper_profiler.pkb | 9 +- .../coverage/ut_coverage_helper_profiler.pks | 2 +- source/core/coverage/ut_coverage_profiler.pkb | 19 ++-- source/core/coverage/ut_coverage_profiler.pks | 2 +- source/core/events/ut_event_listener.tps | 2 +- .../create_synonyms_and_grants_for_public.sql | 17 ++- .../create_synonyms_and_grants_for_user.sql | 17 +++ test/core.pkb | 7 +- test/core/reporters/test_coverage.pkb | 2 +- .../core/reporters/test_extended_coverage.pkb | 4 +- 19 files changed, 153 insertions(+), 233 deletions(-) diff --git a/source/core/coverage/dbms_plssqlcode.sql b/source/core/coverage/dbms_plssqlcode.sql index e3aa2ec9a..1395ce10d 100644 --- a/source/core/coverage/dbms_plssqlcode.sql +++ b/source/core/coverage/dbms_plssqlcode.sql @@ -1,8 +1,6 @@ begin $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then dbms_plsql_code_coverage.create_coverage_tables(force_it => true); - $else - null; $end end; / diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index b56c82ccd..e237ff54e 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -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'); @@ -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 @@ -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 @@ -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; @@ -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); @@ -140,33 +152,55 @@ 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) ); +-- g_coverage_id(gc_block_coverage) := dbms_plsql_code_coverage.start_coverage( l_run_comment ); + $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 @@ -175,13 +209,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; diff --git a/source/core/coverage/ut_coverage.pks b/source/core/coverage/ut_coverage.pks index 2dff5ddc1..26890e600 100644 --- a/source/core/coverage/ut_coverage.pks +++ b/source/core/coverage/ut_coverage.pks @@ -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); @@ -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; diff --git a/source/core/coverage/ut_coverage_block.pkb b/source/core/coverage/ut_coverage_block.pkb index c405fd262..3d830822e 100644 --- a/source/core/coverage/ut_coverage_block.pkb +++ b/source/core/coverage/ut_coverage_block.pkb @@ -23,7 +23,7 @@ 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; @@ -31,9 +31,7 @@ create or replace package body ut_coverage_block is 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 @@ -41,7 +39,7 @@ create or replace package body ut_coverage_block is 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 @@ -155,6 +153,6 @@ create or replace package body ut_coverage_block is return l_result; end get_coverage_data; - + end; / diff --git a/source/core/coverage/ut_coverage_block.pks b/source/core/coverage/ut_coverage_block.pks index 00c5e9e28..3eba99b12 100644 --- a/source/core/coverage/ut_coverage_block.pks +++ b/source/core/coverage/ut_coverage_block.pks @@ -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; / diff --git a/source/core/coverage/ut_coverage_helper.pkb b/source/core/coverage/ut_coverage_helper.pkb index 41f5108d5..0f10d4b03 100644 --- a/source/core/coverage/ut_coverage_helper.pkb +++ b/source/core/coverage/ut_coverage_helper.pkb @@ -17,9 +17,6 @@ create or replace package body ut_coverage_helper is */ - g_develop_mode boolean not null := false; - g_is_started boolean not null := false; - type t_proftab_row is record ( line binary_integer, @@ -35,108 +32,6 @@ create or replace package body ut_coverage_helper is type t_block_rows is table of t_block_row; - procedure set_coverage_status(a_started in boolean) is - begin - g_is_started := a_started; - end; - - 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 is_develop_mode return boolean is - begin - return g_develop_mode; - end; - - procedure coverage_start_internal(a_run_comment varchar2) is - begin - $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(a_run_comment => a_run_comment ,a_coverage_id => g_coverage_id(ut_coverage.gc_block_coverage) ); - ut_coverage_helper_profiler.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id(ut_coverage.gc_proftab_coverage)); - coverage_pause(); - $else - ut_coverage_helper_profiler.coverage_start(a_run_comment => a_run_comment, a_coverage_id => g_coverage_id(ut_coverage.gc_proftab_coverage)); - coverage_pause(); - $end - - g_is_started := true; - end; - - procedure coverage_start(a_run_comment varchar2) is - begin - if not g_is_started then - g_develop_mode := false; - coverage_start_internal(a_run_comment); - end if; - end; - - procedure coverage_start_develop is - begin - if not g_is_started then - g_develop_mode := true; - coverage_start_internal('utPLSQL Code coverage run in development MODE '||ut_utils.to_string(systimestamp)); - end if; - end; - - procedure coverage_pause is - begin - if not g_develop_mode then - ut_coverage_helper_profiler.coverage_pause(); - end if; - end; - - procedure coverage_resume is - begin - ut_coverage_helper_profiler.coverage_resume(); - end; - - procedure coverage_stop is - begin - if not g_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_profiler.coverage_stop(); - ut_coverage_helper_block.coverage_stop(); - $else - ut_coverage_helper_profiler.coverage_stop(); - $end - end if; - end; - - procedure coverage_stop_develop is - begin - g_develop_mode := false; - 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_profiler.coverage_stop(); - ut_coverage_helper_block.coverage_stop(); - $else - ut_coverage_helper_profiler.coverage_stop(); - $end - - end; - - procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is - begin - g_develop_mode := true; - g_is_started := true; - g_coverage_id(a_coverage_type) := a_coverage_id; - end; - - procedure mock_coverage_id(a_coverage_id g_coverage_arr) is - begin - g_develop_mode := true; - g_is_started := true; - g_coverage_id := a_coverage_id; - end; - procedure insert_into_tmp_table(a_data t_coverage_sources_tmp_rows) is begin forall i in 1 .. a_data.count diff --git a/source/core/coverage/ut_coverage_helper.pks b/source/core/coverage/ut_coverage_helper.pks index ee7c33846..c36ae43b2 100644 --- a/source/core/coverage/ut_coverage_helper.pks +++ b/source/core/coverage/ut_coverage_helper.pks @@ -16,17 +16,6 @@ create or replace package ut_coverage_helper authid definer is limitations under the License. */ - type g_coverage_arr is table of integer index by varchar2(30); - - g_coverage_id g_coverage_arr; - - - function get_coverage_id(a_coverage_type in varchar2) return integer; - - procedure set_coverage_status(a_started in boolean); - - procedure set_develop_mode(a_develop_mode in boolean); - --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; @@ -60,31 +49,6 @@ create or replace package ut_coverage_helper authid definer is type t_tmp_table_objects_crsr is ref cursor return t_tmp_table_object; - function is_develop_mode return boolean; - - procedure coverage_start(a_run_comment in varchar2); - - /* - * Start coverage in develop mode, where all internal calls to utPLSQL itself are also included - */ - procedure coverage_start_develop; - - procedure coverage_stop; - - procedure coverage_stop_develop; - - procedure coverage_pause; - - procedure coverage_resume; - - /*** - * Allows overwriting of private global variable g_coverage_id - * Used internally, only for unit testing of the framework only - */ - procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2); - - procedure mock_coverage_id(a_coverage_id g_coverage_arr); - procedure insert_into_tmp_table(a_data t_coverage_sources_tmp_rows); procedure cleanup_tmp_table; diff --git a/source/core/coverage/ut_coverage_helper_block.pkb b/source/core/coverage/ut_coverage_helper_block.pkb index 8d652099d..3db3d84c7 100644 --- a/source/core/coverage/ut_coverage_helper_block.pkb +++ b/source/core/coverage/ut_coverage_helper_block.pkb @@ -30,23 +30,23 @@ create or replace package body ut_coverage_helper_block is type t_block_rows is table of t_block_row; - procedure coverage_start(a_run_comment varchar2,a_coverage_id out integer) is + procedure coverage_start(a_run_comment varchar2, a_coverage_id out integer) is begin - a_coverage_id := dbms_plsql_code_coverage.start_coverage(run_comment => a_run_comment); + a_coverage_id := dbms_plsql_code_coverage.start_coverage(run_comment => a_run_comment); end; procedure coverage_stop is begin - dbms_plsql_code_coverage.stop_coverage(); + dbms_plsql_code_coverage.stop_coverage(); end; - function block_results(a_object_owner varchar2, a_object_name varchar2) return t_block_rows is - l_raw_coverage sys_refcursor; - l_coverage_rows t_block_rows; - l_coverage_id integer := ut_coverage_helper.get_coverage_id(ut_coverage.gc_block_coverage); + function block_results(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return t_block_rows is + l_raw_coverage sys_refcursor; + l_coverage_rows t_block_rows; + l_ut3_owner varchar2(128) := ut_utils.ut_owner(); begin - open l_raw_coverage for q'[select ccb.line + open l_raw_coverage for 'select ccb.line ,count(ccb.block) totalblocks ,sum(ccb.covered) from dbmspcc_units ccu @@ -57,7 +57,7 @@ create or replace package body ut_coverage_helper_block is and ccu.owner = :a_object_owner and ccu.name = :a_object_name group by ccb.line - order by 1]' using l_coverage_id,a_object_owner,a_object_name; + order by 1' using a_coverage_id,a_object_owner,a_object_name; fetch l_raw_coverage bulk collect into l_coverage_rows; close l_raw_coverage; @@ -65,12 +65,12 @@ create or replace package body ut_coverage_helper_block is return l_coverage_rows; end; - function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2) return ut_coverage_helper.t_unit_line_calls is + function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return ut_coverage_helper.t_unit_line_calls is l_tmp_data t_block_rows; l_results ut_coverage_helper.t_unit_line_calls; begin - l_tmp_data := block_results(a_object_owner => a_object_owner, a_object_name => a_object_name); + l_tmp_data := block_results(a_object_owner, a_object_name, a_coverage_id); for i in 1 .. l_tmp_data.count loop l_results(l_tmp_data(i).line).blocks := l_tmp_data(i).blocks; diff --git a/source/core/coverage/ut_coverage_helper_block.pks b/source/core/coverage/ut_coverage_helper_block.pks index 041db26f7..fa2c55904 100644 --- a/source/core/coverage/ut_coverage_helper_block.pks +++ b/source/core/coverage/ut_coverage_helper_block.pks @@ -1,4 +1,4 @@ -create or replace package ut_coverage_helper_block authid definer is +create or replace package ut_coverage_helper_block authid current_user is /* utPLSQL - Version 3 Copyright 2016 - 2017 utPLSQL Project @@ -20,7 +20,7 @@ create or replace package ut_coverage_helper_block authid definer is procedure coverage_stop; - function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2) return ut_coverage_helper.t_unit_line_calls; + function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return ut_coverage_helper.t_unit_line_calls; end; / diff --git a/source/core/coverage/ut_coverage_helper_profiler.pkb b/source/core/coverage/ut_coverage_helper_profiler.pkb index eb993d9f9..965d1ab54 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pkb +++ b/source/core/coverage/ut_coverage_helper_profiler.pkb @@ -53,10 +53,9 @@ create or replace package body ut_coverage_helper_profiler is dbms_profiler.stop_profiler(); end; - function proftab_results(a_object_owner varchar2, a_object_name varchar2) return t_proftab_rows is + function proftab_results(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return t_proftab_rows is l_raw_coverage sys_refcursor; l_coverage_rows t_proftab_rows; - l_coverage_id integer := ut_coverage_helper.get_coverage_id(ut_coverage.gc_proftab_coverage); begin open l_raw_coverage for q'[select d.line#, case when sum(d.total_occur) = 0 and sum(d.total_time) > 0 then 1 else sum(d.total_occur) end total_occur @@ -68,7 +67,7 @@ create or replace package body ut_coverage_helper_profiler is and u.unit_owner = :a_object_owner and u.unit_name = :a_object_name and u.unit_type not in ('PACKAGE SPEC', 'TYPE SPEC', 'ANONYMOUS BLOCK') - group by d.line#]' using l_coverage_id,a_object_owner,a_object_name; + group by d.line#]' using a_coverage_id,a_object_owner,a_object_name; FETCH l_raw_coverage BULK COLLECT INTO l_coverage_rows; @@ -77,11 +76,11 @@ create or replace package body ut_coverage_helper_profiler is RETURN l_coverage_rows; end; - function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2) return ut_coverage_helper.t_unit_line_calls is + function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return ut_coverage_helper.t_unit_line_calls is l_tmp_data t_proftab_rows; l_results ut_coverage_helper.t_unit_line_calls; begin - l_tmp_data := proftab_results(a_object_owner => a_object_owner, a_object_name => a_object_name); + l_tmp_data := proftab_results(a_object_owner, a_object_name, a_coverage_id); for i in 1 .. l_tmp_data.count loop l_results(l_tmp_data(i).line).calls := l_tmp_data(i).calls; diff --git a/source/core/coverage/ut_coverage_helper_profiler.pks b/source/core/coverage/ut_coverage_helper_profiler.pks index cfe08df87..89117aada 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pks +++ b/source/core/coverage/ut_coverage_helper_profiler.pks @@ -24,7 +24,7 @@ create or replace package ut_coverage_helper_profiler authid definer is procedure coverage_resume; - function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2) return ut_coverage_helper.t_unit_line_calls; + function get_raw_coverage_data(a_object_owner varchar2, a_object_name varchar2, a_coverage_id integer) return ut_coverage_helper.t_unit_line_calls; end; / diff --git a/source/core/coverage/ut_coverage_profiler.pkb b/source/core/coverage/ut_coverage_profiler.pkb index 64c8cf2d0..2ff528f3c 100644 --- a/source/core/coverage/ut_coverage_profiler.pkb +++ b/source/core/coverage/ut_coverage_profiler.pkb @@ -19,25 +19,22 @@ create or replace package body ut_coverage_profiler is /** * Public functions */ - function get_coverage_data(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; - 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; + 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,'Y')); - 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_profiler.get_raw_coverage_data( l_source_object.owner, l_source_object.name); + l_line_calls := ut_coverage_helper_profiler.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 from dbms_profiler) if l_line_calls.count > 0 then diff --git a/source/core/coverage/ut_coverage_profiler.pks b/source/core/coverage/ut_coverage_profiler.pks index a86d31486..6bfb6a8f7 100644 --- a/source/core/coverage/ut_coverage_profiler.pks +++ b/source/core/coverage/ut_coverage_profiler.pks @@ -16,7 +16,7 @@ create or replace package ut_coverage_profiler 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; / diff --git a/source/core/events/ut_event_listener.tps b/source/core/events/ut_event_listener.tps index 9711c8d79..56511c8d0 100644 --- a/source/core/events/ut_event_listener.tps +++ b/source/core/events/ut_event_listener.tps @@ -1,4 +1,4 @@ -create or replace type ut_event_listener authid definer as object ( +create or replace type ut_event_listener authid current_user as object ( /* utPLSQL - Version 3 Copyright 2016 - 2017 utPLSQL Project diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 8c1f3ab9f..b8d3773c4 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -88,7 +88,14 @@ grant execute on &&ut3_owner..ut_annotation_cache_manager to public; grant execute on &&ut3_owner..ut_annotation_parser to public; grant execute on &&ut3_owner..ut_annotation_objs_cache_info to public; grant execute on &&ut3_owner..ut_annotation_obj_cache_info to public; - +begin + $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then + execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_blocks to public'; + execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_runs to public'; + execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_units to public'; + $end +end; +/ prompt Creating synonyms for UTPLSQL objects in &&ut3_owner schema to PUBLIC @@ -136,3 +143,11 @@ create public synonym ut_key_value_pair for &&ut3_owner..ut_key_value_pair; create public synonym ut_compound_data_tmp for &&ut3_owner..ut_compound_data_tmp; create public synonym ut_compound_data_diff_tmp for &&ut3_owner..ut_compound_data_diff_tmp; create public synonym ut_sonar_test_reporter for &&ut3_owner..ut_sonar_test_reporter; +begin + $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then + execute immediate 'create public synonym dbmspcc_blocks for &&ut3_owner..dbmspcc_blocks'; + execute immediate 'create public synonym dbmspcc_runs for &&ut3_owner..dbmspcc_runs'; + execute immediate 'create public synonym dbmspcc_units for &&ut3_owner..dbmspcc_units'; + $end +end; +/ diff --git a/source/create_synonyms_and_grants_for_user.sql b/source/create_synonyms_and_grants_for_user.sql index 525d88ea4..3b59d87fa 100644 --- a/source/create_synonyms_and_grants_for_user.sql +++ b/source/create_synonyms_and_grants_for_user.sql @@ -108,6 +108,15 @@ grant execute on &&ut3_owner..ut_annotation_cache_manager to &ut3_user; grant execute on &&ut3_owner..ut_annotation_parser to &ut3_user; grant execute on &&ut3_owner..ut_annotation_objs_cache_info to &ut3_user; grant execute on &&ut3_owner..ut_annotation_obj_cache_info to &ut3_user; +begin + $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then + execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_blocks to &ut3_user'; + execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_runs to &ut3_user'; + execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_units to &ut3_user'; + $end + end; +/ + prompt Creating synonyms for UTPLSQL objects in &&ut3_owner schema to user &&ut3_user @@ -155,3 +164,11 @@ create or replace synonym &ut3_user..ut_key_value_pair for &&ut3_owner..ut_key_v create or replace synonym &ut3_user..ut_compound_data_tmp for &&ut3_owner..ut_cursor_data; create or replace synonym &ut3_user..ut_compound_data_diff_tmp for &&ut3_owner..ut_compound_data_diff_tmp; create or replace synonym &ut3_user..ut_sonar_test_reporter for &&ut3_owner..ut_sonar_test_reporter; +begin + $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then + execute immediate 'create or replace synonym &ut3_user..dbmspcc_blocks for &&ut3_owner..dbmspcc_blocks'; + execute immediate 'create or replace synonym &ut3_user..dbmspcc_runs for &&ut3_owner..dbmspcc_runs'; + execute immediate 'create or replace synonym &ut3_user..dbmspcc_units for &&ut3_owner..dbmspcc_units'; + $end + end; +/ diff --git a/test/core.pkb b/test/core.pkb index 3ba70009b..69a21b69e 100644 --- a/test/core.pkb +++ b/test/core.pkb @@ -2,7 +2,7 @@ create or replace package body core is procedure global_setup is begin - ut3.ut_coverage.coverage_start_develop(); + ut3.ut_coverage.set_develop_mode(true); execute_autonomous( q'[create or replace package ut_transaction_control as function count_rows(a_val varchar2) return number; @@ -43,11 +43,6 @@ create or replace package body core is execute_autonomous('drop package ut_transaction_control'); end; - procedure enable_develop_coverage is - begin - ut3.ut_coverage.coverage_start_develop(); - end; - procedure execute_autonomous(a_sql varchar2) is pragma autonomous_transaction; begin diff --git a/test/core/reporters/test_coverage.pkb b/test/core/reporters/test_coverage.pkb index 7a759ec43..347f4f463 100644 --- a/test/core/reporters/test_coverage.pkb +++ b/test/core/reporters/test_coverage.pkb @@ -106,7 +106,7 @@ create or replace package body test_coverage is create_dummy_coverage_package(); create_dummy_coverage_test(); g_run_id := get_mock_run_id(); - ut3.ut_coverage_helper.mock_coverage_id(g_run_id,ut3.ut_coverage.gc_proftab_coverage); + ut3.ut_coverage.mock_coverage_id(g_run_id, ut3.ut_coverage.gc_proftab_coverage); mock_coverage_data(g_run_id); commit; end; diff --git a/test/core/reporters/test_extended_coverage.pkb b/test/core/reporters/test_extended_coverage.pkb index 7a7668b6c..4d0cb135b 100644 --- a/test/core/reporters/test_extended_coverage.pkb +++ b/test/core/reporters/test_extended_coverage.pkb @@ -1,6 +1,6 @@ create or replace package body test_extended_coverage is - g_run_id ut3.ut_coverage_helper.g_coverage_arr; + g_run_id ut3.ut_coverage.tt_coverage_id_arr; function get_mock_block_run_id return integer is v_result integer; @@ -94,7 +94,7 @@ create or replace package body test_extended_coverage is create_dummy_coverage_test(); g_run_id(ut3.ut_coverage.gc_block_coverage) := get_mock_block_run_id(); g_run_id(ut3.ut_coverage.gc_proftab_coverage) := get_mock_proftab_run_id(); - ut3.ut_coverage_helper.mock_coverage_id(g_run_id); + ut3.ut_coverage.mock_coverage_id(g_run_id); mock_block_coverage_data(g_run_id(ut3.ut_coverage.gc_block_coverage)); mock_profiler_coverage_data(g_run_id(ut3.ut_coverage.gc_proftab_coverage)); commit; From 3cdca4d3b4f1fc61f9241075309a27773b384d97 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Apr 2018 15:08:39 +0100 Subject: [PATCH 2/4] Fixed unit tests. Removed schema reference for block coverage tables. --- test/core/reporters/test_extended_coverage.pkb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/core/reporters/test_extended_coverage.pkb b/test/core/reporters/test_extended_coverage.pkb index 4d0cb135b..7ae0606e2 100644 --- a/test/core/reporters/test_extended_coverage.pkb +++ b/test/core/reporters/test_extended_coverage.pkb @@ -6,7 +6,7 @@ create or replace package body test_extended_coverage is v_result integer; begin select nvl(min(run_id),0) - 1 into v_result - from ut3.dbmspcc_runs; + from dbmspcc_runs; return v_result; end; @@ -58,13 +58,13 @@ create or replace package body test_extended_coverage is procedure mock_block_coverage_data(a_run_id integer) is c_unit_id constant integer := 1; begin - insert into ut3.dbmspcc_runs ( run_id, run_owner, run_timestamp, run_comment) + insert into dbmspcc_runs ( run_id, run_owner, run_timestamp, run_comment) values(a_run_id, user, sysdate, 'unit testing utPLSQL'); - insert into ut3.dbmspcc_units ( run_id, object_id, type, owner, name,last_ddl_time) + insert into dbmspcc_units ( run_id, object_id, type, owner, name,last_ddl_time) values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE',sysdate); - insert into ut3.dbmspcc_blocks ( run_id, object_id, line,block,col,covered,not_feasible) + insert into dbmspcc_blocks ( run_id, object_id, line,block,col,covered,not_feasible) select a_run_id, c_unit_id,4,1,1,1,0 from dual union all select a_run_id, c_unit_id,4,2,2,0,0 from dual union all select a_run_id, c_unit_id,5,3,0,1,0 from dual union all @@ -105,9 +105,9 @@ create or replace package body test_extended_coverage is begin begin execute immediate q'[drop package ut3.test_dummy_coverage]'; exception when others then null; end; begin execute immediate q'[drop package ut3.dummy_coverage]'; exception when others then null; end; - delete from ut3.dbmspcc_blocks where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); - delete from ut3.dbmspcc_units where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); - delete from ut3.dbmspcc_runs where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); + delete from dbmspcc_blocks where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); + delete from dbmspcc_units where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); + delete from dbmspcc_runs where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); delete from ut3.plsql_profiler_data where runid = g_run_id(ut3.ut_coverage.gc_proftab_coverage); delete from ut3.plsql_profiler_units where runid = g_run_id(ut3.ut_coverage.gc_proftab_coverage); delete from ut3.plsql_profiler_runs where runid = g_run_id(ut3.ut_coverage.gc_proftab_coverage); From 0aa9c3533fa12d471a90d27fbe5eb43190b25ed5 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Apr 2018 19:23:36 +0100 Subject: [PATCH 3/4] Fixed install scripts. Fixed examples and old tests. --- examples/RunExpectations.sql | 6 ++++-- old_tests/RunAll.sql | 6 ++++-- source/core/coverage/dbms_plssqlcode.sql | 2 ++ source/core/coverage/ut_coverage.pkb | 1 - source/create_synonyms_and_grants_for_public.sql | 4 ++++ source/create_synonyms_and_grants_for_user.sql | 8 ++++++-- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/examples/RunExpectations.sql b/examples/RunExpectations.sql index cbf850ad7..aeb5c40bc 100644 --- a/examples/RunExpectations.sql +++ b/examples/RunExpectations.sql @@ -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; / diff --git a/old_tests/RunAll.sql b/old_tests/RunAll.sql index a6af0c924..936789bd3 100644 --- a/old_tests/RunAll.sql +++ b/old_tests/RunAll.sql @@ -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 @@ -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'); diff --git a/source/core/coverage/dbms_plssqlcode.sql b/source/core/coverage/dbms_plssqlcode.sql index 1395ce10d..e3aa2ec9a 100644 --- a/source/core/coverage/dbms_plssqlcode.sql +++ b/source/core/coverage/dbms_plssqlcode.sql @@ -1,6 +1,8 @@ begin $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then dbms_plsql_code_coverage.create_coverage_tables(force_it => true); + $else + null; $end end; / diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index e237ff54e..bb06a80b7 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -157,7 +157,6 @@ create or replace package body ut_coverage is 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) ); --- g_coverage_id(gc_block_coverage) := dbms_plsql_code_coverage.start_coverage( l_run_comment ); $end ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) ); coverage_pause(); diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index b8d3773c4..235c6806a 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -93,6 +93,8 @@ begin execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_blocks to public'; execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_runs to public'; execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_units to public'; + $else + null; $end end; / @@ -148,6 +150,8 @@ begin execute immediate 'create public synonym dbmspcc_blocks for &&ut3_owner..dbmspcc_blocks'; execute immediate 'create public synonym dbmspcc_runs for &&ut3_owner..dbmspcc_runs'; execute immediate 'create public synonym dbmspcc_units for &&ut3_owner..dbmspcc_units'; + $else + null; $end end; / diff --git a/source/create_synonyms_and_grants_for_user.sql b/source/create_synonyms_and_grants_for_user.sql index 3b59d87fa..3044cb32f 100644 --- a/source/create_synonyms_and_grants_for_user.sql +++ b/source/create_synonyms_and_grants_for_user.sql @@ -113,8 +113,10 @@ begin execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_blocks to &ut3_user'; execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_runs to &ut3_user'; execute immediate 'grant select, insert, delete, update on &&ut3_owner..dbmspcc_units to &ut3_user'; + $else + null; $end - end; +end; / @@ -169,6 +171,8 @@ begin execute immediate 'create or replace synonym &ut3_user..dbmspcc_blocks for &&ut3_owner..dbmspcc_blocks'; execute immediate 'create or replace synonym &ut3_user..dbmspcc_runs for &&ut3_owner..dbmspcc_runs'; execute immediate 'create or replace synonym &ut3_user..dbmspcc_units for &&ut3_owner..dbmspcc_units'; + $else + null; $end - end; +end; / From b9ebca53ce336bc645b6724c4c4fb8cb4cda10d8 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Apr 2018 19:34:36 +0100 Subject: [PATCH 4/4] Updated documentation. --- docs/userguide/coverage.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 170d522da..b8ec894be 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -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)