<!--
  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.
-->

<!-- This test folder contains tests that are not part of the regular testsuite
     because they use optional libraries such as LGPL or private ones.
     They are optional and will validate extra functionality available through Service Integration
     Example: Transaction Manager -->
<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.activemq.tests</groupId>
      <artifactId>artemis-tests-pom</artifactId>
      <version>2.19.1-SNAPSHOT</version>
   </parent>

   <artifactId>extra-tests</artifactId>
   <packaging>jar</packaging>
   <name>ActiveMQ Artemis Extra Tests</name>

   <properties>
      <byteman.version>4.0.11</byteman.version>
      <activemq.basedir>${project.basedir}/../..</activemq.basedir>
      <jboss-jts.version>4.17.13.Final</jboss-jts.version>
      <hornetq.version>2.4.7.Final</hornetq.version>
      <openhft.core.version>1.4.9</openhft.core.version>
      <openhft.affinity.version>3.0.6</openhft.affinity.version>
      <openjdk.jmh.version>1.12</openjdk.jmh.version>
   </properties>

   <dependencies>
      <dependency>
          <groupId>com.google.errorprone</groupId>
          <artifactId>error_prone_core</artifactId>
      </dependency>
      <dependency>
         <groupId>org.jboss.byteman</groupId>
         <artifactId>byteman</artifactId>
         <version>${byteman.version}</version>
      </dependency>
      <dependency>
         <groupId>org.jboss.byteman</groupId>
         <artifactId>byteman-submit</artifactId>
         <scope>test</scope>
         <version>${byteman.version}</version>
      </dependency>
      <dependency>
         <groupId>org.jboss.byteman</groupId>
         <artifactId>byteman-install</artifactId>
         <scope>test</scope>
         <version>${byteman.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-junit</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.jboss.byteman</groupId>
         <artifactId>byteman-bmunit</artifactId>
         <scope>test</scope>
         <version>${byteman.version}</version>
         <exclusions>
            <exclusion>
               <groupId>org.testng</groupId>
               <artifactId>testng</artifactId>
            </exclusion>
         </exclusions>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-core-client</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
         <type>test-jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-core-client</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-server</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
         <type>test-jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-server</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq.tests</groupId>
         <artifactId>integration-tests</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
         <type>test-jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-commons</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
         <type>test-jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq.tests</groupId>
         <artifactId>unit-tests</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
         <type>test-jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-jms-client</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-jms-server</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-ra</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-hqclient-protocol</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-service-extensions</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>jakarta.resource</groupId>
         <artifactId>jakarta.resource-api</artifactId>
      </dependency>
      <dependency>
         <groupId>jakarta.transaction</groupId>
         <artifactId>jakarta.transaction-api</artifactId>
      </dependency>
      <dependency>
         <groupId>jakarta.jms</groupId>
         <artifactId>jakarta.jms-api</artifactId>
      </dependency>
      <dependency>
         <groupId>org.jboss.logging</groupId>
         <artifactId>jboss-logging-processor</artifactId>
         <scope>provided</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.jboss.logging</groupId>
         <artifactId>jboss-logging-annotations</artifactId>
         <scope>provided</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.jboss.logging</groupId>
         <artifactId>jboss-logging</artifactId>
      </dependency>
      <dependency>
         <groupId>org.jboss.logmanager</groupId>
         <artifactId>jboss-logmanager</artifactId>
      </dependency>
      <dependency>
          <groupId>org.wildfly.common</groupId>
          <artifactId>wildfly-common</artifactId>
      </dependency>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
      </dependency>

      <!-- this is for the log assertion -->
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-commons</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-hornetq-protocol</artifactId>
         <version>${project.version}</version>
         <scope>test</scope>
      </dependency>

      <!-- Needed for JMS Bridge Tests -->
      <dependency>
         <groupId>org.jboss</groupId>
         <artifactId>jboss-transaction-spi</artifactId>
         <version>7.1.0.Final</version>
         <exclusions>
            <exclusion>
               <groupId>org.hornetq</groupId>
               <artifactId>hornetq-commons</artifactId>
            </exclusion>
         </exclusions>
      </dependency>

      <dependency>
         <groupId>org.hornetq</groupId>
         <artifactId>hornetq-core-client</artifactId>
         <version>${hornetq.version}</version>
      </dependency>

      <!-- Needed for XA tests -->
      <dependency>
         <groupId>org.jboss.jbossts.jts</groupId>
         <artifactId>jbossjts-jacorb</artifactId>
         <version>4.17.13.Final</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
               <execution>
                  <phase>test</phase>
                  <goals>
                     <goal>test-jar</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
               <skipTests>${skipExtraTests}</skipTests>
               <!-- ensure we don't inherit a byteman jar form any env settings -->
               <environmentVariables>
                  <BYTEMAN_HOME />
               </environmentVariables>
               <systemProperties>
                  <property>
                     <name>com.arjuna.ats.arjuna.objectstore.objectStoreDir</name>
                     <value>target/ObjectStore</value>
                  </property>
                  <property>
                     <name>ObjectStoreEnvironmentBean.objectStoreDir</name>
                     <value>target/ObjectStore</value>
                  </property>
                  <!--
                  <property>
                     <name>org.jboss.byteman.home</name>
                     <value></value>
                  </property>
                  <property>
                     <name>org.jboss.byteman.verbose</name>
                     <value>true</value>
                  </property>
                  <property>
                     <name>org.jboss.byteman.contrib.bmunit.verbose</name>
                     <value>true</value>
                  </property>
                  <property>
                     <name>org.jboss.byteman.dump.generated.classes</name>
                     <value></value>
                  </property>
                  -->
               </systemProperties>
               <!-- make sure maven puts the byteman jar in the classpath rather than in a manifest jar -->
               <useManifestOnlyJar>false</useManifestOnlyJar>
               <!-- when upgrading this plugin from 2.4 to 2.18.1 <forkMode>once</forkMode> was replaced with these: -->
               <forkCount>1</forkCount>
               <reuseForks>true</reuseForks>
               <!--
               <debugForkedProcess>true</debugForkedProcess>
               -->

               <!-- the option <parallel>false</parallel> is not supported after the plugin upgrade from 2.4 to 2.18.1 -->

               <!--<argLine>${activemq-surefire-argline} -Dorg.jboss.byteman.verbose -Dorg.jboss.byteman.contrib.bmunit.verbose</argLine>-->
               <!-- '-noverify' is needed here to fix VerifyErrors on ScaleDownFailoverTest and ScaleDownFailureTest (and their subclasses). I got the tip from https://issues.jboss.org/browse/BYTEMAN-248. -->
               <argLine>${activemq-surefire-argline} -noverify</argLine>
            </configuration>
         </plugin>

         <!-- Don't deploy artifacts for this module. It has non-permissive
              dependencies and is only optionally used for local testing. -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
               <skip>true</skip>
            </configuration>
         </plugin>
      </plugins>
   </build>

</project>
