/**
 * 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'
cargoStartLocal.mustRunAfter 'testClasses'

if (!project.hasProperty('cargoDisabled')) {
    test {
        dependsOn(cargoStartLocal)
        finalizedBy cargoStopLocal
    }
}

// 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')
