<!--
    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>
    <groupId>org.apache.qpid</groupId>
    <artifactId>qpid-perftests</artifactId>
    <packaging>jar</packaging>
    <version>1.0-incubating-M2-SNAPSHOT</version>
    <name>Qpid Performance Tests</name>
    <url>http://cwiki.apache.org/confluence/display/qpid</url>

    <parent>
        <groupId>org.apache.qpid</groupId>
        <artifactId>qpid</artifactId>
        <version>1.0-incubating-M2-SNAPSHOT</version>
    </parent>

    <properties>
        <topDirectoryLocation>..</topDirectoryLocation>
        <log4j.perftests>perftests.log4j</log4j.perftests>
    </properties>

    <!-- Temporary local maven repo, whilst JUnit Toolkit is still reaching stable version to add to central maven repository. -->
    <pluginRepositories>
        <pluginRepository>
          <id>junit-toolkit-plugin.snapshots</id>
          <name>JUnit Toolkit SNAPSHOT Repository</name>
      <url>http://junit-toolkit.svn.sourceforge.net/svnroot/junit-toolkit/snapshots/</url>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>

        <dependency>
            <groupId>org.apache.qpid</groupId>
            <artifactId>qpid-client</artifactId>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>

        <dependency>
            <groupId>uk.co.thebadgerset</groupId>
            <artifactId>junit-toolkit</artifactId>
        </dependency>

        <!-- Test dependencies. -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- The JUnit Toolkit maven2 plugin is in the process of being added to the maven repository.

                 Configures the toolkit test runner for performance testing. These can be run from within maven, or by using the generated
                 scripts.

                 To run from within maven:

                 mvn uk.co.thebadgerset:junit-toolkit-maven-plugin:tktest

                 To run from the command line (after doing assembly:assembly goal):

                 java -cp target/test_jar-jar-with-dependencies.jar uk.co.thebadgerset.junit.extensions.TKTestRunner -s 1 -r 100000 
                      -o target org.apache.qpid.requestreply.PingPongTestPerf

                 To generate the scripts do:

                 mvn uk.co.thebadgerset:junit-toolkit-maven-plugin:tkscriptgen

                 Then to run the scripts, in the target directory do (after doing assembly:assembly goal):

                 ./script_name.sh

                 These scripts can find everything in the 'all test dependencies' jar created by the assembly:assembly goal.
                 -->
            <plugin>
              <groupId>uk.co.thebadgerset</groupId>
              <artifactId>junit-toolkit-maven-plugin</artifactId>

              <configuration>
                <scriptOutDirectory>target</scriptOutDirectory>
                <testJar>${project.build.finalName}-all-test-deps.jar</testJar>

                <systemproperties>
                  <property>
                    <name>log4j.configuration</name>
                    <value>${log4j.perftests}</value>
                  </property>
                  <property>
                    <name>amqj.logging.level</name>
                    <value>warn</value>
                  </property>
                  <property><!-- Turn off most logging messages from the junit-toolkit test tool itself. -->
                    <name>badger.level</name>
                    <value>warn</value>
                  </property>
                  <property>
                    <name>amqj.test.logging.level</name>
                    <value>info</value>
                  </property>
                </systemproperties>

                <commands>
                  <!-- Single pings. These can be scaled up by overriding the parameters when calling the test script. -->
                  <Ping-Once>-n Ping-Once -s [1] -r 1 -t testPingOk -o . org.apache.qpid.ping.PingTestPerf</Ping-Once>
                  <Ping-Once-Async>-n Ping-Once-Async -s [1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf</Ping-Once-Async>
                  <Ping-Latency>-n Ping-Latency -s [1000] -d 10S -t testPingLatency -o . org.apache.qpid.ping.PingLatencyTestPerf</Ping-Latency>

                  <!-- More example Tests. These are examples to exercise all the features of the test harness. Can scale up with option overrides. -->
                  <Ping-Tx>-n Ping-Tx -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf transacted=true</Ping-Tx>
                  <Ping-Size>-n Ping-Size -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messagesize=512</Ping-Size>
                  <Ping-Concurrent>-n Ping-Concurrent -s [100] -c [4] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf</Ping-Concurrent>
                  <Ping-Many-Queues>-n Ping-Many-Queues -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf destinationscount=4</Ping-Many-Queues>
                  <Ping-Duration>-n Ping-Duration -s [100] -d10S -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf</Ping-Duration>
                  <Ping-Rate>-n Ping-Rate -s [100] -d10S -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf rate=500</Ping-Rate>
                  <Ping-PubSub>-n Ping-PubSub -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true</Ping-PubSub>
                  <Ping-Many-Topics>
                      -n Ping-Many-Topics -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true destinationscount=4
                  </Ping-Many-Topics>
                          <Ping-Persistent>
                      -n Ping-Persistent -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true
                  </Ping-Persistent>
                  <Ping-Batch-Logging>
                      -n Ping-Batch-Logging -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf BatchSize=10
                  </Ping-Batch-Logging>
                  <Ping-Failover-Before-Send> 
                      -n Ping-Failover-Before-Send -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf CommitBatchSize=10 FailBeforeSend=true
                  </Ping-Failover-Before-Send>
                  <Ping-Failover-After-Send>
                      -n Ping-Failover-After-Send -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf CommitBatchSize=10 FailAfterSend=true
                  </Ping-Failover-After-Send>
                  <Ping-Failover-Before-Commit>
                      -n Ping-Failover-Before-Commit -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf CommitBatchSize=10 FailBeforeCommit=true
                  </Ping-Failover-Before-Commit>
                  <Ping-Failover-After-Commit>
                      -n Ping-Failover-After-Commit -s [100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf CommitBatchSize=10 FailAfterCommit=true
                  </Ping-Failover-After-Commit>

                </commands>
              </configuration>

              <executions>
                <execution>
                  <phase>test</phase>
                  <!--<goals>
                    <goal>tktest</goal>
                  </goals>-->
                </execution>
              </executions>
            </plugin>

            <!-- Bundles all the dependencies, fully expanded into a single jar, required to run the tests.

                 Usefull when bundling system, integration or performance tests into a convenient
                 package to hand over to testers. To use it run:

                 java -cp target/your_app_name-all-test-deps.jar path.to.your.Class

                 or often:

                 java -cp target/your_app_name-all-test-deps.jar junit.framework.textui.TestRunner path.to.your.test.Class

                 or other JUnit test runner invocations.
                 -->
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-assembly-plugin</artifactId>
              <version>2.2-SNAPSHOT</version>
              <configuration>
                <descriptors>
                  <descriptor>jar-with-dependencies.xml</descriptor>
                </descriptors>
                <outputDirectory>target</outputDirectory>
                <workDirectory>target/assembly/work</workDirectory>
              </configuration>
            </plugin>

        </plugins>

        <resources>
            <!-- Include source files in built jar -->
            <resource>
                <targetPath>src/</targetPath>
                <filtering>false</filtering>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.java</include>
                </includes>
            </resource>
            <!-- Include a log4j configuration in the jar at the root level (don't name this log4j.properties though as won't be able to override it). -->
            <resource>
                <targetPath>/</targetPath>
                <filtering>false</filtering>
                <directory>src/main/java</directory>
                <includes>
                    <include>perftests.log4j</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>
