diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 43679e253..e3141b527 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -49,8 +49,8 @@ create or replace package body ut_runner is l_current ut_utils.t_version := ut_utils.to_version(coalesce(a_current,version())); begin if l_requested.major = l_current.major - and (l_requested.minor < l_current.minor - or l_requested.minor = l_current.minor and l_requested.bugfix <= l_current.bugfix) then + and (l_requested.minor < l_current.minor or l_requested.minor is null + or l_requested.minor = l_current.minor and (l_requested.bugfix <= l_current.bugfix or l_requested.bugfix is null)) then l_result := true; end if; return ut_utils.boolean_to_int(l_result); @@ -86,10 +86,12 @@ create or replace package body ut_runner is ut_utils.cleanup_temp_tables; ut_output_buffer.close(l_listener.reporters); - exception + ut_metadata.reset_source_definition_cache; + exception when others then ut_utils.cleanup_temp_tables; ut_output_buffer.close(l_listener.reporters); + ut_metadata.reset_source_definition_cache; dbms_output.put_line(dbms_utility.format_error_backtrace); dbms_output.put_line(dbms_utility.format_error_stack); raise; diff --git a/source/core/ut_expectation_processor.pkb b/source/core/ut_expectation_processor.pkb index 2a16af70e..c53476915 100644 --- a/source/core/ut_expectation_processor.pkb +++ b/source/core/ut_expectation_processor.pkb @@ -125,6 +125,7 @@ create or replace package body ut_expectation_processor as l_line_no integer; l_owner varchar2(1000); l_object_name varchar2(1000); + l_object_full_name varchar2(1000); l_result varchar2(4000); -- in 12.2 format_call_stack reportes not only package name, but also the procedure name -- when 11g and 12c reports only package name @@ -135,9 +136,10 @@ create or replace package body ut_expectation_processor as if l_caller_stack_line like '%.%' then l_line_no := to_number( regexp_substr(l_caller_stack_line,'(0x)?[0-9a-f]+\s+(\d+)',subexpression => 2) ); l_owner := regexp_substr(l_caller_stack_line,'([A-Za-z0-9$#_]+)\.([A-Za-z0-9$#_]|\.)+',subexpression => 1); - l_object_name := regexp_substr(l_caller_stack_line,'([A-Za-z0-9$#_]+)\.(([A-Za-z0-9$#_]|\.)+)',subexpression => 2); + l_object_name := regexp_substr(l_caller_stack_line,'([A-Za-z0-9$#_]+)\.([A-Za-z0-9$#_]+)',subexpression => 2); + l_object_full_name := regexp_substr(l_caller_stack_line,'([A-Za-z0-9$#_]+)\.(([A-Za-z0-9$#_]|\.)+)',subexpression => 2); if l_owner is not null and l_object_name is not null and l_line_no is not null then - l_result := 'at "' || l_owner || '.' || l_object_name || '", line '|| l_line_no || ' ' + l_result := 'at "' || l_owner || '.' || l_object_full_name || '", line '|| l_line_no || ' ' || ut_metadata.get_source_definition_line(l_owner, l_object_name, l_line_no); end if; end if; diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index 64a12fd37..15566ebd1 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -159,6 +159,12 @@ create or replace package body ut_metadata as return l_line; end; + procedure reset_source_definition_cache is + begin + g_source_cache := null; + g_cached_object := null; + end; + function get_dba_view(a_view_name varchar2) return varchar2 is l_invalid_object_name exception; l_result varchar2(128) := lower(a_view_name); @@ -170,5 +176,6 @@ create or replace package body ut_metadata as when l_invalid_object_name then return replace(l_result,'dba_','all_'); end; + end; / diff --git a/source/core/ut_metadata.pks b/source/core/ut_metadata.pks index 88db52d4a..fcd4a4a20 100644 --- a/source/core/ut_metadata.pks +++ b/source/core/ut_metadata.pks @@ -79,6 +79,9 @@ create or replace package ut_metadata authid current_user as */ function get_source_definition_line(a_owner varchar2, a_object_name varchar2, a_line_no integer) return varchar2; + + procedure reset_source_definition_cache; + /* function: get_dba_view diff --git a/test/install_tests.sql b/test/install_tests.sql index 2a7b5d589..6e03a6f61 100644 --- a/test/install_tests.sql +++ b/test/install_tests.sql @@ -1,3 +1,5 @@ +whenever sqlerror exit failure rollback +whenever oserror exit failure rollback @core.pks @ut_utils/test_ut_utils.pks @@ -23,6 +25,31 @@ @ut_expectations/test_expectations_cursor.pkb @@ut_runner/test_ut_runner.pkb -show errors +set linesize 200 +set define on +set verify off +column text format a100 +column error_count noprint new_value error_count + +prompt Validating installation + +set heading on +select type, name, sequence, line, position, text, count(1) over() error_count + from all_errors + where owner = USER + and name not like 'BIN$%' --not recycled + -- errors only. ignore warnings + and attribute = 'ERROR' + order by name, type, sequence +/ + +begin + if to_number('&&error_count') > 0 then + raise_application_error(-20000, 'Not all sources were successfully installed.'); + else + dbms_output.put_line('Installation completed successfully'); + end if; +end; +/ exit diff --git a/test/ut_runner/test_ut_runner.pkb b/test/ut_runner/test_ut_runner.pkb index f02675926..5c8e4fb26 100644 --- a/test/ut_runner/test_ut_runner.pkb +++ b/test/ut_runner/test_ut_runner.pkb @@ -41,5 +41,61 @@ create or replace package body test_ut_runner is throws('v3.0.0.0','bad_ver'); end; + procedure create_test_spec + as + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package test_cache as + --%suite + + --%test + procedure failing_test; +end; +]'; + end; + + procedure create_test_body(a_number integer) + as + pragma autonomous_transaction; + begin + execute immediate 'create or replace package body test_cache as + procedure failing_test is + begin + ut3.ut.expect('||a_number||').to_be_null; + end; +end;'; + end; + + procedure drop_test_package + as + pragma autonomous_transaction; + begin + execute immediate 'drop package test_cache'; + end; + + procedure run_reset_package_body_cache is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + begin + --Arrange + create_test_spec(); + create_test_body(0); + select * + bulk collect into l_results + from table(ut3.ut.run('test_cache')); + + --Act + create_test_body(1); + select * + bulk collect into l_results + from table(ut3.ut.run('test_cache')); + --Assert + l_actual := ut3.ut_utils.table_to_clob(l_results); + l_expected := '%ut3.ut.expect(1).to_be_null;%'; + ut.expect(l_actual).to_be_like(l_expected); + drop_test_package(); + end; + end; / diff --git a/test/ut_runner/test_ut_runner.pks b/test/ut_runner/test_ut_runner.pks index cd7601595..993cd1770 100644 --- a/test/ut_runner/test_ut_runner.pks +++ b/test/ut_runner/test_ut_runner.pks @@ -15,8 +15,8 @@ create or replace package test_ut_runner is --%test(version_compatibility_check raises exception when invalid version passed) procedure version_comp_check_exception; - --%test(version_compatibility_check raises exception when invalid version passed) - procedure version_comp_check_exception; + --%test(run resets cache of package body after every run) + procedure run_reset_package_body_cache; end; /