<!--
  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>2.10.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>karaf-client-integration-tests</module>
      <module>compatibility-tests</module>
      <module>soak-tests</module>
      <module>stress-tests</module>
      <module>performance-tests</module>
      <module>artemis-test-support</module>
      <module>smoke-tests</module>
   </modules>
</project>
