<!--
 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/jquery-1.7.2.js" usetimestamp="true"/>
    <get src="http://js-test-driver.googlecode.com/svn/trunk/JsTestDriver/contrib/qunit/src/equiv.js" dest="${build}/js/lib/equiv.js" usetimestamp="true"/>
    <get src="http://js-test-driver.googlecode.com/svn/trunk/JsTestDriver/contrib/qunit/src/QUnitAdapter.js" dest="${build}/js/lib/QUnitAdapter.js" 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>

