<?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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.sling</groupId>
        <artifactId>sling</artifactId>
        <version>26</version>
        <relativePath/>
    </parent>

    <artifactId>org.apache.sling.samples.testing.bundle-with-it</artifactId>
    <version>0.0.9-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <name>Apache Sling Testing - sample bundle with integration tests</name>
    <description>
        Sample project that demonstrates a bundle with unit and integration 
        tests in the same Maven module, running against a full Sling instance. 
        Uses both HTTP-based and teleported server-side tests.
    </description>
    
    <properties>
        <!-- Set this to run the server on a specific port
        <http.port></http.port>
         -->
         
        <!-- Set this to run tests against an existing server instance -->
        <keepJarRunning>false</keepJarRunning>
        
        <!-- URL of a server against which to run tests -->
        <test.server.url />
        
         <!-- Set this to run tests against a specific hostname, if test.server.url is not set-->
         <test.server.hostname />

        <!-- Set this to use a different username for remote execution of sling junit tests -->
        <test.server.username />

        <!-- Set this to use a different password for remote execution of sling junit tests -->
        <test.server.password />
        
        <!-- Options for the VM that executes our runnable jar -->
        <jar.executor.vm.options>-Xmx512m</jar.executor.vm.options>
        
        <!-- Change this to use longer or shorter timeouts for testing -->
        <sling.testing.timeout.multiplier>1.0</sling.testing.timeout.multiplier>
        
        <!-- Set this to run the executable jar in a specified filesystem folder -->
        <jar.executor.work.folder />
        
        <!-- Options for the jar to execute. $JAREXEC_SERVER_PORT$ is replaced by the
            selected port number -->
        <jar.executor.jar.options>-p $JAREXEC_SERVER_PORT$</jar.executor.jar.options>
		
        <!-- Filter IT -->
        <sling.it.ignorelist>*.FilterIT#testShouldNotRun:test_filter</sling.it.ignorelist>
    </properties>
    
    <scm>
        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-samples.git</connection>
        <developerConnection> scm:svn:https://svn.apache.org/repos/asf/sling/trunk/testing/samples/bundle-with-tests</developerConnection>
        <url>https://gitbox.apache.org/repos/asf?p=sling-samples.git</url>
    </scm>

    <build>
        <plugins>
           <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>${basedir}</directory>
                            <includes>
                                <!-- sling folder is the workdir of the executable jar that we test -->
                                <include>sling/**</include>
                            </includes>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
             </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
             </plugin>
            <plugin>
                <groupId>org.apache.rat</groupId>
                <artifactId>apache-rat-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>derby.log</exclude>
                        <exclude>sling/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-runnable-jar</id>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                            <phase>process-resources</phase>
                        <configuration>
                            <includeArtifactIds>org.apache.sling.launchpad</includeArtifactIds>
                            <excludeTransitive>true</excludeTransitive>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                        </configuration>
                    </execution>
                    <execution>
                        <!-- 
                            Consider all dependencies as candidates to be installed
                            as additional bundles. We use system properties to define
                            which bundles to install in which order.  
                        -->
                        <id>copy-additional-bundles</id>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                            <phase>process-resources</phase>
                        <configuration>
                            <outputDirectory>${project.build.directory}</outputDirectory>
                            <excludeTransitive>true</excludeTransitive>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- Find free ports to run our server -->
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>reserve-server-port</id>
                        <goals>
                            <goal>reserve-network-port</goal>
                        </goals>
                        <phase>process-resources</phase>
                        <configuration>
                            <portNames>
                                <portName>http.port</portName>
                            </portNames>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.19.1</version>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>verify</id>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <systemPropertyVariables>
                        <!-- 
                            TODO this is a fairly complicated setup, we might
                            switch to a Maven plugin using a Sling provisioning
                            model to start the server under test. The slingstart
                            plugin does this but currently requires a launchpad jar,
                            using a pure provisioning model startup would be more
                            flexible.  
                        -->
                        
                        <!-- if set, this prevents jar executor from starting Sling?? 
                        <test.server.url>${test.server.url}</test.server.url>
                         -->
                        <test.server.hostname>${test.server.hostname}</test.server.hostname>
                        <test.server.username>${test.server.username}</test.server.username>
                        <test.server.password>${test.server.password}</test.server.password>
                        <jar.executor.server.port>${http.port}</jar.executor.server.port>
                        <jar.executor.vm.options>${jar.executor.vm.options}</jar.executor.vm.options>
                        <jar.executor.jar.folder>${project.basedir}/target/dependency</jar.executor.jar.folder>
                        <jar.executor.jar.name.regexp>org.apache.sling.launchpad.*jar$</jar.executor.jar.name.regexp>
                        <jar.executor.work.folder>${jar.executor.work.folder}</jar.executor.work.folder>
                        <jar.executor.jar.options>${jar.executor.jar.options}</jar.executor.jar.options>
                        <additional.bundles.path>${project.build.directory}</additional.bundles.path>
                        <keepJarRunning>${keepJarRunning}</keepJarRunning>
                        <server.ready.timeout.seconds>60</server.ready.timeout.seconds>
                        <sling.testing.timeout.multiplier>${sling.testing.timeout.multiplier}</sling.testing.timeout.multiplier>
                        <server.ready.path.1>/:script src="system/sling.js"</server.ready.path.1>
                        <server.ready.path.2>/.explorer.html:href="/libs/sling/explorer/css/explorer.css"</server.ready.path.2>
                        <server.ready.path.3>/sling-test/sling/sling-test.html:Sling client library tests</server.ready.path.3>
                        <start.bundles.timeout.seconds>30</start.bundles.timeout.seconds>
                        <bundle.install.timeout.seconds>20</bundle.install.timeout.seconds>
                        
                        <!-- 
                            Define additional bundles to install by specifying the beginning of their artifact name.
                            The bundles are installed in lexical order of these property names.
                            All bundles must be listed as dependencies in this pom, or they won't be installed. 
                        -->
                        <sling.additional.bundle.1>org.apache.sling.junit.core</sling.additional.bundle.1>
                        
                        <!--  Install this bundle for integration tests -->
                        <sling.additional.bundle.2>${project.artifactId}-${project.version}.jar</sling.additional.bundle.2>
						
						<!-- Test the Filter rule -->
                        <sling.it.ignorelist>${sling.it.ignorelist}</sling.it.ignorelist>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
         </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.api</artifactId>
            <version>2.4.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.commons.mime</artifactId>
            <version>2.1.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr.annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.junit.core</artifactId>
            <version>1.0.14</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.testing.rules</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.junit.teleporter</artifactId>
            <version>1.0.6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.launchpad</artifactId>
            <version>8</version>
			<scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
