<?xml version="1.0" encoding="UTF-8"?>
<!--
    * 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>
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.apache.photark</groupId>
		<artifactId>photark-parent</artifactId>
		<version>M3-incubating</version>
		<relativePath>../pom.xml</relativePath>
	</parent>
	<artifactId>photark-ui-tests</artifactId>
	<name>Apache PhotArk UI Integration Test</name>
    
    
    <properties>
        <http.port>8080</http.port>
        <http.base>http://localhost:${http.port}/photark</http.base>
        <tomcat.home>${env.CATALINA_HOME}</tomcat.home>
    </properties>

    <dependencies>
    	<dependency>
    		<groupId>org.apache.photark</groupId>
    		<artifactId>photark-webapp</artifactId>
    		<version>M3-incubating</version>
    		<type>war</type>
    	</dependency>
							
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.8.1</version>
			<scope>test</scope>
		</dependency>
		
		<dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>2.7</version>
           	<scope>test</scope>
		</dependency>
    </dependencies>


	<build>
		<plugins>
			<plugin>
				<groupId>org.codehaus.cargo</groupId>
				<artifactId>cargo-maven2-plugin</artifactId>
				<version>1.0.1-beta-1</version>
                
				<configuration>
                    <wait>false</wait>

					<container>
						<containerId>tomcat6x</containerId>
                        <type>installed</type>
                        <home>${tomcat.home}</home>
                        <systemProperties>
                            <org.apache.commons.logging.Log>
                                org.apache.commons.logging.impl.SimpleLog
                            </org.apache.commons.logging.Log>
                        </systemProperties>
					</container>

                    <configuration>
                        <properties>
                            <cargo.servlet.port>${http.port}</cargo.servlet.port>
                        </properties>
                        <type>existing</type>
                        <home>${tomcat.home}</home>
                                            
						<deployables>
							<deployable>
								<groupId>org.apache.photark</groupId>
								<artifactId>photark-webapp</artifactId>
								<type>war</type>
								<properties>
									<context>photark</context>
								</properties>
							</deployable>
						</deployables>
                    </configuration>
					
                    
					<!-- Deployer configuration -->
					<!--deployer>
                        <type>installed</type>
						<type>embedded</type>
						<deployables>
							<deployable>
								<groupId>org.apache.photark</groupId>
								<artifactId>photark-webapp</artifactId>
								<type>war</type>
								<properties>
									<context>photark</context>
								</properties>
							</deployable>
						</deployables>
					</deployer-->
				</configuration>
                
				<executions>
					<execution>
						<id>start-container</id>
						<phase>pre-integration-test</phase>
						<goals>
                            <goal>deployer-deploy</goal>
							<goal>start</goal>
						</goals>
					</execution>
					<execution>
						<id>stop-container</id>
						<phase>post-integration-test</phase>
						<goals>
							<goal>stop</goal>
						</goals>
					</execution>
				</executions>				
                
                
   			</plugin>

			<!--
				NOTE: This horrible looking configuration sets up the surefire
				plugin to not run tests during the 'test' phase, but instead during
				the 'integration-test' phase.
			-->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skip>true</skip>
				</configuration>
				<executions>
					<execution>
						<id>test</id>
						<phase>test</phase>
						<goals>
							<goal>test</goal>
						</goals>
						<configuration>
							<skip>true</skip>
						</configuration>
					</execution>
					<execution>
						<id>integration</id>
						<phase>integration-test</phase>
						<goals>
							<goal>test</goal>
						</goals>
						<configuration>
							<skip>false</skip>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>
