<?xml version="1.0"?>
<!--
    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.
 -->
<project name="solr-test-framework" default="default">
  <description>Solr Test Framework</description>

  <import file="../common-build.xml"/>

  <path id="solr.test.framework.lucene.libs">
    <pathelement location="${test-framework.jar}"/>
  </path>

  <path id="classpath">
    <fileset dir="lib" excludes="${common.classpath.excludes}"/>
    <path refid="solr.test.framework.lucene.libs" />
    <path refid="solr.base.classpath"/>
  </path>

  <!-- Redefine Lucene test-framework compilation here to avoid circular dependency on compile-core -->
  <target name="compile-test-framework">
    <ant dir="${common.dir}" target="compile-test-framework" inheritall="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
  </target>

  <target name="compile-core" depends="resolve, compile-solr-core, compile-test-framework">
    <!-- TODO: why does test-framework override compile-core to use this special classpath? -->
    <compile srcdir="${src.dir}" destdir="${build.dir}/classes/java">
      <classpath refid="test.base.classpath"/>
    </compile>
    
    <!-- Copy the resources folder (if existent) -->
    <copy todir="${build.dir}/classes/java">
      <fileset dir="${resources.dir}" erroronmissingdir="no"/>
    </copy>
  </target>

  <!-- redefine the clover setup, because we dont want to run clover for the test-framework -->
  <target name="-clover.setup" if="run.clover"/>

  <!-- redefine the test compilation, so it's just a no-op -->
  <target name="compile-test"/>
  
  <!-- redefine the forbidden apis for tests, as we check ourselves -->
  <target name="-check-forbidden-tests" depends="-init-forbidden-apis,compile-core">
    <forbidden-apis suppressAnnotation="**.SuppressForbidden" signaturesFile="${common.dir}/tools/forbiddenApis/tests.txt" classpathref="forbidden-apis.allclasses.classpath"> 
      <fileset dir="${build.dir}/classes/java"/>
    </forbidden-apis>
  </target>

  <!-- Override common-solr.javadocs to include JUnit links -->
  <!-- and to copy the built javadocs to ${dest}/docs/api/test-framework -->
  <target name="javadocs"
          depends="compile-core,jar-test-framework,lucene-javadocs,javadocs-test-framework,define-lucene-javadoc-url,check-javadocs-uptodate" unless="javadocs-uptodate-${name}">
    <sequential>
      <mkdir dir="${javadoc.dir}/${name}"/>
      <!-- NOTE: explicitly not using solr-invoke-javadoc, or attempting to 
     link to lucene-test-framework because if we did javadoc would 
     attempt to link class refs in in org.apache.lucene, causing 
     broken links. (either broken links to things like "Directory" if 
     lucene-test-framework was first, or broken links to things like 
     LuceneTestCase if lucene-core was first)
      -->
      <invoke-javadoc destdir="${javadoc.dir}/${name}" 
          title="${Name} ${version} Test Framework API">
  <sources>
    <link offline="true" href="${javadoc.link.junit}"
    packagelistLoc="${javadoc.packagelist.dir}/junit"/>
    <packageset dir="${src.dir}"/>
  </sources>
      </invoke-javadoc>
      <solr-jarify basedir="${javadoc.dir}/${name}" destfile="${build.dir}/${final.name}-javadoc.jar"/>
    </sequential>
  </target>
  <target name="module-jars-to-solr"
          depends="-module-jars-to-solr-not-for-package,-module-jars-to-solr-package"/>
  <target name="-module-jars-to-solr-not-for-package" unless="called.from.create-package">
    <antcall target="jar-test-framework" inheritall="true"/>
    <property name="test-framework.uptodate" value="true"/>
    <mkdir dir="${build.dir}/lucene-libs"/>
    <copy todir="${build.dir}/lucene-libs" preservelastmodified="true" flatten="true" failonerror="true" overwrite="true">
      <path refid="solr.test.framework.lucene.libs" />
    </copy>
  </target>
  <target name="-module-jars-to-solr-package" if="called.from.create-package">
    <antcall target="-unpack-lucene-tgz" inheritall="true"/>
    <pathconvert property="relative.solr.test.framework.lucene.libs" pathsep=",">
      <path refid="solr.test.framework.lucene.libs"/>
      <globmapper from="${common.build.dir}/*" to="*" handledirsep="true"/>
    </pathconvert>
    <mkdir dir="${build.dir}/lucene-libs"/>
    <copy todir="${build.dir}/lucene-libs" preservelastmodified="true" flatten="true" failonerror="true" overwrite="true">
      <fileset dir="${lucene.tgz.unpack.dir}/lucene-${version}" includes="${relative.solr.test.framework.lucene.libs}"/>
    </copy>
  </target>

  <target name="dist" depends="module-jars-to-solr, common-solr.dist">
    <!-- we're not a contrib, our lucene-libs and go in a special place -->
    <mkdir  dir="${dist}/test-framework" />
    <copy todir="${dist}/test-framework">
      <fileset dir="${build.dir}">
  <include name="lucene-libs/*.jar" />
      </fileset>
      <fileset dir=".">
  <include name="lib/*" />
  <include name="README.txt" />
      </fileset>
    </copy>
  </target>

</project>

