<!--
 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="Java Script Test" default="test" basedir="."
  xmlns:artifact="antlib:org.apache.maven.artifact.ant"
  xmlns:jsl="antlib:com.googlecode.jslint4java">

  <description>Java Script Test based on Thrift Java Library</description>

  <property name="src" location="src" />
  <property name="genjava" location="gen-java" />
  <property name="genjs" location="gen-js" />
  <property name="build" location="build" />
  <property name="jar.file" location="${build}/jstest.jar" />

  <!-- the root directory, where you unpack thrift distibution (e.g. thrift-0.x.x.tar.gz) -->
  <property name="thrift.dir" location="../../../" />
  <property name="thrift.java.dir" location="${thrift.dir}/lib/java" />

  <!-- Include the base java properties file -->
  <property file="${thrift.java.dir}/build.properties" />

  <property name="thrift.compiler" location="${thrift.dir}/compiler/cpp/thrift" />

  <path id="libs.classpath">
    <fileset dir="${thrift.java.dir}/build/">
      <include name="*.jar" />
    </fileset>
    <fileset dir="${thrift.java.dir}/build/lib">
      <include name="*.jar" />
    </fileset>
    <fileset dir="${build}/lib">
      <include name="*.jar" />
    </fileset>
  </path>

  <path id="test.classpath">
    <path refid="libs.classpath" />
    <pathelement location="${jar.file}" />
  </path>

  <target name="dependencies">
    <fail>
      <condition>
        <not>
          <resourcecount count="2">
            <fileset id="fs" dir="${thrift.java.dir}/build">
              <include name="libthrift*.jar" />
              <exclude name="libthrift*javadoc.jar" />
            </fileset>
          </resourcecount>
        </not>
      </condition>
      You need libthrift*.jar and libthrift*test.jar located at
      ${thrift.java.dir}/build
      Did you compile Thrift Java library and its test suite by "ant compile-test"?
    </fail>
    <fail>
      <condition>
        <not>
          <resourcecount count="1">
            <fileset id="fs" dir="${thrift.dir}" includes="compiler/cpp/thrift"/>
          </resourcecount>
        </not>
      </condition>
      Thrift compiler is missing !
    </fail>
  </target>

  <target name="init" depends="dependencies">
    <tstamp />
    <mkdir dir="${build}"/>
    <mkdir dir="${build}/js/lib"/>
    <mkdir dir="${build}/lib"/>
    <mkdir dir="${build}/log"/>
    <mkdir dir="${build}/test"/>
    <mkdir dir="${build}/test/log"/>
  </target>

  <target name="jslibs" depends="init, proxy">
    <get src="http://code.jquery.com/jquery-1.7.2.js" dest="${build}/js/lib" usetimestamp="true"/>
    <get src="http://js-test-driver.googlecode.com/svn/trunk/JsTestDriver/contrib/qunit/src/equiv.js" dest="${build}/js/lib" usetimestamp="true"/>
    <get src="http://js-test-driver.googlecode.com/svn/trunk/JsTestDriver/contrib/qunit/src/QUnitAdapter.js" dest="${build}/js/lib" usetimestamp="true"/>

    <get src="http://code.jquery.com/qunit/qunit-1.5.0.js" dest="${build}/js/lib/qunit.js" usetimestamp="true"/>
    <get src="http://code.jquery.com/qunit/qunit-1.5.0.css" dest="${build}/js/lib/qunit.css" usetimestamp="true"/>
    <!-- js-test-driver has issues with relative path...so we need a copy -->
    <copy file="../src/thrift.js" todir="${build}/js/"/>
  </target>

  <target name="compile" description="compile the test suite" depends="init, generate, resolve">
    <!-- //TODO enable <compilerarg value="-Xlint"/>-->
    <javac includeantruntime="false" srcdir="${genjava}" destdir="${build}/test" classpathref="libs.classpath"/>
    <javac includeantruntime="false" srcdir="${src}" destdir="${build}/test" classpathref="libs.classpath"/>
  </target>

  <target name="jstest" description="create the test suite jar file" depends="compile">
    <jar jarfile="${jar.file}" basedir="${build}/test"/>
  </target>

  <target name="testserver" description="run the test server" depends="jstest, jslibs">
    <java classname="test.Httpd" fork="true"
      classpathref="test.classpath" failonerror="true">
      <arg value="../" />
    </java>
  </target>

  <target name="proxy" if="proxy.enabled">
    <setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}"
      proxyuser="${proxy.user}" proxypassword="${proxy.pass}"/>
  </target>

  <target name="xvfb">
    <echo>check if Xvfb is available:</echo>
    <exec executable="Xvfb" failifexecutionfails="no" resultproperty="xvfb.present" failonerror="false" output="${build}/log/xvfb.log">
      <arg line="--version"/>
    </exec>
  </target>

  <target name="phantomjs" depends="xvfb" if="xvfb.present">
    <echo>check if phantomjs is available:</echo>
    <exec executable="phantomjs" failifexecutionfails="no" resultproperty="phantomjs.present" failonerror="false" output="${build}/log/phantomjs.log">
      <arg line="--version"/>
    </exec>
  </target>

  <target name="unittest" description="do unit tests with headless browser phantomjs" depends="init, phantomjs, jstest, jslibs" if="phantomjs.present">
    <parallel>
      <exec executable="Xvfb" spawn="true" failonerror="false">
        <arg line=":99" />
      </exec>
      <java classname="test.Httpd" fork="true" timeout="10000"
        classpathref="test.classpath" failonerror="false" output="${build}/log/unittest.log">
        <arg value="../" />
      </java>
      <sequential>
        <sleep seconds="2"/>
        <echo>Running Unit Tests with headless browser!</echo>
        <exec executable="phantomjs" failonerror="true">
          <env key="DISPLAY" value=":99"/>
          <arg line="phantomjs-qunit.js http://localhost:8088/test/test.html" />
        </exec>
      </sequential>
    </parallel>
  </target>

  <target name="jstestdriver-server" description="start the js-test-driver server" depends="init, resolve">
    <echo>Starting js-test-driver Server...</echo>
    <java jar="${build}/lib/jstestdriver-1.3.2.jar" dir="." fork="true"
            failonerror="true" output="${build}/log/jstestdriver-server.log">
      <arg line="--port 9876"/>
    </java>
  </target>

  <target name="jstestdriver" description="do unit tests with js-test-driver" depends="init, jstest, jslibs">
    <parallel>
      <java classname="test.Httpd" fork="true" timeout="10000"
        classpathref="test.classpath" failonerror="false" output="${build}/log/unittest.log">
        <arg value="../" />
      </java>
      <sequential>
        <sleep seconds="2"/>
        <echo>Running Unit Tests with js-test-driver</echo>
          <java jar="${build}/lib/jstestdriver-1.3.2.jar" dir="." fork="true" 
            failonerror="true" output="${build}/log/jstestdriver.log">
            <arg value="--config" />
            <arg value="jsTestDriver.conf" />

            <arg value="--reset" />
            <arg value="--verbose" />

            <arg value="--tests" />
            <arg value="all" />

            <arg value="--testOutput" />
            <arg value="${build}/test/log/" />
        </java>
      </sequential>
    </parallel>
  </target>

  <target name="generate">
    <exec executable="${thrift.compiler}" failonerror="true">
      <arg line="--gen java ${thrift.dir}/test/ThriftTest.thrift" />
    </exec>
    <exec executable="${thrift.compiler}" failonerror="true">
      <arg line="--gen js:jquery ${thrift.dir}/test/ThriftTest.thrift" />
    </exec>
  </target>

  <target name="test" description="run test suite (lint, unittest)" depends="lint, unittest"/>

  <target name="lint" description="code quality checks (jslint and gjslint if available)" depends="generate, gjslint, jslint"/>

  <target name="jslint" depends="resolve">
    <taskdef uri="antlib:com.googlecode.jslint4java" resource="com/googlecode/jslint4java/antlib.xml" classpathref="libs.classpath" />
    <!--
         the following options would probably make sense in the future:
         browser,undef,eqeqeq,plusplus,bitwise,regexp,strict,newcap,immed
    -->
    <jsl:jslint options="evil,forin,browser,bitwise,regexp,newcap,immed" encoding="UTF-8">
      <formatter type="plain" />
      <fileset dir="${genjs}" includes="**/*.js" />
      <fileset dir="../src" includes="thrift.js" />

      <!-- issues with unsafe character -->
      <!-- fileset dir="." includes="*test*.js" /> -->
    </jsl:jslint>
  </target>

  <target name="check-gjslint">
    <echo>check if gjslint is available:</echo>
    <exec executable="gjslint" failifexecutionfails="no" resultproperty="gjslint.present" failonerror="false">
      <arg line="--helpshort"/>
    </exec>
  </target>

  <target name="gjslint" depends="check-gjslint" if="gjslint.present">
    <exec executable="gjslint" failifexecutionfails="no">
      <arg line="--nojsdoc"/>
      <arg line="${genjs}/*.js"/>
      <arg line="../src/thrift.js"/>

      <!-- issues with unsafe character, etc. -->
      <!-- <arg line="*test*.js"/> -->
    </exec>
  </target>

  <target name="clean">
    <delete dir="${build}" />
    <delete dir="${genjava}" />
    <delete dir="${genjs}" />
  </target>

  <target name="resolve" unless="mvn.finished">
    <typedef uri="antlib:org.apache.maven.artifact.ant" classpath="${thrift.java.dir}/build/tools/${mvn.ant.task.jar}"/>

    <artifact:dependencies filesetId="js.test.dependency.jars">
      <dependency groupId="org.apache.httpcomponents" artifactId="httpclient" version="4.0.1"/>
      <dependency groupId="com.googlecode.jslint4java" artifactId="jslint4java-ant" version="1.4.6"/>
      <dependency groupId="eu.medsea.mimeutil" artifactId="mime-util" version="2.1.3"/>
      <!-- get jstestdriver.jar via maven-->
      <remoteRepository id="jstd-maven-plugin google code repo" url="http://jstd-maven-plugin.googlecode.com/svn/maven2"/>
      <dependency groupId="com.google.jstestdriver" artifactId="maven-jstestdriver-plugin" version="1.3.2.3"/>
    </artifact:dependencies>

    <!-- Copy the dependencies to the build/lib dir -->
    <copy todir="${build}/lib">
      <fileset refid="js.test.dependency.jars"/>
      <mapper type="flatten"/>
    </copy>
    
    <property name="mvn.finished" value="true"/>
  </target>
</project>

