<!--
  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.29.0</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>
      <byteman.version>4.0.18</byteman.version>
   </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>jakarta.management.j2ee</groupId>
            <artifactId>jakarta.management.j2ee-api</artifactId>
            <version>${jakarta.management.j2ee-api.version}</version>
            <!-- License: EPL 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>
            </configuration>
         </plugin>
      </plugins>
   </build>

   <profiles>
      <profile>
         <id>jmh</id>
         <modules>
            <module>performance-jmh</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>
            <module>performance-jmh</module>
         </modules>
         <properties>
            <skipActiveMQ5Tests>true</skipActiveMQ5Tests>
            <skipExtraTests>true</skipExtraTests>
         </properties>
      </profile>
      <profile>
         <id>e2e-tests</id>
         <properties>
            <e2e-tests.skipTests>false</e2e-tests.skipTests>
            <e2e-tests.skipImageBuild>false</e2e-tests.skipImageBuild>
         </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>integration-tests-isolated</module>
      <module>karaf-client-integration-tests</module>
      <module>karaf-server-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>
      <module>e2e-tests</module>
      <module>leak-tests</module>
   </modules>
</project>
