<?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 xmlns:au="antlib:org.apache.ant.antunit" default="antunit">
   <import file="../../antunit-base.xml" />

  <target name="testCommandLauncherTask">
   <echo message="${input}"/>
    <mkdir dir="${input}"/>
    <mkdir dir="${output}"/>
    <echo file="${input}/MyCommandLauncher.java">
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.taskdefs.launcher.Java13CommandLauncher;

public class MyCommandLauncher extends Java13CommandLauncher {
        public MyCommandLauncher() throws NoSuchMethodException {
                super();
        }



        @Override
        public Process exec(Project project, String[] cmd, String[] env, File workingDir) throws IOException {
                Process p = super.exec(project, cmd, env, workingDir);
                System.out.println("Hello World From CommandLauncher");
                return p;
        }

}

    </echo>
    <echo file="${input}/MyJavaExecutable.java">
public class MyJavaExecutable {
        public static void main(String[] args) {

        }
}

    </echo>
    <javac destdir="${output}"
           srcdir="${input}"/>
    <typedef
       name="my-command-launcher"
       classname="MyCommandLauncher" classpath="${output}"/> 

    <commandlauncher vmlauncher="true">
        <my-command-launcher/>
    </commandlauncher>

    <condition property="java"
               value="${java.home}/bin/java.exe"
               else="${java.home}/bin/java">
        <os family="dos"/>
    </condition>

    <exec executable="${java}" failonerror="true">
        <arg value="-cp"/>
        <arg value="${output}"/>
        <arg value="MyJavaExecutable"/>
    </exec>


    <au:assertLogContains text="Hello World From CommandLauncher"/>
  </target>

 
</project>
