diff --git a/.github/scripts/create_api_user.sh b/.github/scripts/create_api_user.sh new file mode 100755 index 0000000..b9452e2 --- /dev/null +++ b/.github/scripts/create_api_user.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -ev + +echo Running command: sqlplus -S -L sys/oracle@${DB_URL} AS SYSDBA +sqlplus -S -L sys/oracle@${DB_URL} AS SYSDBA < demo_project.sh.tmp <<- EOF +sqlplus -S -L sys/oracle@${DB_URL} AS SYSDBA <<- SQL + PROMPT Connected to ${DB_URL} + PROMPT Creating Database User ${DB_USER} + PROMPT create user ${DB_USER} identified by ${DB_PASS} quota unlimited on USERS default tablespace USERS; + PROMPT grant create session, create procedure, create type, create table, create sequence, create view to ${DB_USER}; + PROMPT grant connect to ${DB_USER}; + PROMPT grant select any dictionary to ${DB_USER}; + create user ${DB_USER} identified by ${DB_PASS} quota unlimited on USERS default tablespace USERS; + grant create session, create procedure, create type, create table, create sequence, create view to ${DB_USER}; + grant connect to ${DB_USER}; + grant select any dictionary to ${DB_USER}; + exit +SQL + +cd /${PROJECT_FILE} +sqlplus -S -L ${DB_USER}/${DB_PASS}@${DB_URL} <<- SQL + whenever sqlerror exit failure rollback + whenever oserror exit failure rollback + PROMPT Connected to ${DB_URL} + PROMPT Installing sources of demo project into schema ${DB_USER} + @source/install.sql + exit +SQL + +sqlplus -S -L ${DB_USER}/${DB_PASS}@${DB_URL} <<- SQL + whenever sqlerror exit failure rollback + whenever oserror exit failure rollback + PROMPT Connected to ${DB_URL} + PROMPT Installing tests for demo project into schema ${DB_USER} + @test/install.sql +exit +SQL +EOF + +docker cp ./${PROJECT_FILE} oracle:/${PROJECT_FILE} +docker cp ./demo_project.sh.tmp oracle:/demo_project.sh +docker exec oracle bash /demo_project.sh diff --git a/.travis/install_utplsql.sh b/.github/scripts/install_utplsql.sh similarity index 92% rename from .travis/install_utplsql.sh rename to .github/scripts/install_utplsql.sh index ac1e862..8aee546 100755 --- a/.travis/install_utplsql.sh +++ b/.github/scripts/install_utplsql.sh @@ -15,7 +15,7 @@ chmod -R go+w ./${UTPLSQL_FILE}/{source,examples} # Create a temporary install script. cat > install.sh.tmp <- + --health-cmd healthcheck.sh + --health-interval 10s + --health-timeout 5s + --health-retries 10 + --name oracle + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-java@v5 + with: + distribution: 'adopt' + java-version: '17' + + - name: Install utplsql + run: .github/scripts/install_utplsql.sh + + - name: Install demo project + run: .github/scripts/install_demo_project.sh + + - name: Build and Test + run: | + API_VERSION="${{ github.event.client_payload.api_version || inputs.api_version }}" + mvn verify appassembler:assemble -Dutplsql-java-api.version="$API_VERSION" + + slack-workflow-status: + if: always() + name: Post Workflow Status To Slack + needs: [ build ] + runs-on: ubuntu-latest + steps: + - name: Slack Workflow Notification + uses: Gamesight/slack-workflow-status@master + with: + repo_token: ${{secrets.GITHUB_TOKEN}} + slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} + name: 'Github Actions[bot]' + icon_url: 'https://octodex.github.com/images/mona-the-rivetertocat.png' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9540ee2..62f3368 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,6 +2,7 @@ name: Build and test on: push: + branches: [ develop ] pull_request: branches: [ develop ] @@ -20,29 +21,26 @@ jobs: name: Test on JDK ${{ matrix.jdk }} with utPLSQL ${{ matrix.utplsql_version }} runs-on: ubuntu-latest env: - ORACLE_VERSION: "gvenzl/oracle-xe:18.4.0-slim" UTPLSQL_VERSION: ${{matrix.utplsql_version}} UTPLSQL_FILE: ${{matrix.utplsql_file}} - ORACLE_PASSWORD: oracle - DB_URL: "127.0.0.1:1521:XE" - DB_USER: app - DB_PASS: app + DB_URL: "//localhost:1521/FREEPDB1" + DB_USER: APP + DB_PASS: APP strategy: fail-fast: false matrix: - utplsql_version: ["v3.0.1","v3.0.2","v3.0.3","v3.0.4","v3.1.1","v3.1.2","v3.1.3","v3.1.6","v3.1.7","v3.1.8","v3.1.9","v3.1.10","v3.1.11","develop"] + utplsql_version: ["v3.2.01","develop"] utplsql_file: ["utPLSQL"] - jdk: ['8'] - include: - - utplsql_version: "v3.0.0" - jdk: '8' - utplsql_file: "utPLSQLv3.0.0" + jdk: ['11', '17', '21', '25'] services: oracle: - image: gvenzl/oracle-xe:18.4.0-slim + image: gvenzl/oracle-free:23-slim-faststart env: ORACLE_PASSWORD: oracle + DB_URL: "//localhost:1521/FREEPDB1" + DB_USER: APP + DB_PASS: pass ports: - 1521:1521 options: >- @@ -53,22 +51,22 @@ jobs: --name oracle steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v5 with: distribution: 'adopt' java-version: ${{matrix.jdk}} - name: Install utplsql - run: .travis/install_utplsql.sh + run: .github/scripts/install_utplsql.sh - name: Install demo project - run: .travis/install_demo_project.sh + run: .github/scripts/install_demo_project.sh - name: Build and Test - run: mvn verify jar:jar appassembler:assemble + run: mvn verify appassembler:assemble slack-workflow-status: if: always() diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf6c098..bd819e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: Release on: push: tags: - - "*.*.*" + - "v*.*.*" workflow_dispatch: @@ -14,10 +14,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v5 with: distribution: 'adopt' java-version: 8 @@ -26,7 +26,7 @@ jobs: run: mvn package appassembler:assemble assembly:single checksum:files -DskipTests - name: Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2.6 with: files: | target/utPLSQL-cli.zip diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 76b64a0..0000000 --- a/.travis.yml +++ /dev/null @@ -1,87 +0,0 @@ -sudo: required -language: java - -services: - - docker - -jdk: - - openjdk8 - -env: - global: - - DOCKER_CFG=$HOME/.docker - - DOCKER_REPO="utplsqlv3/oracledb" - - CACHE_DIR=$HOME/.cache - - MAVEN_HOME=/usr/local/maven - - MAVEN_CFG=$HOME/.m2 - - DB_URL="127.0.0.1:1521:XE" - - DB_USER=app - - DB_PASS=app - - ORACLE_VERSION="11g-r2-xe" - - DOCKER_OPTIONS="--shm-size=1g" - - UTPLSQL_FILE="utPLSQL" - matrix: - - UTPLSQL_VERSION="v3.0.0" - UTPLSQL_FILE="utPLSQLv3.0.0" - - UTPLSQL_VERSION="v3.0.1" - - UTPLSQL_VERSION="v3.0.2" - - UTPLSQL_VERSION="v3.0.3" - - UTPLSQL_VERSION="v3.0.4" - - UTPLSQL_VERSION="v3.1.1" - - UTPLSQL_VERSION="v3.1.2" - - UTPLSQL_VERSION="v3.1.3" - - UTPLSQL_VERSION="v3.1.6" - - UTPLSQL_VERSION="v3.1.7" - - UTPLSQL_VERSION="v3.1.8" - - UTPLSQL_VERSION="develop" - UTPLSQL_FILE="utPLSQL" - -cache: - directories: - - $DOCKER_CFG - - $CACHE_DIR - - $MAVEN_CFG - -install: - - bash .travis/start_db.sh - - bash .travis/install_utplsql.sh - - bash .travis/install_demo_project.sh - -script: - - mvn package -DskipTests - - mvn package verify jar:jar appassembler:assemble - -before_deploy: - - bash .travis/create_release.sh - - if [ ! -z "$TRAVIS_TAG" ]; then VERSION=$(tr -d "/v/" <<<$TRAVIS_TAG); mvn org.codehaus.mojo:versions-maven-plugin:2.1:set -DnewVersion=${VERSION}; fi - -deploy: - - provider: releases - api_key: $GITHUB_API_TOKEN - file: - - utPLSQL-cli.zip - - utPLSQL-cli.zip.md5 - skip_cleanup: true - on: - repository: utPLSQL/utPLSQL-cli - tags: true - # Use only first job "#xxx.1" to publish artifacts - condition: "${TRAVIS_JOB_NUMBER} =~ \\.1$" - - provider: bintray - file: bintray.json - user: ${BINTRAY_USER} - key: ${BINTRAY_API_KEY} - dry-run: false - skip_cleanup: true - on: - repository: utPLSQL/utPLSQL-cli - branch: develop - # Use only first job "#xxx.1" to publish artifacts - condition: "${TRAVIS_JOB_NUMBER} =~ \\.1$" - -notifications: - slack: - rooms: - - secure: "jTPq4AcWQdWp1rB175c05ei/1lXZF1DBoqiKl9PPe7f8vqXS2QLPXMwGTEkZ1YnqL2MPZMB+50Gw5RhLKQ+t+9pN7ejLO0D8ULi1e96PDU5ZL5pNvRglH6U/lR5iT1CjELUuraDXDJ98Vu4gluLMiwTtFYQhNrOoA2V84L+8fF7rGjbGl4/zOXA9RQ4YAcOomJesb4vE7BCjhDjUuMW43xjNWg2s0WAiF+fC1HY/tsBMb1CGfpVULnO5ES5bKtUv/aGtySzH0vXilGDUvhZ/8mdaRn6uxpzcqrFdAyW8elSD28CypcYoxy6Myudw3SFiRPs0/Z02VXvm8DQtU/lcFEnaO7dMG+FpFhsWbrEjcRS6R7ve8uc7e/WuaQhtNVzSTOzRe+JFPGP9FOcYN+AcW2NJFILV9yT7+X/MPIB0OMxuwaPmVgtoyx0oec2nw05azmDr76P2e1XLnKtxa8ouwvPx8EMgApnXSR6VmLGu/w8nmtvIWjEAJ88cdGhwBagtyAsn2frzHq8aKpMziDRYvw4ivwGAeHJFsDtdRXzSbxhxmjl6+is3P0g0iAfojQ/Pzd4GugSYwqRQLLE7dUE0FAKXhKAAQAkjRZxik2+w6jgG8PuLuHdR4pm7C9srL+WAX8aFq/RQXE7BoIdqiZ5TMekw8d6eCRTjcRHsa3pPAd0=" - on_success: change - on_failure: always diff --git a/.travis/create_api_user.sh b/.travis/create_api_user.sh deleted file mode 100755 index c898f15..0000000 --- a/.travis/create_api_user.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -ev - -sqlplus -S -L sys/oracle@//127.0.0.1:1521/xe AS SYSDBA < demo_project.sh.tmp <org.utplsql cli - 3.1.9 + 3.2.0-SNAPSHOT utPLSQL CLI CLI for running Unit Tests with utPLSQL v3+. https://github.com/utPLSQL/utPLSQL-cli + 3.2.3 UTF-8 - 1.8 - 1.8 - 5.5.2 - 19.3.0.0 + 11 + 5.12.2 + 4.7.7 + 1.5.18 + 2.2 local + + utplsql + https://sonarcloud.io @@ -27,26 +32,44 @@ + + GitHub Issues + https://github.com/utPLSQL/utPLSQL-java-api/issues + + + + + Vinicius Avellar Moreira + utPLSQL.org + https://utplsql.org + amvinicius@gmail.com + + + Samuel Nitsche + utPLSQL.org + https://utplsql.org + derpesse@gmail.com + + + Jacek Gebal + utPLSQL.org + https://utplsql.org + jgebal@gmail.com + + + Simon Martinelli + utPLSQL.org + https://utplsql.org + simon@martineli.ch + https://martinelli.ch + + + org.utplsql - java-api - 3.1.9 - compile - - - com.oracle.ojdbc - ucp - - - com.oracle.ojdbc - ojdbc8 - - - com.oracle.ojdbc - orai18n - - + utplsql-java-api + ${utplsql-java-api.version} javax.xml.bind @@ -56,32 +79,13 @@ ch.qos.logback logback-classic - 1.2.11 + ${logback.version} info.picocli picocli - 4.6.3 + ${picocli.version} - - com.oracle.database.jdbc - ojdbc8 - ${oracle.jdbc.version} - compile - - - com.oracle.database.jdbc - ucp - - - - - com.oracle.database.nls - orai18n - ${oracle.jdbc.version} - compile - - org.junit.jupiter @@ -92,17 +96,22 @@ org.hamcrest hamcrest - 2.1 + ${hamcrest.version} test + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + org.codehaus.mojo appassembler-maven-plugin - 1.10 + 2.1.0 true true @@ -120,7 +129,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.0 + 3.5.5 **/*IT.java @@ -130,7 +139,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 2.22.0 + 3.5.5 @@ -143,7 +152,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.8.0 utPLSQL-cli false @@ -155,7 +164,7 @@ net.nicoulaj.maven.plugins checksum-maven-plugin - 1.10 + 1.11 @@ -173,7 +182,7 @@ com.amashchenko.maven.plugin gitflow-maven-plugin - 1.18.0 + 1.21.0 true @@ -202,16 +211,9 @@ - utplsql-java-api - - https://packagecloud.io/utplsql/utplsql-java-api/maven2 - - - true - - - true - + central-snapshots + https://central.sonatype.com/repository/maven-snapshots/ + true @@ -224,13 +226,6 @@ org.apache.maven.plugins maven-failsafe-plugin - - - ${dbUrl} - ${dbUser} - ${dbPass} - - diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index de1be33..f79e63d 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -192,8 +192,8 @@ private void initDatabase(DataSource dataSource) throws SQLException { compatibilityProxy = checkFrameworkCompatibility(conn); - logger.info("Successfully connected to database. UtPLSQL core: {}", compatibilityProxy.getVersionDescription()); - logger.info("Oracle-Version: {}", new DefaultDatabaseInformation().getOracleVersion(conn)); + logger.info("Connected to Oracle database: {}", new DefaultDatabaseInformation().getOracleVersion(conn)); + logger.info("utPLSQL core: {}", compatibilityProxy.getVersionDescription()); } catch (SQLException e) { if (e.getErrorCode() == 1017 || e.getErrorCode() == 12514) { throw new DatabaseConnectionFailed(e); diff --git a/src/main/java/org/utplsql/cli/datasource/InitializableOracleDataSource.java b/src/main/java/org/utplsql/cli/datasource/InitializableOracleDataSource.java index db32b1a..0aa44fa 100644 --- a/src/main/java/org/utplsql/cli/datasource/InitializableOracleDataSource.java +++ b/src/main/java/org/utplsql/cli/datasource/InitializableOracleDataSource.java @@ -2,31 +2,102 @@ import oracle.jdbc.pool.OracleDataSource; +import javax.sql.DataSource; +import java.io.PrintWriter; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; -public class InitializableOracleDataSource extends OracleDataSource { +public class InitializableOracleDataSource implements DataSource { + private final OracleDataSource delegate; private String initSql; public InitializableOracleDataSource() throws SQLException { + this.delegate = new OracleDataSource(); } + // --- URL / credentials passthrough (mirrors what callers used before) --- + + public void setURL(String url) throws SQLException { + delegate.setURL(url); + } + + public void setUser(String user) { + delegate.setUser(user); + } + + public void setPassword(String password) { + delegate.setPassword(password); + } + + // --- Core DataSource methods --- + @Override public Connection getConnection() throws SQLException { - Connection con = super.getConnection(); - - if ( initSql != null && !initSql.isEmpty() ) { - try (CallableStatement stmt = con.prepareCall(initSql)) { - stmt.execute(); - } - } + Connection con = delegate.getConnection(); + runInitSql(con); + return con; + } + @Override + public Connection getConnection(String username, String password) throws SQLException { + Connection con = delegate.getConnection(username, password); + runInitSql(con); return con; } - public void setConnectionInitSql( String sql ) { + public void setConnectionInitSql(String sql) { this.initSql = sql; } -} + + // --- DataSource boilerplate --- + + @Override + public PrintWriter getLogWriter() throws SQLException { + return delegate.getLogWriter(); + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + delegate.setLogWriter(out); + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + delegate.setLoginTimeout(seconds); + } + + @Override + public int getLoginTimeout() throws SQLException { + return delegate.getLoginTimeout(); + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return delegate.getParentLogger(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + if (iface.isInstance(delegate)) return iface.cast(delegate); + return delegate.unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return iface.isInstance(delegate) || delegate.isWrapperFor(iface); + } + + // --- Private helpers --- + + private void runInitSql(Connection con) throws SQLException { + if (initSql != null && !initSql.isEmpty()) { + try (CallableStatement stmt = con.prepareCall(initSql)) { + stmt.execute(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java b/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java index 8f99cf3..34fbb4b 100644 --- a/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java +++ b/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java @@ -1,6 +1,5 @@ package org.utplsql.cli.datasource; -import oracle.jdbc.pool.OracleDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.utplsql.api.EnvironmentVariableUtil; @@ -46,7 +45,7 @@ public DataSource getDataSource() throws SQLException { return ds; } - private void setThickOrThinJdbcUrl(OracleDataSource ds) throws SQLException { + private void setThickOrThinJdbcUrl(InitializableOracleDataSource ds) throws SQLException { List errors = new ArrayList<>(); Throwable lastException = null; diff --git a/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java b/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java index 602ee7c..20483c1 100644 --- a/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java +++ b/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java @@ -29,13 +29,17 @@ public LocalAssetsCoverageHTMLReporter(String selfType, Object[] attributes) { public Reporter init(Connection con, CompatibilityProxy compatibilityProxy, ReporterFactory reporterFactory) throws SQLException { super.init(con, compatibilityProxy, reporterFactory); - if (hasOutputToFile()) { + if (hasOutputToFile() && assetsAreBundled()) { writeReportAssetsTo(getPhysicalAssetPath()); } return this; } + private static boolean assetsAreBundled() { + return CoverageHTMLReporter.class.getResource("/CoverageHTMLReporter") != null; + } + private String getNameOfOutputFile() { Path outputPath = Paths.get(options.getOutputFileName()); return outputPath.getName(outputPath.getNameCount() - 1).toString(); @@ -51,7 +55,7 @@ private Path getPhysicalAssetPath() { } private void setAssetsPathFromOptions() { - if (hasOutputToFile()) { + if (hasOutputToFile() && assetsAreBundled()) { setAssetsPath(getNameOfOutputFile() + "_assets/"); } } diff --git a/src/test/java/org/utplsql/cli/CliVersionInfoTest.java b/src/test/java/org/utplsql/cli/CliVersionInfoTest.java index 28db14c..4a89f27 100644 --- a/src/test/java/org/utplsql/cli/CliVersionInfoTest.java +++ b/src/test/java/org/utplsql/cli/CliVersionInfoTest.java @@ -8,6 +8,6 @@ class CliVersionInfoTest { @Test void getCliVersionInfo() { - assertTrue(CliVersionInfo.getVersion().startsWith("3.1")); + assertTrue(CliVersionInfo.getVersion().startsWith("3.2")); } } diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index 488654e..dddca1a 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -19,9 +19,9 @@ class TestHelper { private static String sPass; static { - sUrl = EnvironmentVariableUtil.getEnvValue("DB_URL", "192.168.99.100:1521:XE"); - sUser = EnvironmentVariableUtil.getEnvValue("DB_USER", "app"); - sPass = EnvironmentVariableUtil.getEnvValue("DB_PASS", "app"); + sUrl = EnvironmentVariableUtil.getEnvValue("DB_URL", "//localhost:1521/FREEPDB1"); + sUser = EnvironmentVariableUtil.getEnvValue("DB_USER", "APP"); + sPass = EnvironmentVariableUtil.getEnvValue("DB_PASS", "pass"); } static RunPicocliCommand createPicocliRunCommand(String... args ) {