Skip to content

Commit 293e0f3

Browse files
committed
ut_output_table_buffer will now throw an exception on timeout.
Default initial timeout was changed from 4 hours to 15 seconds. All output reporters will now produce an extra leading line at the start of a test run. Resolves #840
1 parent 5c1f193 commit 293e0f3

19 files changed

+160
-110
lines changed

examples/developer_examples/RunExampleTestSuiteWithCompositeReporter.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ begin
3333
l_run := ut_run(ut_suite_items(l_suite));
3434
l_run.do_execute();
3535

36-
ut_event_manager.trigger_event(ut_utils.gc_finalize, l_run);
36+
ut_event_manager.trigger_event(ut_event_manager.gc_finalize, l_run);
3737
l_doc_reporter.lines_to_dbms_output(0,0);
3838
l_tc_reporter.lines_to_dbms_output(0,0);
3939
end;

examples/developer_examples/RunExampleTestSuiteWithCustomReporter.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ begin
4343
ut_event_manager.add_listener(l_reporter);
4444
l_run := ut_run(ut_suite_items(l_suite));
4545
l_run.do_execute();
46-
ut_event_manager.trigger_event(ut_utils.gc_finalize, l_run);
46+
ut_event_manager.trigger_event(ut_event_manager.gc_finalize, l_run);
4747
l_reporter.lines_to_dbms_output(0,0);
4848
end;
4949
/

source/api/ut_runner.pkb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ create or replace package body ut_runner is
4545
procedure finish_run(a_run ut_run, a_force_manual_rollback boolean) is
4646
begin
4747
ut_utils.cleanup_temp_tables;
48-
ut_event_manager.trigger_event(ut_utils.gc_finalize, a_run);
48+
ut_event_manager.trigger_event(ut_event_manager.gc_finalize, a_run);
4949
ut_metadata.reset_source_definition_cache;
5050
ut_utils.read_cache_to_dbms_output();
5151
ut_coverage_helper.cleanup_tmp_table();
@@ -141,9 +141,12 @@ create or replace package body ut_runner is
141141
set(a_test_file_mappings),
142142
a_client_character_set
143143
);
144+
145+
ut_event_manager.trigger_event(ut_event_manager.gc_initialize, l_run);
146+
144147
ut_suite_manager.configure_execution_by_path(l_paths, l_run.items);
145148
if a_force_manual_rollback then
146-
l_run.set_rollback_type(ut_utils.gc_rollback_manual, a_force=>true);
149+
l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true );
147150
end if;
148151

149152
l_run.do_execute();

source/core/events/ut_event_manager.pkb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,11 @@ create or replace package body ut_event_manager as
6060
procedure trigger_event( a_event_name t_event_name, a_event_object ut_event_item ) is
6161
begin
6262
if a_event_name is not null and g_event_listeners_index.exists(a_event_name)
63-
-- disabled due to compiler warning: PLW-06023: invocation of IS NOT NULL computes trivial value
64-
-- and g_event_listeners_index(a_event_name) is not null
6563
then
6664
for listener_number in 1 .. g_event_listeners_index(a_event_name).count loop
6765
g_listeners(listener_number).on_event(a_event_name, a_event_object);
6866
end loop;
69-
if a_event_name = ut_utils.gc_finalize then
67+
if a_event_name = ut_event_manager.gc_finalize then
7068
dispose_listeners;
7169
end if;
7270
end if;

source/core/events/ut_event_manager.pks

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,42 @@ create or replace package ut_event_manager authid current_user as
1515
See the License for the specific language governing permissions and
1616
limitations under the License.
1717
*/
18+
/* Constants: Event names */
1819
subtype t_event_name is varchar2(250);
1920

21+
gc_initialize constant t_event_name := 'initialize';
22+
23+
gc_before_run constant t_event_name := 'before_run';
24+
gc_before_suite constant t_event_name := 'before_suite';
25+
26+
gc_before_before_all constant t_event_name := 'before_beforeall';
27+
gc_after_before_all constant t_event_name := 'after_beforeall';
28+
29+
gc_before_test constant t_event_name := 'beforetest';
30+
31+
gc_before_before_each constant t_event_name := 'before_beforeeach';
32+
gc_after_before_each constant t_event_name := 'after_beforeeach';
33+
gc_before_before_test constant t_event_name := 'before_beforetest';
34+
gc_after_before_test constant t_event_name := 'after_beforetest';
35+
36+
gc_before_test_execute constant t_event_name := 'before_test';
37+
gc_after_test_execute constant t_event_name := 'after_test';
38+
39+
gc_before_after_test constant t_event_name := 'before_aftertest';
40+
gc_after_after_test constant t_event_name := 'after_aftertest';
41+
gc_before_after_each constant t_event_name := 'before_aftereach';
42+
gc_after_after_each constant t_event_name := 'after_aftereach';
43+
44+
gc_after_test constant t_event_name := 'aftertest';
45+
46+
gc_before_after_all constant t_event_name := 'before_afterall';
47+
gc_after_after_all constant t_event_name := 'after_afterall';
48+
49+
gc_after_suite constant t_event_name := 'after_suite';
50+
gc_after_run constant t_event_name := 'after_run';
51+
52+
gc_finalize constant t_event_name := 'finalize';
53+
2054
procedure trigger_event( a_event_name t_event_name, a_event_object ut_event_item );
2155

2256
procedure initialize;

source/core/output_buffers/ut_output_buffer_tmp.sql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ begin
2828
item_type varchar2(1000),
2929
is_finished number(1,0) default 0 not null,
3030
constraint ut_output_buffer_tmp_pk primary key(output_id, message_id),
31-
constraint ut_output_buffer_tmp_ck check(is_finished = 0 and text is not null or is_finished = 1 and text is null),
31+
constraint ut_output_buffer_tmp_ck check(
32+
is_finished = 0 and (text is not null or item_type is not null )
33+
or is_finished = 1 and text is null and item_type is null ),
3234
constraint ut_output_buffer_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id)
3335
) organization index overflow nologging initrans 100 ';
3436
begin

source/core/output_buffers/ut_output_table_buffer.tpb

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ create or replace type body ut_output_table_buffer is
4949
overriding member procedure send_line(self in ut_output_table_buffer, a_text varchar2, a_item_type varchar2 := null) is
5050
pragma autonomous_transaction;
5151
begin
52-
if a_text is not null then
52+
if a_text is not null or a_item_type is not null then
5353
insert into ut_output_buffer_tmp(output_id, message_id, text, item_type)
5454
values (self.output_id, ut_message_id_seq.nextval, a_text, a_item_type);
5555
end if;
@@ -62,15 +62,15 @@ create or replace type body ut_output_table_buffer is
6262
insert into ut_output_buffer_tmp(output_id, message_id, text, item_type)
6363
select self.output_id, ut_message_id_seq.nextval, t.column_value, a_item_type
6464
from table(a_text_list) t
65-
where t.column_value is not null;
65+
where t.column_value is not null or a_item_type is not null;
6666

6767
commit;
6868
end;
6969

7070
overriding member procedure send_clob(self in ut_output_table_buffer, a_text clob, a_item_type varchar2 := null) is
7171
pragma autonomous_transaction;
7272
begin
73-
if a_text is not null and a_text != empty_clob() then
73+
if a_text is not null and a_text != empty_clob() or a_item_type is not null then
7474
insert into ut_output_buffer_tmp(output_id, message_id, text, item_type)
7575
values (self.output_id, ut_message_id_seq.nextval, a_text, a_item_type);
7676
end if;
@@ -80,9 +80,10 @@ create or replace type body ut_output_table_buffer is
8080
overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined is
8181
l_buffer_data ut_output_data_rows;
8282
l_message_ids ut_integer_list;
83+
l_finished_flags ut_integer_list;
8384
l_already_waited_for number(10,2) := 0;
8485
l_finished boolean := false;
85-
lc_init_wait_sec constant naturaln := coalesce(a_initial_timeout, 60 * 60 * 4 ); -- 4 hours
86+
lc_init_wait_sec constant naturaln := coalesce(a_initial_timeout, 15 ); -- 15 seconds
8687
lc_max_wait_sec constant naturaln := coalesce(a_timeout_sec, 60 * 60 * 4); -- 4 hours
8788
l_wait_for integer := lc_init_wait_sec;
8889
lc_short_sleep_time constant number(1,1) := 0.1; --sleep for 100 ms between checks
@@ -111,13 +112,13 @@ create or replace type body ut_output_table_buffer is
111112
begin
112113
while not l_finished loop
113114
with ordered_buffer as (
114-
select a.message_id, ut_output_data_row(a.text, a.item_type)
115+
select a.message_id, ut_output_data_row(a.text, a.item_type), is_finished
115116
from ut_output_buffer_tmp a
116117
where a.output_id = self.output_id
117118
order by a.message_id
118119
)
119120
select b.*
120-
bulk collect into l_message_ids, l_buffer_data
121+
bulk collect into l_message_ids, l_buffer_data, l_finished_flags
121122
from ordered_buffer b
122123
where rownum <= lc_bulk_limit;
123124

@@ -141,18 +142,21 @@ create or replace type body ut_output_table_buffer is
141142
for i in 1 .. l_buffer_data.count loop
142143
if l_buffer_data(i).text is not null then
143144
pipe row(l_buffer_data(i));
144-
else
145+
elsif l_finished_flags(i) = 1 then
145146
l_finished := true;
146147
exit;
147148
end if;
148149
end loop;
150+
remove_read_data(l_message_ids);
149151
end if;
150-
remove_read_data(l_message_ids);
151-
if l_finished then
152+
if l_finished or l_already_waited_for >= l_wait_for then
152153
remove_buffer_info();
153-
end if;
154-
if l_already_waited_for >= l_wait_for then
155-
l_finished := true;
154+
if l_already_waited_for > 0 and l_already_waited_for >= l_wait_for then
155+
raise_application_error(
156+
ut_utils.gc_out_buffer_timeout,
157+
'Timeout occurred while waiting for output data. Waited for: '||l_already_waited_for||' seconds.'
158+
);
159+
end if;
156160
end if;
157161
end loop;
158162
return;

source/core/types/ut_logical_suite.tpb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ create or replace type body ut_logical_suite as
1818

1919
overriding member procedure mark_as_skipped(self in out nocopy ut_logical_suite) is
2020
begin
21-
ut_event_manager.trigger_event(ut_utils.gc_before_suite, self);
21+
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
2222
self.start_time := current_timestamp;
2323
for i in 1 .. self.items.count loop
2424
self.items(i).mark_as_skipped();
2525
end loop;
2626
self.end_time := self.start_time;
27-
ut_event_manager.trigger_event(ut_utils.gc_after_suite, self);
27+
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
2828
self.calc_execution_result();
2929
end;
3030

@@ -43,7 +43,7 @@ create or replace type body ut_logical_suite as
4343
begin
4444
ut_utils.debug_log('ut_logical_suite.execute');
4545

46-
ut_event_manager.trigger_event(ut_utils.gc_before_suite, self);
46+
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
4747
self.start_time := current_timestamp;
4848

4949
for i in 1 .. self.items.count loop
@@ -54,7 +54,7 @@ create or replace type body ut_logical_suite as
5454
self.calc_execution_result();
5555
self.end_time := current_timestamp;
5656

57-
ut_event_manager.trigger_event(ut_utils.gc_after_suite, self);
57+
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
5858

5959
return l_completed_without_errors;
6060
end;
@@ -78,15 +78,15 @@ create or replace type body ut_logical_suite as
7878
overriding member procedure mark_as_errored(self in out nocopy ut_logical_suite, a_error_stack_trace varchar2) is
7979
begin
8080
ut_utils.debug_log('ut_logical_suite.fail');
81-
ut_event_manager.trigger_event(ut_utils.gc_before_suite, self);
81+
ut_event_manager.trigger_event(ut_event_manager.gc_before_suite, self);
8282
self.start_time := current_timestamp;
8383
for i in 1 .. self.items.count loop
8484
-- execute the item (test or suite)
8585
self.items(i).mark_as_errored(a_error_stack_trace);
8686
end loop;
8787
self.calc_execution_result();
8888
self.end_time := self.start_time;
89-
ut_event_manager.trigger_event(ut_utils.gc_after_suite, self);
89+
ut_event_manager.trigger_event(ut_event_manager.gc_after_suite, self);
9090
end;
9191

9292
overriding member function get_error_stack_traces return ut_varchar2_list is

source/core/types/ut_output_reporter_base.tpb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,10 @@ create or replace type body ut_output_reporter_base is
7878
self.output_buffer.close();
7979
end;
8080

81+
overriding member procedure on_initialize(self in out nocopy ut_output_reporter_base, a_run in ut_run) is
82+
begin
83+
self.output_buffer.send_line(null, 'initialize');
84+
end;
85+
8186
end;
8287
/

source/core/types/ut_output_reporter_base.tps

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ create or replace type ut_output_reporter_base under ut_reporter_base(
2828
final member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined,
2929
final member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor,
3030
final member procedure lines_to_dbms_output(self in ut_output_reporter_base, a_initial_timeout natural := null, a_timeout_sec natural := null),
31-
overriding final member procedure on_finalize(self in out nocopy ut_output_reporter_base, a_run in ut_run)
31+
overriding final member procedure on_finalize(self in out nocopy ut_output_reporter_base, a_run in ut_run),
32+
overriding member procedure on_initialize(self in out nocopy ut_output_reporter_base, a_run in ut_run)
3233
)
3334
not final not instantiable
3435
/

0 commit comments

Comments
 (0)