<?xml version="1.0" encoding="UTF-8"?>
<!--

    Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.eclipse.ee4j.faces.tck</groupId>
        <artifactId>old-faces-tck-parent</artifactId>
        <version>4.1.1</version>
    </parent>

    <artifactId>old-tck-run</artifactId>
    <packaging>pom</packaging>

    <name>Old Jakarta Faces TCK - run</name>

    <properties>
        <ant.version>1.10.2</ant.version>
        <ant.home>${project.build.directory}/apache-ant-${ant.version}</ant.home>
        <ant.zip.url>https://archive.apache.org/dist/ant/binaries/apache-ant-${ant.version}-bin.zip</ant.zip.url>
        
        <tck.home>${project.build.directory}/faces-tck</tck.home>
        <tck.tests.home>${tck.home}/src/com/sun/ts/tests</tck.tests.home>
        <tck.mode>standalone</tck.mode>
        <tck.old.skip>${skipITs}</tck.old.skip>
         
        <glassfish.asadmin>${glassfish.home}/glassfish/bin/asadmin</glassfish.asadmin>
       
        <jacoco.includes>org/glassfish/**\:com/sun/enterprise/**</jacoco.includes>
        
        <port.admin>14848</port.admin>
        <port.derby>11527</port.derby>
        <port.http>18080</port.http>
        <port.https>18181</port.https>
        <port.jms>17676</port.jms>
        <port.jmx>18686</port.jmx>
        <port.orb>13700</port.orb>
        <port.orb.mutual>13920</port.orb.mutual>
        <port.orb.ssl>13820</port.orb.ssl>
        <port.harness.log>12000</port.harness.log>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.main.distributions</groupId>
            <artifactId>glassfish</artifactId>
            <version>${glassfish.version}</version>
            <type>zip</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.ee4j.faces.tck</groupId>
            <artifactId>old-tck-build</artifactId>
            <version>${project.version}</version>
            <type>zip</type>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.googlecode.maven-download-plugin</groupId>
                <artifactId>download-maven-plugin</artifactId>
                <version>1.6.7</version>
                <executions>
                    <execution>
                        <id>download-ant</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>wget</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <skip>${tck.old.skip}</skip>
                    <url>${ant.zip.url}</url>
                    <unpack>true</unpack>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <configuration>
                    <skip>${tck.old.skip}</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>unpack-tck</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <includeArtifactIds>old-tck-build</includeArtifactIds>
                            <outputDirectory>${project.build.directory}</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>3.1.0</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.ant</groupId>
                        <artifactId>ant</artifactId>
                        <version>${ant.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>ant-contrib</groupId>
                        <artifactId>ant-contrib</artifactId>
                        <version>1.0b3</version>
                        <exclusions>
                            <exclusion>
                                <groupId>ant</groupId>
                                <artifactId>ant</artifactId>
                            </exclusion>
                        </exclusions>
                    </dependency>
                </dependencies>
                <configuration>
                    <skip>${tck.old.skip}</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>prepare-tck-and-glassfish</id>
                        <phase>pre-integration-test</phase>
                        <configuration>
                            <target xmlns:if="ant:if" xmlns:unless="ant:unless">
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
                                         
                                <macrodef name="tck-setting">
                                    <attribute name="key" /> <attribute name="value" />
                                    <sequential>
                                      <replaceregexp file="${tck.home}/bin/ts.jte" byline="true"
                                        match="@{key}=.*" replace="@{key}=@{value}" />
                                    </sequential>
                                </macrodef>
                                
                                <if>
                                    <equals arg1="${tck.mode}" arg2="platform" />
                                    <then>
                                        <copy file="${tck.home}/bin/ts.jtx.platform" tofile="${tck.home}/bin/ts.jtx" overwrite="true"  />
                                    </then>
                                    <elseif>
                                        <equals arg1="${tck.mode}" arg2="standalone" />
                                            <then>
                                                <copy file="${tck.home}/bin/ts.jtx.standalone" tofile="${tck.home}/bin/ts.jtx" overwrite="true"  />
                                            </then>
                                    </elseif>
                                    <else>
                                        <echo message="The value of property ${tck.mode} should be set as standalone or platform " />
                                        <fail/>
                                    </else>
                                </if>
                                
                                
                                <!-- 
                                    Set exclude file 
                                    
                                    This will exclude everything except for lines matching a pattern, which will not be excluded.
                                    In effect, it works as the reverse and only these tests will be executed.
                                    
                                -->
                                <sequential if:set="run.test.pattern">
                                    <echo message="Running test pattern ${run.test.pattern}" /> 
                            
                                    <copy file="${project.basedir}/src/test/etc/ts-all-${tck.mode}.jtx"
                                        tofile="${tck.home}/bin/ts.jtx.tmp" overwrite="true" verbose="true"/>
                            
                                    <replaceregexp file="${tck.home}/bin/ts.jtx.tmp"
                                        match="${run.test.pattern}" replace="" byline="true" />
                                        
                                    <copy file="${tck.home}/bin/ts.jtx.tmp" 
                                        toFile="${tck.home}/bin/ts.jtx" overwrite="true" verbose="true">
                                        <filterchain>
                                            <ignoreblank/>
                                        </filterchain>
                                    </copy>
                                    
                                    <delete file="${tck.home}/bin/ts.jtx.tmp"/>
                                    
                                    <if>
                                        <equals arg1="${tck.mode}" arg2="platform" />
                                    <then>
                                        <loadfile srcFile="${tck.home}/bin/ts.jtx.platform" property="ts.jtx.platform" />
                                        <echo append="true" message="${ts.jtx.platform}" file="${tck.home}/bin/ts.jtx"/>
                                    </then>
                                    <elseif>
                                        <equals arg1="${tck.mode}" arg2="standalone" />
                                            <then>
                                                <loadfile srcFile="${tck.home}/bin/ts.jtx.standalone" property="ts.jtx.standalone"  />
                                                <echo append="true" message="${ts.jtx.standalone}" file="${tck.home}/bin/ts.jtx"/>
                                            </then>
                                    </elseif>
                                    </if>
                                    
                                </sequential>
                                
                                

                                <!-- Change configuration -->
                                
                                <tck-setting key="web.home" value="${glassfish.home}/glassfish"/>
                                <tck-setting key="webServerHome" value="${glassfish.home}/glassfish"/>
                                <tck-setting key="webServerHost" value="localhost"/>
                                <tck-setting key="webServerPort" value="${port.http}"/>
                                
                                <tck-setting key="securedWebServicePort" value="${port.https}"/>
                                <tck-setting key="s1as.admin.port" value="${port.admin}"/>
                                <tck-setting key="glassfish.admin.port" value="${port.admin}"/>
                                <tck-setting key="orb.port" value="${port.orb}"/>
                                <tck-setting key="database.port" value="${port.derby}"/>
                                <tck-setting key="harness.log.port" value="${port.harness.log}"/>
                                
                                <tck-setting key="report.dir" value="${tck.home}/facesreport/faces"/>
                                <tck-setting key="work.dir" value="${tck.home}/faceswork/faces"/>

                                <tck-setting key="impl.vi" value="glassfish"/>
                                <tck-setting key="impl.vi.deploy.dir" value="${webServerHome}/domains/domain1/autodeploy"/>
                                <tck-setting key="impl.deploy.timeout.multiplier" value="960"/>
                                
                                <tck-setting key="jsf.classes" value="${webServerHome}/modules/cdi-api.jar;${webServerHome}/modules/jakarta.servlet.jsp.jstl-api.jar;${webServerHome}/modules/jakarta.inject.jar;${webServerHome}/modules/jakarta.faces.jar;${webServerHome}/modules/jakarta.servlet.jsp-api.jar;${webServerHome}/modules/jakarta.servlet-api.jar;${webServerHome}/modules/expressly.jar"/>

                                <limit maxwait="60">
                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin" failonerror="true">
                                        <arg value="delete-domain"/>
                                        <arg value="domain1" />
                                    </exec>
                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin" failonerror="true">
                                        <arg value="create-domain"/>
                                        <arg value="--domainproperties=domain.adminPort=${port.admin}:domain.instancePort=${port.http}:http.ssl.port=${port.https}:jms.port=${port.jms}:domain.jmxPort=${port.jmx}:orb.listener.port=${port.orb}:orb.ssl.port=${port.orb.ssl}:orb.mutualauth.port=${port.orb.mutual}" />
                                        <arg value="--user=admin" />
                                        <arg value="--nopassword" />
                                        <arg value="domain1" />
                                    </exec>
                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin" failonerror="true">
                                        <arg value="start-domain"/>
                                    </exec>

                                    <if>
                                        <isset property="jacoco.version" />
                                        <then>
                                            <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
                                                <arg value="create-jvm-options" />
                                                <arg value="--port=${port.admin}" />
                                                <arg value="&quot;-javaagent\:${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.build.directory}/jacoco-it.exec,includes=${jacoco.includes}&quot;" />
                                            </exec>
                                        </then>
                                    </if>
                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin" failonerror="true">
                                        <arg value="stop-domain"/>
                                        <arg value="domain1"/>
                                    </exec>
                                </limit>
                                
                                <mkdir dir="${tck.home}/facesreport"/>
                                <mkdir dir="${tck.home}/facesreport/faces"/>
                                
                                <replace file="${tck.home}/bin/xml/ts.top.import.xml" if:set="suspend-tck" >
                                  <replacetoken><![CDATA[<jvmarg value="-Xmx512m"/>]]></replacetoken>
                                  <replacevalue><![CDATA[<jvmarg value="-Xmx512m"/>
                                <jvmarg value="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9008"/>]]></replacevalue>
                                </replace>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>

                    <execution>
                        <id>configure-tck-tests</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target xmlns:if="ant:if" xmlns:unless="ant:unless">
                                <replace file="${glassfish.home}/glassfish/domains/domain1/config/domain.xml" 
                                    token="-Xmx512m" value="-Xmx1024m" />
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
                                
                                <limit maxwait="300">
                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin" failonerror="true">
                                        <arg value="start-domain"/>
                                        <arg value="--suspend" if:set="glassfish.suspend"/>
                                    </exec>
                                </limit>
                                
                                <!-- Deploy single test -->
                                <sequential if:set="run.test" >
                                    <dirname property="test.dir" file="${tck.home}/src/${run.test}"/>
                                    <echo>Deploying from ${test.dir}</echo>
                                    
                                    <exec executable="${ant.home}/bin/ant" dir="${test.dir}" failonerror="true">
                                        <arg value="deploy"  />
                                    </exec>
                                </sequential>
                                
                                <!-- Deploy all tests -->
                                <sequential unless:set="run.test" >
                                    <echo>Deploying all archives</echo>
                                    <exec executable="${ant.home}/bin/ant" dir="${tck.tests.home}" failonerror="true">
                                        <arg value="-Dutil.dir=${tck.home}"  />
                                        <arg value="deploy.all"  />
                                    </exec>
                                </sequential>
                            </target>
                        </configuration>
                    </execution>

                    <execution>
                        <id>run-tck-tests</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target xmlns:if="ant:if" xmlns:unless="ant:unless">
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />

                                <echo level="info" message="Start running all tests" />
                                <exec executable="${ant.home}/bin/ant" dir="${tck.home}/bin" resultproperty="testResult">
                                    <arg value="-Dutil.dir=${tck.home}"  />
                                    <arg value="-Dmultiple.tests=${run.test}" if:set="run.test" />
                                    <arg value="run.all" unless:set="run.test"/>
                                    <arg value="runclient" if:set="run.test" />
                                    <env key="LC_ALL" value="C" />
                                </exec>

                                <if>
                                    <not>
                                        <equals arg1="${testResult}" arg2="0" />
                                    </not>
                                    <then>
                                        <echo message="Running tests failed." />
                                        <loadfile property="contents" srcFile="${glassfish.home}/glassfish/domains/domain1/logs/server.log" />
                                        <echo message="${contents}" />
                                    </then>
                                </if>

                                <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
                                    <arg value="stop-domain" />
                                </exec>
                                
                                <if>
                                    <not>
                                        <equals arg1="${testResult}" arg2="0" />
                                    </not>
                                    <then>
                                        <fail/>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
