From 1f1828ffca6565076a26d418ee2d154cf0c90188 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 10 Nov 2019 11:54:13 +0000 Subject: [PATCH 01/51] Updated project version to 3.1.10 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 76cb3f689..04c455c73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.9 +v3.1.10 From a33b53d6ff70c652d7d1e6380af2d3c65ba79c48 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 10 Nov 2019 12:06:35 +0000 Subject: [PATCH 02/51] Updated project version after build [skip ci] --- VERSION | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- sonar-project.properties | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/VERSION b/VERSION index 04c455c73..8961ff4ac 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.10 +v3.1.10-develop diff --git a/docs/about/authors.md b/docs/about/authors.md index 776e5cd44..5b6742c00 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index edf1181bd..ac12e0d57 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 46ddbf89b..1a7753962 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 4092c00c9..95bc201ea 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 20d119f93..abc4846c1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 36ed86ae6..17549d2e5 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 33950623d..8e4ff4aed 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 3378cafe4..25b8c7170 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 203daffe0..b3210f9a7 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 3d01aafbd..798cf3a27 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index fe2369957..20a9c980f 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index aab93b2f8..713667d56 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 3d6e23843..71cada77d 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index ceb1cbb13..2992adff1 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 798b2fd0b..4d9f0a4b7 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 2c8b4ebdd..9ebd3f9bc 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 5e48ee239..2f82f3965 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.9.3268-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) # Upgrading from version 2 diff --git a/sonar-project.properties b/sonar-project.properties index da061019b..62c8f808f 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -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.9 +sonar.projectVersion=v3.1.10-develop # 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. diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 1e4b63c7f..0185c5568 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -766,7 +766,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.9.3268 + * secion v3.1.10.3271-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index f1a19efb9..e5de08d1c 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.9.3268'; + gc_version constant varchar2(50) := 'v3.1.10.3271-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From a2c0a587d665913ec4a7dcd76798053b32685387 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 10 Nov 2019 13:27:14 +0000 Subject: [PATCH 03/51] Update link for utPLSQL download statistics --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 2ccf8ee68..0d66152d0 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ [![license](https://img.shields.io/github/license/utPLSQL/utPLSQL.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![latest-release](https://img.shields.io/github/release/utPLSQL/utPLSQL.svg)](https://github.com/utPLSQL/utPLSQL/releases) -[![Github All Releases](https://img.shields.io/github/downloads/utPLSQL/utPLSQL/total.svg)](https://github.com/utPLSQL/utPLSQL/releases) +[![Download statistics](https://img.shields.io/github/downloads/utPLSQL/utPLSQL/total.svg)](http://gra.caldis.me/?url=https://github.com/utPLSQL/utPLSQL) [![chat](http://img.shields.io/badge/slack-team--chat-blue.svg)](http://utplsql-slack-invite.herokuapp.com/) [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) From 52794ac13a8fd8e7749f29b895c8dae9ca1f2c4c Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 10 Nov 2019 13:57:48 +0000 Subject: [PATCH 04/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 5b6742c00..6a2b49ced 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index ac12e0d57..2d04c1cb8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 1a7753962..c535b514d 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 95bc201ea..db847e339 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index abc4846c1..efe13d2df 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 17549d2e5..4693d3db4 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 8e4ff4aed..d7dc12567 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 25b8c7170..c9286f55b 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index b3210f9a7..8ea9d9df7 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 798cf3a27..813485e9b 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 20a9c980f..161e87a87 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 713667d56..e39989fc8 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 71cada77d..7c50c0138 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 2992adff1..421b7fab3 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 4d9f0a4b7..5d588a634 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 9ebd3f9bc..5ce154fa9 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 2f82f3965..d94dd2b56 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3271--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 0185c5568..83d519811 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -766,7 +766,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3271-develop + * secion v3.1.10.3274-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index e5de08d1c..e3802e1f5 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3271-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3274-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From b3973d09a7d111e85b5e8a6c4904e1e1e28b35d1 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 29 Nov 2019 22:54:35 +0000 Subject: [PATCH 05/51] Fixed test dependency on user running them. Resolves #969 --- test/ut3_tester/core/test_ut_suite.pkb | 14 +++--- test/ut3_tester/core/test_ut_test.pkb | 60 +++++++++++++------------- test/ut3_tester_helper/run_helper.pkb | 6 +-- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/test/ut3_tester/core/test_ut_suite.pkb b/test/ut3_tester/core/test_ut_suite.pkb index 3ea323a6d..9c52df9e5 100644 --- a/test/ut3_tester/core/test_ut_suite.pkb +++ b/test/ut3_tester/core/test_ut_suite.pkb @@ -19,11 +19,11 @@ create or replace package body test_ut_suite is l_suite ut3.ut_suite; begin --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); l_suite.path := 'ut3_tester_helper.ut_example_tests'; l_suite.disabled_flag := ut3.ut_utils.boolean_to_int(true); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_before_all)); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_before_all)); l_suite.items.extend; l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); l_suite.items.extend; @@ -44,9 +44,9 @@ create or replace package body test_ut_suite is l_suite ut3.ut_suite; begin --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); l_suite.path := 'ut3_tester_helper.ut_example_tests'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_before_all)); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_before_all)); l_suite.items.extend; l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'set_g_number_0', a_line_no=> 1); --Act @@ -65,9 +65,9 @@ create or replace package body test_ut_suite is l_suite ut3.ut_suite; begin --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); l_suite.path := 'ut3_tester_helper.ut_example_tests'; - l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_after_all)); + l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_after_all)); l_suite.items.extend; l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'set_g_number_0', a_line_no=> 1); diff --git a/test/ut3_tester/core/test_ut_test.pkb b/test/ut3_tester/core/test_ut_test.pkb index 2a85a323f..b4dcc2536 100644 --- a/test/ut3_tester/core/test_ut_test.pkb +++ b/test/ut3_tester/core/test_ut_test.pkb @@ -12,7 +12,7 @@ create or replace package body test_ut_test is --Arrange l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); l_suite.path := 'ut3_tester_helper.ut_example_tests'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); l_suite.items.extend; l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); @@ -38,11 +38,11 @@ create or replace package body test_ut_test is --Arrange l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); l_suite.path := 'ut3_tester_helper.ut_example_tests'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); l_test := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_before_test)); - l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_after_test)); + l_test.before_test_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_before_test)); + l_test.after_test_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_after_test)); l_suite.items.extend; l_suite.items(l_suite.items.last) := l_test; l_suite.items.extend; @@ -65,10 +65,10 @@ create or replace package body test_ut_test is begin --Arrange l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); l_test := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_before_each)); - l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_after_each)); + l_test.before_each_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_before_each)); + l_test.after_each_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_after_each)); l_suite.items.extend; l_suite.items(l_suite.items.last) := l_test; l_suite.items.extend; @@ -90,11 +90,11 @@ create or replace package body test_ut_test is l_test ut3.ut_test; begin --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'ut_example_tests', a_line_no=> 1); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); l_test := ut3.ut_test(a_object_owner =>'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_before_test)); - l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); + l_test.before_test_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_before_test)); + l_test.after_test_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); l_suite.items.extend; l_suite.items(l_suite.items.last) := l_test; l_suite.items.extend; @@ -116,15 +116,15 @@ create or replace package body test_ut_test is l_test ut3.ut_test; begin --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'ut_example_tests', a_line_no=> 1); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - l_test := ut3.ut_test(a_object_owner => USER,a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_before_each)); - l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_each)); + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_test := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_test.before_each_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_before_each)); + l_test.after_each_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_each)); l_suite.items.extend; l_suite.items(l_suite.items.last) := l_test; l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => USER,a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); --Act l_suite.do_execute(); --Assert @@ -148,8 +148,8 @@ create or replace package body test_ut_test is begin l_test.after_each_list := ut3.ut_executables( ut3.ut_executable( - user, - 'UT_EXAMPLE_TESTS', + 'ut3_tester_helper', + 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_each ) @@ -171,7 +171,7 @@ create or replace package body test_ut_test is ); begin l_test.after_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_after_each) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_after_each) ); --Act l_test.do_execute(); @@ -190,7 +190,7 @@ create or replace package body test_ut_test is ); begin l_test.after_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_after_each) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', null, ut3.ut_utils.gc_after_each) ); --Act l_test.do_execute(); @@ -325,7 +325,7 @@ create or replace package body test_ut_test is a_line_no => null ); begin - l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_each)); + l_test.before_each_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_each)); --Act l_test.do_execute(); --Assert @@ -344,7 +344,7 @@ create or replace package body test_ut_test is ); begin l_test.before_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_each) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_each) ); --Act l_test.do_execute(); @@ -363,7 +363,7 @@ create or replace package body test_ut_test is ); begin l_test.before_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_before_each) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', null, ut3.ut_utils.gc_before_each) ); --Act l_test.do_execute(); @@ -529,7 +529,7 @@ create or replace package body test_ut_test is a_line_no => null ); begin - l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_test)); + l_test.before_test_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_test)); --Act l_test.do_execute(); --Assert @@ -547,7 +547,7 @@ create or replace package body test_ut_test is ); begin l_test.before_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_test) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_test) ); --Act l_test.do_execute(); @@ -566,7 +566,7 @@ create or replace package body test_ut_test is ); begin l_test.before_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_before_test) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', null, ut3.ut_utils.gc_before_test) ); --Act l_test.do_execute(); @@ -584,7 +584,7 @@ create or replace package body test_ut_test is a_line_no => null ); begin - l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); + l_test.after_test_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); --Act l_test.do_execute(); --Assert @@ -602,7 +602,7 @@ create or replace package body test_ut_test is ); begin l_test.after_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid procedure name', ut3.ut_utils.gc_after_test) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', 'invalid procedure name', ut3.ut_utils.gc_after_test) ); --Act l_test.do_execute(); @@ -621,7 +621,7 @@ create or replace package body test_ut_test is ); begin l_test.after_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_after_test) + ut3.ut_executable('ut3_tester_helper', 'ut_example_tests', null, ut3.ut_utils.gc_after_test) ); --Act l_test.do_execute(); diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index ef6528e04..9a9c8587f 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -550,11 +550,11 @@ create or replace package body run_helper is begin --Arrange execute immediate 'delete from ut$test_table'; - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_TRANSACTION_CONTROL', a_line_no=> 1); + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_TRANSACTION_CONTROL', a_line_no=> 1); l_suite.path := 'ut_transaction_control'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_TRANSACTION_CONTROL', 'setup', ut3.ut_utils.gc_before_all)); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable('ut3_tester_helper', 'UT_TRANSACTION_CONTROL', 'setup', ut3.ut_utils.gc_before_all)); l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => USER, a_object_name => 'ut_transaction_control',a_name => a_procedure_name, a_line_no=> 1); + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_transaction_control',a_name => a_procedure_name, a_line_no=> 1); l_suite.set_rollback_type(a_rollback_type); --Act From 39d144ae7f55cf13cd22d5d313f96c742980b305 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 30 Nov 2019 00:59:11 +0000 Subject: [PATCH 06/51] Changed how savepoint name is generated. Resolves #982 --- source/core/coverage/proftab.sql | 2 +- source/core/ut_savepoint_seq.sql | 15 --------------- source/core/ut_utils.pkb | 2 +- source/install.sql | 1 - source/uninstall_objects.sql | 2 -- 5 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 source/core/ut_savepoint_seq.sql diff --git a/source/core/coverage/proftab.sql b/source/core/coverage/proftab.sql index 62c69dc9a..a5d09f43d 100644 --- a/source/core/coverage/proftab.sql +++ b/source/core/coverage/proftab.sql @@ -37,7 +37,7 @@ begin if l_tab_exist = 0 then execute immediate q'[create table plsql_profiler_units ( - runid number references plsql_profiler_runs, + runid number(18) references plsql_profiler_runs, unit_number number, -- internally generated library unit # unit_type varchar2(128), -- library unit type unit_owner varchar2(128), -- library unit owner name diff --git a/source/core/ut_savepoint_seq.sql b/source/core/ut_savepoint_seq.sql deleted file mode 100644 index e1d80f452..000000000 --- a/source/core/ut_savepoint_seq.sql +++ /dev/null @@ -1,15 +0,0 @@ -create sequence ut_savepoint_seq - /* - utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - start with 1 cache 20; \ No newline at end of file diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 83d519811..d593f0a65 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -59,7 +59,7 @@ create or replace package body ut_utils is function gen_savepoint_name return varchar2 is begin - return 's'||trim(to_char(ut_savepoint_seq.nextval,'0000000000000000000000000000')); + return 's'||to_char(systimestamp,'yyyymmddhh24missff9'); end; procedure debug_log(a_message varchar2) is diff --git a/source/install.sql b/source/install.sql index 1f9913b0a..5a4f1449c 100644 --- a/source/install.sql +++ b/source/install.sql @@ -59,7 +59,6 @@ end; @@install_component.sql 'core/types/ut_reporters_info.tps' @@install_component.sql 'core/ut_utils.pks' @@install_component.sql 'core/ut_metadata.pks' -@@install_component.sql 'core/ut_savepoint_seq.sql' @@install_component.sql 'core/ut_utils.pkb' @@install_component.sql 'core/ut_metadata.pkb' @@install_component.sql 'reporters/ut_ansiconsole_helper.pks' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index c905153f4..d540efbbb 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -243,8 +243,6 @@ end; drop package ut_utils; -drop sequence ut_savepoint_seq; - drop type ut_documentation_reporter force; drop type ut_debug_reporter force; From 4bb7a951ef5bac19ec98233e979d093c3bef9bc8 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 30 Nov 2019 16:55:24 +0000 Subject: [PATCH 07/51] Added a hash of owner to the generated savepoint name. Resolves #982 --- source/core/coverage/proftab.sql | 2 +- source/core/ut_savepoint_seq.sql | 15 +++++++++++++++ source/core/ut_utils.pkb | 3 ++- source/install.sql | 1 + source/uninstall_objects.sql | 2 ++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 source/core/ut_savepoint_seq.sql diff --git a/source/core/coverage/proftab.sql b/source/core/coverage/proftab.sql index a5d09f43d..62c69dc9a 100644 --- a/source/core/coverage/proftab.sql +++ b/source/core/coverage/proftab.sql @@ -37,7 +37,7 @@ begin if l_tab_exist = 0 then execute immediate q'[create table plsql_profiler_units ( - runid number(18) references plsql_profiler_runs, + runid number references plsql_profiler_runs, unit_number number, -- internally generated library unit # unit_type varchar2(128), -- library unit type unit_owner varchar2(128), -- library unit owner name diff --git a/source/core/ut_savepoint_seq.sql b/source/core/ut_savepoint_seq.sql new file mode 100644 index 000000000..b87d18e6d --- /dev/null +++ b/source/core/ut_savepoint_seq.sql @@ -0,0 +1,15 @@ +create sequence ut_savepoint_seq + /* + utPLSQL - Version 3 + Copyright 2016 - 2019 utPLSQL Project + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + start with 1 cache 20 minvalue 1 maxvalue 99999999999999999 cycle; \ No newline at end of file diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index d593f0a65..8ebb50f53 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -22,6 +22,7 @@ create or replace package body ut_utils is gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]'; gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]'; gc_full_valid_xml_name constant varchar2(50) := '^([_a-zA-Z])([_a-zA-Z0-9\.-])*$'; + gc_owner_hash constant integer(11) := dbms_utility.get_hash_value( ut_owner(), 0, power(2,31)-1); function surround_with(a_value varchar2, a_quote_char varchar2) return varchar2 is begin @@ -59,7 +60,7 @@ create or replace package body ut_utils is function gen_savepoint_name return varchar2 is begin - return 's'||to_char(systimestamp,'yyyymmddhh24missff9'); + return 's'||gc_owner_hash||trim(to_char(ut_savepoint_seq.nextval,'00000000000000000')); end; procedure debug_log(a_message varchar2) is diff --git a/source/install.sql b/source/install.sql index 5a4f1449c..1f9913b0a 100644 --- a/source/install.sql +++ b/source/install.sql @@ -59,6 +59,7 @@ end; @@install_component.sql 'core/types/ut_reporters_info.tps' @@install_component.sql 'core/ut_utils.pks' @@install_component.sql 'core/ut_metadata.pks' +@@install_component.sql 'core/ut_savepoint_seq.sql' @@install_component.sql 'core/ut_utils.pkb' @@install_component.sql 'core/ut_metadata.pkb' @@install_component.sql 'reporters/ut_ansiconsole_helper.pks' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index d540efbbb..c905153f4 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -243,6 +243,8 @@ end; drop package ut_utils; +drop sequence ut_savepoint_seq; + drop type ut_documentation_reporter force; drop type ut_debug_reporter force; From 42053b4c5bd3badb964176e83571b4c42791b734 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 30 Nov 2019 18:39:06 +0000 Subject: [PATCH 08/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 6a2b49ced..439a68670 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 2d04c1cb8..e0c634bf8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index c535b514d..31192f201 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index db847e339..7a5f97899 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index efe13d2df..56f7877ca 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4693d3db4..634c51837 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index d7dc12567..293977ac1 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index c9286f55b..2cbdf83f0 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 8ea9d9df7..53b4622c7 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 813485e9b..89d1f290f 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 161e87a87..4f983ee3a 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index e39989fc8..47d3803ae 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 7c50c0138..d1a35e5be 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 421b7fab3..d52fdbc87 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 5d588a634..91ebd0ced 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 5ce154fa9..9a727b56e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index d94dd2b56..29af9c353 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3274--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 8ebb50f53..9d002b4ad 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3274-develop + * secion v3.1.10.3282-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index e3802e1f5..950b84216 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3274-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3282-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From d654cccee281ac28c4c437fdf6be9e5aa8e96287 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 1 Dec 2019 14:01:29 +0000 Subject: [PATCH 09/51] Changed the target location for published documentation. Now it's published into main utplsql.gihub.io repository. --- .travis.yml | 6 +- ..._gh_pages.sh => push_docs_to_github_io.sh} | 62 +++++++++---------- .travis/update_project_version.sh | 2 + 3 files changed, 33 insertions(+), 37 deletions(-) rename .travis/{push_docs_to_gh_pages.sh => push_docs_to_github_io.sh} (67%) mode change 100755 => 100644 diff --git a/.travis.yml b/.travis.yml index b48adb107..7ac28e41f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,6 @@ env: - CURRENT_BRANCH=${TRAVIS_BRANCH} - UTPLSQL_REPO="utPLSQL/utPLSQL" - UTPLSQL_BUILD_NO="${TRAVIS_BUILD_NUMBER:-0}" - - UTPLSQL_VERSION_PATTERN="v?([0-9]+\.){3}[0-9]+[^']*" - UTPLSQL_VERSION=$(. .travis/get_project_version.sh) - UTPLSQL_BUILD_VERSION=$(. .travis/get_project_build_version.sh) - UTPLSQL_SOURCES_DIR='source' @@ -115,16 +114,15 @@ jobs: - pip install mkdocs before_script: skip script: - - if [[ ($TRAVIS_BRANCH == develop) && ($TRAVIS_PULL_REQUEST == false) ]]; then bash .travis/trigger_travis.sh $TRAVIS_ACCESS_TOKEN; fi - - #The update_project_version.sh needs to be done before pushing changes to develop branch - bash .travis/update_project_version.sh - git config --global user.email "builds@travis-ci.com" - git config --global user.name "${UTPLSQL_BUILD_USER_NAME}" - git remote rm origin - git remote add origin https://${github_api_token}@github.com/${UTPLSQL_REPO} - if [[ ! $TRAVIS_TAG ]]; then bash .travis/push_release_version.sh; fi + - bash .travis/push_docs_to_github_io.sh - bash .travis/build_docs.sh - - bash .travis/push_docs_to_gh_pages.sh + - if [[ ($TRAVIS_BRANCH == develop) && ($TRAVIS_PULL_REQUEST == false) ]]; then bash .travis/trigger_travis.sh $TRAVIS_ACCESS_TOKEN; fi before_deploy: - bash .travis/build_release_archive.sh deploy: diff --git a/.travis/push_docs_to_gh_pages.sh b/.travis/push_docs_to_github_io.sh old mode 100755 new mode 100644 similarity index 67% rename from .travis/push_docs_to_gh_pages.sh rename to .travis/push_docs_to_github_io.sh index d2c5a685c..add63aa1b --- a/.travis/push_docs_to_gh_pages.sh +++ b/.travis/push_docs_to_github_io.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Many aspects of this came from https://gist.github.com/domenic/ec8b0fc8ab45f39403dd +# Based on `push_docs_to_gh_pages.sh` # Significant alterations # - Support for multiple copies of documentation, # - only clearing out develop @@ -13,59 +13,55 @@ # - File: "docs/index.md" with that contains develop docs # Required ENV Variables -PAGES_TARGET_BRANCH="gh-pages" LATEST_DOCS_BRANCH="develop" +GITHUB_IO_REPO='jgebal/jgebal.github.io' +GITHUB_IO_BRANCH='master' + # TRAVIS_* variables are set by travis directly and only need to be if testing externally -# We don't want a pull request automatically updating the repository +# We deploy only when building on develop branch or on TAG (release) if [ "$TRAVIS_PULL_REQUEST" == "false" ] && { [ "${CURRENT_BRANCH}" == "${LATEST_DOCS_BRANCH}" ] || [ -n "${TRAVIS_TAG}" ]; }; then # ENV Variable checks are to help with configuration troubleshooting, they silently exit with unique message. # Anyone one of them not set can be used to turn off this functionality. # If a version of the project is not defined - [[ -n "${UTPLSQL_VERSION}" ]] || { echo "variable UTPLSQL_VERSION is not defines or missing value"; exit 0; } + [[ -n "${UTPLSQL_VERSION}" ]] || { echo "variable UTPLSQL_VERSION is not defines or missing value"; exit 1; } # Fail if the markdown documentation is not present. [[ -f ./docs/index.md ]] || { echo "file docs/index.md not found"; exit 1; } - # Save some useful information + # Store latest commit SHA to be used when committing and pushing to github.io repo SHA=`git rev-parse --verify HEAD` - # clone the repository and switch to PAGES_TARGET_BRANCH branch + # clone the repository and switch to GITHUB_IO_BRANCH branch mkdir pages - cd pages - git clone https://${github_api_token}@github.com/${UTPLSQL_REPO} . - - PAGES_BRANCH_EXISTS=$(git ls-remote --heads origin ${PAGES_TARGET_BRANCH}) + cd ./pages + git clone --depth 1 https://${github_api_token}@github.com/${GITHUB_IO_REPO} -b ${GITHUB_IO_BRANCH} . - if [ -n "$PAGES_BRANCH_EXISTS" ] ; then - echo "Pages Branch Found" - git checkout ${PAGES_TARGET_BRANCH} - else - echo "Creating Pages Branch" - git checkout --orphan ${PAGES_TARGET_BRANCH} - git rm -rf . - fi + mkdir -p utPLSQL + cd ./utPLSQL #clear out develop documentation directory and copy docs contents to it. - echo "updating 'develop' directory" - mkdir -p develop - rm -rf develop/**./* || exit 0 - cp -a ../docs/. ./develop + echo "updating 'develop' documentation directory" + mkdir -p ./develop + rm -rf ./develop/**./* || exit 0 + cp -a ../../docs/. ./develop + # If a Tagged Build then copy to it's own directory as well and to the 'latest' release directory if [ -n "$TRAVIS_TAG" ]; then - echo "Creating ${UTPLSQL_VERSION}" - mkdir -p ${UTPLSQL_VERSION} - rm -rf ${UTPLSQL_VERSION}/**./* || exit 0 - cp -a ../docs/. ${UTPLSQL_VERSION} - echo "Populating 'latest' directory" - mkdir -p latest - rm -rf latest/**./* || exit 0 - cp -a ../docs/. latest + echo "Creating directory ./${UTPLSQL_VERSION}" + mkdir -p ./${UTPLSQL_VERSION} + rm -rf ./${UTPLSQL_VERSION}/**./* || exit 0 + cp -a ../../docs/. ./${UTPLSQL_VERSION} + echo "Populating 'latest' directory" + mkdir -p ./latest + rm -rf ./latest/**./* || exit 0 + cp -a ../../docs/. ./latest fi # Stage changes for commit git add . + #Check if there are doc changes, if none exit the script - if [[ -z `git diff HEAD --exit-code` ]] && [ -n "${PAGES_BRANCH_EXISTS}" ] ; then + if [[ -z `git diff HEAD --exit-code` ]]; then echo "No changes to docs detected." exit 0 fi @@ -75,7 +71,7 @@ if [ "$TRAVIS_PULL_REQUEST" == "false" ] && { [ "${CURRENT_BRANCH}" == "${LATEST echo "---" >>index.md echo "layout: default" >>index.md echo "---" >>index.md - echo "" >>index.md + echo "" >>index.md echo "# Documentation versions" >>index.md echo "" >>index.md echo "" >>index.md #- 7th line - placeholder for latest release doc @@ -96,6 +92,6 @@ if [ "$TRAVIS_PULL_REQUEST" == "false" ] && { [ "${CURRENT_BRANCH}" == "${LATEST git add . git commit -m "Deploy to gh-pages branch: base commit ${SHA}" # Now that we're all set up, we can push. - git push --quiet origin HEAD:${PAGES_TARGET_BRANCH} + git push --quiet origin HEAD:${GITHUB_IO_BRANCH} fi diff --git a/.travis/update_project_version.sh b/.travis/update_project_version.sh index 3f162fb78..c4540eef8 100755 --- a/.travis/update_project_version.sh +++ b/.travis/update_project_version.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +UTPLSQL_VERSION_PATTERN="v?([0-9]+\.){3}[0-9]+[^']*" + echo Current branch is "${CURRENT_BRANCH}" echo Update version in project source files From 090b74c083cdec6530e37958466277040157d34d Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 1 Dec 2019 14:12:54 +0000 Subject: [PATCH 10/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 439a68670..2ba4aff9a 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index e0c634bf8..33c552f78 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 31192f201..52c21c740 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 7a5f97899..e851d6ae5 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 56f7877ca..f17d3848c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 634c51837..4f39ca713 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 293977ac1..db061005f 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 2cbdf83f0..ea7b3e50f 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 53b4622c7..95c1dadcf 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 89d1f290f..4f3375f85 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 4f983ee3a..c1995e1bc 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 47d3803ae..30fe6fcda 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index d1a35e5be..ba3f6735a 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index d52fdbc87..35455a6cd 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 91ebd0ced..21f36e1a4 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 9a727b56e..22cf5cb5e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 29af9c353..13135431c 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3282--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 9d002b4ad..0553f0343 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3282-develop + * secion v3.1.10.3290-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 950b84216..79bcc5107 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3282-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3290-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e8f453291b58f90bde2fbac6a6b8562757997905 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 19 Dec 2019 15:38:07 +0100 Subject: [PATCH 11/51] Skip as many %endcontext as nested %context annotations We need to make sure to calculate the corrent %endcontext annotation, not just the first that is greater than the next nested %context. To operate correctly during recursion we also need information about the parent %endcontext position Fixes #1034 --- source/core/ut_suite_builder.pkb | 56 ++++++++++++++--- test/ut3_tester/core/test_suite_builder.pkb | 68 +++++++++++++++++++++ test/ut3_tester/core/test_suite_builder.pks | 5 ++ 3 files changed, 119 insertions(+), 10 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index c7e968467..f40d2f2a1 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -708,15 +708,49 @@ create or replace package body ut_suite_builder is a_context_ann_pos t_annotation_position, a_package_annotations in out nocopy tt_annotations_by_name ) return t_annotation_position is - l_result t_annotation_position; + l_next_endcontext_pos t_annotation_position; + l_next_context_pos t_annotation_position; + l_open_count integer := 0; begin if a_package_annotations.exists(gc_endcontext) then - l_result := a_package_annotations(gc_endcontext).first; - while l_result <= a_context_ann_pos loop - l_result := a_package_annotations(gc_endcontext).next(l_result); + l_next_endcontext_pos := a_package_annotations(gc_endcontext).first; + while l_next_endcontext_pos <= a_context_ann_pos loop + l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); end loop; + + l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); + loop + -- Get all the %context annotations between start and first %endcontext + while l_next_context_pos is not null and l_next_context_pos < l_next_endcontext_pos loop + l_open_count := l_open_count+1; + l_next_context_pos := a_package_annotations(gc_context).next(l_next_context_pos); + end loop; + -- Skip as many %endcontexts as we had additional contexts open + while l_open_count > 0 loop + l_open_count := l_open_count-1; + l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); + end loop; + -- Repeat until the next %context is later than next %endcontext + exit when l_next_context_pos is null or l_next_context_pos > l_next_endcontext_pos; + end loop; end if; - return l_result; + return l_next_endcontext_pos; + end; + + function has_nested_context( + a_context_ann_pos t_annotation_position, + a_package_annotations in out nocopy tt_annotations_by_name + ) return boolean is + l_next_endcontext_pos t_annotation_position; + begin + if ( a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context)) then + l_next_endcontext_pos := a_package_annotations(gc_endcontext).first; + while l_next_endcontext_pos <= a_context_ann_pos loop + l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); + end loop; + return l_next_endcontext_pos > a_package_annotations(gc_context).next(a_context_ann_pos); + end if; + return false; end; function get_annotations_in_context( @@ -753,7 +787,8 @@ create or replace package body ut_suite_builder is a_parent in out nocopy ut_suite, a_annotations in out nocopy t_annotations_info, a_suite_items out nocopy ut_suite_items, - a_parent_context_pos in integer := 0 + a_parent_context_pos in integer := 0, + a_parent_end_context_pos in integer default null ) is l_context_pos t_annotation_position; l_next_context_pos t_annotation_position; @@ -802,7 +837,6 @@ create or replace package body ut_suite_builder is l_default_context_name := 'nested_context_#'||l_context_no; l_context_name := null; l_end_context_pos := get_endcontext_position(l_context_pos, a_annotations.by_name ); - l_next_context_pos := a_annotations.by_name(gc_context).next(l_context_pos); if a_annotations.by_name.exists(gc_name) then l_context_name := @@ -841,9 +875,8 @@ create or replace package body ut_suite_builder is l_context.parse_time := a_annotations.parse_time; --if nested context found - if l_next_context_pos < l_end_context_pos or l_end_context_pos is null then - get_context_items( l_context, a_annotations, l_context_items, l_context_pos ); - l_end_context_pos := get_endcontext_position(l_context_pos, a_annotations.by_name ); + if has_nested_context(l_context_pos, a_annotations.by_name) then + get_context_items( l_context, a_annotations, l_context_items, l_context_pos, l_end_context_pos ); else l_context_items := ut_suite_items(); end if; @@ -870,6 +903,9 @@ create or replace package body ut_suite_builder is exit when not a_annotations.by_name.exists( gc_context); l_context_pos := a_annotations.by_name( gc_context).next( l_context_pos); + if ( a_parent_end_context_pos is not null and a_parent_end_context_pos <= l_context_pos ) then + l_context_pos := null; + end if; l_context_no := l_context_no + 1; end loop; end; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index a204a04e6..8250eb96e 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -767,6 +767,74 @@ create or replace package body test_suite_builder is ); end; + procedure nested_contexts_2 is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation( 1, 'suite','Cool', null), + ut3.ut_annotation( 2, 'suitepath','path', null), + ut3.ut_annotation( 3, 'context','Level 1', null), + ut3.ut_annotation( 4, 'name','context_1', null), + ut3.ut_annotation( 5, 'context','Level 1.1', null), + ut3.ut_annotation( 6, 'name','context_1_1', null), + ut3.ut_annotation( 7, 'test', 'Test 1.1.1', 'test_1_1_1'), + ut3.ut_annotation( 8, 'test', 'Test 1.1.2', 'test_1_1_2'), + ut3.ut_annotation( 9, 'endcontext', null, null), + ut3.ut_annotation(10, 'endcontext', null, null), + ut3.ut_annotation(11, 'context','Level 2', null), + ut3.ut_annotation(12, 'name','context_2', null), + ut3.ut_annotation(13, 'test', 'Test 2.1', 'test_2_1'), + ut3.ut_annotation(14, 'endcontext',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + ''|| + '' || + '%%' || + '' || + '%context_1Level 1path.some_package.context_1' || + '%' || + '' || + '%context_1_1Level 1.1path.some_package.context_1.context_1_1' || + '%' || + '' || + '%test_1_1_1Test 1.1.1path.some_package.context_1.context_1_1.test_1_1_1' || + '%' || + '' || + '%test_1_1_2Test 1.1.2path.some_package.context_1.context_1_1.test_1_1_2' || + '%' || + '' || + '%' || + '%' || + '' || + '%' || + '%' || + '%'|| + '' + ); + -- Test both contexts separately due to ordering + ut.expect(l_actual).to_be_like( + ''|| + '' || + '%%' || + '' || + '%context_2Level 2path.some_package.context_2' || + '%' || + '' || + '%test_2_1Test 2.1path.some_package.context_2.test_2_1' || + '%' || + '%' || + '%' || + '%' || + '%'|| + '' + ); + end; + procedure before_after_in_context is l_actual clob; diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index 7a85cb946..98a61171e 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -3,6 +3,7 @@ create or replace package test_suite_builder is --%suitepath(utplsql.ut3_tester.core) --%context(--%suite annotation) + --%name(suite) --%test(Sets suite name from package name and leaves description empty) procedure no_suite_description; @@ -105,6 +106,7 @@ create or replace package test_suite_builder is --%endcontext --%context(--%context annotation) + --%name(context) --%test(Creates nested suite for content between context/endcontext annotations) procedure suite_from_context; @@ -112,6 +114,9 @@ create or replace package test_suite_builder is --%test(Creates nested contexts inside a context) procedure nested_contexts; + --%test(Creates multiple nested contexts inside a context) + procedure nested_contexts_2; + --%test(Associates before/after all/each to tests in context only) procedure before_after_in_context; From 8df3f7d5d505f463d8ca5162e1bc608e0d8997b3 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 19 Dec 2019 15:49:06 +0100 Subject: [PATCH 12/51] Refactoring: Extract function, add variables for readability --- source/core/ut_suite_builder.pkb | 36 ++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index f40d2f2a1..a4a1da7ee 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -704,6 +704,22 @@ create or replace package body ut_suite_builder is set_seq_no(a_suite.after_all_list); end; + function get_next_annotation_of_type( + a_start_position t_annotation_position, + a_annotation_type varchar2, + a_package_annotations in out nocopy tt_annotations_by_name + ) return t_annotation_position is + l_result t_annotation_position; + begin + if a_package_annotations.exists(a_annotation_type) then + l_result := a_package_annotations(a_annotation_type).first; + while l_result <= a_start_position loop + l_result := a_package_annotations(a_annotation_type).next(l_result); + end loop; + end if; + return l_result; + end; + function get_endcontext_position( a_context_ann_pos t_annotation_position, a_package_annotations in out nocopy tt_annotations_by_name @@ -712,13 +728,10 @@ create or replace package body ut_suite_builder is l_next_context_pos t_annotation_position; l_open_count integer := 0; begin - if a_package_annotations.exists(gc_endcontext) then - l_next_endcontext_pos := a_package_annotations(gc_endcontext).first; - while l_next_endcontext_pos <= a_context_ann_pos loop - l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); - end loop; + if a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context) then + l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); + l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); - l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); loop -- Get all the %context annotations between start and first %endcontext while l_next_context_pos is not null and l_next_context_pos < l_next_endcontext_pos loop @@ -742,13 +755,14 @@ create or replace package body ut_suite_builder is a_package_annotations in out nocopy tt_annotations_by_name ) return boolean is l_next_endcontext_pos t_annotation_position; + l_next_context_pos t_annotation_position; begin if ( a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context)) then - l_next_endcontext_pos := a_package_annotations(gc_endcontext).first; - while l_next_endcontext_pos <= a_context_ann_pos loop - l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); - end loop; - return l_next_endcontext_pos > a_package_annotations(gc_context).next(a_context_ann_pos); + l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); + l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); + if ( l_next_context_pos < l_next_endcontext_pos ) then + return true; + end if; end if; return false; end; From a4d92dea60e98246ec21db6bbc0dfa9a3fa46971 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 19 Dec 2019 15:51:12 +0100 Subject: [PATCH 13/51] Refactoring: Add clarifying comment --- source/core/ut_suite_builder.pkb | 1 + 1 file changed, 1 insertion(+) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index a4a1da7ee..810da27ab 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -917,6 +917,7 @@ create or replace package body ut_suite_builder is exit when not a_annotations.by_name.exists( gc_context); l_context_pos := a_annotations.by_name( gc_context).next( l_context_pos); + -- don't go on when the next context is outside the parent's context boundaries if ( a_parent_end_context_pos is not null and a_parent_end_context_pos <= l_context_pos ) then l_context_pos := null; end if; From 4d1500f9ac2c89aed17471bddf871ecdaceb200f Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 19 Dec 2019 21:04:21 +0100 Subject: [PATCH 14/51] Refactoring: Move responsibility to get context name completely to get_context_name --- source/core/ut_suite_builder.pkb | 53 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 810da27ab..d013c107e 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -817,26 +817,35 @@ create or replace package body ut_suite_builder is l_default_context_name t_object_name; function get_context_name( a_parent in out nocopy ut_suite, - a_context_names in tt_annotation_texts, - a_start_position binary_integer, - a_end_position binary_integer + a_start_position binary_integer ) return varchar2 is l_result t_annotation_name; l_found boolean; + l_end_position binary_integer; l_annotation_pos binary_integer; + l_context_names tt_annotation_texts; begin - l_annotation_pos := a_context_names.first; - while l_annotation_pos is not null loop - if l_annotation_pos > a_start_position and l_annotation_pos < a_end_position then - if l_found then - add_annotation_ignored_warning(a_parent, gc_name,'Duplicate annotation %%%.', l_annotation_pos); - else - l_result := a_context_names(l_annotation_pos); - end if; - l_found := true; - end if; - l_annotation_pos := a_context_names.next(l_annotation_pos); - end loop; + if a_annotations.by_name.exists(gc_name) then + l_context_names := a_annotations.by_name( gc_name ); + l_end_position := + least( + coalesce( get_endcontext_position(a_start_position, a_annotations.by_name), a_annotations.by_line.last ), + coalesce( a_annotations.by_name(gc_context).next(a_start_position), a_annotations.by_line.last ) + ); + l_annotation_pos := l_context_names.first; + + while l_annotation_pos is not null loop + if l_annotation_pos > a_start_position and l_annotation_pos < l_end_position then + if l_found then + add_annotation_ignored_warning(a_parent, gc_name,'Duplicate annotation %%%.', l_annotation_pos); + else + l_result := l_context_names(l_annotation_pos); + end if; + l_found := true; + end if; + l_annotation_pos := l_context_names.next(l_annotation_pos); + end loop; + end if; return l_result; end; begin @@ -852,18 +861,8 @@ create or replace package body ut_suite_builder is l_context_name := null; l_end_context_pos := get_endcontext_position(l_context_pos, a_annotations.by_name ); l_next_context_pos := a_annotations.by_name(gc_context).next(l_context_pos); - if a_annotations.by_name.exists(gc_name) then - l_context_name := - get_context_name( - a_parent, - a_annotations.by_name( gc_name ), - l_context_pos, - least( - coalesce( l_end_context_pos, a_annotations.by_line.last ), - coalesce( l_next_context_pos, a_annotations.by_line.last ) - ) - ); - end if; + l_context_name := get_context_name(a_parent, l_context_pos); + if not regexp_like( l_context_name, '^(\w|[$#])+$' ) or l_context_name is null then if not regexp_like( l_context_name, '^(\w|[$#])+$' ) then a_parent.put_warning( From 3c547ecd57d96101b81ca21e70003500e80a99b8 Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 08:22:23 +0100 Subject: [PATCH 15/51] Fix intendation --- source/core/ut_suite_builder.pkb | 76 ++++++++++++++++---------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index d013c107e..0c0730c4b 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -15,7 +15,7 @@ create or replace package body ut_suite_builder is See the License for the specific language governing permissions and limitations under the License. */ - + subtype t_annotation_text is varchar2(4000); subtype t_annotation_name is varchar2(4000); subtype t_object_name is varchar2(500); @@ -315,13 +315,13 @@ create or replace package body ut_suite_builder is l_annotation_pos := a_throws_ann_text.next(l_annotation_pos); end loop; end; - + procedure add_tags_to_suite_item( a_suite in out nocopy ut_suite, a_tags_ann_text tt_annotation_texts, a_list in out nocopy ut_varchar2_rows, a_procedure_name t_object_name := null - ) is + ) is l_annotation_pos binary_integer; l_tags_list ut_varchar2_list := ut_varchar2_list(); l_tag_items ut_varchar2_list; @@ -354,7 +354,7 @@ create or replace package body ut_suite_builder is --remove empty strings from table list e.g. tag1,,tag2 and convert to rows a_list := ut_utils.convert_collection( ut_utils.filter_list(set(l_tags_list),ut_utils.gc_word_no_space) ); end; - + procedure set_seq_no( a_list in out nocopy ut_executables ) is @@ -533,16 +533,16 @@ create or replace package body ut_suite_builder is ); set_seq_no(l_test.after_test_list); end if; - + if l_proc_annotations.exists( gc_tags) then add_tags_to_suite_item(a_suite, l_proc_annotations( gc_tags), l_test.tags, a_procedure_name); end if; - + if l_proc_annotations.exists( gc_throws) then add_to_throws_numbers_list(a_suite, l_test.expected_error_codes, a_procedure_name, l_proc_annotations( gc_throws)); end if; l_test.disabled_flag := ut_utils.boolean_to_int( l_proc_annotations.exists( gc_disabled)); - + a_suite_items.extend; a_suite_items( a_suite_items.last ) := l_test; @@ -687,7 +687,7 @@ create or replace package body ut_suite_builder is if a_annotations.by_name.exists(gc_aftereach) then l_after_each_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_aftereach), gc_aftereach ); end if; - + if a_annotations.by_name.exists(gc_tags) then add_tags_to_suite_item(a_suite, a_annotations.by_name(gc_tags),a_suite.tags); end if; @@ -730,22 +730,22 @@ create or replace package body ut_suite_builder is begin if a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context) then l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); - l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); + l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); loop - -- Get all the %context annotations between start and first %endcontext + -- Get all the %context annotations between start and first %endcontext while l_next_context_pos is not null and l_next_context_pos < l_next_endcontext_pos loop - l_open_count := l_open_count+1; - l_next_context_pos := a_package_annotations(gc_context).next(l_next_context_pos); - end loop; - -- Skip as many %endcontexts as we had additional contexts open - while l_open_count > 0 loop - l_open_count := l_open_count-1; - l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); - end loop; - -- Repeat until the next %context is later than next %endcontext - exit when l_next_context_pos is null or l_next_context_pos > l_next_endcontext_pos; - end loop; + l_open_count := l_open_count+1; + l_next_context_pos := a_package_annotations(gc_context).next(l_next_context_pos); + end loop; + -- Skip as many %endcontexts as we had additional contexts open + while l_open_count > 0 loop + l_open_count := l_open_count-1; + l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); + end loop; + -- Repeat until the next %context is later than next %endcontext + exit when l_next_context_pos is null or l_next_context_pos > l_next_endcontext_pos; + end loop; end if; return l_next_endcontext_pos; end; @@ -758,11 +758,11 @@ create or replace package body ut_suite_builder is l_next_context_pos t_annotation_position; begin if ( a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context)) then - l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); - l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); - if ( l_next_context_pos < l_next_endcontext_pos ) then - return true; - end if; + l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); + l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); + if ( l_next_context_pos < l_next_endcontext_pos ) then + return true; + end if; end if; return false; end; @@ -834,17 +834,17 @@ create or replace package body ut_suite_builder is ); l_annotation_pos := l_context_names.first; - while l_annotation_pos is not null loop - if l_annotation_pos > a_start_position and l_annotation_pos < l_end_position then - if l_found then - add_annotation_ignored_warning(a_parent, gc_name,'Duplicate annotation %%%.', l_annotation_pos); - else - l_result := l_context_names(l_annotation_pos); - end if; - l_found := true; - end if; - l_annotation_pos := l_context_names.next(l_annotation_pos); - end loop; + while l_annotation_pos is not null loop + if l_annotation_pos > a_start_position and l_annotation_pos < l_end_position then + if l_found then + add_annotation_ignored_warning(a_parent, gc_name,'Duplicate annotation %%%.', l_annotation_pos); + else + l_result := l_context_names(l_annotation_pos); + end if; + l_found := true; + end if; + l_annotation_pos := l_context_names.next(l_annotation_pos); + end loop; end if; return l_result; end; @@ -918,7 +918,7 @@ create or replace package body ut_suite_builder is l_context_pos := a_annotations.by_name( gc_context).next( l_context_pos); -- don't go on when the next context is outside the parent's context boundaries if ( a_parent_end_context_pos is not null and a_parent_end_context_pos <= l_context_pos ) then - l_context_pos := null; + l_context_pos := null; end if; l_context_no := l_context_no + 1; end loop; From b4c1d7235481048da76c1d8d937e0c5129c67375 Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 08:25:27 +0100 Subject: [PATCH 16/51] Refactoring: Use just one return to improve readability --- source/core/ut_suite_builder.pkb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 0c0730c4b..32c12c7e5 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -754,17 +754,14 @@ create or replace package body ut_suite_builder is a_context_ann_pos t_annotation_position, a_package_annotations in out nocopy tt_annotations_by_name ) return boolean is - l_next_endcontext_pos t_annotation_position; - l_next_context_pos t_annotation_position; + l_next_endcontext_pos t_annotation_position := 0; + l_next_context_pos t_annotation_position := 0; begin if ( a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context)) then l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); - if ( l_next_context_pos < l_next_endcontext_pos ) then - return true; - end if; end if; - return false; + return ( l_next_context_pos < l_next_endcontext_pos ); end; function get_annotations_in_context( From 86185a87599e71f65d27c4bba10848b74fc01937 Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 09:02:34 +0100 Subject: [PATCH 17/51] Rewrite get_endcontext_position to be much easier to understand Using simple parenthesis counter and annotations_by_line --- source/core/ut_suite_builder.pkb | 44 +++++++++++++------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 32c12c7e5..0b00801b8 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -722,32 +722,25 @@ create or replace package body ut_suite_builder is function get_endcontext_position( a_context_ann_pos t_annotation_position, - a_package_annotations in out nocopy tt_annotations_by_name + a_package_annotations in tt_annotations_by_line ) return t_annotation_position is - l_next_endcontext_pos t_annotation_position; - l_next_context_pos t_annotation_position; - l_open_count integer := 0; + l_result t_annotation_position; + l_open_count integer := 1; + l_idx t_annotation_position := a_package_annotations.next(a_context_ann_pos); begin - if a_package_annotations.exists(gc_endcontext) and a_package_annotations.exists(gc_context) then - l_next_endcontext_pos := get_next_annotation_of_type(a_context_ann_pos, gc_endcontext, a_package_annotations); - l_next_context_pos := a_package_annotations(gc_context).next(a_context_ann_pos); - - loop - -- Get all the %context annotations between start and first %endcontext - while l_next_context_pos is not null and l_next_context_pos < l_next_endcontext_pos loop - l_open_count := l_open_count+1; - l_next_context_pos := a_package_annotations(gc_context).next(l_next_context_pos); - end loop; - -- Skip as many %endcontexts as we had additional contexts open - while l_open_count > 0 loop - l_open_count := l_open_count-1; - l_next_endcontext_pos := a_package_annotations(gc_endcontext).next(l_next_endcontext_pos); - end loop; - -- Repeat until the next %context is later than next %endcontext - exit when l_next_context_pos is null or l_next_context_pos > l_next_endcontext_pos; - end loop; + while l_open_count > 0 and l_idx is not null loop + if ( a_package_annotations(l_idx).name = gc_context ) then + l_open_count := l_open_count+1; + elsif ( a_package_annotations(l_idx).name = gc_endcontext ) then + l_open_count := l_open_count-1; + l_result := l_idx; + end if; + l_idx := a_package_annotations.next(l_idx); + end loop; + if ( l_open_count > 0 ) then + l_result := null; end if; - return l_next_endcontext_pos; + return l_result; end; function has_nested_context( @@ -826,7 +819,7 @@ create or replace package body ut_suite_builder is l_context_names := a_annotations.by_name( gc_name ); l_end_position := least( - coalesce( get_endcontext_position(a_start_position, a_annotations.by_name), a_annotations.by_line.last ), + coalesce( get_endcontext_position(a_start_position, a_annotations.by_line), a_annotations.by_line.last ), coalesce( a_annotations.by_name(gc_context).next(a_start_position), a_annotations.by_line.last ) ); l_annotation_pos := l_context_names.first; @@ -856,10 +849,9 @@ create or replace package body ut_suite_builder is while l_context_pos is not null loop l_default_context_name := 'nested_context_#'||l_context_no; l_context_name := null; - l_end_context_pos := get_endcontext_position(l_context_pos, a_annotations.by_name ); + l_end_context_pos := get_endcontext_position(l_context_pos, a_annotations.by_line ); l_next_context_pos := a_annotations.by_name(gc_context).next(l_context_pos); l_context_name := get_context_name(a_parent, l_context_pos); - if not regexp_like( l_context_name, '^(\w|[$#])+$' ) or l_context_name is null then if not regexp_like( l_context_name, '^(\w|[$#])+$' ) then a_parent.put_warning( From 89df1ddbda8f1521c58483672315b0e41d1eb6dc Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 09:09:31 +0100 Subject: [PATCH 18/51] Clarify intention of end-position, make it more visible how it's defined --- source/core/ut_suite_builder.pkb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 0b00801b8..0b4551765 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -817,10 +817,11 @@ create or replace package body ut_suite_builder is begin if a_annotations.by_name.exists(gc_name) then l_context_names := a_annotations.by_name( gc_name ); + -- Maximum end-position to look for %name annotation is either the next %context or the next %endcontext annotation l_end_position := least( - coalesce( get_endcontext_position(a_start_position, a_annotations.by_line), a_annotations.by_line.last ), - coalesce( a_annotations.by_name(gc_context).next(a_start_position), a_annotations.by_line.last ) + coalesce( get_next_annotation_of_type(a_start_position, gc_endcontext, a_annotations.by_name), a_annotations.by_line.last ), + coalesce( get_next_annotation_of_type(a_start_position, gc_context, a_annotations.by_name), a_annotations.by_line.last ) ); l_annotation_pos := l_context_names.first; From c61abfaed5ce0e6d1d95596400486660f49abfc7 Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 09:12:55 +0100 Subject: [PATCH 19/51] Get rid of several `in out nocopy` params where `in` would be sufficient --- source/core/ut_suite_builder.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 0b4551765..a44e73919 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -707,7 +707,7 @@ create or replace package body ut_suite_builder is function get_next_annotation_of_type( a_start_position t_annotation_position, a_annotation_type varchar2, - a_package_annotations in out nocopy tt_annotations_by_name + a_package_annotations in tt_annotations_by_name ) return t_annotation_position is l_result t_annotation_position; begin @@ -745,7 +745,7 @@ create or replace package body ut_suite_builder is function has_nested_context( a_context_ann_pos t_annotation_position, - a_package_annotations in out nocopy tt_annotations_by_name + a_package_annotations in tt_annotations_by_name ) return boolean is l_next_endcontext_pos t_annotation_position := 0; l_next_context_pos t_annotation_position := 0; From 35acf1438280a5714c26929b4ea17c6132c81e0d Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 09:15:33 +0100 Subject: [PATCH 20/51] Not necessary to check for IS NOT NULL --- source/core/ut_suite_builder.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index a44e73919..5f468f756 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -907,7 +907,7 @@ create or replace package body ut_suite_builder is l_context_pos := a_annotations.by_name( gc_context).next( l_context_pos); -- don't go on when the next context is outside the parent's context boundaries - if ( a_parent_end_context_pos is not null and a_parent_end_context_pos <= l_context_pos ) then + if (a_parent_end_context_pos <= l_context_pos ) then l_context_pos := null; end if; l_context_no := l_context_no + 1; From 3327fc371f8a5f3b5be9baea1745fce2dbd8b08d Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 20 Dec 2019 09:55:20 +0100 Subject: [PATCH 21/51] Fix intendation --- test/ut3_tester/core/test_suite_builder.pkb | 2 +- test/ut3_tester/core/test_suite_builder.pks | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 8250eb96e..86d86032a 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -767,7 +767,7 @@ create or replace package body test_suite_builder is ); end; - procedure nested_contexts_2 is + procedure nested_contexts_2 is l_actual clob; l_annotations ut3.ut_annotations; begin diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index 98a61171e..7c7fc77f6 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -106,7 +106,7 @@ create or replace package test_suite_builder is --%endcontext --%context(--%context annotation) - --%name(context) + --%name(context) --%test(Creates nested suite for content between context/endcontext annotations) procedure suite_from_context; From cef109b90206705f16a897688056f7185cfc0c03 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Fri, 20 Dec 2019 20:28:20 +0000 Subject: [PATCH 22/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 2ba4aff9a..f607f7562 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 33c552f78..adfd52a46 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 52c21c740..971e9462e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e851d6ae5..82c0ce2af 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index f17d3848c..23f63009b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4f39ca713..16ec10576 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index db061005f..a62afed04 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index ea7b3e50f..b5f8a37cd 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 95c1dadcf..c12ec9e73 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 4f3375f85..e5f816f15 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index c1995e1bc..24e0f8f9d 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 30fe6fcda..14a440173 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index ba3f6735a..39baf4a18 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 35455a6cd..66e69d48b 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 21f36e1a4..bfe4523a9 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 22cf5cb5e..4b6e83db4 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 13135431c..53d30e474 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3290--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 0553f0343..33ab46b38 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3290-develop + * secion v3.1.10.3297-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 79bcc5107..9da213a3b 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3290-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3297-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ad0f99d9fd2cc34383eabd284e7d8006d4aec286 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 22 Dec 2019 15:27:47 +0000 Subject: [PATCH 23/51] Fixed repo for publishing github docs. --- .travis/push_docs_to_github_io.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/push_docs_to_github_io.sh b/.travis/push_docs_to_github_io.sh index add63aa1b..e29f1c88c 100644 --- a/.travis/push_docs_to_github_io.sh +++ b/.travis/push_docs_to_github_io.sh @@ -14,7 +14,7 @@ # Required ENV Variables LATEST_DOCS_BRANCH="develop" -GITHUB_IO_REPO='jgebal/jgebal.github.io' +GITHUB_IO_REPO='utPLSQL/utPLSQL.github.io' GITHUB_IO_BRANCH='master' # TRAVIS_* variables are set by travis directly and only need to be if testing externally From 33f5152e99e4cbcc6150d3a86e606f3156db6029 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 22 Dec 2019 15:37:53 +0000 Subject: [PATCH 24/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index f607f7562..205fbef66 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index adfd52a46..923dd5b7d 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 971e9462e..260e05ede 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 82c0ce2af..6ff3b41be 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 23f63009b..fc2718b3f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 16ec10576..184866b7b 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index a62afed04..12ccc8a30 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b5f8a37cd..0f0682924 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c12ec9e73..4853bfca1 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e5f816f15..ba4313743 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 24e0f8f9d..612b59444 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 14a440173..31988dcfe 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 39baf4a18..6de351376 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 66e69d48b..346de3cb9 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index bfe4523a9..7a8f10af6 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 4b6e83db4..7babf9366 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 53d30e474..cd6e8b065 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3297--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 33ab46b38..096761d0a 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3297-develop + * secion v3.1.10.3298-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 9da213a3b..671312a9f 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3297-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3298-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 8e43a089a67e26d951a929b5f285065938b10c3c Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Dec 2019 15:53:09 +0000 Subject: [PATCH 25/51] Moved validation of `--%throws` annotation values. Now the validation is executed at runtime, when the tests is executed. This resolves issues related to the fact that some package constants may not exist or be valid at suite parse time. In such scenario, the annotations continued to be ignored despite the fact that package constants were valid at test runtime. With this change, tests can now have `--throws` annotations referencing constants that are undefined at compile time. Resolves #1033 --- source/core/types/ut_executable_test.tpb | 114 ++++- source/core/types/ut_executable_test.tps | 4 +- source/core/types/ut_suite_cache_row.tps | 2 +- source/core/types/ut_suite_item.tpb | 10 + source/core/types/ut_suite_item.tps | 3 +- source/core/types/ut_test.tpb | 2 +- source/core/types/ut_test.tps | 4 +- source/core/ut_suite_builder.pkb | 178 +------- source/core/ut_suite_cache_manager.pkb | 2 +- .../test_annot_throws_exception.pkb | 430 ++++++++++-------- .../test_annot_throws_exception.pks | 8 +- test/ut3_tester/core/test_suite_builder.pkb | 18 - test/ut3_tester/core/test_suite_builder.pks | 3 - 13 files changed, 390 insertions(+), 388 deletions(-) diff --git a/source/core/types/ut_executable_test.tpb b/source/core/types/ut_executable_test.tpb index a11797a54..89ab16dab 100644 --- a/source/core/types/ut_executable_test.tpb +++ b/source/core/types/ut_executable_test.tpb @@ -31,7 +31,7 @@ create or replace type body ut_executable_test as member procedure do_execute( self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, - a_expected_error_codes in ut_integer_list + a_expected_error_codes in ut_varchar2_rows ) is l_completed_without_errors boolean; begin @@ -40,10 +40,114 @@ create or replace type body ut_executable_test as member function do_execute( self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, - a_expected_error_codes in ut_integer_list + a_expected_error_codes in ut_varchar2_rows ) return boolean is l_expected_except_message varchar2(4000); + l_expected_error_numbers ut_integer_list; + function build_exception_numbers_list( + a_item in out nocopy ut_suite_item, + a_expected_error_codes in ut_varchar2_rows + ) return ut_integer_list is + l_exception_number integer; + l_exception_number_list ut_integer_list := ut_integer_list(); + c_regexp_for_exception_no constant varchar2(30) := '^-?[[:digit:]]{1,5}$'; + + c_integer_exception constant varchar2(1) := 'I'; + c_named_exception constant varchar2(1) := 'N'; + + function is_valid_qualified_name (a_name varchar2) return boolean is + l_name varchar2(500); + begin + l_name := dbms_assert.qualified_sql_name(a_name); + return true; + exception when others then + return false; + end; + + function check_exception_type(a_exception_name in varchar2) return varchar2 is + l_exception_type varchar2(50); + begin + --check if it is a predefined exception + begin + execute immediate 'begin null; exception when '||a_exception_name||' then null; end;'; + l_exception_type := c_named_exception; + exception + when others then + if dbms_utility.format_error_stack() like '%PLS-00485%' then + declare + e_invalid_number exception; + pragma exception_init ( e_invalid_number, -6502 ); + begin + execute immediate 'declare x integer := '||a_exception_name||'; begin null; end;'; + l_exception_type := c_integer_exception; + exception + when others then + null; + end; + end if; + end; + return l_exception_type; + end; + + function get_exception_number (a_exception_var in varchar2) return integer is + l_exc_no integer; + l_exc_type varchar2(50); + function remap_no_data_found (a_number integer) return integer is + begin + return case a_number when 100 then -1403 else a_number end; + end; + begin + l_exc_type := check_exception_type(a_exception_var); + + execute immediate + case l_exc_type + when c_integer_exception then + 'declare l_exception number; begin :l_exception := '||a_exception_var||'; end;' + when c_named_exception then + 'begin raise '||a_exception_var||'; exception when others then :l_exception := sqlcode; end;' + else + 'begin :l_exception := null; end;' + end + using out l_exc_no; + + return remap_no_data_found(l_exc_no); + end; + + begin + if a_expected_error_codes is not empty then + for i in 1 .. a_expected_error_codes.count loop + /** + * Check if its a valid qualified name and if so try to resolve name to an exception number + */ + if is_valid_qualified_name(a_expected_error_codes(i)) then + l_exception_number := get_exception_number(a_expected_error_codes(i)); + elsif regexp_like(a_expected_error_codes(i), c_regexp_for_exception_no) then + l_exception_number := a_expected_error_codes(i); + end if; + + if l_exception_number is null then + a_item.put_warning( + 'Invalid parameter value "'||a_expected_error_codes(i)||'" for "--%throws" annotation. Parameter ignored.', + self.procedure_name, + a_item.line_no + ); + elsif l_exception_number >= 0 then + a_item.put_warning( + 'Invalid parameter value "'||a_expected_error_codes(i)||'" for "--%throws" annotation. Exception value must be a negative integer. Parameter ignored.', + self.procedure_name, + a_item.line_no + ); + else + l_exception_number_list.extend; + l_exception_number_list(l_exception_number_list.last) := l_exception_number; + end if; + l_exception_number := null; + end loop; + end if; + + return l_exception_number_list; + end; function failed_expec_errnum_message(a_expected_error_codes in ut_integer_list) return varchar is l_actual_error_no integer; l_expected_error_codes varchar2(4000); @@ -72,9 +176,9 @@ create or replace type body ut_executable_test as begin --Create a ut_executable object and call do_execute after that get the data to know the test's execution result self.do_execute(a_item); - - if a_expected_error_codes is not null and a_expected_error_codes is not empty then - l_expected_except_message := failed_expec_errnum_message(a_expected_error_codes); + l_expected_error_numbers := build_exception_numbers_list(a_item, a_expected_error_codes); + if l_expected_error_numbers is not null and l_expected_error_numbers is not empty then + l_expected_except_message := failed_expec_errnum_message( l_expected_error_numbers ); if l_expected_except_message is not null then ut_expectation_processor.add_expectation_result( diff --git a/source/core/types/ut_executable_test.tps b/source/core/types/ut_executable_test.tps index 2772720de..88500c9be 100644 --- a/source/core/types/ut_executable_test.tps +++ b/source/core/types/ut_executable_test.tps @@ -22,12 +22,12 @@ create or replace type ut_executable_test authid current_user under ut_executabl member procedure do_execute( self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, - a_expected_error_codes in ut_integer_list + a_expected_error_codes in ut_varchar2_rows ), member function do_execute( self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, - a_expected_error_codes in ut_integer_list + a_expected_error_codes in ut_varchar2_rows ) return boolean ) final; diff --git a/source/core/types/ut_suite_cache_row.tps b/source/core/types/ut_suite_cache_row.tps index 6817be5ec..fb4a8bb9f 100644 --- a/source/core/types/ut_suite_cache_row.tps +++ b/source/core/types/ut_suite_cache_row.tps @@ -33,7 +33,7 @@ create type ut_suite_cache_row as object ( before_test_list ut_executables, after_each_list ut_executables, after_test_list ut_executables, - expected_error_codes ut_integer_list, + expected_error_codes ut_varchar2_rows, tags ut_varchar2_rows, item ut_executable_test ) diff --git a/source/core/types/ut_suite_item.tpb b/source/core/types/ut_suite_item.tpb index 6478d5c82..9b939727a 100644 --- a/source/core/types/ut_suite_item.tpb +++ b/source/core/types/ut_suite_item.tpb @@ -97,6 +97,16 @@ create or replace type body ut_suite_item as self.results_count.increase_warning_count; end; + member procedure put_warning(self in out nocopy ut_suite_item, a_message varchar2, a_procedure_name varchar2, a_line_no integer) is + l_result varchar2(1000); + begin + l_result := self.object_owner || '.' || self.object_name ; + if a_procedure_name is not null then + l_result := l_result || '.' || a_procedure_name ; + end if; + put_warning( a_message || chr( 10 ) || 'at package "' || upper(l_result) || '", line ' || a_line_no ); + end; + member function get_transaction_invalidators return ut_varchar2_list is begin return transaction_invalidators; diff --git a/source/core/types/ut_suite_item.tps b/source/core/types/ut_suite_item.tps index 53c59a2ea..87f577459 100644 --- a/source/core/types/ut_suite_item.tps +++ b/source/core/types/ut_suite_item.tps @@ -84,7 +84,8 @@ create or replace type ut_suite_item force under ut_event_item ( not instantiable member procedure mark_as_errored(self in out nocopy ut_suite_item, a_error_stack_trace varchar2), not instantiable member function get_error_stack_traces return ut_varchar2_list, not instantiable member function get_serveroutputs return clob, - member procedure put_warning(self in out nocopy ut_suite_item, a_message varchar2) + member procedure put_warning(self in out nocopy ut_suite_item, a_message varchar2), + member procedure put_warning(self in out nocopy ut_suite_item, a_message varchar2, a_procedure_name varchar2, a_line_no integer) ) not final not instantiable / diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index 9fbcf9269..4ed3f665e 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -18,7 +18,7 @@ create or replace type body ut_test as constructor function ut_test( self in out nocopy ut_test, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, - a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags ut_varchar2_rows := null + a_line_no integer, a_expected_error_codes ut_varchar2_rows := null, a_tags ut_varchar2_rows := null ) return self as result is begin self.self_type := $$plsql_unit; diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index fcf565671..85caf7380 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -54,10 +54,10 @@ create or replace type ut_test force under ut_suite_item ( /** *Holds the expected error codes list when the user use the annotation throws */ - expected_error_codes ut_integer_list, + expected_error_codes ut_varchar2_rows, constructor function ut_test( self in out nocopy ut_test, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, - a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags ut_varchar2_rows := null + a_line_no integer, a_expected_error_codes ut_varchar2_rows := null, a_tags ut_varchar2_rows := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_test), overriding member function do_execute(self in out nocopy ut_test) return boolean, diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 5f468f756..d13cbaed9 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -62,9 +62,6 @@ create or replace package body ut_suite_builder is gc_endcontext ); - gc_integer_exception constant varchar2(1) := 'I'; - gc_named_exception constant varchar2(1) := 'N'; - type tt_executables is table of ut_executables index by t_annotation_position; type t_annotation is record( @@ -97,27 +94,6 @@ create or replace package body ut_suite_builder is by_name tt_annotations_by_name ); - function get_qualified_object_name( - a_suite ut_suite_item, a_procedure_name t_object_name - ) return varchar2 is - l_result varchar2(1000); - begin - if a_suite is not null then - l_result := upper( a_suite.object_owner || '.' || a_suite.object_name ); - if a_procedure_name is not null then - l_result := l_result || upper( '.' || a_procedure_name ); - end if; - end if; - return l_result; - end; - - function get_object_reference( - a_suite ut_suite_item, a_procedure_name t_object_name, a_line_no binary_integer - ) return varchar2 is - begin - return chr( 10 ) || 'at package "' || get_qualified_object_name(a_suite, a_procedure_name) || '", line ' || a_line_no; - end; - procedure delete_annotations_range( a_annotations in out nocopy t_annotations_info, a_start_pos t_annotation_position, @@ -163,8 +139,9 @@ create or replace package body ut_suite_builder is ) is begin a_suite.put_warning( - replace(a_message,'%%%','"--%'||a_annotation||'"') - || ' Annotation ignored.' || get_object_reference( a_suite, a_procedure_name, a_line_no ) + replace(a_message,'%%%','"--%'||a_annotation||'"')|| ' Annotation ignored.', + a_procedure_name, + a_line_no ); end; @@ -181,136 +158,26 @@ create or replace package body ut_suite_builder is procedure add_to_throws_numbers_list( a_suite in out nocopy ut_suite, - a_list in out nocopy ut_integer_list, + a_list in out nocopy ut_varchar2_rows, a_procedure_name t_object_name, a_throws_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; - function is_valid_qualified_name (a_name varchar2) return boolean is - l_name varchar2(500); - begin - l_name := dbms_assert.qualified_sql_name(a_name); - return true; - exception when others then - return false; - end; - - function check_exception_type(a_exception_name in varchar2) return varchar2 is - l_exception_type varchar2(50); - begin - --check if it is a predefined exception - begin - execute immediate 'begin null; exception when '||a_exception_name||' then null; end;'; - l_exception_type := gc_named_exception; - exception - when others then - if dbms_utility.format_error_stack() like '%PLS-00485%' then - begin - execute immediate 'declare x positiven := -('||a_exception_name||'); begin null; end;'; - l_exception_type := gc_integer_exception; - exception - when others then - --invalid exception number (positive) - --TODO add warning for this value - null; - end; - end if; - end; - return l_exception_type; - end; - - function get_exception_number (a_exception_var in varchar2) return integer is - l_exc_no integer; - l_exc_type varchar2(50); - function remap_no_data_found (a_number integer) return integer is - begin - return case a_number when 100 then -1403 else a_number end; - end; - begin - l_exc_type := check_exception_type(a_exception_var); - - if l_exc_type is not null then - - execute immediate - case l_exc_type - when gc_integer_exception then - 'declare - l_exception number; - begin - :l_exception := '||a_exception_var||'; ' - when gc_named_exception then - 'begin - raise '||a_exception_var||'; - exception - when others then - :l_exception := sqlcode; ' - end || - 'end;' - using out l_exc_no; - - end if; - return remap_no_data_found(l_exc_no); - end; - - function build_exception_numbers_list( - a_suite in out nocopy ut_suite, - a_procedure_name t_object_name, - a_line_no integer, - a_annotation_text in varchar2 - ) return ut_integer_list is - l_throws_list ut_varchar2_list; - l_exception_number integer; - l_exception_number_list ut_integer_list := ut_integer_list(); - c_regexp_for_exception_no constant varchar2(30) := '^-?[[:digit:]]{1,5}$'; - begin - --the a_expected_error_codes is converted to a ut_varchar2_list after that is trimmed and filtered to left only valid exception numbers - l_throws_list := ut_utils.trim_list_elements(ut_utils.string_to_table(a_annotation_text, ',', 'Y')); - - for i in 1 .. l_throws_list.count - loop - /** - * Check if its a valid qualified name and if so try to resolve name to an exception number - */ - if is_valid_qualified_name(l_throws_list(i)) then - l_exception_number := get_exception_number(l_throws_list(i)); - elsif regexp_like(l_throws_list(i), c_regexp_for_exception_no) then - l_exception_number := l_throws_list(i); - end if; - - if l_exception_number is null then - a_suite.put_warning( - 'Invalid parameter value "'||l_throws_list(i) - ||'" for "--%throws" annotation. Parameter ignored.'||get_object_reference( a_suite, a_procedure_name, a_line_no ) - ); - else - l_exception_number_list.extend; - l_exception_number_list(l_exception_number_list.last) := l_exception_number; - end if; - l_exception_number := null; - end loop; - - return l_exception_number_list; - end; - begin - a_list := ut_integer_list(); l_annotation_pos := a_throws_ann_text.first; while l_annotation_pos is not null loop if a_throws_ann_text(l_annotation_pos) is null then a_suite.put_warning( - '"--%throws" annotation requires a parameter. Annotation ignored.' - || get_object_reference( a_suite, a_procedure_name, l_annotation_pos ) + '"--%throws" annotation requires a parameter. Annotation ignored.', + a_procedure_name, + l_annotation_pos ); else - a_list := - a_list multiset union - build_exception_numbers_list( - a_suite, - a_procedure_name, - l_annotation_pos, - a_throws_ann_text(l_annotation_pos) - ); + ut_utils.append_to_list( + a_list, + ut_utils.convert_collection( ut_utils.trim_list_elements ( ut_utils.string_to_table( a_throws_ann_text(l_annotation_pos), ',' ) ) ) + ); end if; l_annotation_pos := a_throws_ann_text.next(l_annotation_pos); end loop; @@ -330,8 +197,9 @@ create or replace package body ut_suite_builder is while l_annotation_pos is not null loop if a_tags_ann_text(l_annotation_pos) is null then a_suite.put_warning( - '"--%tags" annotation requires a tag value populated. Annotation ignored.' - || get_object_reference( a_suite, a_procedure_name, l_annotation_pos ) + '"--%tags" annotation requires a tag value populated. Annotation ignored.', + a_procedure_name, + l_annotation_pos ); else l_tag_items := ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos),',')); @@ -342,8 +210,9 @@ create or replace package body ut_suite_builder is l_tags_list(l_tags_list.last) := l_tag_items(i); else a_suite.put_warning( - 'Invalid value "'||l_tag_items(i)||'" for "--%tags" annotation. See documentation for details on valid tag values. Annotation value ignored.' - || get_object_reference( a_suite, a_procedure_name, l_annotation_pos ) + 'Invalid value "'||l_tag_items(i)||'" for "--%tags" annotation. See documentation for details on valid tag values. Annotation value ignored.', + a_procedure_name, + l_annotation_pos ); end if; end loop; @@ -857,9 +726,10 @@ create or replace package body ut_suite_builder is if not regexp_like( l_context_name, '^(\w|[$#])+$' ) then a_parent.put_warning( 'Invalid value "'||l_context_name||'" for context name.' || - ' Context name ignored and fallback to auto-name "'||l_default_context_name||'" ' || - get_object_reference( a_parent, null, l_context_pos ) - ); + ' Context name ignored and fallback to auto-name "'||l_default_context_name||'" ', + null, + l_context_pos + ); end if; l_context_name := l_default_context_name; end if; @@ -886,8 +756,10 @@ create or replace package body ut_suite_builder is if l_end_context_pos is null then a_parent.put_warning( - 'Missing "--%endcontext" annotation for a "--%context" annotation. The end of package is considered end of context.'|| get_object_reference( a_parent, null, l_context_pos ) - ); + 'Missing "--%endcontext" annotation for a "--%context" annotation. The end of package is considered end of context.', + null, + l_context_pos + ); l_end_context_pos := a_annotations.by_line.last; end if; diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index f52d15bf7..509b28498 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -57,7 +57,7 @@ create or replace package body ut_suite_cache_manager is select 'UT_LOGICAL_SUITE' as self_type, p.path, p.object_owner, upper( substr(p.path, instr( p.path, '.', -1 ) + 1 ) ) as object_name, cast(null as ut_executables) as x, - cast(null as ut_integer_list) as y, + cast(null as ut_varchar2_rows) as y, cast(null as ut_executable_test) as z from suitepath_part p where p.path diff --git a/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb b/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb index 1ad4f19a5..04e65a6c2 100644 --- a/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb +++ b/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb @@ -20,212 +20,230 @@ is c_e_diff_exc constant number := -20204; c_e_mix_list constant number := -20205; c_e_mix_missin constant number := -20206; - + c_e_positive constant number := 20207; + e_some_exception exception; pragma exception_init(e_some_exception, -20207); end;]'; l_package_spec := ' - create package annotated_package_with_throws is - --%suite(Dummy package to test annotation throws) - - --%test(Throws same annotated exception) - --%throws(-20145) - procedure raised_same_exception; - - --%test(Throws one of the listed exceptions) - --%throws(-20145,-20146, -20189 ,-20563) - procedure raised_one_listed_exception; - - --%test(Leading zero is ignored in exception list) - --%throws(-01476) - procedure leading_0_exception_no; - - --%test(Throws diff exception) - --%throws(-20144) - procedure raised_diff_exception; - - --%test(Throws empty) - --%throws() - procedure empty_throws; - - --%test(Ignores annotation and fails when exception was thrown) - --%throws(hello,784#,0-=234,,u1234) - procedure bad_paramters_with_except; - - --%test(Ignores annotation and succeeds when no exception thrown) - --%throws(hello,784#,0-=234,,u1234) - procedure bad_paramters_without_except; - - --%test(Detects a valid exception number within many invalid ones) - --%throws(7894562, operaqk, -=1, -1, pow74d, posdfk3) - procedure one_valid_exception_number; - - --%test(Gives failure when a exception is expected and nothing is thrown) - --%throws(-20459, -20136, -20145) - procedure nothing_thrown; - - --%test(Single exception defined as a constant number in package) - --%throws(exc_pkg.c_e_single_exc) - procedure single_exc_const_pkg; - - --%test(Gives success when one of annotated exception using constant is thrown) - --%throws(exc_pkg.c_e_list_1,exc_pkg.c_e_list_2) - procedure list_of_exc_constant; - - --%test(Gives failure when the raised exception is different that the annotated one using variable) - --%throws(exc_pkg.c_e_diff_exc) - procedure fail_not_match_exc; - - --%test(Success when one of exception from mixed list of number and constant is thrown) - --%throws(exc_pkg.c_e_mix_list,-20105) - procedure mixed_exc_list; - - --%test(Success when match exception even if other variable on list dont exists) - --%throws(exc_pkg.c_e_mix_missin,utter_rubbish) - procedure mixed_list_notexi; - - --%test(Success resolve and match named exception defined in pragma exception init) - --%throws(exc_pkg.e_some_exception) - procedure named_exc_pragma; - - --%test(Success resolve and match oracle named exception) - --%throws(NO_DATA_FOUND) - procedure named_exc_ora; - - --%test(Success resolve and match oracle named exception dup val index) - --%throws(DUP_VAL_ON_INDEX) - procedure named_exc_ora_dup_ind; - - --%test(Success map no data 100 to -1403) - --%throws(-1403) - procedure nodata_exc_ora; - - --%test(Success for exception defined as varchar) - --%throws(exc_pkg.c_e_varch_exc) - procedure defined_varchar_exc; - - --%test(Non existing constant exception) - --%throws(dummy.c_dummy); - procedure non_existing_const; - - --%test(Bad exception constant) - --%throws(exc_pkg.c_e_dummy); - procedure bad_exc_const; - - end; + create package annotated_package_with_throws is + --%suite(Dummy package to test annotation throws) + + --%test(Throws same annotated exception) + --%throws(-20145) + procedure raised_same_exception; + + --%test(Throws one of the listed exceptions) + --%throws(-20145,-20146, -20189 ,-20563) + procedure raised_one_listed_exception; + + --%test(Leading zero is ignored in exception list) + --%throws(-01476) + procedure leading_0_exception_no; + + --%test(Throws diff exception) + --%throws(-20144) + procedure raised_diff_exception; + + --%test(Throws empty) + --%throws() + procedure empty_throws; + + --%test(Ignores annotation and fails when exception was thrown) + --%throws(hello,784#,0-=234,,u1234) + procedure bad_paramters_with_except; + + --%test(Ignores annotation and succeeds when no exception thrown) + --%throws(hello,784#,0-=234,,u1234) + procedure bad_paramters_without_except; + + --%test(Ignores annotation for positive exception number value) + --%throws(20001) + procedure positive_exception_number; + + --%test(Ignores annotation for positive exception number variable) + --%throws(exc_pkg.c_e_positive) + procedure positive_exception_number_var; + + --%test(Detects a valid exception number within many invalid ones) + --%throws(7894562, operaqk, -=1, -1, pow74d, posdfk3) + procedure one_valid_exception_number; + + --%test(Gives failure when a exception is expected and nothing is thrown) + --%throws(-20459, -20136, -20145) + procedure nothing_thrown; + + --%test(Single exception defined as a constant number in package) + --%throws(exc_pkg.c_e_single_exc) + procedure single_exc_const_pkg; + + --%test(Gives success when one of annotated exception using constant is thrown) + --%throws(exc_pkg.c_e_list_1,exc_pkg.c_e_list_2) + procedure list_of_exc_constant; + + --%test(Gives failure when the raised exception is different that the annotated one using variable) + --%throws(exc_pkg.c_e_diff_exc) + procedure fail_not_match_exc; + + --%test(Success when one of exception from mixed list of number and constant is thrown) + --%throws(exc_pkg.c_e_mix_list,-20105) + procedure mixed_exc_list; + + --%test(Success when match exception even if other variable on list dont exists) + --%throws(exc_pkg.c_e_mix_missin,utter_rubbish) + procedure mixed_list_notexi; + + --%test(Success resolve and match named exception defined in pragma exception init) + --%throws(exc_pkg.e_some_exception) + procedure named_exc_pragma; + + --%test(Success resolve and match oracle named exception) + --%throws(NO_DATA_FOUND) + procedure named_exc_ora; + + --%test(Success resolve and match oracle named exception dup val index) + --%throws(DUP_VAL_ON_INDEX) + procedure named_exc_ora_dup_ind; + + --%test(Success map no data 100 to -1403) + --%throws(-1403) + procedure nodata_exc_ora; + + --%test(Success for exception defined as varchar) + --%throws(exc_pkg.c_e_varch_exc) + procedure defined_varchar_exc; + + --%test(Non existing constant exception) + --%throws(dummy.c_dummy); + procedure non_existing_const; + + --%test(Bad exception constant) + --%throws(exc_pkg.c_e_dummy); + procedure bad_exc_const; + end; '; l_package_body := ' - create package body annotated_package_with_throws is - procedure raised_same_exception is - begin - raise_application_error(-20145, ''Test error''); - end; - - procedure raised_one_listed_exception is - begin - raise_application_error(-20189, ''Test error''); - end; - - procedure leading_0_exception_no is - x integer; - begin - x := 1 / 0; - end; - - procedure raised_diff_exception is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure empty_throws is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure bad_paramters_with_except is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure bad_paramters_without_except is - begin - null; - end; - - procedure one_valid_exception_number is - begin - raise dup_val_on_index; - end; - - procedure nothing_thrown is - begin - null; - end; - - procedure single_exc_const_pkg is - begin - raise_application_error(exc_pkg.c_e_single_exc,''Test''); - end; - - procedure list_of_exc_constant is - begin - raise_application_error(exc_pkg.c_e_list_1,''Test''); - end; - - procedure fail_not_match_exc is - begin - raise NO_DATA_FOUND; - end; - - procedure mixed_exc_list is - begin - raise_application_error(exc_pkg.c_e_mix_list,''Test''); - end; - - procedure mixed_list_notexi is - begin - raise_application_error(exc_pkg.c_e_mix_missin,''Test''); - end; - - procedure named_exc_pragma is - begin - raise exc_pkg.e_some_exception; - end; - - procedure named_exc_ora is - begin - raise NO_DATA_FOUND; - end; - - procedure named_exc_ora_dup_ind is - begin - raise DUP_VAL_ON_INDEX; - end; - - procedure nodata_exc_ora is - begin - raise NO_DATA_FOUND; - end; - - procedure defined_varchar_exc is - begin - raise_application_error(exc_pkg.c_e_varch_exc,''Test''); - end; - - procedure non_existing_const is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure bad_exc_const is - begin - raise_application_error(-20143, ''Test error''); - end; - + create package body annotated_package_with_throws is + procedure raised_same_exception is + begin + raise_application_error(-20145, ''Test error''); + end; + + procedure raised_one_listed_exception is + begin + raise_application_error(-20189, ''Test error''); + end; + + procedure leading_0_exception_no is + x integer; + begin + x := 1 / 0; + end; + + procedure raised_diff_exception is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure empty_throws is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure bad_paramters_with_except is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure bad_paramters_without_except is + begin + null; + end; + + procedure positive_exception_number is + begin + null; + end; + + procedure positive_exception_number_var is + begin + null; + end; + + procedure one_valid_exception_number is + begin + raise dup_val_on_index; + end; + + procedure nothing_thrown is + begin + null; + end; + + procedure single_exc_const_pkg is + begin + raise_application_error(exc_pkg.c_e_single_exc,''Test''); + end; + + procedure list_of_exc_constant is + begin + raise_application_error(exc_pkg.c_e_list_1,''Test''); + end; + + procedure fail_not_match_exc is + begin + raise NO_DATA_FOUND; + end; + + procedure mixed_exc_list is + begin + raise_application_error(exc_pkg.c_e_mix_list,''Test''); + end; + + procedure mixed_list_notexi is + begin + raise_application_error(exc_pkg.c_e_mix_missin,''Test''); + end; + + procedure named_exc_pragma is + begin + raise exc_pkg.e_some_exception; + end; + + procedure named_exc_ora is + begin + raise NO_DATA_FOUND; + end; + + procedure named_exc_ora_dup_ind is + begin + raise DUP_VAL_ON_INDEX; + end; + + procedure nodata_exc_ora is + begin + raise NO_DATA_FOUND; + end; + + procedure defined_varchar_exc is + begin + raise_application_error(exc_pkg.c_e_varch_exc,''Test''); + end; + + procedure non_existing_const is + begin + raise_application_error(-20143, ''Test error''); end; + + procedure bad_exc_const is + begin + raise_application_error(-20143, ''Test error''); + end; + + end; '; execute immediate l_exception_spec; @@ -277,13 +295,25 @@ is procedure bad_paramters_without_except is begin ut.expect(g_tests_results).to_match('^\s*Ignores annotation and succeeds when no exception thrown \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('bad_paramters_without_except'); + ut.expect(g_tests_results).to_match('bad_paramters_without_except\s*Invalid parameter value ".*" for "--%throws" annotation. Parameter ignored.','m'); + end; + + procedure positive_exception_number is + begin + ut.expect(g_tests_results).to_match('^\s*Ignores annotation for positive exception number value \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).to_match('positive_exception_number\s*Invalid parameter value "20001" for "--%throws" annotation. Exception value must be a negative integer. Parameter ignored.','m'); + end; + + procedure positive_exception_number_var is + begin + ut.expect(g_tests_results).to_match('^\s*Ignores annotation for positive exception number variable \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).to_match('positive_exception_number_var\s*Invalid parameter value ".*" for "--%throws" annotation. Exception value must be a negative integer. Parameter ignored.','m'); end; procedure one_valid_exception_number is begin ut.expect(g_tests_results).to_match('^\s*Detects a valid exception number within many invalid ones \[[\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('one_valid_exception_number'); + ut.expect(g_tests_results).to_match('one_valid_exception_number\s*Invalid parameter value ".*" for "--%throws" annotation. Parameter ignored.','m'); end; procedure nothing_thrown is @@ -319,13 +349,13 @@ is procedure mixed_list_notexi is begin ut.expect(g_tests_results).to_match('^\s*Success when match exception even if other variable on list dont exists \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('mixed_list_notexi'); + ut.expect(g_tests_results).to_match('mixed_list_notexi\s*Invalid parameter value "utter_rubbish" for "--%throws" annotation. Parameter ignored.','m'); end; procedure named_exc_pragma is begin ut.expect(g_tests_results).to_match('^\s*Success resolve and match named exception defined in pragma exception init \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('mixed_list_notexi'); + ut.expect(g_tests_results).not_to_match('named_exc_pragma'); end; procedure named_exc_ora is diff --git a/test/ut3_tester/core/annotations/test_annot_throws_exception.pks b/test/ut3_tester/core/annotations/test_annot_throws_exception.pks index ce2e6ba7a..a9d20183d 100644 --- a/test/ut3_tester/core/annotations/test_annot_throws_exception.pks +++ b/test/ut3_tester/core/annotations/test_annot_throws_exception.pks @@ -26,7 +26,13 @@ is --%test(Ignores when only bad parameters are passed, the test does not raise a exception and it shows successful test) procedure bad_paramters_without_except; - + + --%test(Ignores annotation for positive exception number value) + procedure positive_exception_number; + + --%test(Ignores annotation for positive exception number variable) + procedure positive_exception_number_var; + --%test(Detects a valid exception number within many invalid ones) procedure one_valid_exception_number; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 86d86032a..00d914413 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -1386,24 +1386,6 @@ create or replace package body test_suite_builder is ); end; - procedure throws_value_invalid is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(3, 'test','A test with invalid throws annotation', 'A_TEST_PROCEDURE'), - ut3.ut_annotation(3, 'throws',' -20145 , bad_variable_name ', 'A_TEST_PROCEDURE') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%Invalid parameter value "bad_variable_name" for "--%throws" annotation. Parameter ignored.%%' - ); - end; - procedure before_aftertest_multi is l_actual clob; diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index 7c7fc77f6..4b49e606f 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -161,9 +161,6 @@ create or replace package test_suite_builder is --%test(Gives warning if --%throws annotation has no value) procedure throws_value_empty; - --%test(Gives warning if --%throws annotation has invalid value) - procedure throws_value_invalid; - --%endcontext --%context(--%beforetest/aftertest annotation) From d33bd80f4a1b5c7e1c5188fa04ac5fcdfde9bf73 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Thu, 2 Jan 2020 19:11:57 +0000 Subject: [PATCH 26/51] Updated documentation for whitespace vs null compare. Updated tests o represent the issue more clearly. Closes #880 --- docs/userguide/expectations.md | 3 +- .../expectations/test_expectations_cursor.pkb | 56 +++++++------------ .../expectations/test_expectations_cursor.pks | 36 ++++++------ 3 files changed, 39 insertions(+), 56 deletions(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 612b59444..9cd665314 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1114,7 +1114,8 @@ utPLSQL is capable of comparing compound data-types including: - It is possible to compare PL/SQL records, collections, varrays and associative arrays. To compare this types of data, use cursor comparison feature of utPLSQL and TABLE operator in SQL query - On Oracle 11g Release 2 - pipelined table functions are needed (see section [Implicit (Shadow) Types in this artcile](https://oracle-base.com/articles/misc/pipelined-table-functions)) - On Oracle 12c and above - use [TABLE function on nested tables/varrays/associative arrays of PL/SQL records](https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1) - +- utPLSQL is not able to distinguish a NULL column/attribute from a column/attribute containing whitespace-only when comparing compound data. This is due to Oracle limitation on of XMLType., utPLSQL is not able to distinguish between + See [issue #880](https://github.com/utPLSQL/utPLSQL/issues/880) for details. *Note: This behavior might be fixed in future relreases, when utPLSQL is no longer depending on XMLType for compound data comparison.* utPLSQL offers advanced data-comparison options, for comparing compound data-types. The options allow you to: - define columns/attributes to exclude from comparison diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 1c6f46532..054c65e17 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2639,7 +2639,7 @@ Check the query and data for errors.'; end; - procedure insginificant_whitespace1 is + procedure space_only_vs_empty is l_actual sys_refcursor; l_expected sys_refcursor; begin @@ -2650,79 +2650,65 @@ Check the query and data for errors.'; select column_value t1 from table(ut_varchar2_list(' ')); --Assert ut3.ut.expect( l_actual ).to_equal( l_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; - procedure insginificant_whitespace2 is + procedure tab_only_vs_empty is l_actual sys_refcursor; l_expected sys_refcursor; begin open l_expected for - select ' t ' t1 from dual; - + select column_value t1 from table(ut_varchar2_list('')); + open l_actual for - select 't' t1 from dual; + select column_value t1 from table(ut_varchar2_list(chr(9))); --Assert ut3.ut.expect( l_actual ).to_equal( l_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); - end; - - procedure insginificant_whitespace3 is - l_actual sys_refcursor; - l_expected sys_refcursor; - begin - open l_expected for - select 't ' t1 from dual; - - open l_actual for - select 't' t1 from dual; - --Assert - ut3.ut.expect( l_actual ).to_equal( l_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; - - procedure insginificant_whitespace4 is + + procedure insignificant_start_end_space is l_actual sys_refcursor; l_expected sys_refcursor; begin open l_expected for - select ' t' t1 from dual; + select ' t ' t1 from dual; open l_actual for select 't' t1 from dual; --Assert ut3.ut.expect( l_actual ).to_equal( l_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); - end; + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; - procedure insginificant_whitespace5 is + procedure double_vs_single_start_end_ws is l_actual sys_refcursor; l_expected sys_refcursor; begin open l_expected for - select ' ' t1 from dual; + select ' t ' t1 from dual; open l_actual for - select '' t1 from dual; + select ' t ' t1 from dual; --Assert ut3.ut.expect( l_actual ).to_equal( l_expected ); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); - end; + end; - procedure nulltowhitespace is + procedure leading_tab_vs_space is l_actual sys_refcursor; l_expected sys_refcursor; begin open l_expected for - select cast(null as varchar2(2)) t1 from dual; + select ' t' t1 from dual; open l_actual for - select ' ' t1 from dual; + select chr(9)||'t' t1 from dual; --Assert ut3.ut.expect( l_actual ).to_equal( l_expected ); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); - end; - + end; + procedure number_from_dual is l_actual sys_refcursor; l_expected sys_refcursor; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index d3dbeb9a7..0ed249a49 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -417,31 +417,27 @@ create or replace package test_expectations_cursor is --%test(Check that column name accept non xml characters fix #902) procedure nonxmlchar_part_of_colname; - - - /*Oracle Bug not readin properly in xmltable */ - --%test ( Compare insiginificant whitespaces scenario 1 ) + + + /*Oracle Bug not reading properly in XMLTable - See - Issue #880 */ + --%disabled + --%test ( Space-only string is not equal empty string ) + procedure space_only_vs_empty; + + /*Oracle Bug not reading properly in XMLTable - See - Issue #880 */ --%disabled - procedure insginificant_whitespace1; + --%test ( Tab-only string is not equal empty string ) + procedure tab_only_vs_empty; - --%test ( Compare insiginificant whitespaces scenario 2 ) - procedure insginificant_whitespace2; + --%test ( Insignificant start/end whitespaces are considered ) + procedure insignificant_start_end_space; - --%test ( Compare insiginificant whitespaces scenario 3 ) - procedure insginificant_whitespace3; + --%test ( Double and single leading/trailing space is distinguished ) + procedure double_vs_single_start_end_ws; - --%test ( Compare insiginificant whitespaces scenario 4 ) - procedure insginificant_whitespace4; + --%test ( Leading Tab vs. Space is distinguished ) + procedure leading_tab_vs_space; - /*Oracle Bug not readin properly in xmltable */ - --%test ( Compare insiginificant whitespaces scenario 5 ) - --%disabled - procedure insginificant_whitespace5; - - /*Oracle Bug not readin properly in xmltable */ - --%test ( Compare null to whitespace ) - --%disabled - procedure nulltowhitespace; --%test(Check precision of number from dual #907) procedure number_from_dual; From 5510555c3b6cea45f273cb4135e811e959ce1877 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 3 Jan 2020 05:23:44 +0000 Subject: [PATCH 27/51] Fixed documentation. --- docs/userguide/expectations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 9cd665314..9f2842e2f 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1114,7 +1114,7 @@ utPLSQL is capable of comparing compound data-types including: - It is possible to compare PL/SQL records, collections, varrays and associative arrays. To compare this types of data, use cursor comparison feature of utPLSQL and TABLE operator in SQL query - On Oracle 11g Release 2 - pipelined table functions are needed (see section [Implicit (Shadow) Types in this artcile](https://oracle-base.com/articles/misc/pipelined-table-functions)) - On Oracle 12c and above - use [TABLE function on nested tables/varrays/associative arrays of PL/SQL records](https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1) -- utPLSQL is not able to distinguish a NULL column/attribute from a column/attribute containing whitespace-only when comparing compound data. This is due to Oracle limitation on of XMLType., utPLSQL is not able to distinguish between +- utPLSQL is not able to distinguish between a NULL and whitespace-only column/attribute from when comparing compound data. This is due to Oracle limitation on of XMLType. See [issue #880](https://github.com/utPLSQL/utPLSQL/issues/880) for details. *Note: This behavior might be fixed in future relreases, when utPLSQL is no longer depending on XMLType for compound data comparison.* utPLSQL offers advanced data-comparison options, for comparing compound data-types. The options allow you to: From d02ac9470627e0896922bdf37d03c89125b1422c Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Dec 2019 00:58:47 +0000 Subject: [PATCH 28/51] Changed ordering of tests for suites with context Resolves #1036 --- source/core/ut_suite_cache_manager.pkb | 20 ++-- test/ut3_tester/core/test_suite_builder.pkb | 118 ++++++++++---------- test/ut3_tester/core/test_suite_builder.pks | 2 +- 3 files changed, 74 insertions(+), 66 deletions(-) diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 509b28498..759f55278 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -162,14 +162,20 @@ create or replace package body ut_suite_cache_manager is return case when a_random_seed is null then q'[ replace( - case - when c.obj.self_type in ( 'UT_TEST' ) - then substr(c.obj.path, 1, instr(c.obj.path, '.', -1) ) - else c.obj.path - end, '.', chr(0) + substr( c.obj.path, 1, instr( c.obj.path, lower(c.obj.object_name), -1 ) + length(c.obj.object_name) ), + '.', + chr(0) ) desc nulls last, - c.obj.object_name desc, - c.obj.line_no, + case when c.obj.self_type = 'UT_SUITE_CONTEXT' then + ( select max( x.line_no ) + 1 + from ut_suite_cache x + where c.obj.object_owner = x.object_owner and c.obj.object_name = x.object_name and + x.path like c.obj.path || '.%' + ) + else + c.obj.line_no + end, + regexp_count(c.obj.path,'\.') desc, :a_random_seed]' else ' ut_runner.hash_suite_path( diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 00d914413..8eedc1142 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -649,6 +649,9 @@ create or replace package body test_suite_builder is '' || '%' || '%' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || '' || '%a_contextA contextsome_package.a_context' || '%' || @@ -661,9 +664,6 @@ create or replace package body test_suite_builder is '%' || '' || '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || '' || '' || '%some_packagesuite_level_beforeall' || @@ -710,26 +710,14 @@ create or replace package body test_suite_builder is '' || '%' || '%' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || '' || '%a_contextA contextsome_package.a_context' || '%' || '' || - '%nested_context_2nested_context_2some_package.a_context.nested_context_2' || - '%' || - '' || - '%nested_context_#1a_nested_context_3some_package.a_context.nested_context_2.nested_context_#1' || - '%' || - '' || - '%test_in_nested_context_3Test in nested contextsome_package.a_context.nested_context_2.nested_context_#1.test_in_nested_context_3' || - '%' || - '' || - '' || - '%' || - '' || - '%test_in_nested_context_2Test in nested contextsome_package.a_context.nested_context_2.test_in_nested_context_2' || - '%' || - '' || - '' || + '%first_test_in_a_contextFirst test in contextsome_package.a_context.first_test_in_a_context' || '%' || '' || '%a_nested_contextA nested contextsome_package.a_context.a_nested_context' || @@ -743,7 +731,22 @@ create or replace package body test_suite_builder is '%' || '%' || '' || - '%first_test_in_a_contextFirst test in contextsome_package.a_context.first_test_in_a_context' || + '%nested_context_2nested_context_2some_package.a_context.nested_context_2' || + '%' || + '' || + '%test_in_nested_context_2Test in nested contextsome_package.a_context.nested_context_2.test_in_nested_context_2' || + '%' || + '' || + '%nested_context_#1a_nested_context_3some_package.a_context.nested_context_2.nested_context_#1' || + '%' || + '' || + '%test_in_nested_context_3Test in nested contextsome_package.a_context.nested_context_2.nested_context_#1.test_in_nested_context_3' || + '%' || + '' || + '' || + '%' || + '' || + '' || '%' || '' || '%second_test_in_a_contextSecond test in contextsome_package.a_context.second_test_in_a_context' || @@ -754,9 +757,6 @@ create or replace package body test_suite_builder is '%' || '' || '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || '' || '' || '%some_packagesuite_level_beforeall' || @@ -859,6 +859,10 @@ create or replace package body test_suite_builder is ''|| '' || '%' || + '%' || + '%suite_level_test' || + '%%suite_level_test%' || + '%' || '%' || '%nested_context_#1A contextsome_package.nested_context_#1' || '%' || @@ -872,10 +876,6 @@ create or replace package body test_suite_builder is '%%context_beforeall%' || '%%context_afterall%' || '%' || - '%' || - '%suite_level_test' || - '%%suite_level_test%' || - '%' || '%' || '%'|| '' @@ -909,6 +909,12 @@ create or replace package body test_suite_builder is ''|| '' || '%' || + '%' || + '%suite_level_test' || + '%%suite_level_beforeeach%' || + '%%suite_level_test%' || + '%%suite_level_aftereach%' || + '%' || '%' || '%nested_context_#1nested_context_#1some_package.nested_context_#1' || '%' || @@ -920,12 +926,6 @@ create or replace package body test_suite_builder is '%' || '%' || '%' || - '%' || - '%suite_level_test' || - '%%suite_level_beforeeach%' || - '%%suite_level_test%' || - '%%suite_level_aftereach%' || - '%' || '%' || '%%suite_level_beforeall%' || '%%suite_level_afterall%' || @@ -961,18 +961,20 @@ create or replace package body test_suite_builder is ''|| '' || '%' || - '%a_contextSome contextsome_package.a_context' || - '%' || - '' || - '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || - '%' || - '' || - '' || - '%some_packagecontext_setup' || - '%' || '%' || '%suite_level_testIn suitesome_package.suite_level_test' || '%' || + '%' || + '%a_contextSome contextsome_package.a_context' || + '%' || + '' || + '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || + '%' || + '' || + '' || + '%some_packagecontext_setup' || + '%' || + '%' || '' || '' || '%some_packagesuite_level_beforeall' || @@ -1010,6 +1012,9 @@ create or replace package body test_suite_builder is ''|| '' || '%' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || '' || '%a_contextA contextsome_package.a_context' || '%' || @@ -1022,9 +1027,6 @@ create or replace package body test_suite_builder is '%' || '' || '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || '' || '' || '%some_packagesuite_level_beforeall' || @@ -1067,32 +1069,32 @@ create or replace package body test_suite_builder is '' || '%' || '' || - '%nested_context_#2A contextsome_package.nested_context_#2' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || + '' || + '%a_contextA contextsome_package.a_context' || '%' || '' || - '%test_in_duplicated_contextIn duplicated contextsome_package.nested_context_#2.test_in_duplicated_context' || + '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || '%' || '' || '' || - '%some_packagesetup_in_duplicated_context' || + '%some_packagecontext_setup' || '%' || '' || '' || '' || - '%a_contextA contextsome_package.a_context' || + '%nested_context_#2A contextsome_package.nested_context_#2' || '%' || '' || - '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || + '%test_in_duplicated_contextIn duplicated contextsome_package.nested_context_#2.test_in_duplicated_context' || '%' || '' || '' || - '%some_packagecontext_setup' || + '%some_packagesetup_in_duplicated_context' || '%' || '' || '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || '' || '' || '%some_packagesuite_level_beforeall' || @@ -1341,20 +1343,20 @@ create or replace package body test_suite_builder is '' || '%' || '' || - '%nested_context_#2A contextsome_package.nested_context_#2' || + '%nested_context_#1A contextsome_package.nested_context_#1' || '%' || '' || - '%test_in_a_context2In context2some_package.nested_context_#2.test_in_a_context2' || + '%test_in_a_context1In context1some_package.nested_context_#1.test_in_a_context1' || '%' || '' || '' || '' || '' || '' || - '%nested_context_#1A contextsome_package.nested_context_#1' || + '%nested_context_#2A contextsome_package.nested_context_#2' || '%' || '' || - '%test_in_a_context1In context1some_package.nested_context_#1.test_in_a_context1' || + '%test_in_a_context2In context2some_package.nested_context_#2.test_in_a_context2' || '%' || '' || '' || diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index 4b49e606f..e451563e5 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -151,7 +151,7 @@ create or replace package test_suite_builder is --%test(Is ignored when name value is empty) procedure name_empty_value; - --%test(Is ignored when name value is empty) + --%test(Is is applied to corresponding context when multiple contexts used) procedure multiple_contexts; --%endcontext From 0a4edaf1812ea8207d2124613e50fecb7233c4d6 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 29 Dec 2019 01:03:06 +0000 Subject: [PATCH 29/51] Test name fix --- test/ut3_tester/core/test_suite_builder.pks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index e451563e5..4cbfcad74 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -151,7 +151,7 @@ create or replace package test_suite_builder is --%test(Is ignored when name value is empty) procedure name_empty_value; - --%test(Is is applied to corresponding context when multiple contexts used) + --%test(Is applied to corresponding context when multiple contexts used) procedure multiple_contexts; --%endcontext From 326e055007b38fc3ec3380aaae86483f6cb21579 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 3 Jan 2020 05:33:03 +0000 Subject: [PATCH 30/51] Added documenting comments for ordering of data from suite_cache. Fixed SQL formatting. --- source/core/ut_suite_cache_manager.pkb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 759f55278..05984da3f 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -162,19 +162,23 @@ create or replace package body ut_suite_cache_manager is return case when a_random_seed is null then q'[ replace( + --suite path until objects name (excluding contexts and test path) with trailing dot (full stop) substr( c.obj.path, 1, instr( c.obj.path, lower(c.obj.object_name), -1 ) + length(c.obj.object_name) ), '.', + --'.' replaced with chr(0) to assure that child elements come before parent when sorting in descending oder chr(0) ) desc nulls last, case when c.obj.self_type = 'UT_SUITE_CONTEXT' then ( select max( x.line_no ) + 1 from ut_suite_cache x - where c.obj.object_owner = x.object_owner and c.obj.object_name = x.object_name and - x.path like c.obj.path || '.%' + where c.obj.object_owner = x.object_owner + and c.obj.object_name = x.object_name + and x.path like c.obj.path || '.%' ) else c.obj.line_no end, + --assures that child contexts come before parent contexts regexp_count(c.obj.path,'\.') desc, :a_random_seed]' else From a25b8b7c57c5928d38764b2997af0f1385561f2c Mon Sep 17 00:00:00 2001 From: Travis CI Date: Fri, 3 Jan 2020 05:54:05 +0000 Subject: [PATCH 31/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 205fbef66..19adafe88 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 923dd5b7d..95fb477ff 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 260e05ede..a715c2ef6 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 6ff3b41be..1cde4188e 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index fc2718b3f..2e44c6ba1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 184866b7b..423f50ee2 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 12ccc8a30..5d1efaa62 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 0f0682924..6092231de 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 4853bfca1..978a7d3e1 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index ba4313743..4c33cbed9 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 612b59444..2947e55b8 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 31988dcfe..944ecb385 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 6de351376..4a165913f 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 346de3cb9..9093bdffe 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 7a8f10af6..32721d647 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 7babf9366..c1f7733ce 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index cd6e8b065..e97253135 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 096761d0a..d6d65a826 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3298-develop + * secion v3.1.10.3311-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 671312a9f..aa074190e 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3298-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3311-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From d708443346b73a92fed3310605d4fa2a93ad914c Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 4 Jan 2020 10:45:23 +0000 Subject: [PATCH 32/51] Fixed documentation typos. --- docs/userguide/expectations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 9f2842e2f..6410fc6f1 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1114,8 +1114,8 @@ utPLSQL is capable of comparing compound data-types including: - It is possible to compare PL/SQL records, collections, varrays and associative arrays. To compare this types of data, use cursor comparison feature of utPLSQL and TABLE operator in SQL query - On Oracle 11g Release 2 - pipelined table functions are needed (see section [Implicit (Shadow) Types in this artcile](https://oracle-base.com/articles/misc/pipelined-table-functions)) - On Oracle 12c and above - use [TABLE function on nested tables/varrays/associative arrays of PL/SQL records](https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1) -- utPLSQL is not able to distinguish between a NULL and whitespace-only column/attribute from when comparing compound data. This is due to Oracle limitation on of XMLType. - See [issue #880](https://github.com/utPLSQL/utPLSQL/issues/880) for details. *Note: This behavior might be fixed in future relreases, when utPLSQL is no longer depending on XMLType for compound data comparison.* +- utPLSQL is not able to distinguish between NULL and whitespace-only column/attribute value when comparing compound data. This is due to Oracle limitation on of XMLType. + See [issue #880](https://github.com/utPLSQL/utPLSQL/issues/880) for details. *Note: This behavior might be fixed in future releases, when utPLSQL is no longer depending on XMLType for compound data comparison.* utPLSQL offers advanced data-comparison options, for comparing compound data-types. The options allow you to: - define columns/attributes to exclude from comparison From 101bcbf8f09bafecb151ba4d281e76c801236cd2 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 4 Jan 2020 12:43:38 +0000 Subject: [PATCH 33/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 19adafe88..b526f0c8e 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 95fb477ff..207e0bae1 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index a715c2ef6..32346fa8a 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 1cde4188e..832a12eba 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 2e44c6ba1..b5615a2ed 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 423f50ee2..f5d78ea92 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 5d1efaa62..ddb939b76 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 6092231de..4bffbddfc 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 978a7d3e1..5ae210e58 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 4c33cbed9..3eeb45b45 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index dfbcc8651..374d35a62 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 944ecb385..1dab9dd0e 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 4a165913f..37d099545 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 9093bdffe..cd3a78dca 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 32721d647..8ff52311e 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index c1f7733ce..9ea158190 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index e97253135..f73c5a073 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3311--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index d6d65a826..dc49b6baf 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3311-develop + * secion v3.1.10.3319-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index aa074190e..299ff2181 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3311-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3319-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 1b0b8f8c616356a211005f11a8960eac5300a57c Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 15 Feb 2020 14:46:26 +0000 Subject: [PATCH 34/51] Refactored expectations on compound data With this change the reporting of differences is unified across: `unordered`, `ordered` and `join_by` comparison. --- .../data_values/ut_compound_data_helper.pkb | 131 +++++++++++------- .../expectations/test_expectation_anydata.pkb | 6 +- .../expectations/test_expectations_cursor.pkb | 22 ++- 3 files changed, 90 insertions(+), 69 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index d7c0aab76..6a6b30a50 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -417,39 +417,78 @@ create or replace package body ut_compound_data_helper is l_join_xpath varchar2(32767) := ut_utils.to_xpath(a_join_by_list); l_results tt_row_diffs; l_sql varchar2(32767); + l_column_order varchar2(100); begin + if a_enforce_column_order then + l_column_order := 'col_no'; + else + l_column_order := 'col_name'; + end if; l_sql := q'[ - with exp as ( + with + exp_rows as( + select + exp_data_id, extract( exp_item_data, :column_path ) exp_item_data, item_no, diff_id + from ut_compound_data_diff_tmp + where diff_id = :diff_id + and exp_data_id = :self_guid + ), + act_rows as ( + select + act_data_id, extract( act_item_data, :column_path ) act_item_data, item_no, diff_id + from ut_compound_data_diff_tmp ucd + where diff_id = :diff_id + and ucd.act_data_id = :other_guid + ), + exp_cols as ( select - exp_item_data, exp_data_id, item_no rn, rownum col_no, pk_value, + exp_item_data, exp_data_id, item_no rn, rownum col_no, diff_id, s.column_value col, s.column_value.getRootElement() col_name, nvl(s.column_value.getclobval(),empty_clob()) col_val - from ( - select - exp_data_id, extract( ucd.exp_item_data, :column_path ) exp_item_data, item_no, - replace( extract( ucd.exp_item_data, :join_by ).getclobval(), chr(10) ) pk_value - from ut_compound_data_diff_tmp ucd - where diff_id = :diff_id - and ucd.exp_data_id = :self_guid - ) i, - table( xmlsequence( extract(i.exp_item_data,:extract_path) ) ) s + from exp_rows i, + table( xmlsequence( extract( i.exp_item_data, :extract_path ) ) ) s ), - act as ( + act_cols as ( select - act_item_data, act_data_id, item_no rn, rownum col_no, pk_value, + act_item_data, act_data_id, item_no rn, rownum col_no, diff_id, s.column_value col, s.column_value.getRootElement() col_name, nvl(s.column_value.getclobval(),empty_clob()) col_val + from act_rows i, + table( xmlsequence( extract( i.act_item_data, :extract_path ) ) ) s + ), + data_diff as ( + select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, null pk_value, col_name, diff_id from ( - select - act_data_id, extract( ucd.act_item_data, :column_path ) act_item_data, item_no, - replace( extract( ucd.act_item_data, :join_by ).getclobval(), chr(10) ) pk_value - from ut_compound_data_diff_tmp ucd - where diff_id = :diff_id - and ucd.act_data_id = :other_guid - ) i, - table( xmlsequence( extract(i.act_item_data,:extract_path) ) ) s + select nvl(exp.rn, act.rn) rn, + exp.diff_id diff_id, + xmlagg(exp.col order by exp.col_no) exp_item, + xmlagg(act.col order by nvl(exp.col_no, act.col_no)) act_item, + max(nvl(exp.col_name,act.col_name)) col_name + from exp_cols exp + join act_cols act + on exp.rn = act.rn and exp.col_name = act.col_name + where dbms_lob.compare(exp.col_val, act.col_val) != 0 + group by nvl(exp.rn, act.rn), exp.diff_id + ) + unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:') ) + ), + unordered_diff as ( + select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, null pk_value, col_name, diff_id + from ( + select nvl(exp.rn, act.rn) rn, + exp.diff_id diff_id, + xmlagg(exp.col order by exp.col_name) exp_item, + xmlagg(act.col order by act.col_name) act_item, + max(nvl(exp.col_name,act.col_name)) col_name + from exp_cols exp + join act_cols act + on exp.rn = act.rn and exp.col_name = act.col_name + where dbms_lob.compare(exp.col_val, act.col_val) != 0 + group by nvl(exp.rn, act.rn), exp.diff_id + ) + unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:') ) ) - select rn, diff_type, diffed_row, pk_value pk_value + select rn, diff_type, diffed_row, pk_value from ( select rn, diff_type, diffed_row, pk_value, case when diff_type = 'Actual:' then 1 else 2 end rnk, @@ -457,33 +496,20 @@ create or replace package body ut_compound_data_helper is col_name from ( ]' || case when a_unordered then q'[ - select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, pk_value, col_name - from ( - select nvl(exp.rn, act.rn) rn, - nvl(exp.pk_value, act.pk_value) pk_value, - exp.col exp_item, - act.col act_item, - nvl(exp.col_name,act.col_name) col_name - from exp - join act - on exp.rn = act.rn and exp.col_name = act.col_name - where dbms_lob.compare(exp.col_val, act.col_val) != 0 - ) - unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:') ) ]' + select u.rn, u.diff_type, u.diffed_row, + replace( + extract( case when i.exp_data_id is null then i.act_item_data else i.exp_item_data end, :join_by ).getclobval(), + chr(10) + ) pk_value, + u.col_name + from data_diff u + join ut_compound_data_diff_tmp i + on i.diff_id = u.diff_id + and i.item_no = u.rn]' else q'[ - select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, null pk_value, col_name - from ( - select nvl(exp.rn, act.rn) rn, - xmlagg(exp.col order by exp.col_no) exp_item, - xmlagg(act.col order by act.col_no) act_item, - max(nvl(exp.col_name,act.col_name)) col_name - from exp exp - join act act - on exp.rn = act.rn and exp.col_name = act.col_name - where dbms_lob.compare(exp.col_val, act.col_val) != 0 - group by (exp.rn, act.rn) - ) - unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:') ) ]' + select rn, diff_type, diffed_row, pk_value, col_name + from data_diff + where :join_by is null ]' end ||q'[ ) union all @@ -522,14 +548,13 @@ create or replace package body ut_compound_data_helper is case when final_order = 1 then to_char(rn) else col_name end, case when final_order = 1 then to_char(rnk) else col_name end ]' - else - null end; execute immediate l_sql bulk collect into l_results - using l_exp_extract_xpath, l_join_xpath, a_diff_id, a_expected_dataset_guid,a_extract_path, - l_act_extract_xpath, l_join_xpath, a_diff_id, a_actual_dataset_guid,a_extract_path, - l_join_xpath, l_join_xpath, a_diff_id; + using l_exp_extract_xpath, a_diff_id, a_expected_dataset_guid, + l_act_extract_xpath, a_diff_id, a_actual_dataset_guid, + a_extract_path, a_extract_path, + l_join_xpath, l_join_xpath, l_join_xpath, a_diff_id; return l_results; end; diff --git a/test/ut3_user/expectations/test_expectation_anydata.pkb b/test/ut3_user/expectations/test_expectation_anydata.pkb index f94b0efc0..ece5457a7 100644 --- a/test/ut3_user/expectations/test_expectation_anydata.pkb +++ b/test/ut3_user/expectations/test_expectation_anydata.pkb @@ -864,10 +864,8 @@ Rows: [ 60 differences, showing first 20 ] l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] %Diff: %Rows: [ 3 differences ] -%PK 2 - Actual: Something 2 -%PK 2 - Actual: 2 -%PK 2 - Expected: Something 1 -%PK 2 - Expected: 1 +%PK 2 - Actual: Something 22 +%PK 2 - Expected: Something 11 %PK 1 - Extra: 1Something 11 %PK 4 - Missing: 4Something 22]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 054c65e17..5a0b68f2f 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -371,7 +371,7 @@ create or replace package body test_expectations_cursor is l_expected_message := q'[Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = 1 ] %Diff: %Rows: [ 1 differences ] -%Row No. 1 - Actual: 4030 +%Row No. 1 - Actual: 3040 %Row No. 1 - Expected: 34]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert @@ -394,7 +394,7 @@ create or replace package body test_expectations_cursor is l_expected_message := q'[Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = 1 ] %Diff: %Rows: [ 1 differences ] -%Row No. 1 - Actual: 4030 +%Row No. 1 - Actual: 3040 %Row No. 1 - Expected: 34]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert @@ -860,9 +860,9 @@ Columns: Rows: [ 4 differences ] Row No. 1 - Actual: 25000 Row No. 1 - Expected: 10000 - Row No. 2 - Actual: TONYSTARK3100000 + Row No. 2 - Actual: 3TONYSTARK100000 Row No. 2 - Expected: 2LUKESKYWALKER1000 - Row No. 3 - Actual: JESSICAJONES42345 + Row No. 3 - Actual: 4JESSICAJONES2345 Row No. 3 - Expected: 3TONYSTARK100000 Row No. 4 - Extra: MLUKESKYWALKER21000]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); @@ -896,9 +896,9 @@ Columns: Rows: [ 4 differences ] Row No. 1 - Actual: 25000 Row No. 1 - Expected: 10000 - Row No. 2 - Actual: TONYSTARK3100000 + Row No. 2 - Actual: 3TONYSTARK100000 Row No. 2 - Expected: 2LUKESKYWALKER1000 - Row No. 3 - Actual: JESSICAJONES42345 + Row No. 3 - Actual: 4JESSICAJONES2345 Row No. 3 - Expected: 3TONYSTARK100000 Row No. 4 - Extra: MLUKESKYWALKER21000]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); @@ -1237,10 +1237,8 @@ Rows: [ 4 differences ] l_expected_message := q'[Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = 1 ] %Diff: %Rows: [ 1 differences ] -%PK 1 - Actual: 30 -%PK 1 - Expected: 3 -%PK 1 - Actual: 40 -%PK 1 - Expected: 4]'; +%PK 1 - Actual: 3040 +%PK 1 - Expected: 34]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -2511,7 +2509,7 @@ Diff:% begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2522 ut3.ut.expect(l_actual).to_equal(l_expected);% +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line % ut3.ut.expect(l_actual).to_equal(l_expected);% Check the query and data for errors.'; open l_actual for @@ -2536,7 +2534,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2547 ut3.ut.expect(l_actual).to_equal(l_expected);% +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line % ut3.ut.expect(l_actual).to_equal(l_expected);% Check the query and data for errors.'; open l_expected for From 8eac19e41a7b20d9b443901cae90cd3429310835 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 15 Feb 2020 15:03:34 +0000 Subject: [PATCH 35/51] Changed maven repo url. --- .travis/maven_cfg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/maven_cfg.sh b/.travis/maven_cfg.sh index ef2348099..b24e56582 100755 --- a/.travis/maven_cfg.sh +++ b/.travis/maven_cfg.sh @@ -7,7 +7,7 @@ cd $(dirname $(readlink -f $0)) # Download wagon-http recommended by Oracle. # On maven latest version this is not needed, but travis doesn't have it. if [ ! -f $CACHE_DIR/wagon-http-2.8-shaded.jar ]; then - curl -L -O "http://central.maven.org/maven2/org/apache/maven/wagon/wagon-http/2.8/wagon-http-2.8-shaded.jar" + curl -L -O "https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http/2.8/wagon-http-2.8-shaded.jar" mv wagon-http-2.8-shaded.jar $CACHE_DIR/ sudo cp $CACHE_DIR/wagon-http-2.8-shaded.jar $MAVEN_HOME/lib/ext/ else From d84a6845b2275ec77fdc48a083c8deaae05ad752 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 15 Feb 2020 15:32:30 +0000 Subject: [PATCH 36/51] Removing maven step for obtaining Oracle jdbc drivers - those are now available as part of `utPLSQL-cli` since version `3.1.8` --- .travis.yml | 2 -- .travis/maven_cfg.sh | 18 ------------- .travis/pom.xml | 62 -------------------------------------------- .travis/settings.xml | 51 ------------------------------------ 4 files changed, 133 deletions(-) delete mode 100755 .travis/maven_cfg.sh delete mode 100644 .travis/pom.xml delete mode 100644 .travis/settings.xml diff --git a/.travis.yml b/.travis.yml index 7ac28e41f..6d2514c1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -80,8 +80,6 @@ before_install: install: #- unzip utPLSQL.zip - unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli - # Get ojdbc via maven - - bash .travis/maven_cfg.sh - bash .travis/install_sqlcl.sh - sudo mkdir -p /dev/pdbs - sudo chmod -R 777 /dev/pdbs diff --git a/.travis/maven_cfg.sh b/.travis/maven_cfg.sh deleted file mode 100755 index b24e56582..000000000 --- a/.travis/maven_cfg.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -ev -cp .travis/settings.xml $MAVEN_CFG/settings.xml - -cd $(dirname $(readlink -f $0)) - -# Download wagon-http recommended by Oracle. -# On maven latest version this is not needed, but travis doesn't have it. -if [ ! -f $CACHE_DIR/wagon-http-2.8-shaded.jar ]; then - curl -L -O "https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http/2.8/wagon-http-2.8-shaded.jar" - mv wagon-http-2.8-shaded.jar $CACHE_DIR/ - sudo cp $CACHE_DIR/wagon-http-2.8-shaded.jar $MAVEN_HOME/lib/ext/ -else - echo "Using cached wagon-http..." - sudo cp $CACHE_DIR/wagon-http-2.8-shaded.jar $MAVEN_HOME/lib/ext/ -fi - -mvn dependency:copy-dependencies -DoutputDirectory=../utPLSQL-cli/lib \ No newline at end of file diff --git a/.travis/pom.xml b/.travis/pom.xml deleted file mode 100644 index 706bd79bb..000000000 --- a/.travis/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - org.utplsql - utplsql - 3.0.4-SNAPSHOT - jar - - utPLSQL - https://github.com/utPLSQL/utPLSQL - - - UTF-8 - - - - - com.oracle.jdbc - ojdbc8 - 12.2.0.1 - compile - - - com.oracle.jdbc - orai18n - 12.2.0.1 - compile - - - - - - maven.oracle.com - - true - - - false - - https://maven.oracle.com - default - - - - - - maven.oracle.com - https://maven.oracle.com - - - - - - - io.packagecloud.maven.wagon - maven-packagecloud-wagon - 0.0.6 - - - - diff --git a/.travis/settings.xml b/.travis/settings.xml deleted file mode 100644 index 731ef5298..000000000 --- a/.travis/settings.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - maven.oracle.com - ${env.ORACLE_OTN_USER} - ${env.ORACLE_OTN_PASSWORD} - - - ANY - ANY - OAM 11g - - - - - - http.protocol.allow-circular-redirects - %b,true - - - - - - - - - From 02ba32b6c660ceb8fdc58094943a4bc37e49a9ab Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 15 Feb 2020 15:34:22 +0000 Subject: [PATCH 37/51] Removing `/dev/pdbs` directory We do not use it since we switched to `small` databases. --- .travis.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6d2514c1b..018038144 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,10 +50,10 @@ env: - MAVEN_CFG=$HOME/.m2 matrix: - ORACLE_VERSION="${DOCKER_TAG_11G:-11g-r2-xe}" CONNECTION_STR='127.0.0.1:1521/XE' DOCKER_OPTIONS='--shm-size=1g' - - ORACLE_VERSION="${DOCKER_TAG_12C:-12c-r1-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" - - ORACLE_VERSION="${DOCKER_TAG_12C2:-12c-r2-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" - - ORACLE_VERSION="${DOCKER_TAG_18:-18c-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" - - ORACLE_VERSION="${DOCKER_TAG_19:-19c-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" + - ORACLE_VERSION="${DOCKER_TAG_12C:-12c-r1-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' + - ORACLE_VERSION="${DOCKER_TAG_12C2:-12c-r2-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' + - ORACLE_VERSION="${DOCKER_TAG_18:-18c-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' + - ORACLE_VERSION="${DOCKER_TAG_19:-19c-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' cache: pip: true @@ -81,8 +81,6 @@ install: #- unzip utPLSQL.zip - unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli - bash .travis/install_sqlcl.sh - - sudo mkdir -p /dev/pdbs - - sudo chmod -R 777 /dev/pdbs - if [[ ! $TRAVIS_TAG ]]; then bash .travis/start_db.sh; fi before_script: From 15d24afa58bc29a79fc7e0a80bfa31e6c363406c Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 15 Feb 2020 16:21:50 +0000 Subject: [PATCH 38/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index b526f0c8e..245d8504c 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 207e0bae1..5f5295da8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 32346fa8a..73498a628 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 832a12eba..34f990b6f 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index b5615a2ed..c15e45936 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index f5d78ea92..d357cbd8c 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index ddb939b76..4c398a4a4 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 4bffbddfc..87f4f9519 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 5ae210e58..e1a9e09d1 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 3eeb45b45..624dba1ee 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 374d35a62..93b0f1258 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1dab9dd0e..e37920255 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 37d099545..0a7a04b35 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index cd3a78dca..b6ef0def6 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 8ff52311e..3399c5c72 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 9ea158190..3ce5daace 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f73c5a073..66617cb2e 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3319--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index dc49b6baf..13f64d1bd 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3319-develop + * secion v3.1.10.3327-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 299ff2181..3b23edad0 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3319-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3327-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ba90abf5be5ba05b44a9080349f9edd54fe7a62b Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 5 Aug 2019 02:44:42 +0100 Subject: [PATCH 39/51] Cleanup and refactoring of annotation cache. Added ability to refresh annotation cache with DDL trigger enabled if schema was not full-scanned. Resolves: #975 --- .../annotations/ut_annotation_cache_info.sql | 7 +- .../ut_annotation_cache_manager.pkb | 123 ++++---- .../ut_annotation_cache_manager.pks | 19 +- .../ut_annotation_cache_schema.sql | 8 +- .../annotations/ut_annotation_manager.pkb | 230 +++++++-------- .../annotations/ut_annotation_manager.pks | 15 +- .../core/annotations/ut_annotation_parser.pkb | 15 +- .../core/annotations/ut_annotation_parser.pks | 2 +- source/core/annotations/ut_trigger_check.pkb | 4 +- source/core/types/ut_suite_cache_row.tps | 40 +-- source/core/ut_suite_cache_manager.pkb | 23 +- source/core/ut_utils.pkb | 10 +- .../annotations/test_annotation_manager.pkb | 263 +++++++++++------- .../annotations/test_annotation_manager.pks | 37 ++- test/ut3_tester/core/test_suite_manager.pkb | 4 +- test/ut3_tester_helper/run_helper.pkb | 2 +- test/ut3_tester_helper/run_helper.pks | 2 +- 17 files changed, 453 insertions(+), 351 deletions(-) diff --git a/source/core/annotations/ut_annotation_cache_info.sql b/source/core/annotations/ut_annotation_cache_info.sql index e8dc2bfdb..e0781cab7 100644 --- a/source/core/annotations/ut_annotation_cache_info.sql +++ b/source/core/annotations/ut_annotation_cache_info.sql @@ -17,7 +17,10 @@ create table ut_annotation_cache_info ( object_name varchar2(250) not null, object_type varchar2(250) not null, parse_time timestamp not null, - constraint ut_annotation_cache_info_pk primary key(cache_id), - constraint ut_annotation_cache_info_uk unique (object_owner, object_type, object_name) + is_annotated varchar2(1) not null, + constraint ut_annotation_cache_info_ck1 check(is_annotated in ('Y','N')), + constraint ut_annotation_cache_info_pk primary key(cache_id) using index, + constraint ut_annotation_cache_info_uk unique (object_owner, object_type, object_name) using index, + constraint ut_annotation_cache_info_fk foreign key(object_owner, object_type) references ut_annotation_cache_schema(object_owner, object_type) on delete cascade ) organization index; diff --git a/source/core/annotations/ut_annotation_cache_manager.pkb b/source/core/annotations/ut_annotation_cache_manager.pkb index eb60ac3dd..6060d6a21 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pkb +++ b/source/core/annotations/ut_annotation_cache_manager.pkb @@ -17,15 +17,26 @@ create or replace package body ut_annotation_cache_manager as */ procedure update_cache(a_object ut_annotated_object) is - l_cache_id integer; - l_new_objects_count integer := 0; + l_cache_id integer; + l_timestamp timestamp := systimestamp; pragma autonomous_transaction; begin + update ut_annotation_cache_schema s + set s.max_parse_time = l_timestamp + where s.object_type = a_object.object_type and s.object_owner = a_object.object_owner; + + if sql%rowcount = 0 then + insert into ut_annotation_cache_schema s + (object_owner, object_type, max_parse_time) + values (a_object.object_owner, a_object.object_type, l_timestamp); + end if; + -- if not in trigger, or object has annotations if ora_sysevent is null or a_object.annotations is not null and a_object.annotations.count > 0 then update ut_annotation_cache_info i - set i.parse_time = systimestamp + set i.parse_time = l_timestamp, + i.is_annotated = case when a_object.annotations is not empty then 'Y' else 'N' end where (i.object_owner, i.object_name, i.object_type) in ((a_object.object_owner, a_object.object_name, a_object.object_type)) returning cache_id into l_cache_id; @@ -33,24 +44,15 @@ create or replace package body ut_annotation_cache_manager as if sql%rowcount = 0 then insert into ut_annotation_cache_info - (cache_id, object_owner, object_name, object_type, parse_time) - values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, systimestamp) + (cache_id, object_owner, object_name, object_type, parse_time, is_annotated) + values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, l_timestamp, + case when a_object.annotations is not empty then 'Y' else 'N' end + ) returning cache_id into l_cache_id; - l_new_objects_count := 1; end if; end if; - update ut_annotation_cache_schema s - set s.object_count = s.object_count + l_new_objects_count, s.max_parse_time = systimestamp - where s.object_type = a_object.object_type and s.object_owner = a_object.object_owner; - - if sql%rowcount = 0 then - insert into ut_annotation_cache_schema s - (object_owner, object_type, object_count, max_parse_time) - values (a_object.object_owner, a_object.object_type, l_new_objects_count, systimestamp); - end if; - delete from ut_annotation_cache c where cache_id = l_cache_id; if a_object.annotations is not null and a_object.annotations.count > 0 then @@ -63,7 +65,8 @@ create or replace package body ut_annotation_cache_manager as end; - procedure cleanup_cache(a_objects ut_annotation_objs_cache_info) is + procedure reset_objects_cache(a_objects ut_annotation_objs_cache_info) is + l_timestamp timestamp := systimestamp; pragma autonomous_transaction; begin @@ -77,21 +80,39 @@ create or replace package body ut_annotation_cache_manager as and o.object_owner = i.object_owner ); + update ut_annotation_cache_schema s + set s.max_parse_time = l_timestamp + where (s.object_owner, s.object_type) + in ( + select o.object_owner, o.object_type + from table(a_objects) o + ); + + if sql%rowcount = 0 then + insert into ut_annotation_cache_schema s + (object_owner, object_type, max_parse_time) + select distinct o.object_owner, o.object_type, l_timestamp + from table(a_objects) o; + end if; + merge into ut_annotation_cache_info i using (select o.object_name, o.object_type, o.object_owner from table(a_objects) o ) o on (o.object_name = i.object_name and o.object_type = i.object_type and o.object_owner = i.object_owner) - when matched then update set parse_time = systimestamp + when matched then + update + set parse_time = l_timestamp, + is_annotated = 'N' when not matched then insert - (cache_id, object_owner, object_name, object_type, parse_time) - values (ut_annotation_cache_seq.nextval, o.object_owner, o.object_name, o.object_type, systimestamp); + (cache_id, object_owner, object_name, object_type, parse_time, is_annotated) + values (ut_annotation_cache_seq.nextval, o.object_owner, o.object_name, o.object_type, l_timestamp, 'N'); commit; end; - function get_annotations_objects_info(a_object_owner varchar2, a_object_type varchar2) return ut_annotation_objs_cache_info is + function get_cached_objects_list(a_object_owner varchar2, a_object_type varchar2, a_parsed_after timestamp := null) return ut_annotation_objs_cache_info is l_result ut_annotation_objs_cache_info; begin select ut_annotation_obj_cache_info( @@ -104,7 +125,8 @@ create or replace package body ut_annotation_cache_manager as bulk collect into l_result from ut_annotation_cache_info i where i.object_owner = a_object_owner - and i.object_type = a_object_type; + and i.object_type = a_object_type + and (i.parse_time > a_parsed_after or a_parsed_after is null); return l_result; end; @@ -123,6 +145,16 @@ create or replace package body ut_annotation_cache_manager as return l_result; end; + procedure set_fully_refreshed(a_object_owner varchar2, a_object_type varchar2) is + pragma autonomous_transaction; + begin + update ut_annotation_cache_schema s + set s.full_refresh_time = s.max_parse_time + where s.object_owner = a_object_owner + and s.object_type = a_object_type; + commit; + end; + procedure remove_from_cache(a_objects ut_annotation_objs_cache_info) is pragma autonomous_transaction; begin @@ -138,10 +170,10 @@ create or replace package body ut_annotation_cache_manager as commit; end; - function get_annotations_for_objects(a_cached_objects ut_annotation_objs_cache_info, a_parse_time timestamp) return sys_refcursor is - l_results sys_refcursor; + function get_annotations_parsed_since(a_object_owner varchar2, a_object_type varchar2, a_parsed_after timestamp) return sys_refcursor is + l_results sys_refcursor; begin - open l_results for q'[ + open l_results for select ut_annotated_object( i.object_owner, i.object_name, i.object_type, i.parse_time, cast( @@ -151,14 +183,12 @@ create or replace package body ut_annotation_cache_manager as ) order by c.annotation_position ) as ut_annotations ) - ) - from table(:a_cached_objects) o - join ut_annotation_cache_info i - on o.object_owner = i.object_owner and o.object_name = i.object_name and o.object_type = i.object_type + ) as annotated_object + from ut_annotation_cache_info i join ut_annotation_cache c on i.cache_id = c.cache_id - where ]'|| case when a_parse_time is null then ':a_parse_date is null' else 'i.parse_time > :a_parse_time' end ||q'[ - group by i.object_owner, i.object_name, i.object_type, i.parse_time]' - using a_cached_objects, a_parse_time; + where i.object_owner = a_object_owner and i.object_type = a_object_type + and (i.parse_time > a_parsed_after or a_parsed_after is null) + group by i.object_owner, i.object_type, i.object_name, i.parse_time; return l_results; end; @@ -168,35 +198,24 @@ create or replace package body ut_annotation_cache_manager as pragma autonomous_transaction; begin if a_object_owner is null and a_object_type is null then - l_cache_filter := ':a_object_owner is null and :a_object_type is null'; - l_filter := l_cache_filter; + l_filter := ':a_object_owner is null and :a_object_type is null'; + l_cache_filter := l_filter; else - l_filter := - case when a_object_owner is null then ':a_object_owner is null' else 'object_owner = :a_object_owner' end || ' - and '||case when a_object_type is null then ':a_object_type is null' else 'object_type = :a_object_type' end; - l_cache_filter := ' c.cache_id - in (select i.cache_id - from ut_annotation_cache_info i - where '|| l_filter || ' - )'; + l_filter := case when a_object_owner is null then ':a_object_owner is null' else 'object_owner = :a_object_owner' end; + l_filter := l_filter || ' and ' || case when a_object_type is null then ':a_object_type is null' else 'object_type = :a_object_type' end; + l_cache_filter := ' c.cache_id in (select i.cache_id from ut_annotation_cache_info i where ' || l_filter || ' )'; end if; - execute immediate ' - delete from ut_annotation_cache c - where '||l_cache_filter + execute immediate 'delete from ut_annotation_cache c where ' || l_cache_filter using a_object_owner, a_object_type; - execute immediate ' - delete from ut_annotation_cache_info i - where ' || l_filter + execute immediate ' delete from ut_annotation_cache_info i where ' || l_filter using a_object_owner, a_object_type; - execute immediate ' - delete from ut_annotation_cache_schema s - where ' || l_filter + execute immediate ' delete from ut_annotation_cache_schema s where ' || l_filter using a_object_owner, a_object_type; commit; end; -end ut_annotation_cache_manager; +end; / diff --git a/source/core/annotations/ut_annotation_cache_manager.pks b/source/core/annotations/ut_annotation_cache_manager.pks index 2a1d60f1e..e4ba6dd7a 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pks +++ b/source/core/annotations/ut_annotation_cache_manager.pks @@ -16,6 +16,7 @@ create or replace package ut_annotation_cache_manager authid definer as limitations under the License. */ subtype t_cache_schema_info is ut_annotation_cache_schema%rowtype; + /** * Populates cache with information about object and it's annotations * Cache information for individual object is modified by this code @@ -30,21 +31,27 @@ create or replace package ut_annotation_cache_manager authid definer as * Returns a ref_cursor containing `ut_annotated_object` as result * Range of data returned is limited by the input collection o cache object info * - * @param a_cached_objects a `ut_annotation_objs_cache_info` list with information about objects to get from cache + * @param a_cached_objects - list of `ut_annotation_objs_cache_info` containing objects to get from cache + * @param a_min_parse_time - limit results to annotations parsed after specified time only, + * if null - all cached annotations for given objects are returned */ - function get_annotations_for_objects(a_cached_objects ut_annotation_objs_cache_info, a_parse_time timestamp) return sys_refcursor; - + function get_annotations_parsed_since(a_object_owner varchar2, a_object_type varchar2, a_parsed_after timestamp) return sys_refcursor; - function get_annotations_objects_info(a_object_owner varchar2, a_object_type varchar2) return ut_annotation_objs_cache_info; + procedure set_fully_refreshed(a_object_owner varchar2, a_object_type varchar2); function get_cache_schema_info(a_object_owner varchar2, a_object_type varchar2) return t_cache_schema_info; /** - * Removes cached information about annotations for objects on the list and updates parse_time in cache info table. + * Returns information about all objects stored in annotation cache + */ + function get_cached_objects_list(a_object_owner varchar2, a_object_type varchar2, a_parsed_after timestamp := null) return ut_annotation_objs_cache_info; + + /** + * Resets cached information about annotations for objects on the list and updates parse_time in cache info table. * * @param a_objects a `ut_annotation_objs_cache_info` list with information about objects to remove annotations for */ - procedure cleanup_cache(a_objects ut_annotation_objs_cache_info); + procedure reset_objects_cache(a_objects ut_annotation_objs_cache_info); /** * Removes information about objects on the list diff --git a/source/core/annotations/ut_annotation_cache_schema.sql b/source/core/annotations/ut_annotation_cache_schema.sql index abab7385e..b8f908e84 100644 --- a/source/core/annotations/ut_annotation_cache_schema.sql +++ b/source/core/annotations/ut_annotation_cache_schema.sql @@ -12,10 +12,10 @@ create table ut_annotation_cache_schema ( See the License for the specific language governing permissions and limitations under the License. */ - object_owner varchar2(250) not null, - object_type varchar2(250) not null, - object_count integer not null, - max_parse_time date not null, + object_owner varchar2(250) not null, + object_type varchar2(250) not null, + max_parse_time date not null, + full_refresh_time timestamp, constraint ut_annotation_cache_schema_pk primary key(object_owner, object_type) ) organization index; diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index fd2997632..a37391d37 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -19,86 +19,85 @@ create or replace package body ut_annotation_manager as ------------------------------ --private definitions - function get_missing_objects(a_object_owner varchar2, a_object_type varchar2) return ut_annotation_objs_cache_info is - l_rows sys_refcursor; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); - l_cursor_text varchar2(32767); - l_data ut_annotation_objs_cache_info; - l_result ut_annotation_objs_cache_info; - l_card natural; + function user_can_see_whole_schema( a_schema_name varchar2 ) return boolean is begin - l_data := ut_annotation_cache_manager.get_annotations_objects_info(a_object_owner, a_object_type); - l_card := ut_utils.scale_cardinality(cardinality(l_data)); - - l_cursor_text := - 'select /*+ cardinality(i '||l_card||') */ - value(i) - from table( cast( :l_data as '||l_ut_owner||'.ut_annotation_objs_cache_info ) ) i - where - not exists ( - select 1 from '||l_objects_view||q'[ o - where o.owner = i.object_owner - and o.object_name = i.object_name - and o.object_type = i.object_type - and o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'[' - and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'[' - )]'; - open l_rows for l_cursor_text using l_data; - fetch l_rows bulk collect into l_result limit ut_utils.gc_max_objects_fetch_limit; - close l_rows; - return l_result; + return sys_context('userenv','current_schema') = a_schema_name + or ut_metadata.user_has_execute_any_proc() + or ut_metadata.is_object_visible('dba_objects'); end; - function get_annotation_objs_info( - a_object_owner varchar2, - a_object_type varchar2, - a_parse_date timestamp := null, - a_full_scan boolean := true - ) return ut_annotation_objs_cache_info is - l_rows sys_refcursor; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); - l_cursor_text varchar2(32767); - l_data ut_annotation_objs_cache_info; - l_result ut_annotation_objs_cache_info; + function get_non_existing_objects( a_object_owner varchar2, a_object_type varchar2 ) return ut_annotation_objs_cache_info is + l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); + l_object_to_delete ut_annotation_objs_cache_info := ut_annotation_objs_cache_info(); + l_cached_objects ut_annotation_objs_cache_info; begin - ut_event_manager.trigger_event( - 'get_annotation_objs_info - start ( a_full_scan = ' || ut_utils.to_string(a_full_scan) || ' )' - ); + l_cached_objects := ut_annotation_cache_manager.get_cached_objects_list( a_object_owner, a_object_type ); + + if l_cached_objects is not empty then + execute immediate 'select /*+ cardinality(i '||ut_utils.scale_cardinality(cardinality(l_cached_objects))||') */ + value(i) + from table( :l_data ) i + where + not exists ( + select 1 from '||l_objects_view||q'[ o + where o.owner = i.object_owner + and o.object_name = i.object_name + and o.object_type = i.object_type + and o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'[' + and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'[' + )]' + bulk collect into l_object_to_delete + using l_cached_objects; + end if; + return l_object_to_delete; + end; - l_data := ut_annotation_cache_manager.get_annotations_objects_info(a_object_owner, a_object_type); + function get_objects_to_refresh( + a_object_owner varchar2, + a_object_type varchar2, + a_modified_after timestamp + ) return ut_annotation_objs_cache_info is + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_refresh_needed boolean; + l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); + l_cached_objects ut_annotation_objs_cache_info; + l_result ut_annotation_objs_cache_info; + begin + ut_event_manager.trigger_event( 'get_objects_to_refresh - start' ); - if not a_full_scan then - l_result := l_data; - else - l_cursor_text := - 'select /*+ cardinality(i '||ut_utils.scale_cardinality(cardinality(l_data))||') */ - '||l_ut_owner||q'[.ut_annotation_obj_cache_info( - object_owner => o.owner, - object_name => o.object_name, - object_type => o.object_type, - needs_refresh => case when o.last_ddl_time < cast(i.parse_time as date) then 'N' else 'Y' end, - parse_time => i.parse_time - ) - from ]'||l_objects_view||' o - left join table( cast(:l_data as '||l_ut_owner||q'[.ut_annotation_objs_cache_info ) ) i - on o.owner = i.object_owner - and o.object_name = i.object_name - and o.object_type = i.object_type - where o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'[' - and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'[' - and ]' + l_refresh_needed := ( ut_trigger_check.is_alive() = false ) or a_modified_after is null; + l_cached_objects := ut_annotation_cache_manager.get_cached_objects_list( a_object_owner, a_object_type, a_modified_after ); + if l_refresh_needed then + --limit the list to objects that exist and are visible to the invoking user + --enrich the list by info about cache validity + execute immediate + 'select /*+ cardinality(i '||ut_utils.scale_cardinality(cardinality(l_cached_objects))||') */ + '||l_ut_owner||q'[.ut_annotation_obj_cache_info( + object_owner => o.owner, + object_name => o.object_name, + object_type => o.object_type, + needs_refresh => 'Y', + parse_time => c.parse_time + ) + from ]'||l_objects_view||' o + left join table( cast(:l_cached_objects as '||l_ut_owner||q'[.ut_annotation_objs_cache_info ) ) c + on o.owner = c.object_owner + and o.object_name = c.object_name + and o.object_type = c.object_type + where o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'[' + and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'[' + and case when o.last_ddl_time < cast(c.parse_time as date) then 'N' else 'Y' end = 'Y' + and ]' || case - when a_parse_date is null - then ':a_parse_date is null' - else 'o.last_ddl_time >= cast(:a_parse_date as date)' - end; - open l_rows for l_cursor_text using l_data, a_parse_date; - fetch l_rows bulk collect into l_result limit ut_utils.gc_max_objects_fetch_limit; - close l_rows; + when a_modified_after is null + then ':a_modified_after is null' + else 'o.last_ddl_time >= cast(:a_modified_after as date)' + end + bulk collect into l_result using l_cached_objects, a_modified_after; + else + l_result := l_cached_objects; end if; - ut_event_manager.trigger_event('get_annotation_objs_info - end (count='||l_result.count||')'); + ut_event_manager.trigger_event('get_objects_to_refresh - end (count='||l_result.count||')'); return l_result; end; @@ -109,24 +108,24 @@ create or replace package body ut_annotation_manager as begin l_card := ut_utils.scale_cardinality(cardinality(a_objects_to_refresh)); open l_result for - q'[select s.name, s.text + q'[select x.name, x.text from (select /*+ cardinality( r ]'||l_card||q'[ )*/ s.name, s.text, s.line, max(case when s.text like '%--%\%%' escape '\' - and regexp_like(s.text,'--\s*%') + and regexp_like(s.text,'^\s*--\s*%') then 'Y' else 'N' end ) over(partition by s.name) is_annotated from table(:a_objects_to_refresh) r join ]'||l_sources_view||q'[ s - on s.name = r.object_name + on s.name = r.object_name and s.owner = r.object_owner - and s.type = r.object_type - where s.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'[' - and s.type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'[' - ) s - where s.is_annotated = 'Y' - order by s.name, s.line]' + and s.type = r.object_type + where s.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'[' + and s.type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'[' + ) x + where x.is_annotated = 'Y' + order by x.name, x.line]' using a_objects_to_refresh; return l_result; @@ -174,47 +173,57 @@ create or replace package body ut_annotation_manager as end; - procedure refresh_annotation_cache( - a_object_owner varchar2, - a_object_type varchar2, - a_info_rows ut_annotation_objs_cache_info + procedure validate_annotation_cache( + a_object_owner varchar2, + a_object_type varchar2, + a_modified_after timestamp := null ) is - l_objects_to_parse ut_annotation_objs_cache_info; + l_objects_to_refresh ut_annotation_objs_cache_info; + l_modified_after timestamp := a_modified_after; begin - select value(x) - bulk collect into l_objects_to_parse - from table(a_info_rows) x where x.needs_refresh = 'Y'; + if ut_annotation_cache_manager.get_cache_schema_info(a_object_owner, a_object_type).full_refresh_time is null then + l_modified_after := null; + end if; - ut_event_manager.trigger_event('rebuild_annotation_cache - start (l_objects_to_parse.count = '||l_objects_to_parse.count||')'); - ut_annotation_cache_manager.cleanup_cache(l_objects_to_parse); + l_objects_to_refresh := get_objects_to_refresh(a_object_owner, a_object_type, l_modified_after); - if sys_context('userenv','current_schema') = a_object_owner - or ut_metadata.user_has_execute_any_proc() - or ut_metadata.is_object_visible('dba_objects') - then - ut_annotation_cache_manager.remove_from_cache( - get_missing_objects(a_object_owner, a_object_type) - ); + ut_event_manager.trigger_event('validate_annotation_cache - start (l_objects_to_refresh.count = '||l_objects_to_refresh.count||')'); + + + if user_can_see_whole_schema( a_object_owner ) then + --Remove non existing objects from cache only when user can see whole schema + ut_annotation_cache_manager.remove_from_cache( get_non_existing_objects( a_object_owner, a_object_type ) ); end if; --if some source needs parsing and putting into cache - if l_objects_to_parse.count > 0 then + if l_objects_to_refresh.count > 0 then + --Delete annotations for objects that are to be refreshed + ut_annotation_cache_manager.reset_objects_cache(l_objects_to_refresh); + --Rebuild cache from objects source build_annot_cache_for_sources( a_object_owner, a_object_type, - get_sources_to_annotate(a_object_owner, a_object_type, l_objects_to_parse) + get_sources_to_annotate(a_object_owner, a_object_type, l_objects_to_refresh) ); end if; - ut_event_manager.trigger_event('rebuild_annotation_cache - end'); + + if l_modified_after is null then + if user_can_see_whole_schema( a_object_owner ) then + ut_annotation_cache_manager.set_fully_refreshed( a_object_owner, a_object_type ); + else + -- if user cannot see full schema - we dont mark it as fully refreshed + -- it will get refreshed each time until someone with proper privs will refresh it + null; + end if; + end if; + ut_event_manager.trigger_event('validate_annotation_cache - end'); end; ------------------------------------------------------------ --public definitions ------------------------------------------------------------ procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2) is - l_annotation_objs_info ut_annotation_objs_cache_info; begin - l_annotation_objs_info := get_annotation_objs_info(a_object_owner, a_object_type, null, true); - refresh_annotation_cache( a_object_owner, a_object_type, l_annotation_objs_info ); + validate_annotation_cache( a_object_owner, a_object_type ); end; procedure trigger_obj_annotation_rebuild is @@ -295,17 +304,14 @@ create or replace package body ut_annotation_manager as end if; end; - function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_parse_date timestamp := null) return sys_refcursor is - l_annotation_objs_info ut_annotation_objs_cache_info; + function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_modified_after timestamp) return sys_refcursor is l_cursor sys_refcursor; - l_full_scan_needed boolean := not ut_trigger_check.is_alive(); begin - ut_event_manager.trigger_event('get_annotated_objects - start'); - l_annotation_objs_info := get_annotation_objs_info(a_object_owner, a_object_type, a_parse_date, l_full_scan_needed); - refresh_annotation_cache(a_object_owner, a_object_type, l_annotation_objs_info); + ut_event_manager.trigger_event('get_annotated_objects - start: a_modified_after='||ut_utils.to_string(a_modified_after)); + validate_annotation_cache(a_object_owner, a_object_type, a_modified_after); --pipe annotations from cache - l_cursor := ut_annotation_cache_manager.get_annotations_for_objects(l_annotation_objs_info, a_parse_date); + l_cursor := ut_annotation_cache_manager.get_annotations_parsed_since(a_object_owner, a_object_type, a_modified_after); ut_event_manager.trigger_event('get_annotated_objects - end'); return l_cursor; end; @@ -315,5 +321,5 @@ create or replace package body ut_annotation_manager as ut_annotation_cache_manager.purge_cache(a_object_owner, a_object_type); end; -end ut_annotation_manager; +end; / diff --git a/source/core/annotations/ut_annotation_manager.pks b/source/core/annotations/ut_annotation_manager.pks index 1d6bd3d71..70257afac 100644 --- a/source/core/annotations/ut_annotation_manager.pks +++ b/source/core/annotations/ut_annotation_manager.pks @@ -23,18 +23,17 @@ create or replace package ut_annotation_manager authid current_user as /** * Gets annotations for all objects of a specified type for database schema. * Annotations that are stale or missing are parsed and placed in persistent cache. - * After placing in cache, annotation data is returned as pipelined table data. + * After placing in cache, annotation data is returned as ref_cursor. * - * @param a_object_owner owner of objects to get annotations for - * @param a_object_type type of objects to get annotations for - * @param a_parse_date date when object was last parsed - * @return array containing annotated objects along with annotations for each object (nested) + * @param a_object_owner owner of objects to get annotations for + * @param a_object_type type of objects to get annotations for + * @param a_modified_after return only objects modified after thr timestamp + * @return cursor containing annotated objects along with annotations for each object (nested) */ - function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_parse_date timestamp := null) return sys_refcursor; + function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_modified_after timestamp) return sys_refcursor; /** * Rebuilds annotation cache for a specified schema and object type. - * The procedure is called internally by `get_annotated_objects` function. * It can be used to speedup initial execution of utPLSQL on a given schema * if it is executed before any call is made to `ut.run` or `ut_runner.run` procedure. * @@ -57,5 +56,5 @@ create or replace package ut_annotation_manager authid current_user as procedure purge_cache(a_object_owner varchar2, a_object_type varchar2); -end ut_annotation_manager; +end; / diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index bbe58a667..6248f36b9 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -212,14 +212,6 @@ create or replace package body ut_annotation_parser as select value(x) bulk collect into l_result from table(l_annotations) x order by x.position; - -- printing out parsed structure for debugging - $if $$ut_trace $then - print_parse_results(l_result); - dbms_output.put_line('Annotations count: ' || l_result.count); - for i in 1 .. l_result.count loop - dbms_output.put_line(xmltype(l_result(i)).getclobval()); - end loop; - $end return l_result; end parse_object_annotations; @@ -229,7 +221,8 @@ create or replace package body ut_annotation_parser as l_annotations ut_annotations := ut_annotations(); ex_package_is_wrapped exception; pragma exception_init(ex_package_is_wrapped, -24241); - + source_text_is_empty exception; + pragma exception_init(source_text_is_empty, -24236); begin if a_source_lines.count > 0 then --convert to post-processed source clob @@ -248,12 +241,12 @@ create or replace package body ut_annotation_parser as l_annotations := parse_object_annotations(l_source); dbms_lob.freetemporary(l_source); exception - when ex_package_is_wrapped then + when ex_package_is_wrapped or source_text_is_empty then null; end; end if; return l_annotations; end; -end ut_annotation_parser; +end; / diff --git a/source/core/annotations/ut_annotation_parser.pks b/source/core/annotations/ut_annotation_parser.pks index b0a61e576..0368811db 100644 --- a/source/core/annotations/ut_annotation_parser.pks +++ b/source/core/annotations/ut_annotation_parser.pks @@ -40,5 +40,5 @@ create or replace package ut_annotation_parser authid current_user as */ function parse_object_annotations(a_source clob) return ut_annotations; -end ut_annotation_parser; +end; / diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index e07acd3b2..76d3aa11c 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -22,9 +22,7 @@ create or replace package body ut_trigger_check is function is_alive return boolean is pragma autonomous_transaction; begin - if not g_is_trigger_live then - execute immediate 'create or replace synonym '||ut_utils.ut_owner||'.'||gc_check_object_name||' for no_object'; - end if; + execute immediate 'create or replace synonym '||ut_utils.ut_owner||'.'||gc_check_object_name||' for no_object'; return g_is_trigger_live; end; diff --git a/source/core/types/ut_suite_cache_row.tps b/source/core/types/ut_suite_cache_row.tps index fb4a8bb9f..d9f542de3 100644 --- a/source/core/types/ut_suite_cache_row.tps +++ b/source/core/types/ut_suite_cache_row.tps @@ -15,26 +15,26 @@ create type ut_suite_cache_row as object ( See the License for the specific language governing permissions and limitations under the License. */ - id number(22,0), - self_type varchar2(250 byte), - path varchar2(1000 byte), - object_owner varchar2(250 byte), - object_name varchar2(250 byte), - name varchar2(250 byte), - line_no number, - parse_time timestamp (6), - description varchar2(4000 byte), - rollback_type number, - disabled_flag number, - warnings ut_varchar2_rows, - before_all_list ut_executables, - after_all_list ut_executables, - before_each_list ut_executables, - before_test_list ut_executables, - after_each_list ut_executables, - after_test_list ut_executables, + id number(22,0), + self_type varchar2(250 byte), + path varchar2(1000 byte), + object_owner varchar2(250 byte), + object_name varchar2(250 byte), + name varchar2(250 byte), + line_no number, + parse_time timestamp (6), + description varchar2(4000 byte), + rollback_type number, + disabled_flag number, + warnings ut_varchar2_rows, + before_all_list ut_executables, + after_all_list ut_executables, + before_each_list ut_executables, + before_test_list ut_executables, + after_each_list ut_executables, + after_test_list ut_executables, expected_error_codes ut_varchar2_rows, - tags ut_varchar2_rows, - item ut_executable_test + tags ut_varchar2_rows, + item ut_executable_test ) / \ No newline at end of file diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 05984da3f..7c4b1ee93 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -23,7 +23,7 @@ create or replace package body ut_suite_cache_manager is gc_get_cache_suite_sql constant varchar2(32767) := q'[with suite_items as ( - select /*+ cardinality(c 100) */ value(c) as obj + select /*+ cardinality(c 500) */ value(c) as obj from ut_suite_cache c where 1 = 1 and c.object_owner = :l_object_owner @@ -87,7 +87,7 @@ create or replace package body ut_suite_cache_manager is l_result ut_varchar2_rows; l_data ut_annotation_objs_cache_info; begin - l_data := ut_annotation_cache_manager.get_annotations_objects_info(a_object_owner, 'PACKAGE'); + l_data := ut_annotation_cache_manager.get_cached_objects_list(a_object_owner, 'PACKAGE'); select i.object_name bulk collect into l_result @@ -258,7 +258,7 @@ create or replace package body ut_suite_cache_manager is select min(t.parse_time) into l_cache_parse_time from ut_suite_cache_schema t - where object_owner = a_schema_name; + where object_owner = upper(a_schema_name); return l_cache_parse_time; end; @@ -380,13 +380,16 @@ create or replace package body ut_suite_cache_manager is pragma autonomous_transaction; begin l_objects := get_missing_cache_objects(a_schema_name); - delete from ut_suite_cache i - where i.object_owner = a_schema_name - and i.object_name in ( select column_value from table (l_objects) ); - delete from ut_suite_cache_package i - where i.object_owner = a_schema_name - and i.object_name in ( select column_value from table (l_objects) ); + if l_objects is not empty then + delete from ut_suite_cache i + where i.object_owner = a_schema_name + and i.object_name in ( select column_value from table (l_objects) ); + + delete from ut_suite_cache_package i + where i.object_owner = a_schema_name + and i.object_name in ( select column_value from table (l_objects) ); + end if; commit; end; @@ -459,5 +462,5 @@ create or replace package body ut_suite_cache_manager is return l_count > 0; end; -end ut_suite_cache_manager; +end; / diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 13f64d1bd..26de41e0e 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -512,9 +512,11 @@ create or replace package body ut_utils is procedure flush_lines(a_lines ut_varchar2_rows, a_offset integer) is begin - insert into ut_dbms_output_cache (seq_no,text) - select rownum+a_offset, column_value - from table(a_lines); + if a_lines is not empty then + insert into ut_dbms_output_cache (seq_no,text) + select rownum+a_offset, column_value + from table(a_lines); + end if; end; begin loop @@ -534,7 +536,7 @@ create or replace package body ut_utils is procedure read_cache_to_dbms_output is l_lines_data sys_refcursor; l_lines ut_varchar2_rows; - c_lines_limit constant integer := 1000; + c_lines_limit constant integer := 10000; pragma autonomous_transaction; begin open l_lines_data for select text from ut_dbms_output_cache order by seq_no; diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb index d564e5d57..15bbee21a 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -1,45 +1,45 @@ create or replace package body test_annotation_manager is - procedure disable_ddl_trigger is + procedure exec_autonomous(a_sql varchar2) is pragma autonomous_transaction; begin - execute immediate 'alter trigger ut3.ut_trigger_annotation_parsing disable'; - execute immediate 'begin ut3.ut_trigger_check.is_alive(); end;'; + execute immediate a_sql; + end; + + procedure disable_ddl_trigger is + begin + exec_autonomous('alter trigger ut3.ut_trigger_annotation_parsing disable'); + exec_autonomous('begin ut3.ut_trigger_check.is_alive(); end;'); end; procedure enable_ddl_trigger is - pragma autonomous_transaction; begin - execute immediate 'alter trigger ut3.ut_trigger_annotation_parsing enable'; + exec_autonomous('alter trigger ut3.ut_trigger_annotation_parsing enable'); end; procedure create_dummy_package is - pragma autonomous_transaction; begin - execute immediate q'[create or replace package dummy_package as + exec_autonomous(q'[create or replace package dummy_package as procedure some_dummy_procedure; - end;]'; + end;]'); end; procedure drop_dummy_package is - pragma autonomous_transaction; begin - execute immediate q'[drop package dummy_package]'; + exec_autonomous(q'[drop package dummy_package]'); exception when others then null; end; procedure recompile_dummy_package is - pragma autonomous_transaction; begin - execute immediate q'[alter package dummy_package compile]'; + exec_autonomous(q'[alter package dummy_package compile]'); end; procedure create_dummy_test_package is - pragma autonomous_transaction; begin - execute immediate q'[ + exec_autonomous(q'[ /* * Some multiline comments before package spec create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code @@ -55,34 +55,31 @@ create or replace package body test_annotation_manager is --%test(dummy_test) --%beforetest(some_procedure) procedure some_dummy_test_procedure; - end;]'; - execute immediate q'[grant execute on dummy_test_package to public]'; + end;]'); + exec_autonomous(q'[grant execute on dummy_test_package to public]'); end; procedure modify_dummy_test_package is - pragma autonomous_transaction; begin - execute immediate q'[create or replace package dummy_test_package as + exec_autonomous(q'[create or replace package dummy_test_package as --%suite(dummy_test_suite) --%test(dummy_test) procedure some_dummy_test_procedure; - end;]'; + end;]'); end; procedure drop_dummy_test_package is - pragma autonomous_transaction; begin - execute immediate q'[drop package dummy_test_package]'; + exec_autonomous(q'[drop package dummy_test_package]'); exception when others then null; end; procedure recompile_dummy_test_package is - pragma autonomous_transaction; begin - execute immediate q'[alter package dummy_test_package compile]'; + exec_autonomous(q'[alter package dummy_test_package compile]'); end; procedure create_parse_proc_as_ut3$user# is @@ -128,35 +125,31 @@ create or replace package body test_annotation_manager is ut.expect(l_actual).to_be_empty(); end; - procedure assert_dummy_test_package(a_start_date date) is + procedure assert_dummy_test_package(a_start_time timestamp) is l_actual_cache_id integer; + l_data ut3.ut_annotated_objects; + l_result sys_refcursor; l_actual sys_refcursor; l_expected sys_refcursor; begin - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' - and parse_time >= a_start_date; - ut.expect(l_actual_cache_id).to_be_not_null; - - open l_actual for - select annotation_position, annotation_name, annotation_text, subobject_name - from ut3.ut_annotation_cache where cache_id = l_actual_cache_id - order by annotation_position; - open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, - 'dummy_test_suite' as annotation_text, '' as subobject_name - from dual union all - select 3, 'rollback' , 'manual', '' as subobject_name - from dual union all - select 7, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name - from dual union all - select 8, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name - from dual; - - ut.expect(l_actual).to_equal(l_expected); + select + ut3.ut_annotated_object( + sys_context('USERENV', 'CURRENT_USER'), + 'DUMMY_TEST_PACKAGE', 'PACKAGE', a_start_time, + ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', 'dummy_test_suite', null ), + ut3.ut_annotation( 3, 'rollback', 'manual', null ), + ut3.ut_annotation( 7, 'test', 'dummy_test', 'some_dummy_test_procedure' ), + ut3.ut_annotation( 8, 'beforetest', 'some_procedure', 'some_dummy_test_procedure' ) + ) + ) annotated_object + from dual; + + l_result := ut3.ut_annotation_manager.get_annotated_objects(sys_context('USERENV', 'CURRENT_USER'), 'PACKAGE', a_start_time); + fetch l_result bulk collect into l_data; + open l_actual for select value(x) as annotated_object from table(l_data) x where object_name = 'DUMMY_TEST_PACKAGE'; + ut.expect(l_actual).to_equal(l_expected).exclude('ANNOTATED_OBJECT/PARSE_TIME').join_by('ANNOTATED_OBJECT/OBJECT_NAME'); end; @@ -259,74 +252,123 @@ create or replace package body test_annotation_manager is end; - --%test(Updates annotation cache when package recompiled) - procedure trg_update_modified_package is + procedure trg_populate_cache_after_purge is + l_start_date date; begin - null; + --Arrange + create_dummy_test_package(); + l_start_date := sysdate; + ut3.ut_annotation_manager.purge_cache(sys_context('USERENV', 'CURRENT_USER'), 'PACKAGE'); + --Act & Assert + assert_dummy_test_package(l_start_date); end; - procedure add_new_package is - l_actual_cache_id integer; - l_actual sys_refcursor; - l_start_date date; + procedure add_annotated_package is + l_start_time timestamp := systimestamp; begin + --Arrange + create_dummy_test_package(); + --Act & Assert + assert_dummy_test_package( l_start_time ); + end; + + procedure remove_annotated_package is + l_start_time timestamp := systimestamp; + begin + --Arrange + create_dummy_test_package(); + assert_dummy_test_package( l_start_time ); + --Act - l_start_date := sysdate; - ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + drop_dummy_test_package(); + --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' - and parse_time >= l_start_date; + ut.expect( + ut3.ut_annotation_manager.get_annotated_objects( + sys_context( 'USERENV', 'CURRENT_USER' ), 'PACKAGE', l_start_time + ), + 'Annotations are empty after package was dropped' + ).to_be_empty(); + end; - ut.expect(l_actual_cache_id).to_be_not_null; + procedure add_not_annotated_package is + l_start_time timestamp := systimestamp; + begin + --Arrange + create_dummy_package(); + --Act & Assert + ut.expect( + ut3.ut_annotation_manager.get_annotated_objects( + sys_context( 'USERENV', 'CURRENT_USER' ), 'PACKAGE', l_start_time + ), + 'Annotations are empty for not annotated package' + ).to_be_empty(); + end; - open l_actual for - select * - from ut3.ut_annotation_cache - where cache_id = l_actual_cache_id; + procedure remove_not_annotated_package is + l_start_time timestamp := systimestamp; + begin + --Arrange + create_dummy_package(); + ut.expect( + ut3.ut_annotation_manager.get_annotated_objects( + sys_context( 'USERENV', 'CURRENT_USER' ), 'PACKAGE', l_start_time + ), + 'Annotations are empty for non annotated package' + ).to_be_empty(); - ut.expect(l_actual).to_be_empty(); + --Act + drop_dummy_package(); + --Assert + ut.expect( + ut3.ut_annotation_manager.get_annotated_objects( + sys_context( 'USERENV', 'CURRENT_USER' ), 'PACKAGE', l_start_time + ), + 'Annotations are empty after non annoteted package was dropped' + ).to_be_empty(); end; - procedure update_modified_package is - l_actual integer; - l_start_date date; + procedure remove_annotations_from_pkg is + l_start_time timestamp := systimestamp; begin --Arrange - l_start_date := sysdate; - ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); - recompile_dummy_package(); - l_start_date := sysdate; - $if dbms_db_version.version >= 18 $then - dbms_session.sleep(1); - $else - dbms_lock.sleep(1); - $end + create_dummy_test_package(); + assert_dummy_test_package( l_start_time ); --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + exec_autonomous(q'[create or replace package dummy_test_package as + procedure some_dummy_test_procedure; + end;]'); + --Assert - assert_dummy_package(l_start_date); + ut.expect( + ut3.ut_annotation_manager.get_annotated_objects( + sys_context( 'USERENV', 'CURRENT_USER' ), 'PACKAGE', l_start_time + ) + ).to_be_empty(); end; - - procedure add_new_test_package is - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; + procedure add_annotations_to_package is + l_start_time timestamp := systimestamp; begin --Arrange - l_start_date := sysdate; + exec_autonomous(q'[create or replace package dummy_test_package as + procedure some_dummy_test_procedure; + end;]'); + ut.expect( + ut3.ut_annotation_manager.get_annotated_objects( + sys_context( 'USERENV', 'CURRENT_USER' ), 'PACKAGE', l_start_time + ) + ).to_be_empty(); + --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + create_dummy_test_package(); + --Assert - assert_dummy_test_package(l_start_date); + assert_dummy_test_package( l_start_time ); end; - procedure update_modified_test_package is l_actual_cache_id integer; l_actual sys_refcursor; @@ -365,29 +407,35 @@ create or replace package body test_annotation_manager is procedure keep_dropped_data_in_cache is - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; + l_cache_count integer; + l_start_date date; begin - parse_dummy_test_as_ut3$user#(); l_start_date := sysdate; + parse_dummy_test_as_ut3$user#(); drop_dummy_test_package(); --Act parse_dummy_test_as_ut3$user#(); --Assert - assert_dummy_test_package(l_start_date); + select count(1) + into l_cache_count + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') + and object_type = 'PACKAGE' + and object_name = 'DUMMY_TEST_PACKAGE' + and parse_time > l_start_date; + ut.expect( l_cache_count ).to_equal(1); end; procedure no_data_for_dropped_object is - l_result sys_refcursor; - l_data ut3.ut_annotated_objects; - l_actual sys_refcursor; + l_result sys_refcursor; + l_data ut3.ut_annotated_objects; + l_actual sys_refcursor; + l_start_time timestamp := systimestamp; begin --Arrange - ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); drop_dummy_test_package(); --Act - l_result := ut3.ut_annotation_manager.get_annotated_objects(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + l_result := ut3.ut_annotation_manager.get_annotated_objects( sys_context('USERENV', 'CURRENT_USER'),'PACKAGE', l_start_time ); fetch l_result bulk collect into l_data; open l_actual for select object_name from table(l_data) where object_name = 'DUMMY_TEST_PACKAGE'; --Assert @@ -396,13 +444,9 @@ create or replace package body test_annotation_manager is procedure cleanup_dropped_data_in_cache is l_cache_count integer; - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; begin --Arrange ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); - l_start_date := sysdate; drop_dummy_test_package(); --Act ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); @@ -418,5 +462,16 @@ create or replace package body test_annotation_manager is end; + procedure populate_cache_after_purge is + l_start_date date; + begin + --Arrange + create_dummy_test_package(); + l_start_date := sysdate; + ut3.ut_annotation_manager.purge_cache(sys_context('USERENV', 'CURRENT_USER'), 'PACKAGE'); + --Act & Assert + assert_dummy_test_package(l_start_date); + end; + end test_annotation_manager; / diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks index fd5bc3410..cb0b85104 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pks +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -45,12 +45,13 @@ create or replace package test_annotation_manager is --%beforetest(create_dummy_test_package) procedure trg_no_data_for_dropped_object; - --%test(Updates annotation cache when package recompiled) - procedure trg_update_modified_package; + --%disabled(TODO) + --%test(Objects are populated on scan after cache was purged) + procedure trg_populate_cache_after_purge; --%endcontext - --%context(Without DDL trigger enabled) + --%context(Without DDL trigger) --%beforeall(disable_ddl_trigger) @@ -59,16 +60,29 @@ create or replace package test_annotation_manager is --%beforeeach(create_dummy_package) --%aftereach(drop_dummy_package) - --%test(Adds new package to annotation cache info when it is not unit test package) - procedure add_new_package; + --%test(Returns annotations when annotated package was created) + --%aftertest(drop_dummy_test_package) + procedure add_annotated_package; + + --%test(Doesn't return annotations when annotated package was removed) + --%aftertest(drop_dummy_test_package) + procedure remove_annotated_package; - --%test(Updates annotation cache info for modified package) - procedure update_modified_package; + --%test(Doesn't return annotations when package doesn't contain annotations) + --%aftertest(drop_dummy_package) + procedure add_not_annotated_package; - --%test(Adds annotations to cache for unit test package) - --%beforetest(create_dummy_test_package) + --%test(Doesn't return annotations when package without annotations was dropped) + --%aftertest(drop_dummy_package) + procedure remove_not_annotated_package; + + --%test(Doesn't return annotations when annotations removed from package) + --%aftertest(drop_dummy_test_package) + procedure remove_annotations_from_pkg; + + --%test(Returns annotations when annotations were added to package) --%aftertest(drop_dummy_test_package) - procedure add_new_test_package; + procedure add_annotations_to_package; --%test(Updates annotations in cache for modified test package) procedure update_modified_test_package; @@ -84,6 +98,9 @@ create or replace package test_annotation_manager is --%test(Remove object from cache when object dropped and user can see whole schema) procedure cleanup_dropped_data_in_cache; + --%test(Objects are populated on scan after cache was purged) + procedure populate_cache_after_purge; + --%endcontext end test_annotation_manager; diff --git a/test/ut3_tester/core/test_suite_manager.pkb b/test/ut3_tester/core/test_suite_manager.pkb index e693771b4..fd35adc70 100644 --- a/test/ut3_tester/core/test_suite_manager.pkb +++ b/test/ut3_tester/core/test_suite_manager.pkb @@ -1437,7 +1437,7 @@ end;]'; l_expected := ut3.ut_object_names( ut3.ut_object_name('UT3','SOME_TEST_PACKAGE') ); - l_actual := ut3_tester_helper.run_helper.get_object_name('UT3'); + l_actual := ut3_tester_helper.run_helper.get_schema_ut_packages('UT3'); ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); end; @@ -1458,7 +1458,7 @@ end;]'; l_expected_message varchar2(500); begin l_expected_message := q'[ORA-20217: 'Suitepath exceeds 1000 CHAR on: UT3.DUMMY_LONG_TEST_PACKAGE,UT3.DUMMY_LONG_TEST_PACKAGE1'%]'; - l_actual := ut3_tester_helper.run_helper.get_object_name('UT3'); + l_actual := ut3_tester_helper.run_helper.get_schema_ut_packages('UT3'); ut.fail('Expected exception for suitpaths over 1k for two packages'); exception when others then diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 9a9c8587f..70695977b 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -614,7 +614,7 @@ create or replace package body run_helper is execute immediate q'[drop package ut3.some_test_package]'; end; - function get_object_name(a_owner in varchar2) return ut3.ut_object_names is + function get_schema_ut_packages(a_owner in varchar2) return ut3.ut_object_names is begin return ut3.ut_suite_manager.get_schema_ut_packages(ut3.ut_varchar2_rows(a_owner)); end; diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 0f5e5a925..03eb314a7 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -59,7 +59,7 @@ create or replace package run_helper is procedure drop_dummy_long_test_package; procedure create_ut3_suite; procedure drop_ut3_suite; - function get_object_name(a_owner in varchar2) return ut3.ut_object_names; + function get_schema_ut_packages(a_owner in varchar2) return ut3.ut_object_names; function ut_output_buffer_tmp return t_out_buff_tab pipelined; procedure delete_buffer; From 335e420f7a70eb60aed97909122da2c5ad91ef1a Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Tue, 12 Nov 2019 01:09:13 +0000 Subject: [PATCH 40/51] Fixed loophole in privilege check. --- source/core/types/ut_executable_test.tpb | 2 +- source/core/ut_metadata.pkb | 2 +- source/core/ut_suite_manager.pkb | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/core/types/ut_executable_test.tpb b/source/core/types/ut_executable_test.tpb index 89ab16dab..6f25ea1c8 100644 --- a/source/core/types/ut_executable_test.tpb +++ b/source/core/types/ut_executable_test.tpb @@ -160,7 +160,7 @@ create or replace type body ut_executable_test as l_fail_message := 'Expected one of exceptions ('||l_expected_error_codes||') but nothing was raised.'; else l_actual_error_no := regexp_substr(self.error_stack, '^[a-zA-Z]{3}(-[0-9]+)', subexpression=>1); - if not l_actual_error_no member of a_expected_error_codes then + if not l_actual_error_no member of a_expected_error_codes or l_actual_error_no is null then l_fail_message := 'Actual: '||l_actual_error_no||' was expected to '; if cardinality(a_expected_error_codes) > 1 then l_fail_message := l_fail_message || 'be one of: ('||l_expected_error_codes||')'; diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index 7859d6b3f..5448f1b5f 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -123,7 +123,7 @@ create or replace package body ut_metadata as function user_has_execute_any_proc return boolean is l_ut_owner varchar2(250) := ut_utils.ut_owner; begin - return is_object_visible(l_ut_owner||'.ut_utils'); + return is_object_visible(l_ut_owner||'.ut_utils') and sys_context('userenv','current_schema') != l_ut_owner; end; function is_object_visible(a_object_name varchar2) return boolean is diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index e71a51dc8..30bcd4db2 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -373,7 +373,10 @@ create or replace package body ut_suite_manager is a_owner_name varchar2 ) return boolean is begin - return sys_context( 'userenv', 'current_schema' ) = a_owner_name or ut_metadata.user_has_execute_any_proc() or ut_trigger_check.is_alive(); + return sys_context( 'userenv', 'current_schema' ) = a_owner_name or ut_metadata.user_has_execute_any_proc() + or ( ut_trigger_check.is_alive() + and ut_annotation_cache_manager.get_cache_schema_info(a_owner_name, 'PACKAGE').full_refresh_time is not null + ); end; procedure build_and_cache_suites( From 054c39fb522fd456aeb39545d395bb840296db7c Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Feb 2020 00:02:29 +0000 Subject: [PATCH 41/51] Fixed issues with new cursor-results compare query on 11g --- .../data_values/ut_compound_data_helper.pkb | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 6a6b30a50..69ba90811 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -119,8 +119,6 @@ create or replace package body ut_compound_data_helper is || case when a_order_enforced then q'[ --column position is not matching (both when excluded extra/missing columns as well as when they are included) or (a_pos_nn != e_pos_nn and exp_col_pos != act_col_pos)]' - else - null end ||q'[ order by exp_col_pos, act_col_pos]' bulk collect into l_results using a_expected, a_actual; @@ -426,34 +424,34 @@ create or replace package body ut_compound_data_helper is end if; l_sql := q'[ with - exp_rows as( - select - exp_data_id, extract( exp_item_data, :column_path ) exp_item_data, item_no, diff_id - from ut_compound_data_diff_tmp - where diff_id = :diff_id - and exp_data_id = :self_guid - ), - act_rows as ( - select - act_data_id, extract( act_item_data, :column_path ) act_item_data, item_no, diff_id - from ut_compound_data_diff_tmp ucd - where diff_id = :diff_id - and ucd.act_data_id = :other_guid - ), exp_cols as ( select - exp_item_data, exp_data_id, item_no rn, rownum col_no, diff_id, + i.exp_item_data, i.exp_data_id, i.item_no rn, rownum col_no, i.diff_id, s.column_value col, s.column_value.getRootElement() col_name, - nvl(s.column_value.getclobval(),empty_clob()) col_val - from exp_rows i, + nvl( s.column_value.getclobval(), empty_clob() ) col_val + from ( + select + ucd.exp_data_id, extract( ucd.exp_item_data, :column_path ) exp_item_data, + ucd.item_no, ucd.diff_id + from ut_compound_data_diff_tmp ucd + where ucd.diff_id = :diff_id + and ucd.exp_data_id = :self_guid + ) i, table( xmlsequence( extract( i.exp_item_data, :extract_path ) ) ) s ), act_cols as ( select - act_item_data, act_data_id, item_no rn, rownum col_no, diff_id, + i.act_item_data, i.act_data_id, i.item_no rn, rownum col_no, i.diff_id, s.column_value col, s.column_value.getRootElement() col_name, - nvl(s.column_value.getclobval(),empty_clob()) col_val - from act_rows i, + nvl( s.column_value.getclobval(), empty_clob() ) col_val + from ( + select + ucd.act_data_id, extract( ucd.act_item_data, :column_path ) act_item_data, + ucd.item_no, ucd.diff_id + from ut_compound_data_diff_tmp ucd + where ucd.diff_id = :diff_id + and ucd.act_data_id = :other_guid + ) i, table( xmlsequence( extract( i.act_item_data, :extract_path ) ) ) s ), data_diff as ( @@ -496,7 +494,8 @@ create or replace package body ut_compound_data_helper is col_name from ( ]' || case when a_unordered then q'[ - select u.rn, u.diff_type, u.diffed_row, + select /*+ no_unnest */ + u.rn, u.diff_type, u.diffed_row, replace( extract( case when i.exp_data_id is null then i.act_item_data else i.exp_item_data end, :join_by ).getclobval(), chr(10) @@ -551,9 +550,8 @@ create or replace package body ut_compound_data_helper is end; execute immediate l_sql bulk collect into l_results - using l_exp_extract_xpath, a_diff_id, a_expected_dataset_guid, - l_act_extract_xpath, a_diff_id, a_actual_dataset_guid, - a_extract_path, a_extract_path, + using l_exp_extract_xpath, a_diff_id, a_expected_dataset_guid, a_extract_path, + l_act_extract_xpath, a_diff_id, a_actual_dataset_guid, a_extract_path, l_join_xpath, l_join_xpath, l_join_xpath, a_diff_id; return l_results; end; From b39c5be19044b75f112ad5c150e209c923c6dacb Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 17 Feb 2020 00:11:13 +0000 Subject: [PATCH 42/51] Added additional tests for annotation cache refresh with/without DDL trigger. Fixed issues found while testing the code. --- .travis/install.sh | 35 +- development/cleanup.sh | 5 + docs/userguide/install.md | 7 - .../ut_annotation_cache_manager.pkb | 9 +- source/core/ut_suite_manager.pkb | 11 +- test/install_ut3_tester_helper.sql | 4 + test/install_ut3_tester_tests.sql | 4 +- .../annotations/test_annotation_cache.pkb | 503 ++++++++++++++++++ .../annotations/test_annotation_cache.pks | 273 ++++++++++ .../annotations/test_annotation_manager.pkb | 23 +- .../annotations/test_annotation_manager.pks | 15 +- .../annotation_cache_helper.pkb | 167 ++++++ .../annotation_cache_helper.pks | 21 + 13 files changed, 1027 insertions(+), 50 deletions(-) create mode 100644 test/ut3_tester/core/annotations/test_annotation_cache.pkb create mode 100644 test/ut3_tester/core/annotations/test_annotation_cache.pks create mode 100644 test/ut3_tester_helper/annotation_cache_helper.pkb create mode 100644 test/ut3_tester_helper/annotation_cache_helper.pks diff --git a/.travis/install.sh b/.travis/install.sh index 4806105b1..dfcf63efb 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -74,12 +74,6 @@ PROMPT Creating $UT3_TESTER - Power-user for testing internal framework code create user $UT3_TESTER identified by "$UT3_TESTER_PASSWORD" default tablespace $UT3_TABLESPACE quota unlimited on $UT3_TABLESPACE; grant create session, create procedure, create type, create table to $UT3_TESTER; -PROMPT Additional grants for disabling DDL trigger and testing parser without trigger enabled/present - -grant alter any trigger to $UT3_TESTER; -grant administer database trigger to $UT3_TESTER; -grant execute on dbms_lock to $UT3_TESTER; - PROMPT Granting $UT3_OWNER code to $UT3_TESTER begin @@ -98,7 +92,7 @@ end; PROMPT Granting $UT3_OWNER tables to $UT3_TESTER begin - for i in ( select table_name from all_tables t where owner = 'UT3' and nested = 'NO' and IOT_NAME is NULL) + for i in ( select table_name from all_tables t where owner = 'UT3' and nested = 'NO' and iot_name is null) loop execute immediate 'grant select on UT3.'||i.table_name||' to UT3_TESTER'; end loop; @@ -124,8 +118,33 @@ grant create public database link to $UT3_TESTER_HELPER; grant drop public database link to $UT3_TESTER_HELPER; PROMPT Grants for testing coverage outside of main UT3 schema. -grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary, create any synonym, drop any synonym to $UT3_TESTER_HELPER; +grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, + select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, + select any dictionary, create any synonym, drop any synonym, + grant any object privilege, grant any privilege + to $UT3_TESTER_HELPER; + grant create job to $UT3_TESTER_HELPER; +PROMPT Additional grants for disabling DDL trigger and testing parser without trigger enabled/present + +grant alter any trigger to $UT3_TESTER_HELPER; +grant administer database trigger to $UT3_TESTER_HELPER; +grant execute on dbms_lock to $UT3_TESTER_HELPER; + +create user ut3_cache_test_owner identified by ut3; +grant create session, create procedure to ut3_cache_test_owner; + +create user ut3_no_extra_priv_user identified by ut3; +grant create session, create procedure to ut3_no_extra_priv_user; + +create user ut3_select_catalog_user identified by ut3; +grant create session, create procedure, select_catalog_role to ut3_select_catalog_user; + +create user ut3_select_any_table_user identified by ut3; +grant create session, create procedure, select any table to ut3_select_any_table_user; + +create user ut3_execute_any_proc_user identified by ut3; +grant create session, create procedure, execute any procedure to ut3_execute_any_proc_user; exit SQL diff --git a/development/cleanup.sh b/development/cleanup.sh index 313e382ca..4df1e43f5 100755 --- a/development/cleanup.sh +++ b/development/cleanup.sh @@ -23,6 +23,11 @@ drop user ${UT3_RELEASE_VERSION_SCHEMA} cascade; drop user ${UT3_TESTER} cascade; drop user ${UT3_TESTER_HELPER} cascade; drop user ${UT3_USER} cascade; +drop user ut3_cache_test_owner cascade; +drop user ut3_no_extra_priv_user cascade; +drop user ut3_select_catalog_user cascade; +drop user ut3_select_any_table_user cascade; +drop user ut3_execute_any_proc_user cascade; begin for i in ( diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 0a7a04b35..dd80f98ee 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -138,13 +138,6 @@ cd source sqlplus sys/sys_pass@db as sysdba @install_headless_with_trigger.sql utp3 my_verySecret_password utp3_tablespace ``` -**Note:** ->When installing utPLSQL into database with existing unit test packages, utPLSQL will not be able to already-existing unit test packages. When utPSLQL was installed with DDL trigger, you have to do one of: ->- Recompile existing Unit Test packages to make utPLSQL aware of their existence ->- Invoke `exec ut_runner.rebuild_annotation_cache(a_object_owner=> ... );` for every schema containing unit tests in your database -> -> Steps above are required to assure annotation cache is populated properly from existing objects. Rebuilding annotation cache might be faster than code recompilation. - # Recommended Schema It is highly recommended to install utPLSQL in it's own schema. You are free to choose any name for this schema. Installing uPLSQL into shared schema is really not recommended as you loose isolation of framework. diff --git a/source/core/annotations/ut_annotation_cache_manager.pkb b/source/core/annotations/ut_annotation_cache_manager.pkb index 6060d6a21..377dc4492 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pkb +++ b/source/core/annotations/ut_annotation_cache_manager.pkb @@ -78,6 +78,7 @@ create or replace package body ut_annotation_cache_manager as on o.object_name = i.object_name and o.object_type = i.object_type and o.object_owner = i.object_owner + and o.needs_refresh = 'Y' ); update ut_annotation_cache_schema s @@ -86,18 +87,22 @@ create or replace package body ut_annotation_cache_manager as in ( select o.object_owner, o.object_type from table(a_objects) o + where o.needs_refresh = 'Y' ); if sql%rowcount = 0 then insert into ut_annotation_cache_schema s (object_owner, object_type, max_parse_time) select distinct o.object_owner, o.object_type, l_timestamp - from table(a_objects) o; + from table(a_objects) o + where o.needs_refresh = 'Y'; end if; merge into ut_annotation_cache_info i using (select o.object_name, o.object_type, o.object_owner - from table(a_objects) o ) o + from table(a_objects) o + where o.needs_refresh = 'Y' + ) o on (o.object_name = i.object_name and o.object_type = i.object_type and o.object_owner = i.object_owner) diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 30bcd4db2..ee5063105 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -363,7 +363,8 @@ create or replace package body ut_suite_manager is where a.object_name = c.object_name and a.owner = c.object_owner and a.object_type = 'PACKAGE' - ); + ) + or c.self_type = 'UT_LOGICAL_SUITE'; end if; return l_result; @@ -373,10 +374,7 @@ create or replace package body ut_suite_manager is a_owner_name varchar2 ) return boolean is begin - return sys_context( 'userenv', 'current_schema' ) = a_owner_name or ut_metadata.user_has_execute_any_proc() - or ( ut_trigger_check.is_alive() - and ut_annotation_cache_manager.get_cache_schema_info(a_owner_name, 'PACKAGE').full_refresh_time is not null - ); + return sys_context( 'userenv', 'current_schema' ) = a_owner_name or ut_metadata.user_has_execute_any_proc(); end; procedure build_and_cache_suites( @@ -611,6 +609,7 @@ create or replace package body ut_suite_manager is and a.owner = c.object_owner and a.object_type = 'PACKAGE' ) + or c.item_type = 'UT_LOGICAL_SUITE' order by c.object_owner, c.object_name, c.item_line_no; end if; return l_result; @@ -630,7 +629,7 @@ create or replace package body ut_suite_manager is refresh_cache(l_owner_name); l_item_exists := ut_suite_cache_manager.suite_item_exists( l_owner_name, l_package_name, l_procedure_name ); - if not can_skip_all_objects_scan( l_owner_name ) then + if not can_skip_all_objects_scan( l_owner_name ) and l_package_name is not null then select count(1) into l_count from dual c diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index c6244fd39..c0c20634e 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -26,6 +26,10 @@ alter session set plsql_optimize_level=0; @@ut3_tester_helper/expectations_helper.pkb @@ut3_tester_helper/ut_example_tests.pkb +@@ut3_tester_helper/annotation_cache_helper.pks +@@ut3_tester_helper/annotation_cache_helper.pkb +create or replace synonym ut3_tester.annotation_cache_helper for ut3_tester_helper.annotation_cache_helper; + set linesize 200 set define on set verify off diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 6b3a5356c..9548d5148 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -13,6 +13,7 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/annotations/test_annotation_parser.pks @@ut3_tester/core/annotations/test_annot_throws_exception.pks @@ut3_tester/core/annotations/test_annotation_manager.pks +@@ut3_tester/core/annotations/test_annotation_cache.pks @@ut3_tester/core/expectations/test_expectation_processor.pks @@ut3_tester/core/test_ut_utils.pks @@ut3_tester/core/test_ut_test.pks @@ -27,9 +28,10 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core.pkb @@ut3_tester/core/annotations/test_before_after_annotations.pkb @@ut3_tester/core/annotations/test_annotation_parser.pkb -@@ut3_tester/core/expectations/test_expectation_processor.pkb @@ut3_tester/core/annotations/test_annotation_manager.pkb @@ut3_tester/core/annotations/test_annot_throws_exception.pkb +@@ut3_tester/core/annotations/test_annotation_cache.pkb +@@ut3_tester/core/expectations/test_expectation_processor.pkb @@ut3_tester/core/test_ut_utils.pkb @@ut3_tester/core/test_ut_test.pkb @@ut3_tester/core/test_ut_suite.pkb diff --git a/test/ut3_tester/core/annotations/test_annotation_cache.pkb b/test/ut3_tester/core/annotations/test_annotation_cache.pkb new file mode 100644 index 000000000..983004eeb --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annotation_cache.pkb @@ -0,0 +1,503 @@ +create or replace package body test_annotation_cache is + + procedure cache_populated_for_packages(a_packages ut_varchar2_rows) is + l_actual_cache_info sys_refcursor; + l_expected_cache_info sys_refcursor; + begin + open l_actual_cache_info for + select * + from ut3.ut_annotation_cache_info + where object_owner = 'UT3_CACHE_TEST_OWNER'; + open l_expected_cache_info for + select 'UT3_CACHE_TEST_OWNER' as object_owner, upper( column_value ) as object_name, 'Y' as is_annotated + from table (a_packages) x; + ut.expect( l_actual_cache_info ).to_equal( l_expected_cache_info ).exclude( 'CACHE_ID,PARSE_TIME,OBJECT_TYPE' ).JOIN_BY('OBJECT_NAME'); + end; + + procedure can_run_one_package(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + + --Assert - only granted_test_suite is invoked + ut.expect( l_actual ).to_be_like( 'granted_test_suite%2 tests, 0 failed%' ); + rollback; + end; + + procedure can_run_new_package(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Arrange + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.add_new_suite( ); + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + --Assert -Both granted_test_suite and new_suite are invoked + ut.expect( l_actual ).to_be_like( 'granted_test_suite%new_suite%4 tests, 0 failed%' ); + rollback; + end ; + + procedure cant_run_revoked_package(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Arrange + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.add_new_suite( ); + annotation_cache_helper.revoke_granted_suite( ); + + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + --Assert -Only new_suite gets invoked + ut.expect( l_actual ).to_be_like( 'new_suite%2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); + ut.expect( l_actual ).not_to_be_like( '%granted_test_suite%' ); + rollback; + end; + + procedure cant_run_dropped_package(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Arrange + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.add_new_suite( ); + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.revoke_granted_suite( ); + annotation_cache_helper.cleanup_new_suite( ); + + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + --Assert - no test suites are invoked + ut.expect( l_actual ).to_be_like( '%0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); + ut.expect( l_actual ).not_to_be_like( '%new_suite%' ); + ut.expect( l_actual ).not_to_be_like( '%granted_test_suite%' ); + rollback; + end; + + procedure can_run_all_packages(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + + --Assert - only granted_test_suite is invoked + ut.expect( l_actual ).to_be_like( 'granted_test_suite%not_granted_test_suite%4 tests, 0 failed%' ); + rollback; + end; + + procedure can_run_all_new_packages(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Arrange + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.add_new_suite( ); + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + + --Assert - only granted_test_suite is invoked + ut.expect( l_actual ).to_be_like( 'granted_test_suite%new_suite%not_granted_test_suite% tests, 0 failed%' ); + rollback; + end; + + procedure can_run_revoked_packages(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Arrange + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.add_new_suite( ); + annotation_cache_helper.revoke_granted_suite( ); + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + + --Assert - only granted_test_suite is invoked + ut.expect( l_actual ).to_be_like( 'granted_test_suite%new_suite%not_granted_test_suite% tests, 0 failed%' ); + rollback; + end; + + procedure can_run_all_but_dropped(a_user varchar2) is + l_actual clob; + l_current_time date := sysdate; + pragma autonomous_transaction; + begin + --Arrange + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.add_new_suite( ); + l_actual := annotation_cache_helper.run_tests_as( a_user ); + annotation_cache_helper.revoke_granted_suite( ); + annotation_cache_helper.cleanup_new_suite( ); + + --Act + l_actual := annotation_cache_helper.run_tests_as( a_user ); + --Assert - no test suites are invoked + ut.expect( l_actual ).to_be_like( 'granted_test_suite%not_granted_test_suite%4 tests, 0 failed%' ); + ut.expect( l_actual ).not_to_be_like( '%new_suite%' ); + rollback; + end; + + + procedure user_can_run_one_package is + begin + can_run_one_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure user_can_run_new_package is + begin + can_run_new_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure user_cant_run_revoked_package is + begin + cant_run_revoked_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure user_cant_run_dropped_package is + begin + cant_run_dropped_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure sel_cat_user_can_run_one is + begin + can_run_one_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure sel_cat_user_can_run_new is + begin + can_run_new_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure sel_cat_user_cant_run_revoked is + begin + cant_run_revoked_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure sel_cat_user_cant_run_dropped is + begin + cant_run_dropped_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure sel_any_user_can_run_one is + begin + can_run_one_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure sel_any_user_can_run_new is + begin + can_run_new_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure sel_any_user_cant_run_revoked is + begin + cant_run_revoked_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure sel_any_user_cant_run_dropped is + begin + cant_run_dropped_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure exe_any_user_can_run_all is + begin + can_run_all_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure exe_any_user_can_run_new is + begin + can_run_all_new_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure exe_any_user_can_run_revoked is + begin + can_run_revoked_packages('ut3_execute_any_proc_user'); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure exe_any_user_cant_run_dropped is + begin + can_run_all_but_dropped('ut3_execute_any_proc_user'); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure owner_user_can_run_all is + begin + can_run_all_packages( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + + procedure owner_user_can_run_new is + begin + can_run_all_new_packages( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure owner_user_cant_run_dropped is + begin + can_run_all_but_dropped('ut3_cache_test_owner'); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + + procedure t_user_can_run_one_package is + begin + can_run_one_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_user_can_run_new_package is + begin + can_run_new_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_user_cant_run_revoked_pkg is + begin + cant_run_revoked_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_user_cant_run_dropped_pkg is + begin + cant_run_dropped_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_cat_user_can_run_one is + begin + can_run_one_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_cat_user_can_run_new is + begin + can_run_new_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_cat_user_cant_run_revokd is + begin + cant_run_revoked_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_cat_user_cant_run_dropd is + begin + cant_run_dropped_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + + procedure t_sel_any_user_can_run_one is + begin + can_run_one_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_any_user_can_run_new is + begin + can_run_new_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_any_user_cant_run_revokd is + begin + cant_run_revoked_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_sel_any_user_cant_run_dropd is + begin + cant_run_dropped_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + + procedure t_exe_any_user_can_run_all is + begin + can_run_all_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_exe_any_user_can_run_new is + begin + can_run_all_new_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_exe_any_user_can_run_revokd is + begin + can_run_revoked_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_exe_any_user_cant_run_dropd is + begin + can_run_all_but_dropped( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_owner_user_can_run_all is + begin + can_run_all_packages( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_owner_user_can_run_new is + begin + can_run_all_new_packages( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure t_owner_user_cant_run_dropd is + begin + can_run_all_but_dropped( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + + + + procedure p_user_can_run_one_package is + begin + can_run_one_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure p_user_can_run_new_package is + begin + can_run_new_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure p_user_cant_run_revoked_pack is + begin + cant_run_revoked_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure p_user_cant_run_dropped_pack is + begin + cant_run_dropped_package( 'ut3_no_extra_priv_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + + + procedure p_sel_cat_user_can_run_one is + begin + can_run_one_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure p_sel_cat_user_can_run_new is + begin + can_run_new_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure p_sel_cat_user_cant_run_revokd is + begin + cant_run_revoked_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure p_sel_cat_user_cant_run_dropd is + begin + cant_run_dropped_package( 'ut3_select_catalog_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure p_sel_any_user_can_run_one is + begin + can_run_one_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure p_sel_any_user_can_run_new is + begin + can_run_new_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure p_sel_any_user_cant_run_revokd is + begin + cant_run_revoked_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE' ) ); + end; + + procedure p_sel_any_user_cant_run_dropd is + begin + cant_run_dropped_package( 'ut3_select_any_table_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE' ) ); + end; + + procedure p_exe_any_user_can_run_all is + begin + can_run_all_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure p_exe_any_user_can_run_new is + begin + can_run_all_new_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure p_exe_any_user_can_run_revokd is + begin + can_run_revoked_packages( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure p_exe_any_user_cant_run_dropd is + begin + can_run_all_but_dropped( 'ut3_execute_any_proc_user' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure p_owner_user_can_run_all is + begin + can_run_all_packages( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure p_owner_user_can_run_new is + begin + can_run_all_new_packages( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NEW_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + + procedure p_owner_user_cant_run_dropped is + begin + can_run_all_but_dropped( 'ut3_cache_test_owner' ); + cache_populated_for_packages( ut_varchar2_rows( 'GRANTED_TEST_SUITE', 'NOT_GRANTED_TEST_SUITE' ) ); + end; + +end; +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_cache.pks b/test/ut3_tester/core/annotations/test_annotation_cache.pks new file mode 100644 index 000000000..f44b816e1 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annotation_cache.pks @@ -0,0 +1,273 @@ +create or replace package test_annotation_cache is + + --%suite(annotation cache) + --%suitepath(utplsql.ut3_tester.core.annotations) + --%beforeall(annotation_cache_helper.create_run_function_for_users) + --%afterall(annotation_cache_helper.drop_run_function_for_users) + + --%context(With DDL trigger enabled) + + --%beforeall(annotation_cache_helper.enable_ddl_trigger) + --%beforeeach(annotation_cache_helper.setup_two_suites) + --%aftereach(annotation_cache_helper.cleanup_new_suite) + --%afterall(annotation_cache_helper.cleanup_two_suites) + + --%context(User without elevated privileges) + + --%test(Can only execute granted packages) + procedure t_user_can_run_one_package; + + --%test(Can see newly created packages as they are added) + procedure t_user_can_run_new_package; + + --%test(Cannot execute revoked packages) + procedure t_user_cant_run_revoked_pkg; + + --%test(Cannot execute dropped unit test packages) + procedure t_user_cant_run_dropped_pkg; + + --%endcontext + + --%context(User with select_catalog_role) + + --%test(Can only execute granted packages) + procedure t_sel_cat_user_can_run_one; + + --%test(Can see newly created packages as they are added) + procedure t_sel_cat_user_can_run_new; + + --%test(Cannot execute revoked packages) + procedure t_sel_cat_user_cant_run_revokd; + + --%test(Cannot execute dropped unit test packages) + procedure t_sel_cat_user_cant_run_dropd; + + --%endcontext + + --%context(User with select any table privilege) + + --%test(Can only execute granted packages) + procedure t_sel_any_user_can_run_one; + + --%test(Can see newly created packages as they are added) + procedure t_sel_any_user_can_run_new; + + --%test(Cannot execute revoked packages) + procedure t_sel_any_user_cant_run_revokd; + + --%test(Cannot execute dropped unit test packages) + procedure t_sel_any_user_cant_run_dropd; + + --%endcontext + + --%context(User with execute any procedure) + + --%test(Can execute and see all unit test packages) + procedure t_exe_any_user_can_run_all; + + --%test(Can see newly created packages as they are added) + procedure t_exe_any_user_can_run_new; + + --%test(Can execute revoked packages) + procedure t_exe_any_user_can_run_revokd; + + --%test(Cannot execute dropped unit test packages) + procedure t_exe_any_user_cant_run_dropd; + + --%endcontext + + --%context(User owning test packages) + + --%test(Can execute and see all unit test packages) + procedure t_owner_user_can_run_all; + + --%test(Can see newly created packages as they are added) + procedure t_owner_user_can_run_new; + + --%test(Cannot execute dropped unit test packages) + procedure t_owner_user_cant_run_dropd; + + --%endcontext + + --%endcontext + + --%context(With DDL trigger disabled) + + --%beforeall(annotation_cache_helper.disable_ddl_trigger) + --%beforeeach(annotation_cache_helper.setup_two_suites) + --%beforeeach(annotation_cache_helper.purge_annotation_cache) + --%aftereach(annotation_cache_helper.cleanup_new_suite) + --%afterall(annotation_cache_helper.enable_ddl_trigger) + --%afterall(annotation_cache_helper.cleanup_two_suites) + + --%context(User without elevated privileges) + + --%test(Can only execute granted packages) + procedure user_can_run_one_package; + + --%test(Can see newly created packages as they are added) + procedure user_can_run_new_package; + + --%test(Cannot execute revoked packages) + procedure user_cant_run_revoked_package; + + --%test(Cannot execute dropped unit test packages) + procedure user_cant_run_dropped_package; + + --%endcontext + + --%context(User with select_catalog_role) + + --%test(Can only execute granted packages) + procedure sel_cat_user_can_run_one; + + --%test(Can see newly created packages as they are added) + procedure sel_cat_user_can_run_new; + + --%test(Cannot execute revoked packages) + procedure sel_cat_user_cant_run_revoked; + + --%test(Cannot execute dropped unit test packages) + procedure sel_cat_user_cant_run_dropped; + + --%endcontext + + --%context(User with select any table privilege) + + --%test(Can only execute granted packages) + procedure sel_any_user_can_run_one; + + --%test(Can see newly created packages as they are added) + procedure sel_any_user_can_run_new; + + --%test(Cannot execute revoked packages) + procedure sel_any_user_cant_run_revoked; + + --%test(Cannot execute dropped unit test packages) + procedure sel_any_user_cant_run_dropped; + + --%endcontext + + --%context(User with execute any procedure) + + --%test(Can execute and see all unit test packages) + procedure exe_any_user_can_run_all; + + --%test(Can see newly created packages as they are added) + procedure exe_any_user_can_run_new; + + --%test(Can execute revoked packages) + procedure exe_any_user_can_run_revoked; + + --%test(Cannot execute dropped unit test packages) + procedure exe_any_user_cant_run_dropped; + + --%endcontext + + --%context(User owning test packages) + + --%test(Can execute and see all unit test packages) + procedure owner_user_can_run_all; + + --%test(Can see newly created packages as they are added) + procedure owner_user_can_run_new; + + --%test(Cannot execute dropped unit test packages) + procedure owner_user_cant_run_dropped; + + --%endcontext + + --%endcontext + + --%context(With DDL trigger enabled and cache purged) + + --%beforeall(annotation_cache_helper.enable_ddl_trigger) + + --%beforeeach(annotation_cache_helper.setup_two_suites) + --%beforeeach(annotation_cache_helper.purge_annotation_cache) + + --%aftereach(annotation_cache_helper.cleanup_new_suite) + --%aftereach(annotation_cache_helper.cleanup_two_suites) + + --%context(User without elevated privileges) + + --%test(Can only execute granted packages) + procedure p_user_can_run_one_package; + + --%test(Can see newly created packages as they are added) + procedure p_user_can_run_new_package; + + --%test(Cannot execute revoked packages) + procedure p_user_cant_run_revoked_pack; + + --%test(Cannot execute dropped unit test packages) + procedure p_user_cant_run_dropped_pack; + + --%endcontext + + --%context(User with select_catalog_role) + + --%test(Can only execute granted packages) + procedure p_sel_cat_user_can_run_one; + + --%test(Can see newly created packages as they are added) + procedure p_sel_cat_user_can_run_new; + + --%test(Cannot execute revoked packages) + procedure p_sel_cat_user_cant_run_revokd; + + --%test(Cannot execute dropped unit test packages) + procedure p_sel_cat_user_cant_run_dropd; + + --%endcontext + + --%context(User with select any table privilege) + + --%test(Can only execute granted packages) + procedure p_sel_any_user_can_run_one; + + --%test(Can see newly created packages as they are added) + procedure p_sel_any_user_can_run_new; + + --%test(Cannot execute revoked packages) + procedure p_sel_any_user_cant_run_revokd; + + --%test(Cannot execute dropped unit test packages) + procedure p_sel_any_user_cant_run_dropd; + + --%endcontext + + --%context(User with execute any procedure) + + --%test(Can execute and see all unit test packages) + procedure p_exe_any_user_can_run_all; + + --%test(Can see newly created packages as they are added) + procedure p_exe_any_user_can_run_new; + + --%test(Can execute revoked packages) + procedure p_exe_any_user_can_run_revokd; + + --%test(Cannot execute dropped unit test packages) + procedure p_exe_any_user_cant_run_dropd; + + --%endcontext + + --%context(User owning test packages) + + --%test(Can execute and see all unit test packages) + procedure p_owner_user_can_run_all; + + --%test(Can see newly created packages as they are added) + procedure p_owner_user_can_run_new; + + --%test(Cannot execute dropped unit test packages) + procedure p_owner_user_cant_run_dropped; + + --%endcontext + + + --%endcontext + +end; +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb index 15bbee21a..8a3efc508 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -6,17 +6,6 @@ create or replace package body test_annotation_manager is execute immediate a_sql; end; - procedure disable_ddl_trigger is - begin - exec_autonomous('alter trigger ut3.ut_trigger_annotation_parsing disable'); - exec_autonomous('begin ut3.ut_trigger_check.is_alive(); end;'); - end; - - procedure enable_ddl_trigger is - begin - exec_autonomous('alter trigger ut3.ut_trigger_annotation_parsing enable'); - end; - procedure create_dummy_package is begin exec_autonomous(q'[create or replace package dummy_package as @@ -157,10 +146,10 @@ create or replace package body test_annotation_manager is l_actual_cache_id integer; begin --Arrange - disable_ddl_trigger(); + annotation_cache_helper.disable_ddl_trigger(); create_dummy_test_package(); --Act - enable_ddl_trigger(); + annotation_cache_helper.enable_ddl_trigger(); --Assert select max(cache_id) into l_actual_cache_id @@ -175,10 +164,10 @@ create or replace package body test_annotation_manager is l_start_date date; begin --Arrange - disable_ddl_trigger(); + annotation_cache_helper.disable_ddl_trigger(); create_dummy_test_package(); --Act - enable_ddl_trigger(); + annotation_cache_helper.enable_ddl_trigger(); l_start_date := sysdate; recompile_dummy_test_package(); --Assert @@ -190,11 +179,11 @@ create or replace package body test_annotation_manager is l_start_date date; begin --Arrange - disable_ddl_trigger(); + annotation_cache_helper.disable_ddl_trigger(); create_dummy_test_package(); create_dummy_package(); --Act - enable_ddl_trigger(); + annotation_cache_helper.enable_ddl_trigger(); l_start_date := sysdate; ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); --Assert diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks index cb0b85104..5d7464fd2 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pks +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -3,13 +3,11 @@ create or replace package test_annotation_manager is --%suite(ut_annotation_manager) --%suitepath(utplsql.ut3_tester.core.annotations) + --%afterall(drop_dummy_test_package) + --%aftereach procedure cleanup_annotation_cache; - procedure disable_ddl_trigger; - - procedure enable_ddl_trigger; - procedure create_dummy_package; procedure drop_dummy_package; @@ -45,17 +43,18 @@ create or replace package test_annotation_manager is --%beforetest(create_dummy_test_package) procedure trg_no_data_for_dropped_object; - --%disabled(TODO) --%test(Objects are populated on scan after cache was purged) + --%beforetest(annotation_cache_helper.disable_ddl_trigger) + --%aftertest(annotation_cache_helper.enable_ddl_trigger) procedure trg_populate_cache_after_purge; --%endcontext --%context(Without DDL trigger) - --%beforeall(disable_ddl_trigger) + --%beforeall(annotation_cache_helper.disable_ddl_trigger) - --%afterall(enable_ddl_trigger) + --%afterall(annotation_cache_helper.enable_ddl_trigger) --%beforeeach(create_dummy_package) --%aftereach(drop_dummy_package) @@ -69,11 +68,9 @@ create or replace package test_annotation_manager is procedure remove_annotated_package; --%test(Doesn't return annotations when package doesn't contain annotations) - --%aftertest(drop_dummy_package) procedure add_not_annotated_package; --%test(Doesn't return annotations when package without annotations was dropped) - --%aftertest(drop_dummy_package) procedure remove_not_annotated_package; --%test(Doesn't return annotations when annotations removed from package) diff --git a/test/ut3_tester_helper/annotation_cache_helper.pkb b/test/ut3_tester_helper/annotation_cache_helper.pkb new file mode 100644 index 000000000..0d56823df --- /dev/null +++ b/test/ut3_tester_helper/annotation_cache_helper.pkb @@ -0,0 +1,167 @@ +create or replace package body annotation_cache_helper as + + procedure setup_two_suites is + pragma autonomous_transaction; + begin + execute immediate + 'create or replace package ut3_cache_test_owner.granted_test_suite is + --%suite + + --%test + procedure test1; + --%test + procedure test2; + end;'; + + execute immediate + 'create or replace package body ut3_cache_test_owner.granted_test_suite is + procedure test1 is begin ut3.ut.expect( 1 ).to_equal( 1 ); end; + procedure test2 is begin ut3.ut.expect( 1 ).to_equal( 1 ); end; + end;'; + execute immediate + 'create or replace package ut3_cache_test_owner.not_granted_test_suite is + --%suite + + --%test + procedure test1; + --%test + procedure test2; + end;'; + execute immediate + 'create or replace package body ut3_cache_test_owner.not_granted_test_suite is + procedure test1 is begin ut3.ut.expect( 1 ).to_equal( 1 ); end; + procedure test2 is begin ut3.ut.expect( 1 ).to_equal( 1 ); end; + end;'; + + execute immediate + 'grant execute on ut3_cache_test_owner.granted_test_suite to + ut3_execute_any_proc_user, ut3_select_any_table_user, ut3_select_catalog_user, ut3_no_extra_priv_user'; + end; + + procedure revoke_granted_suite is + pragma autonomous_transaction; + begin + execute immediate + 'revoke execute on ut3_cache_test_owner.granted_test_suite from + ut3_execute_any_proc_user, ut3_select_any_table_user, ut3_select_catalog_user, ut3_no_extra_priv_user'; + exception + when others then + null; + end; + + + procedure add_new_suite is + pragma autonomous_transaction; + begin + execute immediate + 'create or replace package ut3_cache_test_owner.new_suite is + --%suite + + --%test + procedure test1; + --%test + procedure test2; + end;'; + + execute immediate + 'create or replace package body ut3_cache_test_owner.new_suite is + procedure test1 is begin ut3.ut.expect( 1 ).to_equal( 1 ); end; + procedure test2 is begin ut3.ut.expect( 1 ).to_equal( 1 ); end; + end;'; + execute immediate + 'grant execute on ut3_cache_test_owner.new_suite to + ut3_execute_any_proc_user, ut3_select_any_table_user, ut3_select_catalog_user, ut3_no_extra_priv_user'; + end; + + procedure cleanup_two_suites is + pragma autonomous_transaction; + begin + begin + execute immediate 'drop package ut3_cache_test_owner.not_granted_test_suite'; + exception + when others then + null; + end; + begin + execute immediate 'drop package ut3_cache_test_owner.granted_test_suite'; + exception + when others then + null; + end; + end; + + procedure cleanup_new_suite is + pragma autonomous_transaction; + begin + execute immediate 'drop package ut3_cache_test_owner.new_suite'; + exception + when others then + null; + end; + + procedure purge_annotation_cache is + begin + ut3.ut_runner.purge_cache( 'UT3_CACHE_TEST_OWNER' ); + end; + + + procedure disable_ddl_trigger is + pragma autonomous_transaction; + begin + execute immediate 'alter trigger ut3.ut_trigger_annotation_parsing disable'; + execute immediate 'begin ut3.ut_trigger_check.is_alive( ); end;'; + end; + + procedure enable_ddl_trigger is + pragma autonomous_transaction; + begin + execute immediate 'alter trigger ut3.ut_trigger_annotation_parsing enable'; + end; + + procedure create_run_function_for_user(a_user varchar2) is + pragma autonomous_transaction; + begin + execute immediate + 'create or replace function ' || a_user || '.ut_run return clob is + l_data ut3.ut_varchar2_list; + l_results clob; + begin + select * bulk collect into l_data from table (ut3.ut.run( ''ut3_cache_test_owner'' )); + return ut3_tester_helper.main_helper.table_to_clob( l_data ); + end; + '; + execute immediate 'grant execute on ' || a_user || '.ut_run to public '; + end; + + procedure drop_run_function_for_user(a_user varchar2) is + pragma autonomous_transaction; + begin + execute immediate 'drop function ' || a_user || '.ut_run'; + end; + + procedure create_run_function_for_users is + begin + create_run_function_for_user( 'ut3_no_extra_priv_user' ); + create_run_function_for_user( 'ut3_select_catalog_user' ); + create_run_function_for_user( 'ut3_select_any_table_user' ); + create_run_function_for_user( 'ut3_execute_any_proc_user' ); + create_run_function_for_user( 'ut3_cache_test_owner' ); + end; + + procedure drop_run_function_for_users is + begin + drop_run_function_for_user( 'ut3_no_extra_priv_user' ); + drop_run_function_for_user( 'ut3_select_catalog_user' ); + drop_run_function_for_user( 'ut3_select_any_table_user' ); + drop_run_function_for_user( 'ut3_execute_any_proc_user' ); + drop_run_function_for_user( 'ut3_cache_test_owner' ); + end; + + function run_tests_as(a_user varchar2) return clob is + l_results clob; + begin + execute immediate 'begin :x := '||a_user||'.ut_run; end;' using out l_results; + return l_results; + end; +end; +/ \ No newline at end of file diff --git a/test/ut3_tester_helper/annotation_cache_helper.pks b/test/ut3_tester_helper/annotation_cache_helper.pks new file mode 100644 index 000000000..d6ab1f8e2 --- /dev/null +++ b/test/ut3_tester_helper/annotation_cache_helper.pks @@ -0,0 +1,21 @@ +create or replace package annotation_cache_helper as + + procedure setup_two_suites; + procedure add_new_suite; + procedure revoke_granted_suite; + + procedure cleanup_two_suites; + procedure cleanup_new_suite; + + procedure purge_annotation_cache; + + procedure disable_ddl_trigger; + procedure enable_ddl_trigger; + + procedure create_run_function_for_users; + procedure drop_run_function_for_users; + + function run_tests_as(a_user varchar2) return clob; + +end; +/ \ No newline at end of file From 5eab4aaf4d06e8e9fb914690a6bd42a05f33e75b Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Tue, 18 Feb 2020 01:08:18 +0000 Subject: [PATCH 43/51] Fixed Teamcity reporting of errors Resolves #1045 --- source/reporters/ut_teamcity_reporter.tpb | 4 ++-- test/ut3_user/reporters/test_teamcity_reporter.pkb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/reporters/ut_teamcity_reporter.tpb b/source/reporters/ut_teamcity_reporter.tpb index ee0a53098..9475c0a90 100644 --- a/source/reporters/ut_teamcity_reporter.tpb +++ b/source/reporters/ut_teamcity_reporter.tpb @@ -74,7 +74,7 @@ create or replace type body ut_teamcity_reporter is begin l_idx := a_executables.first; while l_idx is not null loop - l_message := l_message || add_error_message(a_executables(l_idx).error_backtrace, a_message_name); + l_message := l_message || add_error_message( a_executables(l_idx).get_error_stack_trace(), a_message_name ); l_idx := a_executables.next(l_idx); end loop; return l_message; @@ -92,7 +92,7 @@ create or replace type body ut_teamcity_reporter is if a_test.result = ut_utils.gc_error then l_std_err_msg := l_std_err_msg || add_error_messages(a_test.before_each_list, 'Before each exception:'); l_std_err_msg := l_std_err_msg || add_error_messages(a_test.before_test_list, 'Before test exception:'); - l_std_err_msg := l_std_err_msg || add_error_message(a_test.item.error_backtrace, 'Test exception:'); + l_std_err_msg := l_std_err_msg || add_error_message(a_test.item.get_error_stack_trace(), 'Test exception:'); l_std_err_msg := l_std_err_msg || add_error_messages(a_test.after_test_list, 'After test exception:'); l_std_err_msg := l_std_err_msg || add_error_messages(a_test.after_each_list, 'After each exception:'); diff --git a/test/ut3_user/reporters/test_teamcity_reporter.pkb b/test/ut3_user/reporters/test_teamcity_reporter.pkb index 71d2f857d..032399aee 100644 --- a/test/ut3_user/reporters/test_teamcity_reporter.pkb +++ b/test/ut3_user/reporters/test_teamcity_reporter.pkb @@ -63,8 +63,8 @@ create or replace package body test_teamcity_reporter as -%##teamcity[testStdErr timestamp='%' name='ut3$user#.test_reporters.erroring_test' out='Test exception:|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|n|n'] -%##teamcity[testFailed timestamp='%' details='Test exception:|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|n|n' message='Error occured' name='ut3$user#.test_reporters.erroring_test'] +%##teamcity[testStdErr timestamp='%' name='ut3$user#.test_reporters.erroring_test' out='Test exception:|nORA-06502: PL/SQL: numeric or value error: character to number conversion error|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|nORA-06512: at %|n'] +%##teamcity[testFailed timestamp='%' details='Test exception:|nORA-06502: PL/SQL: numeric or value error: character to number conversion error|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|nORA-06512: at %|n' message='Error occured' name='ut3$user#.test_reporters.erroring_test'] %##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.test_reporters.erroring_test'] %##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.test_reporters.disabled_test'] %##teamcity[testIgnored timestamp='%' name='ut3$user#.test_reporters.disabled_test'] From 641b3b460798012207fc4a2433b1b937d895d21c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Tue, 18 Feb 2020 01:30:09 +0000 Subject: [PATCH 44/51] Update install.sh --- .travis/install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis/install.sh b/.travis/install.sh index dfcf63efb..2e96ebfb2 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -74,6 +74,8 @@ PROMPT Creating $UT3_TESTER - Power-user for testing internal framework code create user $UT3_TESTER identified by "$UT3_TESTER_PASSWORD" default tablespace $UT3_TABLESPACE quota unlimited on $UT3_TABLESPACE; grant create session, create procedure, create type, create table to $UT3_TESTER; +grant execute on dbms_lock to $UT3_TESTER; + PROMPT Granting $UT3_OWNER code to $UT3_TESTER begin From 67c4e7816b453824722391d79bcee634af5bfda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Tue, 18 Feb 2020 01:33:23 +0000 Subject: [PATCH 45/51] Update test_teamcity_reporter.pkb --- test/ut3_user/reporters/test_teamcity_reporter.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/reporters/test_teamcity_reporter.pkb b/test/ut3_user/reporters/test_teamcity_reporter.pkb index 032399aee..a5261d7f9 100644 --- a/test/ut3_user/reporters/test_teamcity_reporter.pkb +++ b/test/ut3_user/reporters/test_teamcity_reporter.pkb @@ -63,8 +63,8 @@ create or replace package body test_teamcity_reporter as -%##teamcity[testStdErr timestamp='%' name='ut3$user#.test_reporters.erroring_test' out='Test exception:|nORA-06502: PL/SQL: numeric or value error: character to number conversion error|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|nORA-06512: at %|n'] -%##teamcity[testFailed timestamp='%' details='Test exception:|nORA-06502: PL/SQL: numeric or value error: character to number conversion error|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|nORA-06512: at %|n' message='Error occured' name='ut3$user#.test_reporters.erroring_test'] +%##teamcity[testStdErr timestamp='%' name='ut3$user#.test_reporters.erroring_test' out='Test exception:|nORA-06502: PL/SQL: numeric or value error: character to number conversion error|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|n'] +%##teamcity[testFailed timestamp='%' details='Test exception:|nORA-06502: PL/SQL: numeric or value error: character to number conversion error|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|n' message='Error occured' name='ut3$user#.test_reporters.erroring_test'] %##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.test_reporters.erroring_test'] %##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.test_reporters.disabled_test'] %##teamcity[testIgnored timestamp='%' name='ut3$user#.test_reporters.disabled_test'] From 3c0351f25bbb5692dab42c49b5be1e17813dbfb7 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Tue, 18 Feb 2020 08:51:02 +0000 Subject: [PATCH 46/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 245d8504c..e1bcfa633 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 5f5295da8..97c065fe2 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 73498a628..6c2b47ac0 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 34f990b6f..92b0ca1d4 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index c15e45936..4a7e105b7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index d357cbd8c..431ec1493 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 4c398a4a4..dc61b998c 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 87f4f9519..2ad5aa9cb 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index e1a9e09d1..4f0ba15ec 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 624dba1ee..a0fc1981b 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 93b0f1258..c9b2bf362 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index e37920255..8df1d7aa2 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 0a7a04b35..823426318 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index b6ef0def6..cdd7d5230 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 3399c5c72..a046affea 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3ce5daace..f050c9417 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 66617cb2e..c7e566681 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3327--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 13f64d1bd..4b7747dfa 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3327-develop + * secion v3.1.10.3342-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 3b23edad0..6a3c2cebd 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3327-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3342-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 29b6db484f1b042b91cf18496fcbd18e5c2d35c3 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Tue, 18 Feb 2020 09:27:06 +0000 Subject: [PATCH 47/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index e1bcfa633..da8a160ba 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 97c065fe2..92742a4a4 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 6c2b47ac0..4df80bc5c 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 92b0ca1d4..f009b0c32 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 4a7e105b7..f1253349b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 431ec1493..4cb07e043 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index dc61b998c..e606a4caf 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 2ad5aa9cb..592eae131 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 4f0ba15ec..00c568012 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index a0fc1981b..9f06ff7c0 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index c9b2bf362..8842461eb 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 8df1d7aa2..df5f8d9d1 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 823426318..3a292a670 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index cdd7d5230..a2e4856e7 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index a046affea..bc642b035 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index f050c9417..295df814e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index c7e566681..6aeee036d 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 4b7747dfa..2986a3707 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -767,7 +767,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3342-develop + * secion v3.1.10.3343-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 6a3c2cebd..73884bdca 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3342-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3343-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 5d4c33c8c74bcf2479e16a961a2b39f7e430b04f Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 22 Feb 2020 14:16:44 +0000 Subject: [PATCH 48/51] Removed unneeded `is_annotated` column --- .../annotations/ut_annotation_cache_info.sql | 2 -- .../annotations/ut_annotation_cache_manager.pkb | 16 ++++++---------- .../core/annotations/test_annotation_cache.pkb | 2 +- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/source/core/annotations/ut_annotation_cache_info.sql b/source/core/annotations/ut_annotation_cache_info.sql index e0781cab7..7bbf99e00 100644 --- a/source/core/annotations/ut_annotation_cache_info.sql +++ b/source/core/annotations/ut_annotation_cache_info.sql @@ -17,8 +17,6 @@ create table ut_annotation_cache_info ( object_name varchar2(250) not null, object_type varchar2(250) not null, parse_time timestamp not null, - is_annotated varchar2(1) not null, - constraint ut_annotation_cache_info_ck1 check(is_annotated in ('Y','N')), constraint ut_annotation_cache_info_pk primary key(cache_id) using index, constraint ut_annotation_cache_info_uk unique (object_owner, object_type, object_name) using index, constraint ut_annotation_cache_info_fk foreign key(object_owner, object_type) references ut_annotation_cache_schema(object_owner, object_type) on delete cascade diff --git a/source/core/annotations/ut_annotation_cache_manager.pkb b/source/core/annotations/ut_annotation_cache_manager.pkb index 377dc4492..4882108fc 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pkb +++ b/source/core/annotations/ut_annotation_cache_manager.pkb @@ -35,8 +35,7 @@ create or replace package body ut_annotation_cache_manager as if ora_sysevent is null or a_object.annotations is not null and a_object.annotations.count > 0 then update ut_annotation_cache_info i - set i.parse_time = l_timestamp, - i.is_annotated = case when a_object.annotations is not empty then 'Y' else 'N' end + set i.parse_time = l_timestamp where (i.object_owner, i.object_name, i.object_type) in ((a_object.object_owner, a_object.object_name, a_object.object_type)) returning cache_id into l_cache_id; @@ -44,10 +43,8 @@ create or replace package body ut_annotation_cache_manager as if sql%rowcount = 0 then insert into ut_annotation_cache_info - (cache_id, object_owner, object_name, object_type, parse_time, is_annotated) - values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, l_timestamp, - case when a_object.annotations is not empty then 'Y' else 'N' end - ) + (cache_id, object_owner, object_name, object_type, parse_time) + values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, l_timestamp) returning cache_id into l_cache_id; end if; @@ -108,11 +105,10 @@ create or replace package body ut_annotation_cache_manager as and o.object_owner = i.object_owner) when matched then update - set parse_time = l_timestamp, - is_annotated = 'N' + set parse_time = l_timestamp when not matched then insert - (cache_id, object_owner, object_name, object_type, parse_time, is_annotated) - values (ut_annotation_cache_seq.nextval, o.object_owner, o.object_name, o.object_type, l_timestamp, 'N'); + (cache_id, object_owner, object_name, object_type, parse_time) + values (ut_annotation_cache_seq.nextval, o.object_owner, o.object_name, o.object_type, l_timestamp); commit; end; diff --git a/test/ut3_tester/core/annotations/test_annotation_cache.pkb b/test/ut3_tester/core/annotations/test_annotation_cache.pkb index 983004eeb..372fec890 100644 --- a/test/ut3_tester/core/annotations/test_annotation_cache.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_cache.pkb @@ -9,7 +9,7 @@ create or replace package body test_annotation_cache is from ut3.ut_annotation_cache_info where object_owner = 'UT3_CACHE_TEST_OWNER'; open l_expected_cache_info for - select 'UT3_CACHE_TEST_OWNER' as object_owner, upper( column_value ) as object_name, 'Y' as is_annotated + select 'UT3_CACHE_TEST_OWNER' as object_owner, upper( column_value ) as object_name from table (a_packages) x; ut.expect( l_actual_cache_info ).to_equal( l_expected_cache_info ).exclude( 'CACHE_ID,PARSE_TIME,OBJECT_TYPE' ).JOIN_BY('OBJECT_NAME'); end; From 8e548733cc2c672e189630b646c19722762ae54f Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 23 Feb 2020 14:05:14 +0000 Subject: [PATCH 49/51] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index da8a160ba..3f583531c 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 92742a4a4..5de382e0a 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 4df80bc5c..64b28b164 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index f009b0c32..e36040752 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index f1253349b..74398a481 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4cb07e043..c1a1bd4a0 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index e606a4caf..c46406ee8 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 592eae131..56a469d69 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 00c568012..cd81dda4c 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 9f06ff7c0..0e9510ddb 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 8842461eb..0f4684306 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index df5f8d9d1..1a7d45224 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 98be5fb6b..78368ab0a 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index a2e4856e7..01b4d597b 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index bc642b035..677ea9493 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 295df814e..55d58eb2b 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 6aeee036d..bb4b24fca 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3343--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 4aa6850af..65452ee2e 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -769,7 +769,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3343-develop + * secion v3.1.10.3346-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 73884bdca..097078d81 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3343-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3346-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From a2d163802ba4699b14f0241c46eae10787f8760a Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 23 Feb 2020 15:45:37 +0000 Subject: [PATCH 50/51] Update `releasing.md` file --- development/releasing.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/development/releasing.md b/development/releasing.md index 3e9ac64fa..93634018d 100644 --- a/development/releasing.md +++ b/development/releasing.md @@ -1,9 +1,10 @@ -The release process is semi-automated. +## Release process With every build, the build process on Travis updates files with an appropriate version number before deployment into the database. This step is performed, to confirm that the update of versions works properly. -To create a release: +## To create a release + - create release branch from development branch and make sure to name the release branch: `release/vX.Y.Z` - update, commit and push at least one file change in the release branch, to kickoff a Travis build - wait for th build to complete successfully From 903425084daee1ec84b8dbda4dcb102a27fe7d58 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 23 Feb 2020 16:02:01 +0000 Subject: [PATCH 51/51] Updated project version after build [skip ci] --- VERSION | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- sonar-project.properties | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/VERSION b/VERSION index 8961ff4ac..04c455c73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.10-develop +v3.1.10 diff --git a/docs/about/authors.md b/docs/about/authors.md index 3f583531c..3ed66a43f 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 5de382e0a..31072519e 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 64b28b164..10ce84eb1 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e36040752..2c9fcb98d 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 74398a481..3d48c47e6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index c1a1bd4a0..feb521f69 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index c46406ee8..bb56ab4ef 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 56a469d69..89aa004ac 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index cd81dda4c..115678802 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 0e9510ddb..14cded7c6 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 0f4684306..7876c7a79 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1a7d45224..290419986 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 78368ab0a..520533cae 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 01b4d597b..d07c4836c 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 677ea9493..8b3033539 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 55d58eb2b..4d7882852 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index bb4b24fca..924e80d17 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.10.3346--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.10.3347-blue.svg) # Upgrading from version 2 diff --git a/sonar-project.properties b/sonar-project.properties index 62c8f808f..7ab61df28 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -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.10-develop +sonar.projectVersion=v3.1.10 # 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. diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 65452ee2e..87a14763c 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -769,7 +769,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adxdb/generation-of-XML-data-from-relational-data.html#GUID-5BE09A7D-80D8-4734-B9AF-4A61F27FA9B2 - * secion v3.1.10.3346-develop + * secion v3.1.10.3347 */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 097078d81..bd017020a 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.10.3346-develop'; + gc_version constant varchar2(50) := 'v3.1.10.3347'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall';