<!--
 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.5.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/git/qunit.js" dest="${build}/js/lib" usetimestamp="true"/>
    <get src="http://code.jquery.com/qunit/git/qunit.css" dest="${build}/js/lib" usetimestamp="true"/>
    <!-- js-test-driver has issues with relative path...so we need a copy -->
    <copy file="../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="5000"
        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=".." 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="../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"/>
      <!-- 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>

