/*
 * 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.
 */

package openejb.tck.commands

import org.apache.commons.lang.SystemUtils
import org.apache.commons.lang.time.StopWatch

import org.apache.geronimo.cts.mavenplugins.j2eetck.report.ReportFileLocator
import org.apache.geronimo.cts.mavenplugins.j2eetck.report.ReportTestCaseLoader
import openejb.tck.util.Messages
import openejb.tck.util.OutputScanner

/**
 * Executes JavaTest to run the TCK tests.
 *
 * @version $Revision$ $Date$
 */
class JavaTestCommand
    extends CommandSupport
{
    def JavaTestCommand(source) {
        super(source)
    }
    
    def execute() {
        if (selectTests().size() == 0) {
            throw new Exception("Must specify at least one test to execute")
        }

        def tests = require('tests').tokenize(",")
        
        def tsant = new TsAntCommand(this)
        
        //
        // NOTE: Special handling for some interop tests
        //
        
        if (tests.contains("interop-csiv2")) {
            if (tests.size() != 1) {
                throw new Exception("The 'interop-csiv2' tests must be run alone")
            }
            
            tsant.execute("enable.csiv2")
            
            javatest()
            
            tsant.execute("disable.csiv2")
        }
        else if (tests.contains("interop-tx")) {
            if (tests.size() != 1) {
                throw new Exception("The 'interop-tx' tests must be run alone")
            }
            
            def workingDir = "${project.build.directory}/tck-work"
            def txDir = "${workingDir}/com/sun/ts/tests/interop/tx"
            
            tsant.execute("disable.ri.tx.interop")
            
            javatest()
            
            ant.mkdir(dir: "${txDir}/interop")
            ant.move(todir: "${txDir}/interop", overwrite: true) {
                fileset(dir: txDir) {
                    exclude(name: "interop/**")
                    exclude(name: "nointerop/**")
                }
            }
            
            tsant.execute("enable.ri.tx.interop")
            
            javatest()
            
            ant.mkdir(dir: "${txDir}/nointerop")
            ant.move(todir: "${txDir}/nointerop", overwrite: true) {
                fileset(dir: txDir) {
                    exclude(name: "interop/**")
                    exclude(name: "nointerop/**")
                }
            }
        }
        else {
            javatest()
        }
    }
    
    def line() {
        println()
        println("=" * 79)
        println()
    }

    def javatest() {
        log.info("Executing JavaTest...")
        
        initPaths()
        
        def tests = selectTests()
        println(tests)


        def timeout = getInteger('timeout', -1)
        def logOutput = getBoolean('logOutput', false)
        def logOutputDirectory = get('logOutputDirectory', "${project.build.directory}/logs")
        def logFile = "${logOutputDirectory}/javatest.log"
        
        def openejbHome = require('openejb.home')
        def javaeeCtsHome = require('javaee6.cts.home')
        def javaeeRiHome = require('javaee6.ri.home')
        def workingDir = "${project.build.directory}/tck-work"
        
        // Define a list of options to enable
        def options = get('options', "").tokenize(',')
        
        // If we are logging output then start the scanner to show progress
        def outputScanner
        if (logOutput) {
            //
            // FIXME: Need to allow appending he log for special interop tests which run
            //        javatest() more than once
            //
            
            // Make sure we start with an empty log
            ant.delete(file: logFile)
            
            outputScanner = new OutputScanner(logFile);
            outputScanner.start()
        }
        
        //
        // HACK: For some reason, need to quote JAVA_HOME on Windows...
        //
        def javaHome = require('java.home')
        if (SystemUtils.IS_OS_WINDOWS) {
            javaHome = "'${javaHome}'"
        }
        
        ant.mkdir(dir: workingDir)
        
        // Make sure we start out with a fresh state
        ant.delete() {
            fileset(dir: workingDir) {
                include(name: "**")
            }
        }
        
        // Track how long the run takes
        def watch = new StopWatch()
        watch.start()

        try {
            ant.java(classname: "com.sun.javatest.tool.Main", failonerror: false, fork: "yes", maxmemory: "150m") {
                //
                // NOTE: Get a reference to the current node so we can conditionally set attributes
                //
                def node = current.wrapper

                // Maybe set timeout
                if (timeout > 0) {
                    log.info("Timeout after: ${timeout} seconds");
                    def millis = timeout * 1000
                    node.setAttribute('timeout', "${millis}")
                }

                // Maybe enable output logging
                if (logOutput) {
                    log.info("Redirecting output to: ${logFile}")
                    redirector(output: logFile)
                }

                classpath(refid: "ts.harness.classpath")

                if (options.contains('javatest-debug')) {
                    log.info("Enabling debug options")

                    jvmarg(value: '-Xdebug')
                    jvmarg(value: '-Xnoagent')
                    jvmarg(value: '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5004')
                    jvmarg(value: '-Djava.compiler=NONE')
                }

                if (options.contains('debug')) {
                    log.info("Enabling server debug options")
                    jvmarg(value: '-Dopenejb.server.debug=true')
                }

                def tckJavaHome = get('tck.java.home')
                if (tckJavaHome != null) {
                    log.info("Using java home ${tckJavaHome}")
                    jvmarg(value: "-Dtck.java.home=${tckJavaHome}")
                }

                def tckJavaVersion = get('tck.java.version')
                if (tckJavaVersion != null) {
                    log.info("Using java version ${tckJavaVersion}")
                    jvmarg(value: "-Dtck.java.version=${tckJavaVersion}")
                }

                def opts = get('tck.java.opts')
                if (tckJavaVersion != null && (tckJavaVersion.startsWith("9") || tckJavaVersion.startsWith("1.9"))) {
                    jvmarg(value: "-Dtck.java.opts=" +
                            "-Dopenejb.deployer.jndiname=openejb/WebappDeployerRemote " +
                            "--add-opens java.base/java.net=ALL-UNNAMED " +
                            "--add-opens java.base/java.lang=ALL-UNNAMED " +
                            "--add-modules java.xml.bind,java.corba")
                }

                sysproperty(key: "user.language", value: 'en')
                sysproperty(key: "user.country", value: 'US')

                sysproperty(key: "openejb.server.uri", value: require('openejb.server.uri'))
                sysproperty(key: "openejb.servicemanager.enabled", value: true)

                sysproperty(key: "server.shutdown.port", value: require('webcontainer.default.shutdown.port'))
                sysproperty(key: "openejb.home", file: openejbHome)
                sysproperty(key: "com.sun.ejb.home", file: openejbHome)
                sysproperty(key: "TS_HOME", file: javaeeCtsHome)
                sysproperty(key: "ts.home", file: javaeeCtsHome)
                sysproperty(key: "J2EE_HOME", file: openejbHome)
                sysproperty(key: "JAVA_HOME", file: javaHome)
                sysproperty(key: "cts.jtroutput", value: true)
                sysproperty(key: "cts.harness.debug", value: require('cts.harness.debug'))
                sysproperty(key: "javatest.security.allowPropertiesAccess", value: true)
                sysproperty(key: "java.security.policy", file: "${javaeeRiHome}/bin/harness.policy")
                sysproperty(key: "J2EE_HOME_RI", file: javaeeRiHome)
                sysproperty(key: "deliverable.class", value: require('deliverable.class'))
                if (tckJavaHome == null || !new File(tckJavaHome, 'jmods').exists()/*j9 doesnt support it*/) {
                    sysproperty(key: "java.endorsed.dirs", file: "${javaeeRiHome}/lib/endorsed")
                }
                sysproperty(key: "com.sun.enterprise.home", file: javaeeRiHome)
                sysproperty(key: "com.sun.aas.installRoot", file: javaeeRiHome)
                sysproperty(key: "DEPLOY_DELAY_IN_MINUTES", value: require('deploy_delay_in_minutes'))

                sysproperty(key: "java.protocol.handler.pkgs", value: 'javax.net.ssl')
                sysproperty(key: "javax.net.ssl.keyStorePassword", value: 'changeit')
                sysproperty(key: "javax.net.ssl.keyStore", file: "${project.basedir}/src/test/keystores/clientcert.jks")
                sysproperty(key: "javax.net.ssl.trustStore", file: "${project.basedir}/src/test/keystores/ssl-truststore")
                sysproperty(key: "javax.net.ssl.trustStorePassword", file: "changeit")

                if (options.contains('appclient-debug')) {
                    log.info("Enabling appclient-debug options")

                    // See testsuite.properties command.testExecuteAppClient for usage
                    sysproperty(key: 'command.testExecuteAppClient.debugopts', value: '-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5003')
                }

                //
                // TODO: Add support for setting command.testExecute.debugopts
                //

                if (options.contains('harness-debug')) {
                    log.info("Enabling harness-debug options")

                    // See testsuite.properties command.testExecute for usage
                    sysproperty(key: 'command.testExecute.debugopts', value: '-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5002')
                }

                if (options.contains('embedded-debug')) {
                    log.info("Enabling embedded-debug options")

                    // See testsuite.properties command.testExecute for usage
                    sysproperty(key: 'command.testExecuteEmbedded.debugopts', value: '-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5001')
                }

                if (SystemUtils.IS_OS_WINDOWS) {
                    sysproperty(key: "windir", value: System.getenv('windir'))
                    sysproperty(key: "SYSTEMROOT", value: System.getenv('SystemRoot'))
                }

                // Include system properties
                arg(value: "-EsysProps")

                arg(value: "-batch")

                arg(value: "-testsuite")
                arg(file: "${javaeeCtsHome}/src")

                arg(value: "-workDir")
                arg(file: workingDir)

                arg(value: "-envFiles")
                arg(file: "${project.build.directory}/ts.jte")

                arg(value: "-env")
                if (SystemUtils.IS_OS_WINDOWS) {
                    arg(value: "ts_win32")
                }
                else {
                    arg(value: "ts_unix")
                }

                arg(value: "-excludeList")
                arg(file: "${project.build.directory}/ts.jtx")

                arg(value: "-timeoutFactor")
                arg(value: "10.0")

                arg(value: "-priorStatus")
                arg(value: "pass,fail,error,notRun")

                arg(value: "-tests")

                tests.each {
                    log.info("Including tests: ${it}")
                    arg(value: it)
                }

                arg(value: "-runtests")

                //
                // HACK: Some pre-running feedback (have to include this in the java closure)
                //
                log.info("Running tests...")
                log.info("> Container Java Version: ${tckJavaVersion}")
                log.info("> Container Java Home: ${tckJavaHome}")

                line()
            }
        } catch (Exception e) {
            log.warn("JavaTest returned non-zero status (see logs/javatest.log) for details: $e")
        }

        watch.stop()
        if (logOutput) {
            outputScanner.shutdown()
        }

        // Display the test summary
        line()
        
        def dir = new File(workingDir)
        def locator = new ReportFileLocator(dir);
        def loader = new ReportTestCaseLoader(dir, true, locator);
        def testcases = loader.loadTestCases();
        def count = testcases.size()
        def passed = 0
        def failed = 0
        def errors = 0

        testcases.each {
            if (it.failed) {
                failed++
            }
            else if (it.error) {
                errors++
            }
            else {
                passed++
            }

            // Only show the summary when we are *not* logging
            if (!logOutput) {
                print('    ')

                if (it.error) {
                    Messages.error()
                }
                else if (it.failed) {
                    Messages.failed()
                }
                else {
                    Messages.passed()
                }

                println(" - ${it.className}#${it.name}")
            }
        }

        // Complain if nothing was run
        if (passed + failed + errors == 0) {
            log.warn('No tests were ran')
        }

        if (!logOutput) {
            println()
        }

        println("Completed running ${count} tests (${watch}):")
        println()
        println("    Passed: $passed")
        println("    Failed: $failed")
        println("    Errors: $errors")

        // Dump out a summary file so we can use that to act upon the results easily in the automated muck
        def props = new Properties()
        //props.setProperty('server', "$webcontainer")
        props.setProperty('tests', "$tests")
        props.setProperty('count', "$count")
        props.setProperty('passCount', "$passed")
        props.setProperty('failureCount', "$failed")
        props.setProperty('errorCount', "$errors")
        props.setProperty('passed', "${failed + errors == 0}")

        def output = new File("${project.build.directory}/summary.properties").newOutputStream()
        try {
            props.store(output, null)
        }
        finally {
            output.close()
        }

        line()
    }
}
