<?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.felix</groupId>
		<artifactId>felix-parent</artifactId>
		<version>2.1</version>
		<relativePath>../../pom/pom.xml</relativePath>
	</parent>

	<artifactId>org.apache.felix.dependencymanager.test</artifactId>
	<version>3.0.1-SNAPSHOT</version>
	<packaging>bundle</packaging>

	<name>Apache Felix Dependency Manager Integration Tests</name>

	<properties>
		<bundle.build.name>
			${basedir}/target
		</bundle.build.name>
		<bundle.file.name>
			${bundle.build.name}/${project.build.finalName}.jar
		</bundle.file.name>

		<felix.build.source>5</felix.build.source>
		<felix.build.target>5</felix.build.target>
		<felix.java.signature.artifactId>java15</felix.java.signature.artifactId>
		<exam.version>3.0.0</exam.version>
		<url.version>1.5.2</url.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>5.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>5.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.dependencymanager</artifactId>
			<version>3.1.1-SNAPSHOT</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.shell</artifactId>
			<version>1.4.2</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.6</version>
			<scope>provided</scope>
		</dependency>

		<!-- Integration Testing with Pax Exam -->
		<!-- 
		<dependency>
			<groupId>org.ops4j.pax.exam</groupId>
			<artifactId>pax-exam-container-native</artifactId>
			<version>${exam.version}</version>
			<scope>test</scope>
		</dependency>
 		-->
 		<dependency>
  		  <groupId>org.ops4j.pax.exam</groupId>
    		<artifactId>pax-exam-container-forked</artifactId>
    		<version>${exam.version}</version>
    		<scope>test</scope>
		</dependency>
 
		<dependency>
			<groupId>org.ops4j.pax.exam</groupId>
			<artifactId>pax-exam-junit4</artifactId>
			<version>${exam.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.ops4j.pax.exam</groupId>
			<artifactId>pax-exam-link-mvn</artifactId>
			<version>${exam.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.ops4j.pax.url</groupId>
			<artifactId>pax-url-aether</artifactId>
			<version>${url.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.framework</artifactId>
			<version>4.2.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>0.9.29</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>0.9.29</version>
			<scope>test</scope>
		</dependency>

		<!-- Dependency Manager Annotations -->
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.dependencymanager.annotation</artifactId>
			<version>3.1.1-SNAPSHOT</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- Build the bundle which contains various components used by integration tests -->
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>2.3.7</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-Name>Apache Felix Dependency Manager Annotations Tests</Bundle-Name>
						<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
						<Export-Package>org.apache.felix.dm.test.components</Export-Package>
					</instructions>
				</configuration>
			</plugin>
			
			<!-- java 5 required for annotations support -->
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
				</configuration>
			</plugin>
			
			<!-- DM annotation plugin used to parse annotations from org.apache.felix.dm.test.components artifact -->
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>org.apache.felix.dependencymanager.annotation</artifactId>
				<version>3.1.1-SNAPSHOT</version>
				<executions>
					<execution>
						<goals>
							<goal>scan</goal>
						</goals>
						<configuration>
							<log>debug</log>
							<!-- generated-output-dir>.</generated-output-dir> -->
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- We have no unit tests, we only have integration tests -->
			<plugin>
				<artifactId>maven-surefire-plugin</artifactId>
				<executions>
					<execution>
						<id>surefire-it</id>
						<phase>integration-test</phase>
						<goals>
							<goal>test</goal>
						</goals>
						<configuration>
							<systemProperties>
								<property>
									<name>project.bundle.file</name>
									<value>${bundle.file.name}</value>
								</property>
								<property>
									<name>project.bundle.symbolicName</name>
									<value>${pom.artifactId}</value>
								</property>								
							</systemProperties>
							<excludes>
								<exclude>**/components/*</exclude>
								<!-- <exclude>**/AspectRaceTest.java</exclude> -->							
							</excludes>
							<includes>
								<!-- By default, all integration tests are run. For running a specific test, 
								     you can specify a given test below: for example:
								     <include>**/integration/**/AspectBaseTest.java</include>
								-->
								<include>**/integration/**/*.java</include>
							</includes>
						</configuration>
					</execution>
				</executions>
				<configuration>
					<excludes>
						<exclude>**/integration/**</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
