| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| description = 'Fineract Integration Tests' |
| |
| apply plugin: 'com.bmuschko.cargo' |
| |
| // Configuration for the Gradle Cargo plugin |
| // https://github.com/bmuschko/gradle-cargo-plugin |
| configurations { |
| tomcat |
| } |
| |
| apply from: 'dependencies.gradle' |
| |
| // Allow external drivers to be used for the tests without packaging it |
| // mainly due to license incompatibilities |
| configurations { |
| driver |
| } |
| dependencies { |
| driver 'com.mysql:mysql-connector-j' |
| } |
| |
| cargo { |
| containerId "tomcat10x" |
| |
| // looks like Cargo doesn't detect the WAR file automatically in the multi-module setup |
| deployable { |
| file = file("$rootDir/fineract-war/build/libs/fineract-provider.war") |
| context = 'fineract-provider' |
| } |
| |
| local { |
| logLevel = 'low' |
| outputFile = file("$buildDir/cargo/integration-tests-output.log") |
| installer { |
| installConfiguration = configurations.tomcat |
| downloadDir = file("$buildDir/download") |
| extractDir = file("$buildDir/tomcat-integration-tests") |
| } |
| startStopTimeout = 1200000 |
| sharedClasspath = configurations.driver |
| containerProperties { |
| def jvmArgs = '--add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED ' |
| if (project.hasProperty('localDebug')) { |
| jvmArgs += ' -agentlib:jdwp=transport=dt_socket,server=y,address=*:9000,suspend=n -Xmx2G -Duser.timezone=Asia/Kolkata ' |
| } |
| if (project.hasProperty('dbType')) { |
| if ('postgresql'.equalsIgnoreCase(dbType)) { |
| jvmArgs += '-Dspring.datasource.hikari.driverClassName=org.postgresql.Driver -Dspring.datasource.hikari.jdbcUrl=jdbc:postgresql://localhost:5432/fineract_tenants -Dspring.datasource.hikari.username=root -Dspring.datasource.hikari.password=postgres -Dfineract.tenant.host=localhost -Dfineract.tenant.port=5432 -Dfineract.tenant.username=root -Dfineract.tenant.password=postgres' |
| } else if ('mysql'.equalsIgnoreCase(dbType)) { |
| jvmArgs += '-Dspring.datasource.hikari.driverClassName=com.mysql.cj.jdbc.Driver -Dspring.datasource.hikari.jdbcUrl=jdbc:mysql://localhost:3306/fineract_tenants -Dspring.datasource.hikari.username=root -Dspring.datasource.hikari.password=mysql -Dfineract.tenant.host=localhost -Dfineract.tenant.port=3306 -Dfineract.tenant.username=root -Dfineract.tenant.password=mysql' |
| } else { |
| throw new GradleException('Provided dbType is not supported') |
| } |
| } else { |
| jvmArgs += '-Dspring.datasource.hikari.driverClassName=org.mariadb.jdbc.Driver -Dspring.datasource.hikari.jdbcUrl=jdbc:mariadb://localhost:3306/fineract_tenants -Dspring.datasource.hikari.username=root -Dspring.datasource.hikari.password=mysql -Dfineract.tenant.host=localhost -Dfineract.tenant.port=3306 -Dfineract.tenant.username=root -Dfineract.tenant.password=mysql' |
| } |
| jvmArgs += ' -Dspring.profiles.active=test -Dfineract.events.external.enabled=true' |
| property 'cargo.start.jvmargs', jvmArgs |
| property 'cargo.tomcat.connector.keystoreFile', file("$rootDir/fineract-provider/src/main/resources/keystore.jks") |
| property 'cargo.tomcat.connector.keystorePass', 'openmf' |
| property 'cargo.tomcat.connector.keystoreType', 'JKS' |
| property 'cargo.tomcat.httpSecure', true |
| property 'cargo.tomcat.connector.sslProtocol', 'TLS' |
| property 'cargo.tomcat.connector.clientAuth', false |
| property 'cargo.protocol', 'https' |
| property 'cargo.servlet.port', 8443 |
| } |
| } |
| } |
| |
| cargoRunLocal.dependsOn ':fineract-war:war' |
| cargoStartLocal.dependsOn ':fineract-war:war' |
| |
| import java.net.HttpURLConnection |
| import java.net.URL |
| import javax.net.ssl.HttpsURLConnection |
| import javax.net.ssl.SSLContext |
| import javax.net.ssl.TrustManager |
| import javax.net.ssl.X509TrustManager |
| |
| tasks.register('waitForFineract') { |
| doLast { |
| int timeoutSeconds = (project.findProperty('waitForFineractTimeoutSeconds') ?: '600') as int |
| int waited = 0 |
| int interval = 5 |
| |
| TrustManager[] trustAllCerts = [ |
| new X509TrustManager() { |
| java.security.cert.X509Certificate[] getAcceptedIssuers() { return null } |
| void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {} |
| void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {} |
| } |
| ] as TrustManager[] |
| |
| SSLContext sc = SSLContext.getInstance("SSL") |
| sc.init(null, trustAllCerts, new java.security.SecureRandom()) |
| HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()) |
| HttpsURLConnection.setDefaultHostnameVerifier({ hostname, session -> true }) |
| |
| URL url = new URL("https://localhost:8443/fineract-provider/actuator/health") |
| println "Waiting for Fineract startup (timeout: ${timeoutSeconds}s)..." |
| |
| while (waited < timeoutSeconds) { |
| try { |
| HttpURLConnection connection = (HttpURLConnection) url.openConnection() |
| connection.setConnectTimeout(2000) |
| connection.setReadTimeout(2000) |
| connection.setRequestMethod("GET") |
| int responseCode = connection.getResponseCode() |
| if (responseCode == 200) { |
| println "Fineract is up!" |
| return |
| } |
| } catch (Exception ignored) { } |
| sleep(interval * 1000) |
| waited += interval |
| println "Still waiting..." |
| } |
| |
| throw new GradleException("Fineract did not start within ${timeoutSeconds} seconds") |
| } |
| } |
| |
| tasks.named('test').configure { |
| if (!project.hasProperty('cargoDisabled')) { |
| dependsOn cargoStartLocal, waitForFineract |
| finalizedBy cargoStopLocal |
| } |
| } |
| |
| if (!project.hasProperty('cargoDisabled')) { |
| cargoStartLocal.mustRunAfter testClasses |
| waitForFineract.mustRunAfter cargoStartLocal |
| } |
| |
| // Configure proper test output directories |
| sourceSets { |
| test { |
| output.resourcesDir = layout.buildDirectory.dir('resources/test').get().asFile |
| java.destinationDirectory = layout.buildDirectory.dir('classes/java/test').get().asFile |
| } |
| } |
| |
| tasks.named('compileTestJava') { |
| outputs.cacheIf { true } |
| } |
| |
| // NOTE: Gradle suggested these dependencies |
| compileTestJava.dependsOn(':fineract-provider:generateGitProperties', ':fineract-provider:processResources', ':fineract-provider:resolve') |
| spotbugsTest.dependsOn(':fineract-provider:generateGitProperties', ':fineract-provider:processResources', ':fineract-provider:resolve') |