<!--
  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">
   <parent>
      <groupId>org.apache.activemq</groupId>
      <artifactId>artemis-pom</artifactId>
      <version>1.5.1</version>
   </parent>

   <name>ActiveMQ Artemis Tests POM</name>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.activemq.tests</groupId>
   <artifactId>artemis-tests-pom</artifactId>
   <packaging>pom</packaging>

   <properties>
      <activemq.basedir>${project.basedir}/..</activemq.basedir>
   </properties>

   <dependencyManagement>
      <dependencies>
         <!--## JMS Dependencies ## -->
         <dependency>
            <groupId>org.apache.geronimo.components</groupId>
            <artifactId>geronimo-jaspi</artifactId>
            <version>2.0.0</version>
            <!-- License: Apache: 2.0 -->
         </dependency>
         <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
            <!-- License: Apache: 2.0 -->
         </dependency>
         <dependency>
            <groupId>org.apache.qpid</groupId>
            <artifactId>qpid-jms-client</artifactId>
            <version>${qpid.jms.version}</version>
            <!-- License: Apache: 2.0 -->
         </dependency>

         <!-- End JMS Dependencies -->
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
               <skip>true</skip>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
               <skipTests>${skipUnitTests}</skipTests>
               <argLine>${activemq-surefire-argline}</argLine>
               <excludes>
                  <!--todo this test is dependent on the jar so needs to be run post package as an integration test-->
                  <exclude>**/ManifestTest.java</exclude>
               </excludes>
            </configuration>
         </plugin>
      </plugins>
   </build>

   <profiles>
       <profile>
         <id>extra-tests</id>
         <modules>
            <!-- to run extra-tests you must define -DskipExtraTests=false
                 or run it with the tests profile -->
            <module>extra-tests</module>
         </modules>
      </profile>
      <profile>
         <!-- deprecated: use openwire-tests -->
         <id>activemq5-unit-tests</id>
         <modules>
            <module>activemq5-unit-tests</module>
         </modules>
         <properties>
            <skipActiveMQ5Tests>false</skipActiveMQ5Tests>
         </properties>
      </profile>
      <profile>
         <id>openwire-tests</id>
         <modules>
            <module>activemq5-unit-tests</module>
         </modules>
         <properties>
            <skipActiveMQ5Tests>false</skipActiveMQ5Tests>
         </properties>
      </profile>
      <profile>
         <id>release</id>
         <modules>
            <module>activemq5-unit-tests</module>
         </modules>
         <properties>
            <skipActiveMQ5Tests>true</skipActiveMQ5Tests>
         </properties>
      </profile>
   </profiles>

   <modules>
      <module>unit-tests</module>
      <module>joram-tests</module>
      <module>timing-tests</module>
      <module>jms-tests</module>
      <module>integration-tests</module>
      <module>soak-tests</module>
      <module>stress-tests</module>
      <module>performance-tests</module>
      <module>artemis-test-support</module>
   </modules>
</project>
