<?xml version="1.0" encoding="UTF-8"?>
<!--
 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.   
-->

<!--
    This build file is used to run the JPA TCK. It assumes that you have
    the TCK zip file located at:

        ${user.home}/.m2/privaterepos/jpa-1_0b-tck.zip

    If you have that file in a different location, it can be specified with
    the "tck.zip" system property.

    The TCK will only be run if you have the "tck-profile" enabled.

    To run a specific package of tests, use the "jpatck.pkg.dir" system
    property to specify the parent directory of the tests you want to run.
    E.g.:

        mvn integration-test -Ptck-profile -Djpatck.pkg.dir=com/sun/ts/tests/ejb30/persistence/inheritance/mappedsc/descriptors

    The TCK running process will do the following:

    1. Fine the TCK zip file and extract it
    2. Create an openjpa-provier.properties file with the OpenJPA config
    3. Modify the TCK's main configuration file (ts.jte) to use OpenJPA
    4. Run the database initialization script
    5. Run the TCK script
    6. Parse the TCK result log to determine whether to fail the build or not
-->
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>tck</artifactId>
    <packaging>pom</packaging>
    <name>OpenJPA JPA TCK Integration Tests</name>
    <parent>
        <groupId>org.apache.openjpa</groupId>
        <artifactId>openjpa-integration</artifactId>
        <version>1.0.2</version>
    </parent>

    <profiles>
    <profile>
    <id>tck-profile</id>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>run-tck</id>
                        <phase>integration-test</phase>
                        <configuration>
                        <tasks>
                        <echo>Running Sun JPA TCK</echo>

                        <property name="tck.zip" value=
                            "${settings.localRepository}/../privaterepos/jpa-1_0b-tck.zip"/>
                         <available property="tck.available" file="${tck.zip}"/>
                        <fail unless="tck.available">The TCK file ${tck.zip} does not exist. This file must be downloaded separately in order to be able to run the JPA TCK</fail>


                        <available property="tck.available" file="${tck.zip}"/>
                        <fail unless="tck.available">The TCK file specific in the "tck.zip" system property (${tck.zip}) does not exist. This file must be downloaded separately in order to be able to run the JPA TCK</fail>

                        <property name="tck.base"
                            value="${basedir}/target/tck"/>
                        <property name="tck.dir" value="${tck.base}/jpatck"/>

                        <delete dir="${tck.dir}"/>

                        <unzip overwrite="false"
                            src="${tck.zip}" dest="${tck.base}"/>

                        <path id="cp">
                            <path refid="maven.compile.classpath"/>

                            <!-- use official JPA API instead of GM's -->
                            <fileset dir="${tck.dir}/lib">
                                <include name="**/*.jar"/>
                                <exclude name="**/geronimo-jpa*"/>
                            </fileset>
                            <pathelement path="${java.class.path}"/>
                        </path>
                        <pathconvert property="cp.property" refid="cp"/>

                        <property name="db.driver"
                            value="org.apache.derby.jdbc.EmbeddedDriver"/>
                        <property name="db.url"
                            value="jdbc:derby:derby-database;create=true"/>
                        <property name="db.username" value="nousername"/>
                        <property name="db.password" value="nopassword"/>

                        <property name="jpatck.pkg.dir" value="com"/>

                        <property name="jpatck.work.dir"
                            value="${tck.dir}/../work"/>
                        <property name="tck.log"
                            value="${tck.base}/openjpa-tck.log"/>

                        <property name="openjpa.properties"
                            value="${tck.dir}/openjpa-provier.properties"/>

                        <!-- create the OpenJPA properties for the TCK run -->
                        <echo append="false" file="${openjpa.properties}">
javax.persistence.provider: org.apache.openjpa.persistence.PersistenceProviderImpl
openjpa.ConnectionDriverName: ${db.driver}
openjpa.ConnectionURL: ${db.url}
openjpa.ConnectionUserName: ${db.username}
openjpa.ConnectionPassword: ${db.password}
openjpa.FetchBatchSize: -1
openjpa.Compatibility: StrictIdentityValues=true
openjpa.Sequence: time
openjpa.Log: DefaultLevel=WARN
openjpa.jdbc.DBDictionary: StoreCharsAsNumbers=false
openjpa.jdbc.SchemaFactory: native(ForeignKeys=true)
                        </echo>

                        <!-- Append OpenJPA-specific configuration -->
                        <property name="jpatck.config"
                            value="${tck.dir}/bin/ts.jte"/>

                        <echo append="false" file="${jpatck.config}.tmp">


#########################################################################
## OpenJPA specific properties follow
#########################################################################

jpa.home=${tck.dir}
work.dir=${jpatck.work.dir}
report.dir=${tck.dir}/../reports
jpa.classes=${cp.property}
database.classes=${jpa.classes}
# Need to specify java.* classes, both in Windows/UNIX locations as well as Mac.
# This includes a few different possible locations; only one of them needs to 
# actually work for a given environment.
sigTestClasspath=${JAVA_HOME}/lib/rt.jar${path.separator}${JAVA_HOME}/jre/lib/rt.jar${path.separator}${JAVA_HOME}/../Classes/classes.jar${path.separator}$${jpa.classes}
persistence.unit.properties.file.full.path=${openjpa.properties}
database.user=${db.username}
database.passwd=${db.password}
database.url=${db.url}
database.driver=${db.driver}

                        </echo>

                        <!-- convert backslashes and known paths with spaces
                            to get around a problem with the TCK testrunner 
                            on windows -->
                        <replace summary="yes" file="${jpatck.config}.tmp" 
                            replacefilterfile="windows-replacefilter.properties"/>
                        <concat append="true" destfile="${jpatck.config}">
                            <fileset file="${jpatck.config}.tmp"/>
                        </concat>

                        <path id="agent.path">
                            <fileset dir="../../openjpa-all/target">
                                <include name="*.jar"/>
                            </fileset>
                        </path>
                        <pathconvert dirsep="/" property="agent" 
                            refid="agent.path"/>
                        <property name="agent.properties" value=""/>
                        <echo>AGENT: ${agent}${agent.properties}</echo>

                        <!--
                            Replace the existing javaagent argument (which
                            uses Toplink's enhancer) with our own. Also, we
                            need to specify the default MetaDataFactory in
                            order to allow tests that don't have any
                            persistent classes to work (like the SignatureTest)
                        -->
                        <replace file="${jpatck.config}">
                            <replacefilter token="-javaagent:${jpa.home}/lib/toplink-essentials-agent.jar" value="-javaagent:${agent}${agent.properties} -Dopenjpa.MetaDataFactory=jpa(DefaultAccessType=PROPERTY)"/>
                        </replace>

                        <!-- make a macro for the TCK harness launcher -->
                        <macrodef name="tsant">
                            <attribute name="buildfile"/>
                            <attribute name="target"/>
                            <sequential>
                                <java classname=
                                    "org.apache.tools.ant.launch.Launcher"
                                    fork="true" failonerror="true"
                                    dir="${tck.dir}/src"
                                    append="true"
                                    output="${tck.log}"
                                    timeout="7200000">
                                    <arg value="-emacs"/>
                                    <arg value="-buildfile"/>
                                    <arg value="@{buildfile}"/>
                                    <arg value="-listener"/>
                                    <arg value="com.sun.ant.TSBuildListener"/>
                                    <arg value="-logger"/>
                                    <arg value="com.sun.ant.TSLogger"/>
                                    <arg value="@{target}"/>

                                    <env key="TS_HOME" value=".."/>
                                    <sysproperty key="ts.home" value=".."/>

                                    <env key="ANT_HOME"
                                        value="${tck.dir}/tools/ant"/>
                                    <sysproperty key="ant.home"
                                        value="${tck.dir}/tools/ant"/>

                                    <sysproperty key="pkg.dir"
                                        value="${jpatck.pkg.dir}"/>

                                    <classpath>
                                        <path refid="cp"/>
                                        <fileset dir="${tck.dir}/tools/ant/lib">
                                            <include name="**/*.jar"/>
                                        </fileset>
                                    </classpath>
                                </java>
                            </sequential>
                        </macrodef>

                        <echo>Logging JPA TCK output to ${tck.log}</echo>

                        <!-- first initialize the database -->
                        <tsant buildfile="${tck.dir}/bin/initdb.xml"
                            target="init.database"/>

                        <!-- now run the TCK -->
                        <tsant buildfile="${tck.dir}/bin/build.xml"
                            target="runclient"/>

                        <!--
                            The TCK's Java process doesn't actually fail when
                            tests fail, so we need to parse the results file
                            for a string indicating whether or not it passed.
                        -->
                        <loadfile property="jpatck.results"
                            srcfile="${jpatck.work.dir}/jtData/log.txt"/>
                        <condition property="jpatck.failed">
                            <contains string="${jpatck.results}"
                                substring="Completed test run: not ok"/>
                        </condition>
                        <fail if="jpatck.failed">Some tests failed</fail>

                        <echo>JPA TCK Passed 100%!</echo>

                        <property name="tck.results.archive"
                            value="${tck.base}/openjpa-tck-results.zip"/>
                        <zip destfile="${tck.results.archive}"
                            basedir="${jpatck.work.dir}"/>
                        <echo>Results archive at: ${tck.results.archive}</echo>

                        </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    </profile>
    </profiles>

    <repositories>
        <repository>
            <id>java.net</id>
            <name>Java.net Maven Repository</name>
            <url>https://maven-repository.dev.java.net/nonav/repository</url>
            <layout>legacy</layout>
        </repository>
    </repositories>

    <dependencies>
        <!-- use the authoritative javax.persistence API for testing -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0b</version>
        </dependency>
        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa-kernel</artifactId>
            <version>${pom.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.2.1.6</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

