Skip to content

Commit 93fd222

Browse files
committed
Reworked coverage to allow for gathering coverage without calling utPLSQL.
Enables multi-session coverage too.
1 parent 199ce0b commit 93fd222

File tree

58 files changed

+1009
-692
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1009
-692
lines changed

examples/RunExpectations.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ set echo off
1111
@@demo_expectations.pck
1212

1313
begin
14-
ut_coverage.coverage_start();
14+
ut_coverage.coverage_start(sys_guid());
1515
ut_coverage.set_develop_mode(true);
1616
ut.run();
1717
ut_coverage.set_develop_mode(false);

source/api/ut.pkb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,12 @@ create or replace package body ut is
248248
end loop;
249249
end if;
250250
return;
251+
exception
252+
when no_data_needed then
253+
if l_results%isopen then
254+
close l_results;
255+
end if;
256+
raise;
251257
end;
252258

253259
function run(
@@ -287,6 +293,12 @@ create or replace package body ut is
287293
end loop;
288294
end if;
289295
return;
296+
exception
297+
when no_data_needed then
298+
if l_results%isopen then
299+
close l_results;
300+
end if;
301+
raise;
290302
end;
291303

292304
function run(
@@ -327,6 +339,12 @@ create or replace package body ut is
327339
end loop;
328340
end if;
329341
return;
342+
exception
343+
when no_data_needed then
344+
if l_results%isopen then
345+
close l_results;
346+
end if;
347+
raise;
330348
end;
331349

332350
function run(
@@ -367,6 +385,12 @@ create or replace package body ut is
367385
end loop;
368386
end if;
369387
return;
388+
exception
389+
when no_data_needed then
390+
if l_results%isopen then
391+
close l_results;
392+
end if;
393+
raise;
370394
end;
371395

372396
function run(
@@ -407,6 +431,12 @@ create or replace package body ut is
407431
end loop;
408432
end if;
409433
return;
434+
exception
435+
when no_data_needed then
436+
if l_results%isopen then
437+
close l_results;
438+
end if;
439+
raise;
410440
end;
411441

412442
function run(
@@ -447,6 +477,12 @@ create or replace package body ut is
447477
end loop;
448478
end if;
449479
return;
480+
exception
481+
when no_data_needed then
482+
if l_results%isopen then
483+
close l_results;
484+
end if;
485+
raise;
450486
end;
451487

452488
procedure run(

source/api/ut_runner.pkb

Lines changed: 29 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,6 @@ create or replace package body ut_runner is
2020
/**
2121
* Private functions
2222
*/
23-
function to_ut_object_list(a_names ut_varchar2_list, a_schema_names ut_varchar2_rows) return ut_object_names is
24-
l_result ut_object_names;
25-
l_object_name ut_object_name;
26-
begin
27-
if a_names is not empty then
28-
l_result := ut_object_names();
29-
for i in 1 .. a_names.count loop
30-
l_object_name := ut_object_name(a_names(i));
31-
if l_object_name.owner is null then
32-
for i in 1 .. cardinality(a_schema_names) loop
33-
l_result.extend;
34-
l_result(l_result.last) := ut_object_name(a_schema_names(i)||'.'||l_object_name.name);
35-
end loop;
36-
else
37-
l_result.extend;
38-
l_result(l_result.last) := l_object_name;
39-
end if;
40-
end loop;
41-
end if;
42-
return l_result;
43-
end;
4423

4524
procedure finish_run(a_run ut_run, a_force_manual_rollback boolean) is
4625
begin
@@ -51,7 +30,6 @@ create or replace package body ut_runner is
5130
ut_compound_data_helper.cleanup_diff();
5231
if not a_force_manual_rollback then
5332
rollback;
54-
ut_utils.cleanup_session_temp_tables;
5533
end if;
5634
end;
5735

@@ -95,9 +73,7 @@ create or replace package body ut_runner is
9573
) is
9674
l_run ut_run;
9775
l_coverage_schema_names ut_varchar2_rows;
98-
l_exclude_object_names ut_object_names := ut_object_names();
99-
l_include_object_names ut_object_names;
100-
l_paths ut_varchar2_list := ut_varchar2_list();
76+
l_paths ut_varchar2_list;
10177
l_random_test_order_seed positive;
10278
l_tags ut_varchar2_rows := ut_varchar2_rows();
10379
begin
@@ -113,55 +89,50 @@ create or replace package body ut_runner is
11389

11490
ut_event_manager.trigger_event(ut_event_manager.gc_initialize);
11591
ut_event_manager.trigger_event(ut_event_manager.gc_debug, ut_run_info());
92+
11693
if a_random_test_order_seed is not null then
11794
l_random_test_order_seed := a_random_test_order_seed;
11895
elsif a_random_test_order then
11996
dbms_random.seed( to_char(systimestamp,'yyyyddmmhh24missffff') );
12097
l_random_test_order_seed := trunc(dbms_random.value(1, 1000000000));
12198
end if;
122-
if a_paths is null or a_paths is empty or a_paths.count = 1 and a_paths(1) is null then
99+
100+
l_paths := ut_utils.filter_list(ut_utils.string_table_to_table(a_paths,','), '.+');
101+
if l_paths is null or l_paths is empty then
123102
l_paths := ut_varchar2_list(sys_context('userenv', 'current_schema'));
124-
else
125-
for i in 1..a_paths.count loop
126-
l_paths := l_paths multiset union ut_utils.string_to_table(a_string => a_paths(i),a_delimiter => ',');
127-
end loop;
128103
end if;
129104

130105
begin
131106
ut_expectation_processor.reset_invalidation_exception();
132107
ut_utils.save_dbms_output_to_cache();
133108

134109
ut_console_reporter_base.set_color_enabled(a_color_console);
110+
135111
if a_coverage_schemes is not empty then
136112
l_coverage_schema_names := ut_utils.convert_collection(a_coverage_schemes);
137113
else
138114
l_coverage_schema_names := ut_suite_manager.get_schema_names(l_paths);
139115
end if;
140116

141-
if a_exclude_objects is not empty then
142-
l_exclude_object_names := to_ut_object_list(a_exclude_objects, l_coverage_schema_names);
143-
end if;
144-
117+
145118
if a_tags is not null then
146-
l_tags := l_tags multiset union distinct ut_utils.convert_collection(
119+
l_tags := l_tags multiset union distinct ut_utils.convert_collection(
147120
ut_utils.trim_list_elements(ut_utils.filter_list(ut_utils.string_to_table(a_tags,','),ut_utils.gc_word_no_space))
148121
);
149122
end if;
150-
l_exclude_object_names := l_exclude_object_names multiset union all ut_suite_manager.get_schema_ut_packages(l_coverage_schema_names);
151-
152-
l_include_object_names := to_ut_object_list(a_include_objects, l_coverage_schema_names);
153123

154124
l_run := ut_run(
155-
null,
156-
l_paths,
157-
l_coverage_schema_names,
158-
l_exclude_object_names,
159-
l_include_object_names,
160-
set(a_source_file_mappings),
161-
set(a_test_file_mappings),
162-
a_client_character_set,
163-
l_random_test_order_seed,
164-
l_tags
125+
a_run_paths => l_paths,
126+
a_coverage_options => ut_coverage_options(
127+
schema_names => l_coverage_schema_names,
128+
exclude_objects => ut_utils.convert_collection(a_exclude_objects),
129+
include_objects => ut_utils.convert_collection(a_include_objects),
130+
file_mappings => set(a_source_file_mappings)
131+
),
132+
a_test_file_mappings => set(a_test_file_mappings),
133+
a_client_character_set => a_client_character_set,
134+
a_random_test_order_seed => l_random_test_order_seed,
135+
a_run_tags => l_tags
165136
);
166137

167138
ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, l_tags);
@@ -296,5 +267,15 @@ create or replace package body ut_runner is
296267
return l_result;
297268
end;
298269

270+
procedure coverage_start(a_coverage_run_id raw) is
271+
begin
272+
ut_coverage.coverage_start(a_coverage_run_id);
273+
end;
274+
275+
procedure coverage_stop is
276+
begin
277+
ut_coverage.coverage_stop;
278+
end;
279+
299280
end ut_runner;
300281
/

source/api/ut_runner.pks

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,9 @@ create or replace package ut_runner authid current_user is
145145
*/
146146
function hash_suite_path(a_path varchar2, a_random_seed positiven) return varchar2;
147147

148+
procedure coverage_start(a_coverage_run_id raw);
149+
150+
procedure coverage_stop;
151+
148152
end ut_runner;
149153
/

source/core/coverage/ut_coverage.pkb

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

19-
g_coverage_id tt_coverage_id_arr;
20-
g_develop_mode boolean not null := false;
21-
g_is_started boolean not null := false;
19+
g_coverage_run_id raw(32);
20+
g_develop_mode boolean not null := false;
21+
g_is_started boolean not null := false;
2222

2323
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;
24+
begin
25+
g_develop_mode := a_develop_mode;
26+
end;
3227

3328
function is_develop_mode return boolean is
34-
begin
35-
return g_develop_mode;
36-
end;
29+
begin
30+
return g_develop_mode;
31+
end;
3732

38-
function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skip_objects ut_object_names) return varchar2 is
33+
function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skip_objects ut_object_names) return varchar2 is
3934
l_result varchar2(32767);
4035
l_full_name varchar2(32767);
4136
l_join_mappings varchar2(32767);
@@ -177,14 +172,16 @@ create or replace package body ut_coverage is
177172
/**
178173
* Public functions
179174
*/
180-
procedure coverage_start(a_coverage_options ut_coverage_options default null) is
175+
procedure coverage_start(a_coverage_run_id t_coverage_run_id) is
181176
l_run_comment varchar2(200) := 'utPLSQL Code coverage run '||ut_utils.to_string(systimestamp);
177+
l_line_coverage_id integer;
178+
l_block_coverage_id integer;
182179
begin
183180
if not is_develop_mode() and not g_is_started then
184-
ut_coverage_helper_block.coverage_start( l_run_comment, g_coverage_id(gc_block_coverage) );
185-
ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) );
186-
coverage_pause();
181+
l_line_coverage_id := ut_coverage_helper_profiler.coverage_start( l_run_comment );
182+
l_block_coverage_id := ut_coverage_helper_block.coverage_start( l_run_comment );
187183
g_is_started := true;
184+
ut_coverage_helper.set_coverage_run_ids(a_coverage_run_id, l_line_coverage_id, l_block_coverage_id);
188185
end if;
189186
end;
190187

@@ -200,18 +197,14 @@ create or replace package body ut_coverage is
200197
ut_coverage_helper_profiler.coverage_resume();
201198
end;
202199

203-
procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
200+
procedure mock_coverage_id(
201+
a_coverage_run_id t_coverage_run_id, a_line_coverage_id integer, a_block_coverage_id integer
202+
) is
204203
begin
205204
g_develop_mode := true;
206205
g_is_started := true;
207-
g_coverage_id(a_coverage_type) := a_coverage_id;
208-
end;
209-
210-
procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr) is
211-
begin
212-
g_develop_mode := true;
213-
g_is_started := true;
214-
g_coverage_id := a_coverage_id;
206+
g_coverage_run_id := a_coverage_run_id;
207+
ut_coverage_helper.set_coverage_run_ids(a_coverage_run_id, a_line_coverage_id, a_block_coverage_id);
215208
end;
216209

217210
procedure coverage_stop is
@@ -227,22 +220,26 @@ create or replace package body ut_coverage is
227220
function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
228221
l_result_block ut_coverage.t_coverage;
229222
l_result_profiler_enrich ut_coverage.t_coverage;
230-
l_object ut_coverage.t_full_name;
223+
l_object ut_coverage.t_object_name;
231224
l_line_no binary_integer;
225+
l_coverage_options ut_coverage_options := a_coverage_options;
232226
begin
227+
if is_develop_mode() then
228+
l_coverage_options.coverage_run_id := coalesce(g_coverage_run_id, l_coverage_options.coverage_run_id);
229+
end if;
233230
--prepare global temp table with sources
234231
ut_event_manager.trigger_event('about to populate coverage temp table');
235-
populate_tmp_table(a_coverage_options);
232+
populate_tmp_table(l_coverage_options);
236233
ut_event_manager.trigger_event('coverage temp table populated');
237234

238235
-- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
239236
-- tmp table for block again.
240-
l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data( a_coverage_options, get_coverage_id(gc_proftab_coverage) );
237+
l_result_profiler_enrich := ut_coverage_profiler.get_coverage_data( l_coverage_options );
241238
ut_event_manager.trigger_event('profiler coverage data retrieved');
242239

243240
-- If block coverage available we will use it.
244241
$if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
245-
l_result_block := ut_coverage_block.get_coverage_data( a_coverage_options, get_coverage_id(gc_block_coverage) );
242+
l_result_block := ut_coverage_block.get_coverage_data( l_coverage_options );
246243
ut_event_manager.trigger_event('block coverage data retrieved');
247244

248245
-- Enrich profiler results with some of the block results

0 commit comments

Comments
 (0)